From c0121a4318760e17fad88948e65fd686c15d4676 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 18 Dec 2022 19:00:37 +0330 Subject: [PATCH 001/144] Initial commit of version 3. --- .dockerignore | 8 - .env | 3 - .env.sample | 3 - .github/CONTRIBUTING.md | 3 +- .gitignore | 130 +- Dockerfile | 11 - Dockerfile.prod | 16 - README.md | 82 +- api/Dockerfile | 29 - api/config.js | 7 - api/modules/getData.js | 54 - api/package-lock.json | 4694 ----- api/package.json | 24 - api/pages/404.html | 20 - api/security/chrome.json | 1535 -- api/server.js | 155 - assets/LinkWarden.png | Bin 256803 -> 0 bytes docker-compose.yml | 40 - package-lock.json | 28140 ------------------------- package.json | 48 - public/favicon.ico | Bin 3870 -> 0 bytes public/index.html | 18 - public/logo192.png | Bin 5347 -> 0 bytes public/logo512.png | Bin 9664 -> 0 bytes public/manifest.json | 8 - public/robots.txt | 3 - src/App.js | 221 - src/componets/AddItem.js | 107 - src/componets/CollectionSelection.js | 81 - src/componets/EditItem.js | 144 - src/componets/Filters.js | 153 - src/componets/List.js | 122 - src/componets/Loader.js | 12 - src/componets/NoResults.js | 12 - src/componets/SideBar.js | 101 - src/componets/TagSelection.js | 81 - src/componets/ViewArchived.js | 28 - src/config.js | 1 - src/index.js | 12 - src/modules/concatCollections.js | 13 - src/modules/concatTags.js | 13 - src/modules/deleteEntity.js | 22 - src/modules/filterData.js | 29 - src/modules/send.js | 62 - src/modules/sortList.js | 48 - src/routes/Collections.js | 24 - src/routes/Tags.js | 24 - src/styles/AddItem.css | 83 - src/styles/App.css | 55 - src/styles/Filters.css | 81 - src/styles/List.css | 206 - src/styles/Loader.css | 7 - src/styles/SideBar.css | 55 - src/styles/SideBar_S.scss | 4 - src/styles/ViewArchived.css | 10 - src/styles/index.css | 138 - 56 files changed, 105 insertions(+), 36875 deletions(-) delete mode 100644 .dockerignore delete mode 100644 .env delete mode 100644 .env.sample delete mode 100644 Dockerfile delete mode 100644 Dockerfile.prod delete mode 100644 api/Dockerfile delete mode 100644 api/config.js delete mode 100644 api/modules/getData.js delete mode 100644 api/package-lock.json delete mode 100644 api/package.json delete mode 100644 api/pages/404.html delete mode 100644 api/security/chrome.json delete mode 100644 api/server.js delete mode 100644 assets/LinkWarden.png delete mode 100644 docker-compose.yml delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 public/favicon.ico delete mode 100644 public/index.html delete mode 100644 public/logo192.png delete mode 100644 public/logo512.png delete mode 100644 public/manifest.json delete mode 100644 public/robots.txt delete mode 100644 src/App.js delete mode 100644 src/componets/AddItem.js delete mode 100644 src/componets/CollectionSelection.js delete mode 100644 src/componets/EditItem.js delete mode 100644 src/componets/Filters.js delete mode 100644 src/componets/List.js delete mode 100644 src/componets/Loader.js delete mode 100644 src/componets/NoResults.js delete mode 100644 src/componets/SideBar.js delete mode 100644 src/componets/TagSelection.js delete mode 100644 src/componets/ViewArchived.js delete mode 100644 src/config.js delete mode 100644 src/index.js delete mode 100644 src/modules/concatCollections.js delete mode 100644 src/modules/concatTags.js delete mode 100644 src/modules/deleteEntity.js delete mode 100644 src/modules/filterData.js delete mode 100644 src/modules/send.js delete mode 100644 src/modules/sortList.js delete mode 100644 src/routes/Collections.js delete mode 100644 src/routes/Tags.js delete mode 100644 src/styles/AddItem.css delete mode 100644 src/styles/App.css delete mode 100644 src/styles/Filters.css delete mode 100644 src/styles/List.css delete mode 100644 src/styles/Loader.css delete mode 100644 src/styles/SideBar.css delete mode 100644 src/styles/SideBar_S.scss delete mode 100644 src/styles/ViewArchived.css delete mode 100644 src/styles/index.css diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 21657bc..0000000 --- a/.dockerignore +++ /dev/null @@ -1,8 +0,0 @@ -.github -api -.gitignore -.dockerignore -Dockerfile* -node_modules -api/media -mongo \ No newline at end of file diff --git a/.env b/.env deleted file mode 100644 index 630a07a..0000000 --- a/.env +++ /dev/null @@ -1,3 +0,0 @@ -API_PORT=5600 -API_ADDRESS=192.168.2.125 -CLIENT_PORT=2500 \ No newline at end of file diff --git a/.env.sample b/.env.sample deleted file mode 100644 index 630a07a..0000000 --- a/.env.sample +++ /dev/null @@ -1,3 +0,0 @@ -API_PORT=5600 -API_ADDRESS=192.168.2.125 -CLIENT_PORT=2500 \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 62297e0..1abb26c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,7 +1,8 @@ # How to contribute + > **For questions/help, feature requests and bug reports please create an [issue](https://github.com/Daniel31x13/link-warden/issues) (please use the right lable).** -First off, I'm really glad you're reading this and thank you for taking the time to contribute! 👍 +First off, I'm really glad you're reading this and thank you for taking the time to contribute! 1. Confirm your planned implementation fit into our project [features](https://github.com/Daniel31x13/link-warden#features) and [project roadmap](https://github.com/Daniel31x13/link-warden/wiki#project-roadmap) (wether it's adding a new feature or improving our existing code). diff --git a/.gitignore b/.gitignore index 3ba4475..bb6fa4d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,104 @@ -node_modules -..pnp -.pnp.js -coverage -build -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local +# Logs +logs +*.log npm-debug.log* yarn-debug.log* yarn-error.log* -mongo -.env +lerna-debug.log* -api/media -api/.ash_history -api/.config -api/.cache/ -api/.pki/ -api/node_modules -api/..pnp -api/.pnp.js -api/coverage -api/build -api/.DS_Store -api/.env.local -api/.env.development.local -api/.env.test.local -api/.env.production.local -api/npm-debug.log* -api/yarn-debug.log* -api/yarn-error.log* +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6682cae..0000000 --- a/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -# Development image for React app -FROM node:18-alpine - -WORKDIR /home/node - -VOLUME /home/node/node_modules - -COPY package*.json ./ - -RUN npm i -g npm@latest \ - && npm ci --legacy-peer-deps diff --git a/Dockerfile.prod b/Dockerfile.prod deleted file mode 100644 index ef5693b..0000000 --- a/Dockerfile.prod +++ /dev/null @@ -1,16 +0,0 @@ -# Production image for React app -FROM node:18-alpine AS builder - -WORKDIR /home/node - -VOLUME /home/node/node_modules - -COPY . . - -RUN npm i -g npm@latest \ - && npm ci --legacy-peer-deps \ - && npm run build - - -FROM nginx:alpine -COPY --from=builder /home/node/build /usr/share/nginx/html diff --git a/README.md b/README.md index d632d2d..5f2accf 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,5 @@ -
-

-LinkWarden +# LinkWarden -A place for your useful links. +## A place for your useful links. -LinkWarden.png - -Twitter Follow - -![GitHub](https://img.shields.io/github/license/daniel31x13/link-warden?style=flat-square) ![GitHub top language](https://img.shields.io/github/languages/top/daniel31x13/link-warden?style=flat-square) ![GitHub last commit](https://img.shields.io/github/last-commit/daniel31x13/link-warden?style=flat-square) ![Netlify](https://img.shields.io/netlify/31890116-669c-4b1c-844e-fa427503d8bf?style=flat-square) ![GitHub Repo stars](https://img.shields.io/github/stars/daniel31x13/link-warden?style=flat-square) - -

- -[Demo (v1.0.0)](https://linkwarden.netlify.app/) | [Intro & Motivation](https://github.com/Daniel31x13/link-warden#intro--motivation) | [Features](https://github.com/Daniel31x13/link-warden#features) | [Roadmap](https://github.com/Daniel31x13/link-warden/wiki#project-roadmap) | [Setup](https://github.com/Daniel31x13/link-warden#setup) | [Development](https://github.com/Daniel31x13/link-warden#linkwarden-development) - -
- -## Intro & Motivation - -**LinkWarden is a self-hosted, open-source bookmark + archive manager to collect, and save websites for offline use.** - -The objective is to have a self-hosted place to keep useful links in one place, and since useful links can go away (see the inevitability of [Link Rot](https://www.howtogeek.com/786227/what-is-link-rot-and-how-does-it-threaten-the-web/)), LinkWarden also saves a copy of the link as screenshot and PDF. - -## Features - -* 📷 Auto-capture a screenshot and PDF from each website. - -* 🔥 Sleek, minimalist design. - -* 🌤 Dark/Light mode support. - -* ↔️ Responsive design. - -* 🔎 Search, filter and sorting functionality. - -* 🚀 Lazy loading (for better performance). - -* 🏷 Set multiple tags to each link. - -* 🗂 Assign each link to a collection where we can further group links. - -## Installation - -### Using Docker Compose V2 (Recommended) - -1. Make sure docker is installed. - -2. Clone this repository. - -3. Head to the main folder and run `docker compose up -d`. - -The app will be deployed on port 3000. - -### Configuration -To configure the app create a `.env` file (in the main folder), here are the available variables: -``` -CLIENT_PORT=2500 # Default: 3000 -API_PORT=5700 # Default: 5500 -API_ADDRESS=192.168.1.14 # Default: localhost -``` - -> If you want to use this app across the network set `API_ADDRESS` as the computer (where LinkWarden is hosted) IP address. - -### Manual Setup - -1. Make sure your MongoDB database and collection is up and running. - -2. Edit [URI, Database name and Collection name](api/config.js) accordingly. - -3. [Optional] If you want to use this app across the network change [`API_HOST`](src/config.js) address with the computer IP and API port. - -4. Head to the main folder using terminal and run: `(cd api && npm install) && npm install --legacy-peer-deps` for the dependencies. - -5. Run `npm start` to start the application. - -## LinkWarden Development - -All contributions are welcomed! But first please take a look at [how to contribute](.github/CONTRIBUTING.md). - -> **For questions/help, feature requests and bug reports please create an [issue](https://github.com/Daniel31x13/link-warden/issues) (please use the right lable).** +Rebuilding project from ground up... diff --git a/api/Dockerfile b/api/Dockerfile deleted file mode 100644 index 1c9a743..0000000 --- a/api/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# Production image for api -# See https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-on-alpine - -FROM node:18-alpine -ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ - PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser - -WORKDIR /home/node -VOLUME /home/node/node_modules - -RUN apk add --no-cache \ - chromium \ - nss \ - freetype \ - harfbuzz \ - ca-certificates \ - ttf-freefont - -COPY . . -RUN npm ci && mkdir -p /media - -# The following command fails when attempting to chown the node_modules directory. -# Running it in its own layer allows it to modify the volume. -RUN chown -R node:node /home/node /media - -USER node - -EXPOSE 5500 -CMD node server.js diff --git a/api/config.js b/api/config.js deleted file mode 100644 index 056c0e7..0000000 --- a/api/config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports.port = process.env.PORT || 5500; -module.exports.URI = process.env.MONGODB_URI || "mongodb://localhost:27017"; // URI -module.exports.database = process.env.DB_NAME || "sample_db"; // Database name -module.exports.collection = process.env.COLLECTION_NAME || "list"; // Collection name -const storageLocation = process.env.STORAGE_LOCATION || "./media"; -module.exports.screenshotDirectory = storageLocation + "/screenshots"; -module.exports.pdfDirectory = storageLocation + "/pdfs"; diff --git a/api/modules/getData.js b/api/modules/getData.js deleted file mode 100644 index 2cf047e..0000000 --- a/api/modules/getData.js +++ /dev/null @@ -1,54 +0,0 @@ -const puppeteer = require("puppeteer"); -const { PuppeteerBlocker } = require("@cliqz/adblocker-puppeteer"); -const fetch = require("cross-fetch"); -const { screenshotDirectory, pdfDirectory } = require("../config.js"); - -module.exports = async (link, id) => { - const browser = await puppeteer.launch({ - args: ["--no-sandbox"], - timeout: 10000, - }); - const page = await browser.newPage(); - - await PuppeteerBlocker.fromPrebuiltAdsAndTracking(fetch).then((blocker) => { - blocker.enableBlockingInPage(page); - }); - - await page.goto(link, { waitUntil: "load", timeout: 300000 }); - - await page.setViewport({ - width: 1200, - height: 800, - }); - - await autoScroll(page); - - await page.screenshot({ - path: screenshotDirectory + "/" + id + ".png", - fullPage: true, - }); - await page.pdf({ path: pdfDirectory + "/" + id + ".pdf", format: "a4" }); - - await browser.close(); -}; - -async function autoScroll(page) { - await page.evaluate(async () => { - await new Promise((resolve, reject) => { - let totalHeight = 0; - let distance = 100; - let timer = setInterval(() => { - let scrollHeight = document.body.scrollHeight; - window.scrollBy(0, distance); - totalHeight += distance; - - if (totalHeight >= scrollHeight - window.innerHeight) { - clearInterval(timer); - resolve(); - } - }, 100); - }); - - window.scrollTo(0,0); - }); -} diff --git a/api/package-lock.json b/api/package-lock.json deleted file mode 100644 index edbea55..0000000 --- a/api/package-lock.json +++ /dev/null @@ -1,4694 +0,0 @@ -{ - "name": "link-warden-api", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "link-warden-api", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@cliqz/adblocker-puppeteer": "^1.23.8", - "cors": "^2.8.5", - "cross-fetch": "^3.1.5", - "express": "^4.17.3", - "mongodb": "^4.5.0", - "puppeteer": "^14.1.1", - "sanitize-filename": "^1.6.3", - "uuid": "^8.3.2" - }, - "devDependencies": { - "nodemon": "^2.0.15" - } - }, - "node_modules/@cliqz/adblocker": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.23.8.tgz", - "integrity": "sha512-xM1JYTv5dA+pPP4x4IVZdjkM9aAsakTnShFLuHLzMxMHd20eUB91NXm4kK6acw9nHwG6rCyat6+u7TvAqSmR6g==", - "dependencies": { - "@cliqz/adblocker-content": "^1.23.8", - "@cliqz/adblocker-extended-selectors": "^1.23.8", - "@remusao/guess-url-type": "^1.1.2", - "@remusao/small": "^1.1.2", - "@remusao/smaz": "^1.7.1", - "@types/chrome": "^0.0.183", - "@types/firefox-webext-browser": "^94.0.0", - "tldts-experimental": "^5.6.21" - } - }, - "node_modules/@cliqz/adblocker-content": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.23.8.tgz", - "integrity": "sha512-5Wm/OSA6H8AUVFi8SDff6xJ4zT/1VCrNoUnevFEi3e0MCmdQUvn+cJc03Saky7Ch5oLSJKTXNNMyPaODZLz24A==", - "dependencies": { - "@cliqz/adblocker-extended-selectors": "^1.23.8" - } - }, - "node_modules/@cliqz/adblocker-extended-selectors": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.23.8.tgz", - "integrity": "sha512-5xx47oT2Q9E3vkfEm/EzSs7cAPi8WNWtu7kJcGa/urVkDchJwdkdelvQ2Dof+k5icI5AqZorZSsk9Q7w2bLxrA==" - }, - "node_modules/@cliqz/adblocker-puppeteer": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-puppeteer/-/adblocker-puppeteer-1.23.8.tgz", - "integrity": "sha512-Ca1/DBqQXsOpKTFVAHX6OpLTSEupXmUkUWHj6iXhLLleC7RPISN5B0b801VDmaGRqoC5zKRxn0vYbIfpgCWVug==", - "dependencies": { - "@cliqz/adblocker": "^1.23.8", - "@cliqz/adblocker-content": "^1.23.8", - "tldts-experimental": "^5.6.21" - }, - "peerDependencies": { - "puppeteer": ">5" - } - }, - "node_modules/@remusao/guess-url-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", - "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" - }, - "node_modules/@remusao/small": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", - "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" - }, - "node_modules/@remusao/smaz": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", - "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", - "dependencies": { - "@remusao/smaz-compress": "^1.9.1", - "@remusao/smaz-decompress": "^1.9.1" - } - }, - "node_modules/@remusao/smaz-compress": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", - "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", - "dependencies": { - "@remusao/trie": "^1.4.1" - } - }, - "node_modules/@remusao/smaz-decompress": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", - "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" - }, - "node_modules/@remusao/trie": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", - "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@types/chrome": { - "version": "0.0.183", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.183.tgz", - "integrity": "sha512-sYI1qGY2oB6U5GFyuoSsVJsi2ytuEe92QrQTXQRwkISN8yn1gPY5qRq1XSwKN17yjvZTgxxeHw2ZoSHMti6qYg==", - "dependencies": { - "@types/filesystem": "*", - "@types/har-format": "*" - } - }, - "node_modules/@types/filesystem": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", - "dependencies": { - "@types/filewriter": "*" - } - }, - "node_modules/@types/filewriter": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", - "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" - }, - "node_modules/@types/firefox-webext-browser": { - "version": "94.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-94.0.1.tgz", - "integrity": "sha512-I6iHRQJSTZ+gYt2IxdH2RRAMvcUyK8v5Ig7fHQR0IwUNYP7hz9+cziBVIKxLCO6XI7fiyRsNOWObfl3/4Js2Lg==" - }, - "node_modules/@types/har-format": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz", - "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==" - }, - "node_modules/@types/node": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", - "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" - }, - "node_modules/@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bson": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.2.tgz", - "integrity": "sha512-VeJKHShcu1b/ugl0QiujlVuBepab714X9nNyBdA1kfekuDGecxgpTA2Z6nYbagrWFeiIyzSWIOzju3lhj+RNyQ==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/devtools-protocol": { - "version": "0.0.982423", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.982423.tgz", - "integrity": "sha512-FnVW2nDbjGNw1uD/JRC+9U5768W7e1TfUwqbDTcSsAu1jXFjITSX8w3rkW5FEpHRMPPGpvNSmO1pOpqByiWscA==" - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mongodb": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz", - "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==", - "dependencies": { - "bson": "^4.6.2", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.5.2", - "socks": "^2.6.2" - }, - "engines": { - "node": ">=12.9.0" - }, - "optionalDependencies": { - "saslprep": "^1.0.3" - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", - "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-14.1.1.tgz", - "integrity": "sha512-4dC6GYR5YlXTmNO3TbYEHTdVSdml1cVD2Ok/h/f/xSTp4ITVdbRWkMjiOaEKRAhtIl6GqaP7B89zx+hfhcNGMQ==", - "hasInstallScript": true, - "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.982423", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.6.0" - }, - "engines": { - "node": ">=14.1.0" - } - }, - "node_modules/puppeteer/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/tldts-core": { - "version": "5.7.80", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.80.tgz", - "integrity": "sha512-qGdm/usUZb6SwSxRolp4nGe+1xyPW7il4/xxuzFQxGvya43xb6S/+O/TJRTY3GCcdAmkwNtibnCeh9rJ3OD6sA==" - }, - "node_modules/tldts-experimental": { - "version": "5.7.80", - "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-5.7.80.tgz", - "integrity": "sha512-NYeVtoJlUSHhGhh14u7aoDgiCrcpuF67AprULGMAsLfn1wMXY3oYeT2kRRXBzTXCg2H1/YCCl7XZ3h59NrDC7Q==", - "dependencies": { - "tldts-core": "^5.7.80" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - }, - "dependencies": { - "@cliqz/adblocker": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.23.8.tgz", - "integrity": "sha512-xM1JYTv5dA+pPP4x4IVZdjkM9aAsakTnShFLuHLzMxMHd20eUB91NXm4kK6acw9nHwG6rCyat6+u7TvAqSmR6g==", - "requires": { - "@cliqz/adblocker-content": "^1.23.8", - "@cliqz/adblocker-extended-selectors": "^1.23.8", - "@remusao/guess-url-type": "^1.1.2", - "@remusao/small": "^1.1.2", - "@remusao/smaz": "^1.7.1", - "@types/chrome": "^0.0.183", - "@types/firefox-webext-browser": "^94.0.0", - "tldts-experimental": "^5.6.21" - } - }, - "@cliqz/adblocker-content": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.23.8.tgz", - "integrity": "sha512-5Wm/OSA6H8AUVFi8SDff6xJ4zT/1VCrNoUnevFEi3e0MCmdQUvn+cJc03Saky7Ch5oLSJKTXNNMyPaODZLz24A==", - "requires": { - "@cliqz/adblocker-extended-selectors": "^1.23.8" - } - }, - "@cliqz/adblocker-extended-selectors": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.23.8.tgz", - "integrity": "sha512-5xx47oT2Q9E3vkfEm/EzSs7cAPi8WNWtu7kJcGa/urVkDchJwdkdelvQ2Dof+k5icI5AqZorZSsk9Q7w2bLxrA==" - }, - "@cliqz/adblocker-puppeteer": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/@cliqz/adblocker-puppeteer/-/adblocker-puppeteer-1.23.8.tgz", - "integrity": "sha512-Ca1/DBqQXsOpKTFVAHX6OpLTSEupXmUkUWHj6iXhLLleC7RPISN5B0b801VDmaGRqoC5zKRxn0vYbIfpgCWVug==", - "requires": { - "@cliqz/adblocker": "^1.23.8", - "@cliqz/adblocker-content": "^1.23.8", - "tldts-experimental": "^5.6.21" - } - }, - "@remusao/guess-url-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", - "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" - }, - "@remusao/small": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", - "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" - }, - "@remusao/smaz": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", - "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", - "requires": { - "@remusao/smaz-compress": "^1.9.1", - "@remusao/smaz-decompress": "^1.9.1" - } - }, - "@remusao/smaz-compress": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", - "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", - "requires": { - "@remusao/trie": "^1.4.1" - } - }, - "@remusao/smaz-decompress": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", - "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" - }, - "@remusao/trie": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", - "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/chrome": { - "version": "0.0.183", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.183.tgz", - "integrity": "sha512-sYI1qGY2oB6U5GFyuoSsVJsi2ytuEe92QrQTXQRwkISN8yn1gPY5qRq1XSwKN17yjvZTgxxeHw2ZoSHMti6qYg==", - "requires": { - "@types/filesystem": "*", - "@types/har-format": "*" - } - }, - "@types/filesystem": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", - "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", - "requires": { - "@types/filewriter": "*" - } - }, - "@types/filewriter": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", - "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" - }, - "@types/firefox-webext-browser": { - "version": "94.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-94.0.1.tgz", - "integrity": "sha512-I6iHRQJSTZ+gYt2IxdH2RRAMvcUyK8v5Ig7fHQR0IwUNYP7hz9+cziBVIKxLCO6XI7fiyRsNOWObfl3/4Js2Lg==" - }, - "@types/har-format": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.8.tgz", - "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==" - }, - "@types/node": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", - "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" - }, - "@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" - }, - "@types/whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - } - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "bson": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.2.tgz", - "integrity": "sha512-VeJKHShcu1b/ugl0QiujlVuBepab714X9nNyBdA1kfekuDGecxgpTA2Z6nYbagrWFeiIyzSWIOzju3lhj+RNyQ==", - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "devtools-protocol": { - "version": "0.0.982423", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.982423.tgz", - "integrity": "sha512-FnVW2nDbjGNw1uD/JRC+9U5768W7e1TfUwqbDTcSsAu1jXFjITSX8w3rkW5FEpHRMPPGpvNSmO1pOpqByiWscA==" - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "mongodb": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz", - "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==", - "requires": { - "bson": "^4.6.2", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.5.2", - "saslprep": "^1.0.3", - "socks": "^2.6.2" - } - }, - "mongodb-connection-string-url": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", - "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "puppeteer": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-14.1.1.tgz", - "integrity": "sha512-4dC6GYR5YlXTmNO3TbYEHTdVSdml1cVD2Ok/h/f/xSTp4ITVdbRWkMjiOaEKRAhtIl6GqaP7B89zx+hfhcNGMQ==", - "requires": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.982423", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.6.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "requires": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" - }, - "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "tldts-core": { - "version": "5.7.80", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.80.tgz", - "integrity": "sha512-qGdm/usUZb6SwSxRolp4nGe+1xyPW7il4/xxuzFQxGvya43xb6S/+O/TJRTY3GCcdAmkwNtibnCeh9rJ3OD6sA==" - }, - "tldts-experimental": { - "version": "5.7.80", - "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-5.7.80.tgz", - "integrity": "sha512-NYeVtoJlUSHhGhh14u7aoDgiCrcpuF67AprULGMAsLfn1wMXY3oYeT2kRRXBzTXCg2H1/YCCl7XZ3h59NrDC7Q==", - "requires": { - "tldts-core": "^5.7.80" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "requires": { - "punycode": "^2.1.1" - } - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", - "requires": {} - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/api/package.json b/api/package.json deleted file mode 100644 index e25ccf7..0000000 --- a/api/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "link-warden-api", - "version": "1.0.0", - "description": "LinkWarden backend", - "main": "server.js", - "scripts": { - "dev": "nodemon server.js" - }, - "author": "", - "license": "MIT", - "dependencies": { - "@cliqz/adblocker-puppeteer": "^1.23.8", - "cors": "^2.8.5", - "cross-fetch": "^3.1.5", - "express": "^4.17.3", - "mongodb": "^4.5.0", - "puppeteer": "^14.1.1", - "sanitize-filename": "^1.6.3", - "uuid": "^8.3.2" - }, - "devDependencies": { - "nodemon": "^2.0.15" - } -} diff --git a/api/pages/404.html b/api/pages/404.html deleted file mode 100644 index 5348452..0000000 --- a/api/pages/404.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - Document - - -

404: NOT FOUND

-

- If you are trying to access a recently added Screenshot/PDF, just wait a - bit more for it to be uploaded. -

-

If the problem persists, looks like the file wasn't created...

-

¯\_(ツ)_/¯

- - diff --git a/api/security/chrome.json b/api/security/chrome.json deleted file mode 100644 index e5b0f2d..0000000 --- a/api/security/chrome.json +++ /dev/null @@ -1,1535 +0,0 @@ -{ - "defaultAction": "SCMP_ACT_ERRNO", - "syscalls": [ - { - "name": "accept", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "accept4", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "access", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "alarm", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "arch_prctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "bind", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "brk", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "capget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "capset", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chmod", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chown32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chroot", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clock_getres", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clock_gettime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clock_nanosleep", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clone", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "close", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "connect", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "creat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "dup", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "dup2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "dup3", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_create1", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_ctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_ctl_old", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_pwait", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_wait", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_wait_old", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "eventfd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "eventfd2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "execve", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "execveat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "exit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "exit_group", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "faccessat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fadvise64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fadvise64_64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fallocate", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fanotify_init", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fanotify_mark", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchmod", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchmodat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchown32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchownat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fcntl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fcntl64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fdatasync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fgetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "flistxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "flock", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fork", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fremovexattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fsetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstatat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstatfs", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstatfs64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fsync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ftruncate", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ftruncate64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "futex", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "futimesat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getcpu", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getcwd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getdents", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getdents64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getegid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getegid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "geteuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "geteuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgroups", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgroups32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getitimer", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpeername", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpgrp", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getppid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpriority", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getrandom", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getrlimit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "get_robust_list", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getrusage", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getsid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getsockname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getsockopt", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "get_thread_area", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "gettid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "gettimeofday", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_add_watch", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_init", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_init1", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_rm_watch", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_cancel", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ioctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_destroy", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_getevents", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ioprio_get", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ioprio_set", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_setup", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_submit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "kill", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lchown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lchown32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lgetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "link", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "linkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "listen", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "listxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "llistxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "_llseek", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lremovexattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lseek", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lsetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lstat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lstat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "madvise", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "memfd_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mincore", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mkdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mkdirat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mknod", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mknodat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mlock", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mlockall", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mmap", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mmap2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mprotect", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_getsetattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_notify", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_open", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_timedreceive", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_timedsend", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_unlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mremap", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgrcv", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgsnd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "munlock", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "munlockall", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "munmap", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "name_to_handle_at", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "nanosleep", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "newfstatat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "_newselect", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "open", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "open_by_handle_at", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "openat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pause", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pipe", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pipe2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "poll", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ppoll", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "prctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pread64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "preadv", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "prlimit64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pselect6", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pwrite64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pwritev", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "read", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readahead", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readlinkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readv", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "recvfrom", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "recvmmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "recvmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "remap_file_pages", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "removexattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rename", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "renameat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "renameat2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rmdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigaction", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigpending", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigprocmask", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigqueueinfo", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigreturn", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigsuspend", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigtimedwait", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_tgsigqueueinfo", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getaffinity", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getparam", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_get_priority_max", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_get_priority_min", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getscheduler", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_rr_get_interval", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setaffinity", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setparam", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setscheduler", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_yield", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "seccomp", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "select", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semop", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semtimedop", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendfile", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendfile64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendmmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendto", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setdomainname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgroups", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgroups32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sethostname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setitimer", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setns", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setpgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setpriority", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setregid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setregid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setreuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setreuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setrlimit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "set_robust_list", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setsid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setsockopt", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "set_thread_area", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "set_tid_address", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmdt", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shutdown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sigaltstack", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "signalfd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "signalfd4", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "socket", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "socketpair", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "splice", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "stat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "stat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "statfs", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "statfs64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "symlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "symlinkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sync_file_range", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "syncfs", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sysinfo", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "syslog", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "tee", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "tgkill", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "time", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_delete", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timerfd_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timerfd_gettime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timerfd_settime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_getoverrun", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_gettime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_settime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "times", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "tkill", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "truncate", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "truncate64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ugetrlimit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "umask", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "uname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "unlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "unlinkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "unshare", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "utime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "utimensat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "utimes", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "vfork", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "vhangup", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "vmsplice", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "wait4", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "waitid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "write", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "writev", - "action": "SCMP_ACT_ALLOW", - "args": null - } - ] -} diff --git a/api/server.js b/api/server.js deleted file mode 100644 index 59cb5f2..0000000 --- a/api/server.js +++ /dev/null @@ -1,155 +0,0 @@ -const express = require("express"); -const app = express(); -const { MongoClient } = require("mongodb"); -const cors = require("cors"); -const getData = require("./modules/getData.js"); -const fs = require("fs"); -const { - port, - URI, - database, - collection, - screenshotDirectory, - pdfDirectory, -} = require("./config.js"); -const fetch = require("cross-fetch"); -const sanitize = require("sanitize-filename"); - -const client = new MongoClient(URI); -const db = client.db(database); -const list = db.collection(collection); - -// Create the storage directories if they do not exist -if (!fs.existsSync(screenshotDirectory)) { - fs.mkdirSync(screenshotDirectory, { recursive: true }); -} - -if (!fs.existsSync(pdfDirectory)) { - fs.mkdirSync(pdfDirectory, { recursive: true }); -} - -app.use(cors()); - -app.use(express.json()); - -app.get("/api", async (req, res) => { - const data = await getDoc(); - res.send(data); -}); - -app.get("/screenshots/:id", async (req, res) => { - res.sendFile( - __dirname + "/" + screenshotDirectory + "/" + sanitize(req.params.id), - (err) => { - if (err) { - res.sendFile(__dirname + "/pages/404.html"); - } - } - ); -}); - -app.get("/pdfs/:id", async (req, res) => { - res.sendFile( - __dirname + "/" + pdfDirectory + "/" + sanitize(req.params.id), - (err) => { - if (err) { - res.sendFile(__dirname + "/pages/404.html"); - } - } - ); -}); - -app.post("/api", async (req, res) => { - const pageToVisit = req.body.link; - const id = req.body._id; - const getTitle = async (url) => { - let body; - await fetch(url) - .then((res) => res.text()) - .then((text) => (body = text)); - // regular expression to parse contents of the tag - let match = body.match(/<title.*>([^<]*)<\/title>/); - return match[1]; - }; - - try { - req.body.title = await getTitle(req.body.link); - await insertDoc(req.body); - - res.send("DONE!"); - getData(pageToVisit, req.body._id); - } catch (err) { - console.log(err); - insertDoc(req.body); - } -}); - -app.put("/api", async (req, res) => { - const id = req.body._id; - - await updateDoc(id, req.body); - - res.send("Updated!"); -}); - -app.delete("/api", async (req, res) => { - const id = req.body.id; - - await deleteDoc(id); - - res.send(`Link with _id:${id} deleted.`); -}); - -async function updateDoc(id, updatedListing) { - try { - await list.updateOne({ _id: id }, { $set: updatedListing }); - } catch (err) { - console.log(err); - } -} - -async function insertDoc(doc) { - try { - await list.insertOne(doc); - } catch (err) { - console.log(err); - } -} - -async function getDoc() { - try { - const result = await list.find({}).toArray(); - - return result; - } catch (err) { - console.log(err); - } -} - -async function deleteDoc(doc) { - doc = sanitize(doc); - try { - const result = await list.deleteOne({ _id: doc }); - - fs.unlink(screenshotDirectory + "/" + doc + ".png", (err) => { - if (err) { - console.log(err); - } - }); - - fs.unlink(pdfDirectory + "/" + doc + ".pdf", (err) => { - if (err) { - console.log(err); - } - }); - - return result; - } catch (err) { - console.log(err); - } -} - -app.listen(port, () => { - console.log(`Success! running on port ${port}.`); - client.connect(); -}); diff --git a/assets/LinkWarden.png b/assets/LinkWarden.png deleted file mode 100644 index 3e366109f34b151a44632878bee0bff39f0af84b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256803 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 ?H-8?4<&y3Pey(&DdT5(+Wy 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ɔ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 Xi5dZuRrmJzZN4eUs7jYe8o&R4DdJ^C diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 87f3847..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: "3" - -## This compose file can be used for development - -services: - mongo: - image: mongo - volumes: - - ./mongo:/data/db - ports: - - 27017 - restart: unless-stopped - - link-warden-api: - build: ./api - environment: - - MONGODB_URI=mongodb://mongo:27017/ - - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true - volumes: - - ./api:/home/node - ports: - - ${API_PORT:-5500}:5500 - restart: unless-stopped - depends_on: - - mongo - - link-warden: - build: . - environment: - # - DANGEROUSLY_DISABLE_HOST_CHECK=true - - REACT_APP_API_HOST=http://${API_ADDRESS:-localhost}:${API_PORT:-5500} - command: npm run go - volumes: - - /home/node/node_modules - - .:/home/node - ports: - - ${CLIENT_PORT:-3000}:3000 - restart: unless-stopped - depends_on: - - link-warden-api diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 182ff6b..0000000 --- a/package-lock.json +++ /dev/null @@ -1,28140 +0,0 @@ -{ - "name": "link-warden", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "link-warden", - "version": "0.1.0", - "dependencies": { - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^12.1.4", - "@testing-library/user-event": "^13.5.0", - "nanoid": "^3.3.4", - "react": "^18.0.0", - "react-awesome-button": "^6.5.1", - "react-dom": "^18.0.0", - "react-lazyload": "^3.2.0", - "react-loader-spinner": "^6.0.0-0", - "react-pro-sidebar": "^0.7.1", - "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", - "react-select": "^5.3.2", - "sass": "^1.53.0", - "web-vitals": "^2.1.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", - "dependencies": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", - "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.9", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", - "charcodes": "^0.2.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", - "dependencies": { - "regenerator-transform": "^0.15.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", - "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "dependencies": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", - "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", - "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", - "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", - "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.9.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", - "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", - "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", - "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", - "dependencies": { - "@emotion/memoize": "^0.7.4" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" - }, - "node_modules/@emotion/react": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", - "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.3", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", - "dependencies": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", - "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <3.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", - "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@testing-library/dom": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", - "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.16.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", - "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", - "dependencies": { - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.4.tgz", - "integrity": "sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "*" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", - "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/react": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.0.tgz", - "integrity": "sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.0.tgz", - "integrity": "sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", - "integrity": "sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==", - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", - "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", - "dependencies": { - "@typescript-eslint/utils": "5.18.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", - "dependencies": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", - "dependencies": { - "@typescript-eslint/utils": "5.18.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", - "dependencies": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", - "dependencies": { - "@typescript-eslint/types": "5.18.0", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "node_modules/bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", - "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/charcodes": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", - "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "node_modules/clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" - }, - "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", - "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-js-pure": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", - "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", - "dependencies": { - "cssnano-preset-default": "^5.2.7", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", - "dependencies": { - "css-declaration-sorter": "^6.2.2", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "node_modules/dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.13.tgz", - "integrity": "sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw==" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==" - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", - "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", - "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", - "dependencies": { - "@typescript-eslint/utils": "^5.13.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", - "dependencies": { - "@types/eslint": "^7.28.2", - "jest-worker": "^27.3.1", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - }, - "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dependencies": { - "@babel/runtime": "^7.7.6" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", - "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", - "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^27.0.0", - "jest-watcher": "^27.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watch-typeahead/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", - "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", - "dependencies": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", - "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", - "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.2" - }, - "peerDependencies": { - "postcss": "^8.0.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", - "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.2" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", - "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dependencies": { - "postcss-selector-parser": "^6.0.6" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", - "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", - "dependencies": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", - "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", - "dependencies": { - "balanced-match": "^1.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.0.0.tgz", - "integrity": "sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-awesome-button": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/react-awesome-button/-/react-awesome-button-6.5.1.tgz", - "integrity": "sha512-94AS4BSIgRCMSHq8wcy3ztostjLK8cqjUX6DT5oWiYNs3uxLv5uk4yFMlzXBjo0I4TERLOZGn66q0xwb+xw5qw==", - "dependencies": { - "web-animation-club": "^0.6.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dom": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.0.0.tgz", - "integrity": "sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-lazyload": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-lazyload/-/react-lazyload-3.2.0.tgz", - "integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==", - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", - "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/react-loader-spinner": { - "version": "6.0.0-0", - "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-6.0.0-0.tgz", - "integrity": "sha512-ANUS2nWUNALH933d04IY3iT6aIYuizI6mQpzHjH5i4aKdnLhm68JLICd2CKdOgxCNixM5iKqA8QSNWBdKe4++g==", - "dependencies": { - "@babel/runtime": "^7.14.6", - "prop-types": "^15.8.1", - "styled-components": "^5.3.3", - "styled-tools": "^1.7.2", - "tslib": "^2.3.0" - }, - "engines": { - "npm": "please-use-yarn", - "yarn": ">= 1.19.1" - }, - "peerDependencies": { - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "node_modules/react-pro-sidebar": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/react-pro-sidebar/-/react-pro-sidebar-0.7.1.tgz", - "integrity": "sha512-Iy1X8ce4t5Vqz4CsyzjwokGUE3/IObgmYzS0ins7/2eWKle0SMUPaWdgMKFIVjtVrMr5vmjPbRicq8FxnVaf8A==", - "dependencies": { - "@popperjs/core": "^2.4.0", - "classnames": "^2.2.6", - "react-slidedown": "^2.4.5", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", - "dependencies": { - "history": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", - "dependencies": { - "history": "^5.2.0", - "react-router": "6.3.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-select": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.2.tgz", - "integrity": "sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ==", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-slidedown": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/react-slidedown/-/react-slidedown-2.4.7.tgz", - "integrity": "sha512-HGDfrqo70r1WVE0DwrySPdCT27/2wcZaJYh5kOnmuPSCtjDDJrNkDdn4Ep/cma2VVfwupeAGhbc2pbrGThU6VQ==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.3.0 || 17", - "react-dom": "^16.3.0 || 17" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dependencies": { - "minimatch": "3.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" - }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } - } - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "node_modules/sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", - "dependencies": { - "lru-cache": "^7.4.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", - "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/styled-components": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz", - "integrity": "sha512-ndETJ9RKaaL6q41B69WudeqLzOpY1A/ET/glXkNZ2T7dPjPqpPCXXQjDFYZWwNnE5co0wX+gTCqx9mfxTmSIPg==", - "hasInstallScript": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-tools": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/styled-tools/-/styled-tools-1.7.2.tgz", - "integrity": "sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==" - }, - "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tailwindcss": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", - "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", - "dependencies": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss": "^8.4.6", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tailwindcss/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/tailwindcss/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tailwindcss/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/tailwindcss/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "dependencies": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-animation-club": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/web-animation-club/-/web-animation-club-0.6.0.tgz", - "integrity": "sha512-9W+EQu1HiaPLe/7WZlhJ2ULqQ4VL80RPDYW+ZcjfTKp6ayOuT1k3SVO6+tu0VBRmOqueJ/mrG+rjjInIv8Aglg==" - }, - "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", - "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz", - "integrity": "sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g==", - "dependencies": { - "idb": "^6.1.4", - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz", - "integrity": "sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-build": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.2.tgz", - "integrity": "sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ==", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.5.2", - "workbox-broadcast-update": "6.5.2", - "workbox-cacheable-response": "6.5.2", - "workbox-core": "6.5.2", - "workbox-expiration": "6.5.2", - "workbox-google-analytics": "6.5.2", - "workbox-navigation-preload": "6.5.2", - "workbox-precaching": "6.5.2", - "workbox-range-requests": "6.5.2", - "workbox-recipes": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2", - "workbox-streams": "6.5.2", - "workbox-sw": "6.5.2", - "workbox-window": "6.5.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz", - "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz", - "integrity": "sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-core": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.2.tgz", - "integrity": "sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ==" - }, - "node_modules/workbox-expiration": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.2.tgz", - "integrity": "sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw==", - "dependencies": { - "idb": "^6.1.4", - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz", - "integrity": "sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw==", - "dependencies": { - "workbox-background-sync": "6.5.2", - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz", - "integrity": "sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-precaching": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.2.tgz", - "integrity": "sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w==", - "dependencies": { - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz", - "integrity": "sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-recipes": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.2.tgz", - "integrity": "sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA==", - "dependencies": { - "workbox-cacheable-response": "6.5.2", - "workbox-core": "6.5.2", - "workbox-expiration": "6.5.2", - "workbox-precaching": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "node_modules/workbox-routing": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.2.tgz", - "integrity": "sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-strategies": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.2.tgz", - "integrity": "sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-streams": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.2.tgz", - "integrity": "sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w==", - "dependencies": { - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2" - } - }, - "node_modules/workbox-sw": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.2.tgz", - "integrity": "sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ==", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.5.2" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.2.tgz", - "integrity": "sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A==", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.2" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" - }, - "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", - "requires": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" - }, - "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" - } - }, - "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", - "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.9", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", - "charcodes": "^0.2.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", - "requires": { - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", - "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - } - }, - "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - } - }, - "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", - "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", - "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" - }, - "@csstools/postcss-color-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", - "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", - "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", - "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@emotion/babel-plugin": { - "version": "11.9.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", - "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "dependencies": { - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - } - }, - "@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/is-prop-valid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", - "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", - "requires": { - "@emotion/memoize": "^0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" - }, - "@emotion/react": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", - "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.3", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", - "hoist-non-react-statics": "^3.3.1" - } - }, - "@emotion/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", - "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", - "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", - "requires": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" - }, - "@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "requires": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - } - } - }, - "@rushstack/eslint-patch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", - "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==" - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "requires": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" - }, - "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - } - }, - "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "requires": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "requires": { - "@babel/types": "^7.12.6" - } - }, - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "requires": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - } - }, - "@testing-library/dom": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", - "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.16.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", - "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", - "requires": { - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.4.tgz", - "integrity": "sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==", - "requires": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "*" - } - }, - "@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "requires": { - "@types/node": "*" - } - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/react": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.0.tgz", - "integrity": "sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.0.tgz", - "integrity": "sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==", - "requires": { - "@types/react": "*" - } - }, - "@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "requires": { - "@types/react": "*" - } - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "requires": { - "@types/node": "*" - } - }, - "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "@types/testing-library__jest-dom": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", - "integrity": "sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==", - "requires": { - "@types/jest": "*" - } - }, - "@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", - "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", - "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", - "requires": { - "@typescript-eslint/utils": "5.18.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", - "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", - "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", - "requires": { - "@typescript-eslint/utils": "5.18.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==" - }, - "@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", - "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", - "requires": { - "@typescript-eslint/types": "5.18.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==" - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - } - }, - "babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "requires": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", - "requires": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==" - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "charcodes": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", - "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==" - }, - "check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" - }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" - }, - "core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", - "requires": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-js-pure": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", - "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "requires": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" - }, - "css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - } - }, - "css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", - "requires": { - "cssnano-preset-default": "^5.2.7", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", - "requires": { - "css-declaration-sorter": "^6.2.2", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "requires": { - "execa": "^5.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-accessibility-api": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.13.tgz", - "integrity": "sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw==" - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" - } - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==" - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "requires": { - "stackframe": "^1.1.1" - } - }, - "es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", - "requires": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "requires": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "requires": { - "@typescript-eslint/experimental-utils": "^5.0.0" - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "requires": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - } - }, - "eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==" - }, - "eslint-plugin-testing-library": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", - "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", - "requires": { - "@typescript-eslint/utils": "^5.13.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" - }, - "eslint-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", - "requires": { - "@types/eslint": "^7.28.2", - "jest-worker": "^27.3.1", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1" - } - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - } - }, - "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - }, - "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - } - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "requires": { - "@babel/runtime": "^7.7.6" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" - }, - "idb": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", - "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - }, - "immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==" - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" - }, - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - } - }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" - }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" - }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - } - }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", - "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", - "requires": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^27.0.0", - "jest-watcher": "^27.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" - }, - "string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "requires": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" - }, - "jsx-ast-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", - "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", - "requires": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" - }, - "language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" - }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", - "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==" - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "requires": { - "tmpl": "1.0.5" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", - "requires": { - "fs-monkey": "1.0.3" - } - }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", - "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", - "requires": { - "postcss-selector-parser": "^6.0.2" - } - }, - "postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" - }, - "postcss-custom-properties": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", - "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" - }, - "postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" - }, - "postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==" - }, - "postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-lab-function": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", - "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" - }, - "postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-nesting": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", - "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "requires": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==" - }, - "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==" - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" - }, - "postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", - "requires": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", - "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" - }, - "postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - } - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "requires": { - "asap": "~2.0.6" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - } - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "requires": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "react": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.0.0.tgz", - "integrity": "sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "requires": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - } - }, - "react-awesome-button": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/react-awesome-button/-/react-awesome-button-6.5.1.tgz", - "integrity": "sha512-94AS4BSIgRCMSHq8wcy3ztostjLK8cqjUX6DT5oWiYNs3uxLv5uk4yFMlzXBjo0I4TERLOZGn66q0xwb+xw5qw==", - "requires": { - "web-animation-club": "^0.6.0" - } - }, - "react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", - "requires": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "react-dom": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.0.0.tgz", - "integrity": "sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - } - }, - "react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "react-lazyload": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-lazyload/-/react-lazyload-3.2.0.tgz", - "integrity": "sha512-zJlrG8QyVZz4+xkYZH5v1w3YaP5wEFaYSUWC4CT9UXfK75IfRAIEdnyIUF+dXr3kX2MOtL1lUaZmaQZqrETwgw==" - }, - "react-loader-spinner": { - "version": "6.0.0-0", - "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-6.0.0-0.tgz", - "integrity": "sha512-ANUS2nWUNALH933d04IY3iT6aIYuizI6mQpzHjH5i4aKdnLhm68JLICd2CKdOgxCNixM5iKqA8QSNWBdKe4++g==", - "requires": { - "@babel/runtime": "^7.14.6", - "prop-types": "^15.8.1", - "styled-components": "^5.3.3", - "styled-tools": "^1.7.2", - "tslib": "^2.3.0" - } - }, - "react-pro-sidebar": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/react-pro-sidebar/-/react-pro-sidebar-0.7.1.tgz", - "integrity": "sha512-Iy1X8ce4t5Vqz4CsyzjwokGUE3/IObgmYzS0ins7/2eWKle0SMUPaWdgMKFIVjtVrMr5vmjPbRicq8FxnVaf8A==", - "requires": { - "@popperjs/core": "^2.4.0", - "classnames": "^2.2.6", - "react-slidedown": "^2.4.5", - "resize-observer-polyfill": "^1.5.1" - } - }, - "react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" - }, - "react-router": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", - "requires": { - "history": "^5.2.0" - } - }, - "react-router-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", - "requires": { - "history": "^5.2.0", - "react-router": "6.3.0" - } - }, - "react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", - "requires": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "fsevents": "^2.3.2", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - } - }, - "react-select": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.2.tgz", - "integrity": "sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ==", - "requires": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0" - } - }, - "react-slidedown": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/react-slidedown/-/react-slidedown-2.4.7.tgz", - "integrity": "sha512-HGDfrqo70r1WVE0DwrySPdCT27/2wcZaJYh5kOnmuPSCtjDDJrNkDdn4Ep/cma2VVfwupeAGhbc2pbrGThU6VQ==", - "requires": { - "tslib": "^2.0.0" - } - }, - "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - }, - "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" - }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", - "requires": { - "lru-cache": "^7.4.0" - } - }, - "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", - "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - } - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - } - }, - "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" - }, - "styled-components": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz", - "integrity": "sha512-ndETJ9RKaaL6q41B69WudeqLzOpY1A/ET/glXkNZ2T7dPjPqpPCXXQjDFYZWwNnE5co0wX+gTCqx9mfxTmSIPg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - } - }, - "styled-tools": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/styled-tools/-/styled-tools-1.7.2.tgz", - "integrity": "sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==" - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - } - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "tailwindcss": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", - "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", - "requires": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss": "^8.4.6", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" - }, - "tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "requires": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "requires": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "requires": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "requires": { - "punycode": "^2.1.1" - } - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-animation-club": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/web-animation-club/-/web-animation-club-0.6.0.tgz", - "integrity": "sha512-9W+EQu1HiaPLe/7WZlhJ2ULqQ4VL80RPDYW+ZcjfTKp6ayOuT1k3SVO6+tu0VBRmOqueJ/mrG+rjjInIv8Aglg==" - }, - "web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" - }, - "webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", - "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" - } - } - }, - "webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "requires": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - } - } - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "workbox-background-sync": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz", - "integrity": "sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g==", - "requires": { - "idb": "^6.1.4", - "workbox-core": "6.5.2" - } - }, - "workbox-broadcast-update": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz", - "integrity": "sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q==", - "requires": { - "workbox-core": "6.5.2" - } - }, - "workbox-build": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.2.tgz", - "integrity": "sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ==", - "requires": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.5.2", - "workbox-broadcast-update": "6.5.2", - "workbox-cacheable-response": "6.5.2", - "workbox-core": "6.5.2", - "workbox-expiration": "6.5.2", - "workbox-google-analytics": "6.5.2", - "workbox-navigation-preload": "6.5.2", - "workbox-precaching": "6.5.2", - "workbox-range-requests": "6.5.2", - "workbox-recipes": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2", - "workbox-streams": "6.5.2", - "workbox-sw": "6.5.2", - "workbox-window": "6.5.2" - }, - "dependencies": { - "@apideck/better-ajv-errors": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz", - "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==", - "requires": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "workbox-cacheable-response": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz", - "integrity": "sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg==", - "requires": { - "workbox-core": "6.5.2" - } - }, - "workbox-core": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.2.tgz", - "integrity": "sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ==" - }, - "workbox-expiration": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.2.tgz", - "integrity": "sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw==", - "requires": { - "idb": "^6.1.4", - "workbox-core": "6.5.2" - } - }, - "workbox-google-analytics": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz", - "integrity": "sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw==", - "requires": { - "workbox-background-sync": "6.5.2", - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "workbox-navigation-preload": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz", - "integrity": "sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg==", - "requires": { - "workbox-core": "6.5.2" - } - }, - "workbox-precaching": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.2.tgz", - "integrity": "sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w==", - "requires": { - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "workbox-range-requests": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz", - "integrity": "sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg==", - "requires": { - "workbox-core": "6.5.2" - } - }, - "workbox-recipes": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.2.tgz", - "integrity": "sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA==", - "requires": { - "workbox-cacheable-response": "6.5.2", - "workbox-core": "6.5.2", - "workbox-expiration": "6.5.2", - "workbox-precaching": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "workbox-routing": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.2.tgz", - "integrity": "sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA==", - "requires": { - "workbox-core": "6.5.2" - } - }, - "workbox-strategies": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.2.tgz", - "integrity": "sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw==", - "requires": { - "workbox-core": "6.5.2" - } - }, - "workbox-streams": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.2.tgz", - "integrity": "sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w==", - "requires": { - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2" - } - }, - "workbox-sw": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.2.tgz", - "integrity": "sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw==" - }, - "workbox-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ==", - "requires": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.5.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "workbox-window": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.2.tgz", - "integrity": "sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A==", - "requires": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.2" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 9a384f6..0000000 --- a/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "link-warden", - "version": "0.1.0", - "description": "A place for all your links and resources.", - "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^12.1.4", - "@testing-library/user-event": "^13.5.0", - "nanoid": "^3.3.4", - "react": "^18.0.0", - "react-awesome-button": "^6.5.1", - "react-dom": "^18.0.0", - "react-lazyload": "^3.2.0", - "react-loader-spinner": "^6.0.0-0", - "react-pro-sidebar": "^0.7.1", - "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", - "react-select": "^5.3.2", - "sass": "^1.53.0", - "web-vitals": "^2.1.4" - }, - "scripts": { - "start": " (cd api && npm run dev) & npm run go", - "go": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html deleted file mode 100644 index eea3d4c..0000000 --- a/public/index.html +++ /dev/null @@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8" /> - <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> - - <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/solid.css"> - - <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> - <title>LinkWarden - - - -
- - diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 1d998b2..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "short_name": "LinkWarden", - "name": "LinkWarden", - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index e9e57dc..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/src/App.js b/src/App.js deleted file mode 100644 index 6ca6822..0000000 --- a/src/App.js +++ /dev/null @@ -1,221 +0,0 @@ -import { useEffect, useState } from "react"; -import "./styles/App.css"; -import List from "./componets/List"; -import AddItem from "./componets/AddItem"; -import { API_HOST } from "./config"; -import Filters from "./componets/Filters"; -import sortList from "./modules/sortList"; -import filter from "./modules/filterData"; -import concatTags from "./modules/concatTags"; -import concatCollections from "./modules/concatCollections"; -import Loader from "./componets/Loader"; -import SideBar from "./componets/SideBar"; -import Tags from "./routes/Tags.js"; -import Collections from "./routes/Collections.js"; -import { Route, Routes } from "react-router-dom"; -import { AwesomeButton } from "react-awesome-button"; -import "react-awesome-button/dist/themes/theme-blue.css"; - -function App() { - const [data, setData] = useState([]), - [newBox, setNewBox] = useState(false), - [filterBox, setFilterBox] = useState(false), - [searchQuery, setSearchQuery] = useState(""), - [filterCheckbox, setFilterCheckbox] = useState([true, true, true]), - [sortBy, setSortBy] = useState(1), - [loader, setLoader] = useState(false), - [lightMode, setLightMode] = useState( - localStorage.getItem("light-mode") === "true" - ), - [toggle, setToggle] = useState(false); - - function SetLoader(x) { - setLoader(x); - } - - function handleFilterCheckbox(newVal) { - setFilterCheckbox(newVal); - } - - function exitAdding() { - setNewBox(false); - } - - function exitFilter() { - setFilterBox(false); - } - - function search(e) { - setSearchQuery(e.target.value); - } - - function handleSorting(e) { - setSortBy(e); - } - - function handleToggleSidebar() { - setToggle(!toggle); - } - - const filteredData = filter(data, searchQuery, filterCheckbox); - - async function fetchData() { - const res = await fetch(API_HOST + "/api"); - const resJSON = await res.json(); - const data = resJSON.reverse(); - setData(data); - } - - useEffect(() => { - const sortedData = sortList(data, sortBy); - setData(sortedData); - exitFilter(); - // eslint-disable-next-line - }, [sortBy, filterCheckbox]); - - useEffect(() => { - fetchData(); - // eslint-disable-next-line - }, []); - - useEffect(() => { - if (lightMode) { - document.body.classList.add("light"); - } else { - document.body.classList.remove("light"); - } - - localStorage.setItem("light-mode", lightMode); - }, [lightMode]); - - return ( -
- - -
-
-
- -  - -
- - - - setFilterBox(true)} - style={{ marginLeft: "10px" }} - > -  - - - setNewBox(true)} - style={{ marginLeft: "auto" }} - > -  - - - setLightMode(!lightMode)} - style={{ marginLeft: "10px" }} - > -
-
-
- - {filterBox ? ( - - ) : null} - - {newBox ? ( - concatTags(data)} - collections={() => concatCollections(data)} - /> - ) : null} - - {loader ? : null} -
- - - - -
- } - /> - - - } - /> - - - } - /> - - - ); -} - -export default App; diff --git a/src/componets/AddItem.js b/src/componets/AddItem.js deleted file mode 100644 index 40ed46f..0000000 --- a/src/componets/AddItem.js +++ /dev/null @@ -1,107 +0,0 @@ -import { useState } from "react"; -import "../styles/AddItem.css"; -import TagSelection from "./TagSelection"; -import addItem from "../modules/send"; -import CollectionSelection from "./CollectionSelection"; -import { AwesomeButton } from "react-awesome-button"; -import "react-awesome-button/dist/themes/theme-blue.css"; - -const AddItem = ({ - onExit, - reFetch, - tags, - collections, - SetLoader, - lightMode, -}) => { - const [name, setName] = useState(""), - [link, setLink] = useState(""), - [tag, setTag] = useState([]), - [collection, setCollection] = useState("Unsorted"); - - function newItem() { - SetLoader(true); - addItem(name, link, tag, collection, reFetch, onExit, SetLoader, "POST"); - } - - function SetName(e) { - setName(e.target.value); - } - - function SetLink(e) { - setLink(e.target.value); - } - - function SetTags(value) { - setTag(value.map((e) => e.value.toLowerCase())); - } - - function SetCollection(value) { - setCollection(value.value); - } - - function abort(e) { - if (e.target.className === "add-overlay") { - onExit(); - } - } - - return ( - <> -
-
-
-

New Link

-
-

- * Link: -

- -

- Name: (Optional) -

- -

- Tags: (Optional) -

- -

- Collections: (Optional) -

- -
- - Add  - -
-
-
-
- - ); -}; - -export default AddItem; diff --git a/src/componets/CollectionSelection.js b/src/componets/CollectionSelection.js deleted file mode 100644 index bab0ebe..0000000 --- a/src/componets/CollectionSelection.js +++ /dev/null @@ -1,81 +0,0 @@ -import CreatableSelect from "react-select/creatable"; - -export default function CollectionSelection({ - setCollection, - collections, - collection = "Unsorted", - lightMode, -}) { - const customStyles = { - container: (provided) => ({ - ...provided, - textShadow: "none", - }), - - placeholder: (provided) => ({ - ...provided, - color: "#a9a9a9", - }), - - option: (provided) => ({ - ...provided, - ':before': { - content: '""', - marginRight: 8, - }, - }), - - menu: (provided) => ({ - ...provided, - border: "solid", - borderWidth: "1px", - borderRadius: "0px", - borderColor: "rgb(141, 141, 141)", - opacity: "90%", - color: "gray", - background: lightMode ? "#e0e0e0" : "#273949", - boxShadow: - "rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px", - }), - - input: (provided) => ({ - ...provided, - color: lightMode ? "rgb(64, 64, 64)" : "white", - - }), - - singleValue: (provided) => ({ - ...provided, - ':before': { - content: '""', - marginRight: 8, - }, - color: lightMode ? "rgb(64, 64, 64)" : "white", - }), - - control: (provided) => ({ - ...provided, - background: lightMode ? "#e0e0e0" : "#273949", - borderWidth: "2px", - borderColor: lightMode ? "#1e88e5": "#e7f4ff", - borderRadius: "50px", - boxShadow: lightMode ? "0px 2px 0px #354c7d, 0px 3px 1px #363636" : "0px 2px 0px #c6e4ff, 0px 3px 1px #363636", - }), - }; - - const data = collections().map((e) => { - return { value: e, label: e }; - }); - - const defaultCollection = { value: collection, label: collection }; - - return ( - - ); -} diff --git a/src/componets/EditItem.js b/src/componets/EditItem.js deleted file mode 100644 index 3e6bffc..0000000 --- a/src/componets/EditItem.js +++ /dev/null @@ -1,144 +0,0 @@ -import { useState } from "react"; -import deleteEntity from "../modules/deleteEntity"; -import "../styles/AddItem.css"; -import TagSelection from "./TagSelection"; -import editItem from "../modules/send"; -import CollectionSelection from "./CollectionSelection"; -import { AwesomeButton } from "react-awesome-button"; -import "react-awesome-button/dist/themes/theme-blue.css"; - -const EditItem = ({ - tags, - collections, - item, - onExit, - SetLoader, - reFetch, - lightMode, -}) => { - const [name, setName] = useState(item.name), - [tag, setTag] = useState(item.tag), - [collection, setCollection] = useState(item.collection); - - function EditItem() { - SetLoader(true); - editItem( - name, - item.link, - tag, - collection, - reFetch, - onExit, - SetLoader, - "PUT", - item._id, - item.title, - item.date - ); - } - - function deleteItem() { - SetLoader(true); - deleteEntity(item._id, reFetch, onExit, SetLoader); - } - - function SetName(e) { - setName(e.target.value); - } - - function SetTags(value) { - setTag(value.map((e) => e.value.toLowerCase())); - } - - function SetCollection(value) { - setCollection(value.value); - } - - function abort(e) { - if (e.target.className === "add-overlay") { - onExit(); - } - } - - const url = new URL(item.link); - - return ( - <> -
-
-
-
-

Edit Link

- -  - -
-
-

- Link:{" "} - - {url.hostname} - -

-

- {item.title} -

- -

- Name: (Optional) -

- -

- Tags: (Optional) -

- -

- Collection: (Optional) -

- - - Update  - -
-
-
- - ); -}; - -export default EditItem; diff --git a/src/componets/Filters.js b/src/componets/Filters.js deleted file mode 100644 index b112fb2..0000000 --- a/src/componets/Filters.js +++ /dev/null @@ -1,153 +0,0 @@ -import "../styles/Filters.css"; -import { useState } from "react"; -import { AwesomeButton } from "react-awesome-button"; -import "react-awesome-button/dist/themes/theme-blue.css"; - -const Filters = ({ - filterCheckbox, - handleFilterCheckbox, - sortBy, - sort, - onExit, -}) => { - const [nameChecked, setNameChecked] = useState(filterCheckbox[0]), - [titleChecked, setTitleChecked] = useState(filterCheckbox[1]), - [tagChecked, setTagChecked] = useState(filterCheckbox[2]), - [radio, setRadio] = useState(sort); - - function abort(e) { - if (e.target.className === "filter-overlay") { - onExit(); - } - } - - function handleRadio(e) { - setRadio(e.target.value); - } - - function applyChanges() { - handleFilterCheckbox([nameChecked, titleChecked, tagChecked]); - sortBy(radio); - } - - return ( - <> -
-
-
-

Filter Results

- -
-
-

Sort By

- - - - - - -
- -
-

Include/Exclude

- - - -
-
- - - Apply  - -
-
- - ); -}; - -export default Filters; diff --git a/src/componets/List.js b/src/componets/List.js deleted file mode 100644 index b1f9927..0000000 --- a/src/componets/List.js +++ /dev/null @@ -1,122 +0,0 @@ -import "../styles/List.css"; -import LazyLoad from "react-lazyload"; -import ViewArchived from "./ViewArchived"; -import EditItem from "./EditItem"; -import { useState, useEffect } from "react"; -import { Link } from "react-router-dom"; -import NoResults from "./NoResults"; -import { - AwesomeButton -} from 'react-awesome-button'; -import 'react-awesome-button/dist/themes/theme-blue.css'; - -const List = ({ data, tags, collections, reFetch, SetLoader, lightMode }) => { - const [editBox, setEditBox] = useState(false), - [editIndex, setEditIndex] = useState(0), - [numberOfResults, setNumberOfResults] = useState(0); - - function edit(index) { - setEditBox(true); - setEditIndex(index); - } - - function exitEditing() { - setEditBox(false); - } - - useEffect(() => { - setNumberOfResults(data.length); - }, [data]); - - let currentPATH = new URL(window.location.href).pathname; - - return ( -
- {numberOfResults > 0 ? ( -

- {currentPATH === "/" ? null : Return to main page} {numberOfResults} {numberOfResults === 1 ? "Link " : "Links "} - found. -

- ) : null} - - {numberOfResults === 0 ? : null} - - {editBox ? ( - tags} - collections={() => collections} - onExit={exitEditing} - SetLoader={SetLoader} - reFetch={reFetch} - item={data[editIndex]} - /> - ) : null} - - {/* eslint-disable-next-line */} - {data.map((e, i) => { - try { - const url = new URL(e.link); - const favicon = - "https://www.google.com/s2/favicons?domain=" + url.hostname; - return ( - -
-
- -
-
- {i + 1} - {e.name + " "} - - ({url.hostname}) - -
-
{e.title}
-
- - {e.collection} - -
-
- {new Date(e.date).toDateString()} -
-
- {e.tag.map((e, i) => { - const tagPath = `/tags/${e}`; - return ( - - {e} - - ); - })} -
-
-
-
- - edit(i)} - style={{ margin: "20px 20px 20px 0px" }} - > -  - -
-
-
- ); - } catch (e) { - console.log(e); - } - })} -
- ); -}; - -export default List; diff --git a/src/componets/Loader.js b/src/componets/Loader.js deleted file mode 100644 index f60b308..0000000 --- a/src/componets/Loader.js +++ /dev/null @@ -1,12 +0,0 @@ -import "../styles/Loader.css"; -import { InfinitySpin } from "react-loader-spinner"; - -const Loader = ({ lightMode }) => { - return ( -
- -
- ); -}; - -export default Loader; diff --git a/src/componets/NoResults.js b/src/componets/NoResults.js deleted file mode 100644 index 09d9bc7..0000000 --- a/src/componets/NoResults.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -const NoResults = () => { - return ( -
-

¯\_(ツ)_/¯

-

Nothing found.

-
- ); -}; - -export default NoResults; diff --git a/src/componets/SideBar.js b/src/componets/SideBar.js deleted file mode 100644 index a408426..0000000 --- a/src/componets/SideBar.js +++ /dev/null @@ -1,101 +0,0 @@ -import { - ProSidebar, - SidebarHeader, - SidebarFooter, - SidebarContent, - Menu, - MenuItem, - SubMenu, -} from "react-pro-sidebar"; -// import "react-pro-sidebar/dist/css/styles.css"; -import "../styles/SideBar_S.scss"; -import "../styles/SideBar.css"; -import { Link } from "react-router-dom"; - -const SideBar = ({ tags, collections, handleToggleSidebar, toggle }) => { - const sortedTags = tags.sort((a, b) => { - const A = a.toLowerCase(), - B = b.toLowerCase(); - if (A < B) return -1; - if (A > B) return 1; - return 0; - }); - - const sortedCollections = collections - .sort((a, b) => { - const A = a.toLowerCase(), - B = b.toLowerCase(); - if (A < B) return -1; - if (A > B) return 1; - return 0; - }) - .filter((e) => { - return e !== "Unsorted"; - }); - - return ( - - -

LinkWarden

-
- - - }> - -
All
- -
- - }> - -
Unsorted
- -
- - } - suffix={{sortedCollections.length}} - title={
Collections
} - > - {sortedCollections.map((e, i) => { - const path = `/collections/${e}`; - return ( - } key={i}> - {e} - - ); - })} -
- - } - suffix={{sortedTags.length}} - title={
Tags
} - > - {sortedTags.map((e, i) => { - const path = `/tags/${e}`; - return ( - #} key={i}> - {e} - - ); - })} -
-
-
- -

- ©{new Date().getFullYear()} Made with 💙 by{" "} - Daniel 31X13 -

-
-
- ); -}; - -export default SideBar; diff --git a/src/componets/TagSelection.js b/src/componets/TagSelection.js deleted file mode 100644 index d9f5da9..0000000 --- a/src/componets/TagSelection.js +++ /dev/null @@ -1,81 +0,0 @@ -import CreatableSelect from "react-select/creatable"; - -export default function TagSelection({ setTags, tags, tag = [], lightMode }) { - const customStyles = { - container: (provided) => ({ - ...provided, - textShadow: "none", - }), - - placeholder: (provided) => ({ - ...provided, - color: "#a9a9a9", - }), - - option: (provided) => ({ - ...provided, - ':before': { - content: '"#"', - marginRight: 8, - }, - }), - - multiValueRemove: (provided) => ({ - ...provided, - color: "gray", - }), - - menu: (provided) => ({ - ...provided, - border: "solid", - borderWidth: "1px", - borderRadius: "0px", - borderColor: "rgb(141, 141, 141)", - opacity: "90%", - color: "gray", - background: lightMode ? "#e0e0e0" : "#273949", - boxShadow: - "rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px", - }), - - input: (provided) => ({ - ...provided, - color: lightMode ? "rgb(64, 64, 64)" : "white", - }), - - multiValueLabel: (provided) => ({ - ...provided, - ':before': { - content: '"#"', - marginRight: 4, - }, - }), - - control: (provided) => ({ - ...provided, - background: lightMode ? "#e0e0e0" : "#273949", - borderWidth: "2px", - borderColor: lightMode ? "#1e88e5": "#e7f4ff", - borderRadius: "50px", - boxShadow: lightMode ? "0px 2px 0px #354c7d, 0px 3px 1px #363636" : "0px 2px 0px #c6e4ff, 0px 3px 1px #363636", - }), - }; - - const data = tags().map((e) => { - return { value: e, label: e }; - }); - const defaultTags = tag.map((e) => { - return { value: e, label: e }; - }); - - return ( - - ); -} diff --git a/src/componets/ViewArchived.js b/src/componets/ViewArchived.js deleted file mode 100644 index ead8a97..0000000 --- a/src/componets/ViewArchived.js +++ /dev/null @@ -1,28 +0,0 @@ -import "../styles/ViewArchived.css"; -import { API_HOST } from "../config"; - -const ViewArchived = ({ id }) => { - const screenshotPath = - API_HOST + "/screenshots/" + id + ".png"; - const pdfPath = - API_HOST + "/pdfs/" + id + ".pdf"; - - return ( - - ); -}; - -export default ViewArchived; diff --git a/src/config.js b/src/config.js deleted file mode 100644 index a893fef..0000000 --- a/src/config.js +++ /dev/null @@ -1 +0,0 @@ -export const API_HOST = process.env.REACT_APP_API_HOST || "http://localhost:5500"; // API full address diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 0b0b6d5..0000000 --- a/src/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import "./styles/index.css"; -import App from "./App"; -import { BrowserRouter } from "react-router-dom"; - -const root = ReactDOM.createRoot(document.getElementById("root")); -root.render( - - - -); diff --git a/src/modules/concatCollections.js b/src/modules/concatCollections.js deleted file mode 100644 index f22315a..0000000 --- a/src/modules/concatCollections.js +++ /dev/null @@ -1,13 +0,0 @@ -const concatCollections = (data) => { - let collections = []; - - for (let i = 0; i < data.length; i++) { - collections = collections.concat(data[i].collection); - } - - collections = collections.filter((v, i, a) => a.indexOf(v) === i); - - return collections; -}; - -export default concatCollections; diff --git a/src/modules/concatTags.js b/src/modules/concatTags.js deleted file mode 100644 index 0d99303..0000000 --- a/src/modules/concatTags.js +++ /dev/null @@ -1,13 +0,0 @@ -const concatTags = (data) => { - let tags = []; - - for (let i = 0; i < data.length; i++) { - tags = tags.concat(data[i].tag); - } - - tags = tags.filter((v, i, a) => a.indexOf(v) === i); - - return tags; -}; - -export default concatTags; diff --git a/src/modules/deleteEntity.js b/src/modules/deleteEntity.js deleted file mode 100644 index 81314fe..0000000 --- a/src/modules/deleteEntity.js +++ /dev/null @@ -1,22 +0,0 @@ -import { API_HOST } from "../config"; - -const deleteEntity = (id, reFetch, onExit, SetLoader) => { - fetch(API_HOST + "/api", { - method: "DELETE", - body: JSON.stringify({ id }), - headers: { - "Content-type": "application/json; charset=UTF-8", - }, - }) - .then((res) => res.text()) - .then((message) => { - console.log(message); - }) - .then(() => onExit()) - .then(() => reFetch()) - .then(() => { - SetLoader(false); - }); -}; - -export default deleteEntity; diff --git a/src/modules/filterData.js b/src/modules/filterData.js deleted file mode 100644 index 5867bfe..0000000 --- a/src/modules/filterData.js +++ /dev/null @@ -1,29 +0,0 @@ -const filteredData = ( - data, - searchQuery, - filterCheckbox -) => { - return data.filter((e) => { - const linkName = e.name.toLowerCase().includes(searchQuery.toLowerCase()); - const websiteTitle = e.title.toLowerCase().includes(searchQuery.toLowerCase()); - const tags = e.tag.some((e) => e.includes(searchQuery.toLowerCase())); - - if (filterCheckbox.every(e => e === true)) { - return linkName || websiteTitle || tags; - } else if (filterCheckbox[0] && filterCheckbox[2]) { - return linkName || tags; - } else if (filterCheckbox[0] && filterCheckbox[1]) { - return linkName || websiteTitle; - } else if (filterCheckbox[2] && filterCheckbox[1]) { - return tags || websiteTitle; - } else if (filterCheckbox[0]) { - return linkName; - } else if (filterCheckbox[1]) { - return websiteTitle; - } else if (filterCheckbox[2]) { - return tags; - } - }); -}; - -export default filteredData; diff --git a/src/modules/send.js b/src/modules/send.js deleted file mode 100644 index e0107d5..0000000 --- a/src/modules/send.js +++ /dev/null @@ -1,62 +0,0 @@ -import { API_HOST } from "../config"; -import { nanoid } from "nanoid"; - -const addItem = async ( - name, - link, - tag, - collection, - reFetch, - onExit, - SetLoader, - method, - id = nanoid(), - title = "", - date = new Date().toString() -) => { - function isValidHttpUrl(string) { - let url; - - try { - url = new URL(string); - } catch (_) { - return false; - } - - return url.protocol === "http:" || url.protocol === "https:"; - } - - if (isValidHttpUrl(link)) { - fetch(API_HOST + "/api", { - method: method, - body: JSON.stringify({ - _id: id, - name: name, - title: title, - link: link, - tag: tag, - collection: collection, - date: date, - }), - headers: { - "Content-type": "application/json; charset=UTF-8", - }, - }) - .then((res) => res.text()) - .then(() => reFetch()) - .then(() => { - SetLoader(false); - }); - - onExit(); - } else if (!isValidHttpUrl(link) && link !== "") { - SetLoader(false); - alert( - 'Please make sure the link is valid.\n\n(i.e. starts with "http"/"https")' - ); - } else { - SetLoader(false); - } -}; - -export default addItem; diff --git a/src/modules/sortList.js b/src/modules/sortList.js deleted file mode 100644 index 9722820..0000000 --- a/src/modules/sortList.js +++ /dev/null @@ -1,48 +0,0 @@ -const sortList = (data, sortBy) => { - let sortedData = data; - if (sortBy.toString() === '1') { - sortedData.sort((a, b) => { - return new Date(b.date) - new Date(a.date); - }); - } else if (sortBy.toString() === '2') { - sortedData.sort((a, b) => { - return new Date(a.date) - new Date(b.date); - }); - } else if (sortBy.toString() === '3') { - sortedData.sort((a, b) => { - const A = a.name.toLowerCase(), - B = b.name.toLowerCase(); - if (A < B) return -1; - if (A > B) return 1; - return 0; - }); - } else if (sortBy.toString() === '4') { - sortedData.sort((a, b) => { - const A = a.name.toLowerCase(), - B = b.name.toLowerCase(); - if (A > B) return -1; - if (A < B) return 1; - return 0; - }); - } else if (sortBy.toString() === '5') { - sortedData.sort((a, b) => { - const A = a.title.toLowerCase(), - B = b.title.toLowerCase(); - if (A < B) return -1; - if (A > B) return 1; - return 0; - }); - } else if (sortBy.toString() === '6') { - sortedData.sort((a, b) => { - const A = a.title.toLowerCase(), - B = b.title.toLowerCase(); - if (A > B) return -1; - if (A < B) return 1; - return 0; - }); - } - - return sortedData; -}; - -export default sortList; diff --git a/src/routes/Collections.js b/src/routes/Collections.js deleted file mode 100644 index a08f196..0000000 --- a/src/routes/Collections.js +++ /dev/null @@ -1,24 +0,0 @@ -import { useParams } from "react-router-dom"; -import List from "../componets/List"; - -const Collections = ({ data, tags, collections, SetLoader, lightMode, reFetch }) => { - const { collectionId } = useParams(); - const dataWithMatchingTag = data.filter((e) => { - return e.collection.includes(collectionId); - }); - - return ( -
- -
- ); -}; - -export default Collections; diff --git a/src/routes/Tags.js b/src/routes/Tags.js deleted file mode 100644 index 1d2abb7..0000000 --- a/src/routes/Tags.js +++ /dev/null @@ -1,24 +0,0 @@ -import { useParams } from "react-router-dom"; -import List from "../componets/List"; - -const Tags = ({ data, tags, collections, SetLoader, lightMode, reFetch }) => { - const { tagId } = useParams(); - const dataWithMatchingTag = data.filter((e) => { - return e.tag.includes(tagId); - }); - - return ( -
- -
- ); -}; - -export default Tags; diff --git a/src/styles/AddItem.css b/src/styles/AddItem.css deleted file mode 100644 index a456290..0000000 --- a/src/styles/AddItem.css +++ /dev/null @@ -1,83 +0,0 @@ -@media (min-width: 800px) { - .box { - left: 30%; - right: 30%; - min-width: 300px; - } -} - -@media (max-width: 800px) { - .box { - left: 15%; - right: 15%; - min-width: 200px; - } -} - -.add-overlay { - animation: fadein 0.2s; - background-color: black; - opacity: 10%; - position: fixed; - top: 0; - left: 0; - bottom: 0; - width: 100vw; - z-index: 1; -} - -.send-box { - position: relative; -} - -.box { - border-radius: 50px; - animation: fadein 0.3s; - border: solid; - border-width: 1px; - border-color: rgb(141, 141, 141); - box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; - position: absolute; - z-index: 2; - overflow-x: hidden; - overflow-y: auto; -} - -.box h2 { - text-align: center; - font-size: 1.5rem; - font-weight: 400; -} - -.box h3 { - font-weight: 300; -} - -.AddItem-content { - padding: 20px; -} - -.AddItem-input { - font-size: 1rem; - padding: 10px; - width: 100%; - border-radius: 50px; -} - -@keyframes fadein { - from { - opacity: 0%; - } - to { - } -} - -.optional { - color: gray; - font-size: 0.8em; - float: right; -} - -.title { - font-size: 0.9em; -} diff --git a/src/styles/App.css b/src/styles/App.css deleted file mode 100644 index 8ca0884..0000000 --- a/src/styles/App.css +++ /dev/null @@ -1,55 +0,0 @@ -@media (width >= 650px) { - .search { - width: 35%; - min-width: 300px; - } -} - -@media (400px < width < 650px) { - .search { - width: 40%; - } -} - -@media (width <= 400px) { - .search { - width: 120px; - } -} - -@media (min-width: 993px) { - .content { - margin-left: 270px; - } - - .sidebar-btn { - display: none; - } -} - -.App { - min-height: 100vh; -} - -.content { - padding: 0px 20px 0 20px; -} - -.head { - padding-top: 20px; - display: flex; -} - -.search { - padding: 10px; - font-family: "Font Awesome 5 Free"; - padding-left: 10px; - font-size: 1rem; - border: solid; - border-radius: 50px; - border-width: 2px; -} - -.select { - font-family: "Font Awesome 5 Free"; -} diff --git a/src/styles/Filters.css b/src/styles/Filters.css deleted file mode 100644 index 4d069e0..0000000 --- a/src/styles/Filters.css +++ /dev/null @@ -1,81 +0,0 @@ -@media (min-width: 600px) { - .filter { - left: 10%; - right: 10%; - min-width: 200px; - } - - .filter-groups { - display: flex; - justify-content: space-evenly; - } -} - -@media (max-width: 600px) { - .filter { - left: 10%; - right: 10%; - min-width: 100px; - } -} - -.filter-overlay { - animation: fadein 0.2s; - background-color: black; - opacity: 10%; - position: fixed; - top: 0; - left: 0; - bottom: 0; - width: 100vw; - z-index: 1; -} - -.filter-box { - position: relative; -} - -.filter { - border-radius: 50px; - animation: fadein 0.3s; - border: solid; - border-width: 1px; - font-weight: 300; - border-color: rgb(141, 141, 141); - justify-content: center; - box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; - padding: 10px; - position: absolute; - -moz-user-select: none; - -webkit-user-select: none; - user-select: none; - z-index: 2; -} - -.filter h2 { - text-align: center; - font-size: 1.5rem; - font-weight: 400; -} - -.filter h3 { - font-weight: 300; -} - -.section > label { - display: block; - text-align: left; - margin-bottom: 10px; - font-family: "Font Awesome 5 Free"; - padding: 10px; - font-size: 1.1rem; - cursor: pointer; -} - -@keyframes fadein { - from { - opacity: 0%; - } - to { - } -} diff --git a/src/styles/List.css b/src/styles/List.css deleted file mode 100644 index 6eebee1..0000000 --- a/src/styles/List.css +++ /dev/null @@ -1,206 +0,0 @@ -@media (min-width: 650px) { - .list-entity-content { - margin-left: 70px; - padding: 20px; - } - - .tags { - margin: 10px 10px 10px 0px; - } - - .img-content-grp { - display: flex; - flex-direction: row; - align-items: center; - } - - .etc { - display: flex; - align-items: center; - } - - .list-row { - margin-bottom: 20px; - display: flex; - justify-content: space-between; - align-items: center; - } - - .list-row:hover img { - opacity: 90%; - } -} - -@media (max-width: 650px) { - .list-entity-content { - margin-top: 50px; - padding-left: 20px; - padding-right: 20px; - } - - .link { - display: block; - margin-left: 10px; - } - - .tags { - margin: 10px auto 10px auto; - justify-content: center; - } - - .list-row { - margin-bottom: 20px; - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - text-align: center; - } - .etc { - display: flex; - align-items: center; - } - - .img-content-grp { - display: flex; - flex-direction: column; - align-items: center; - } - - .date { - margin-left: auto; - } - - .title { - margin-right: auto; - margin-left: auto; - } -} - -.list { - width: 100%; - text-align: left; - border-spacing: 10px 10px; -} - -.list img { - pointer-events: none; - -moz-user-select: none; - -webkit-user-select: none; - user-select: none; - position: absolute; - filter: blur(5px); - opacity: 50%; - margin: 20px; - width: 100px; - height: 100px; - transition: opacity 0.3s ease-in-out; - will-change: transform, opacity; -} - -.list-entity-content { - z-index: 0; - justify-content: space-between; - display: flex; - flex-direction: column; -} - -.list a { - text-decoration: none; -} - -.link { - white-space: nowrap; - font-family: "Font Awesome 5 Free"; - pointer-events: all; - font-size: 1rem; -} - -.link::after { - content: " "; - opacity: 0%; - transition: opacity 0.1s; -} - -.link:hover::after { - opacity: 100%; -} - -.row-name { - font-size: 2rem; - word-break: break-word; -} - -.tags { - display: flex; - border-width: 1px; - width: fit-content; - font-size: 0.8rem; - border-radius: 5px; - flex-wrap: wrap; -} - -.tags a { - text-shadow: none; - margin: 5px; - color: inherit; -} - -.tags a::before { - color: rgb(0, 162, 255); - content: "# "; -} - -.num { - font-size: 1rem; - margin-right: 10px; - opacity: 80%; - display: inline; -} - -.date { - font-weight: 500; - font-size: 0.7rem; - opacity: 80%; - margin-right: auto; - margin-top: 10px; -} - -.no-results { - text-align: center; - padding-top: 5%; - padding-bottom: 5%; - margin-top: 20px; -} - -.edit-title { - display: inline; -} - -.title-delete-group { - text-align: center; - margin-top: 10px; -} - -.list-collection-label { - margin-top: 10px; -} - -.list-collection-label a::before { - font-family: "Font Awesome 5 Free"; - content: " "; -} - -.list-collection-label a { - opacity: 80%; - color: inherit; -} - -.return-btn { - color: inherit; - opacity: 80%; - padding: 5px; - font-size: small; - font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; - text-shadow: none; -} diff --git a/src/styles/Loader.css b/src/styles/Loader.css deleted file mode 100644 index eadbf3b..0000000 --- a/src/styles/Loader.css +++ /dev/null @@ -1,7 +0,0 @@ -.loader { - position: fixed; - bottom: 10%; - left: 30%; - right: 30%; - text-align: center; -} diff --git a/src/styles/SideBar.css b/src/styles/SideBar.css deleted file mode 100644 index f52ed2d..0000000 --- a/src/styles/SideBar.css +++ /dev/null @@ -1,55 +0,0 @@ -.sidebar { - height: 100vh; - position: fixed; -} - -.sidebar h2 { - text-align: center; -} - -.credits { - text-align: center; - font-size: small; -} - -.credits a { - color: inherit; - text-decoration: underline; -} - -.badge { - padding: 3px 10px; - font-size: 0.8rem; - letter-spacing: 1px; - border-radius: 14px; -} - -.sidebar-icon { - font-family: "Font Awesome 5 Free"; - font-size: 1rem; -} - -.menu-item { - color: rgb(255, 255, 255); -} - -.menu-item:hover { - color: rgb(255, 255, 255); -} - -.pro-inner-item { - margin-bottom: 10px; -} - -.sidebar-entity { - font-size: 1.2rem; -} - -.sidebar-item-prefix { - font-family: "Font Awesome 5 Free"; -} - -.pro-sidebar-layout * { - color: white; - text-shadow: none; -} diff --git a/src/styles/SideBar_S.scss b/src/styles/SideBar_S.scss deleted file mode 100644 index 48c4bc8..0000000 --- a/src/styles/SideBar_S.scss +++ /dev/null @@ -1,4 +0,0 @@ -$sidebar-bg-color: #373737; -$submenu-bg-color: #373737; - -@import '~react-pro-sidebar/dist/scss/styles.scss'; \ No newline at end of file diff --git a/src/styles/ViewArchived.css b/src/styles/ViewArchived.css deleted file mode 100644 index cf94677..0000000 --- a/src/styles/ViewArchived.css +++ /dev/null @@ -1,10 +0,0 @@ -.view-archived { - display: flex; - flex-direction: column; - text-align: left; -} - -.seperator { - width: 100%; - color: #1f2c38; -} diff --git a/src/styles/index.css b/src/styles/index.css deleted file mode 100644 index de9ed08..0000000 --- a/src/styles/index.css +++ /dev/null @@ -1,138 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background-color: #273949; - text-shadow: 0px 1px 2px #000000; - color: white; - transition: background-color 0.1s; -} - -*::selection { - background-color: black; - color: white; - text-shadow: none; -} - -/* Dark Mode settings (Default) */ - -.neumorphism { - border-radius: 50px; - background: #273949; - box-shadow: 5px 5px 10px #10171d, - -5px -5px 10px #3e5b75; -} - -.text-field { - background-color: #273949; - border: solid; - border-width: 2px; - color: White; - border-color: #e7f4ff; - box-shadow: 0px 2px 0px #c6e4ff, 0px 3px 1px #363636; - -webkit-appearance: none; - -webkit-box-shadow: 0px 2px 0px #c6e4ff, 0px 3px 1px #363636; -} - -.dark-light::before { - content: ""; -} - -.App .aws-btn { - font-family: "Font Awesome 5 Free"; - --button-default-height: 51px; - --button-default-font-size: 14px; - --button-default-border-radius: 25px; - --button-horizontal-padding: 20px; - --button-raise-level: 3px; - --button-hover-pressure: 0; - --transform-speed: 0.025s; - --button-primary-color: #273949; - --button-primary-color-dark: #c6e4ff; - --button-primary-color-light: #c6e4ff; - --button-primary-color-hover: #0d4a7f; - --button-primary-color-active: #0f5ca0; - --button-primary-border: 2px solid #e7f4ff; - z-index: 0; -} - -.title { - color: white; -} - -.link { - color: rgb(194, 193, 193); -} - -.search { - transition: background-color 0.1s; - background-color: #273949; - color: white; -} - -.filter, .box { - background-color: #273949; -} - -/* Light Mode settings */ - -.light .dark-light::before { - content: ""; -} - -.light { - text-shadow: 0px 1px 2px #ffffff; - background-color: #e0e0e0; - color: rgb(64, 64, 64); -} - -.light .neumorphism { - border-radius: 50px; - background: #e0e0e0; - box-shadow: 5px 5px 10px #5a5a5a, - -5px -5px 10px #ffffff; -} - -.light .title { - color: rgb(0, 0, 0); -} - -.light .text-field { - background-color: #e0e0e0; - border: solid; - border-width: 2px; - color: black; - border-color: #1e88e5; - box-shadow: 0px 2px 0px #354c7d, 0px 3px 1px #363636; - -webkit-appearance: none; - -webkit-box-shadow: 0px 2px 0px #354c7d, 0px 3px 1px #363636; -} - -.light .box, .light .filter { - background-color: #e0e0e0; -} - -.light .link { - color: rgb(102, 102, 102); -} - -.light .aws-btn { - font-family: "Font Awesome 5 Free"; - --button-default-height: 51px; - --button-default-font-size: 14px; - --button-default-border-radius: 25px; - --button-horizontal-padding: 20px; - --button-raise-level: 3px; - --button-hover-pressure: 0; - --transform-speed: 0.025s; - --button-primary-color: #e0e0e0; - --button-primary-color-dark: #354c7d; - --button-primary-color-light: #354c7d; - --button-primary-color-hover: #e1eaf1; - --button-primary-color-active: #e2e2e2; - --button-primary-border: 2px solid #1e88e5; - z-index: 0; -} From 75e5f52a91e778afd0ff87ebdd5c4fc30474c50e Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 5 Jan 2023 10:15:14 +0330 Subject: [PATCH 002/144] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f2accf..71e0956 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ ## A place for your useful links. -Rebuilding project from ground up... +Rebuilding things from ground up... From 31010c96e927bb399b73ca9270cbcaf858b8478f Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 23 Jan 2023 01:09:35 +0330 Subject: [PATCH 003/144] NextJS + Tailwind base setup. --- .eslintrc.json | 3 + .gitignore | 126 +-- SAMPLE_README.md | 38 + jsconfig.json | 8 + next.config.js | 6 + package.json | 28 + pages/_app.js | 5 + pages/_document.js | 13 + pages/api/hello.js | 5 + pages/index.js | 17 + postcss.config.js | 6 + public/favicon.ico | Bin 0 -> 25931 bytes styles/globals.css | 3 + tailwind.config.js | 12 + yarn.lock | 2296 ++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 2467 insertions(+), 99 deletions(-) create mode 100644 .eslintrc.json create mode 100644 SAMPLE_README.md create mode 100644 jsconfig.json create mode 100644 next.config.js create mode 100644 package.json create mode 100644 pages/_app.js create mode 100644 pages/_document.js create mode 100644 pages/api/hello.js create mode 100644 pages/index.js create mode 100644 postcss.config.js create mode 100644 public/favicon.ico create mode 100644 styles/globals.css create mode 100644 tailwind.config.js create mode 100644 yarn.lock diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.gitignore b/.gitignore index bb6fa4d..55175ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,104 +1,32 @@ -# Logs -logs -*.log +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug npm-debug.log* yarn-debug.log* yarn-error.log* -lerna-debug.log* +.pnpm-debug.log* -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json +# local env files +.env*.local -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port \ No newline at end of file +# vercel +.vercel diff --git a/SAMPLE_README.md b/SAMPLE_README.md new file mode 100644 index 0000000..ca8a3a2 --- /dev/null +++ b/SAMPLE_README.md @@ -0,0 +1,38 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..9c33383 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..a843cbe --- /dev/null +++ b/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +} + +module.exports = nextConfig diff --git a/package.json b/package.json new file mode 100644 index 0000000..c551455 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "link-warden", + "version": "3.0.0", + "main": "index.js", + "repository": "https://github.com/Daniel31x13/link-warden.git", + "author": "Daniel31X13 ", + "license": "MIT", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@next/font": "13.1.4", + "eslint": "8.32.0", + "eslint-config-next": "13.1.4", + "next": "13.1.4", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "autoprefixer": "^10.4.13", + "postcss": "^8.4.21", + "tailwindcss": "^3.2.4" + } +} diff --git a/pages/_app.js b/pages/_app.js new file mode 100644 index 0000000..2300201 --- /dev/null +++ b/pages/_app.js @@ -0,0 +1,5 @@ +import '@/styles/globals.css' + +export default function App({ Component, pageProps }) { + return +} diff --git a/pages/_document.js b/pages/_document.js new file mode 100644 index 0000000..54e8bf3 --- /dev/null +++ b/pages/_document.js @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + + + +
+ + + + ) +} diff --git a/pages/api/hello.js b/pages/api/hello.js new file mode 100644 index 0000000..df63de8 --- /dev/null +++ b/pages/api/hello.js @@ -0,0 +1,5 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction + +export default function handler(req, res) { + res.status(200).json({ name: 'John Doe' }) +} diff --git a/pages/index.js b/pages/index.js new file mode 100644 index 0000000..dd1f30b --- /dev/null +++ b/pages/index.js @@ -0,0 +1,17 @@ +import Head from "next/head"; + +export default function Home() { + return ( + <> + + Create Next App + + + + +
+

LinkWarden

+
+ + ); +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/styles/globals.css b/styles/globals.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/styles/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..87aedba --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./app/**/*.{js,ts,jsx,tsx}", + "./pages/**/*.{js,ts,jsx,tsx}", + "./components/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..e660f23 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2296 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@next/env@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.4.tgz#ed91156ee48791ad85992d95d8e1f46a740c0d5e" + integrity sha512-x7ydhMpi9/xX7yVK+Fw33OuwwQWVZUFRxenK3z89fmPzQZyUk35Ynb+b7JkrhfRhDIFFvvqpzVSXeseSlBAw7A== + +"@next/eslint-plugin-next@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.4.tgz#7dd5025d40b9564fc2cc1ea4aa9661a9552ec875" + integrity sha512-a/T30+7Q1scom5t3L+wEBkYzCa+bhT/3DTxzxlNy4Xckw2InzcckQGeIi/larDgh5r2fSSJswhYAZEcKtuJiig== + dependencies: + glob "7.1.7" + +"@next/font@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/font/-/font-13.1.4.tgz#091cfd2db6deb04c5e119d62941ede17e6304655" + integrity sha512-NfqQPAIFJhssdaZEsP0MADZKN+tc040jOkNKVlDZHtVjJWBJSgbe8UHg3w0S6YuQr7PHc0ACbFeVCBQeG4MEvg== + +"@next/swc-android-arm-eabi@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.4.tgz#7d258554b0812f693e91d1bfc940d0e386b394f7" + integrity sha512-5PAchzFst3In6Ml+9APvBj89H29lcPXcUqEYBVv09fWK/V4IuViKc2qOqM9pyPyw7KsqaZPmuqaG595E6jdZLA== + +"@next/swc-android-arm64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.4.tgz#03572661993ba554c4ac6a2b99c35b5062727489" + integrity sha512-LCLjjRhsQ5fR9ExzR2fqxuyJe/D4Ct/YkdonVfJfqOfkEpFwUTQDOVo5GrQec4LZDk3zY+o6vZYjXbB0nD9VLA== + +"@next/swc-darwin-arm64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.4.tgz#10189b4753b43941ffb0f396ee878176c8b4b662" + integrity sha512-LSc/tF1FQ1y1SwKiCdGg8IIl7+Csk6nuLcLIyQXs24UNYjXg5+7vUQXqE8y66v/Dq8qFDC9rM61QhpM9ZDftbg== + +"@next/swc-darwin-x64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.4.tgz#e6574b43699bfe74e38dd620fdaecd7a1676aa0a" + integrity sha512-WoApDo8xfafrNc9+Mz5MwGFKUwbDHsGqLleTGZ8upegwVqDyHsYzqJQudf+loqhV58oGTOqP1eWaHn2J7dijXA== + +"@next/swc-freebsd-x64@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.4.tgz#96e77d986bd22b08ce12d3a5fc884494328b94b2" + integrity sha512-fqNyeT8G4guN8AHPIoBRhGY2GJg89FyWpuwX4o0Y3vUy/84IGZpNst3paCzaYkQSqQE/AuCpkB7hKxkN7ittXw== + +"@next/swc-linux-arm-gnueabihf@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.4.tgz#91b035a6c88e8d583f8b9aef465b64d05ecd1f95" + integrity sha512-MEfm8OC1YR9/tYHUzlQsxcSmiuf8XdO7bqh5VtG4pilScjc5I5t+tQgIDgoDGePfh5W99W23hb3s6oCFrt99rw== + +"@next/swc-linux-arm64-gnu@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.4.tgz#15726af0ce29450ffde593e993b0ec1beba75154" + integrity sha512-2wgth/KsuODzW/E7jsRoWdhKmE5oZzXcBPvf9RW+ZpBNvYQkEDlzfLA7n8DtxTU8I4oMas0mdEPdCWXrSNnVZw== + +"@next/swc-linux-arm64-musl@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.4.tgz#74f449a2bb7b6f6fdaa67df0fa3665ee99a826b8" + integrity sha512-GdWhCRljsT7rNEElEsdu4RRppd+XaQOX1IJslsh/+HU6LsJGUE8tXpa68yJjCsHZHifkbdZNeCr5SYdsN6CbAA== + +"@next/swc-linux-x64-gnu@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.4.tgz#dfaed86d84f11ce6c14c267ead267eab7cbea66d" + integrity sha512-Rsk/ojwYqMskN2eo5hUSVe7UuMV/aSjmrmJ0BCFGFPfBY9sPgmYj/oXlDDN0y5lJD9acPuiBjknLWgnOnx5JIA== + +"@next/swc-linux-x64-musl@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.4.tgz#6f5f184967ba00379ac179546a9575bb7aff9c21" + integrity sha512-gKSVPozedA2gpA+vggYnAqpDuzWFed2oxFeXxHw0aW2ALdAZswAinn1ZwXEQ5fHnVguxjZhH0+2nBxpMdF8p5Q== + +"@next/swc-win32-arm64-msvc@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.4.tgz#ccfa61a8ea56b55d7251f32b6c518ed0962d2923" + integrity sha512-+kAXIIVb7Q4LCKmi7dn9qVlG1XUf3Chgj5Rwl0rAP4WBV2TnJIgsOEC24G1Mm3jjif+qXm7SJS9YZ9Yg3Y8sSQ== + +"@next/swc-win32-ia32-msvc@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.4.tgz#8d164ce4de9eeaf3400ad4becdd653f68f0d9527" + integrity sha512-EsfzAFBVaw1zg1FzlLMgRaTX/DKY+EnAvJ6mCIJMGeSOPIj4Oy6xF2yEQ3VaRkwFpAafHJH6JNB/CGrdKFCMXw== + +"@next/swc-win32-x64-msvc@13.1.4": + version "13.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.4.tgz#0eab48201b90e862c76add99c4feff00bfb0fb67" + integrity sha512-bygNjmnq+F9NqJXh7OfhJgqu6LGU29GNKQYVyZkxY/h5K0WWUvAE/VL+TdyMwbvQr9KByx5XLwORwetLxXCo4g== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@rushstack/eslint-patch@^1.1.3": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + +"@swc/helpers@0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@typescript-eslint/parser@^5.42.0": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.2.tgz#c9edef2a0922d26a37dba03be20c5fff378313b3" + integrity sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw== + dependencies: + "@typescript-eslint/scope-manager" "5.48.2" + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/typescript-estree" "5.48.2" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz#bb7676cb78f1e94921eaab637a4b5d596f838abc" + integrity sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw== + dependencies: + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/visitor-keys" "5.48.2" + +"@typescript-eslint/types@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.2.tgz#635706abb1ec164137f92148f06f794438c97b8e" + integrity sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA== + +"@typescript-eslint/typescript-estree@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz#6e206b462942b32383582a6c9251c05021cc21b0" + integrity sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg== + dependencies: + "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/visitor-keys" "5.48.2" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.48.2": + version "5.48.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz#c247582a0bcce467461d7b696513bf9455000060" + integrity sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ== + dependencies: + "@typescript-eslint/types" "5.48.2" + eslint-visitor-keys "^3.3.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.8.0: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.2.tgz#6e566ab2a3d29e415f5115bc0fd2597a5eb3e5e3" + integrity sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg== + +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001426: + version "1.0.30001446" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz#6d4ba828ab19f49f9bcd14a8430d30feebf1e0c5" + integrity sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.1" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-get-iterator@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.1.4.tgz#f77d3f62e1b62564bd5c88c27bb5a00eb786c565" + integrity sha512-r7n9V4/kkiDDVFfBwI3tviGUV/jUzGI0lY3JefxceYaU18gdk2kMgNPyhHobowu1+yHZpZi8iEzRtzeTrtGRLg== + dependencies: + "@next/eslint-plugin-next" "13.1.4" + "@rushstack/eslint-patch" "^1.1.3" + "@typescript-eslint/parser" "^5.42.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.26.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.31.7" + eslint-plugin-react-hooks "^4.5.0" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-import-resolver-typescript@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz#db5ed9e906651b7a59dd84870aaef0e78c663a05" + integrity sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.10.0" + get-tsconfig "^4.2.0" + globby "^13.1.2" + is-core-module "^2.10.0" + is-glob "^4.0.3" + synckit "^0.8.4" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.26.0: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-react-hooks@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.31.7: + version "7.32.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.1.tgz#88cdeb4065da8ca0b64e1274404f53a0f9890200" + integrity sha512-vOjdgyd0ZHBXNsmvU+785xY8Bfe57EFbTYYk8XrROzWpr9QBvpjITvAXt9xqcE6+8cjR/g1+mfumPToxsl1www== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@8.32.0: + version "8.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" + integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.3.0.tgz#4c26fae115d1050e836aea65d6fe56b507ee249b" + integrity sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.2: + version "13.1.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" + integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3, internal-slot@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + side-channel "^1.0.4" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.10.0, is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next@13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/next/-/next-13.1.4.tgz#fe13ff4a656153b6249c101d79a54569c0cd05e5" + integrity sha512-g0oBUU+tcOPKbXTVdsDO2adc6wd/ggqauHHysPQJxuIKqZ+fwICGJht0C5D5V0A/77eQDF5EFwNdAHkFvBDsog== + dependencies: + "@next/env" "13.1.4" + "@swc/helpers" "0.4.14" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-android-arm-eabi" "13.1.4" + "@next/swc-android-arm64" "13.1.4" + "@next/swc-darwin-arm64" "13.1.4" + "@next/swc-darwin-x64" "13.1.4" + "@next/swc-freebsd-x64" "13.1.4" + "@next/swc-linux-arm-gnueabihf" "13.1.4" + "@next/swc-linux-arm64-gnu" "13.1.4" + "@next/swc-linux-arm64-musl" "13.1.4" + "@next/swc-linux-x64-gnu" "13.1.4" + "@next/swc-linux-x64-musl" "13.1.4" + "@next/swc-win32-arm64-msvc" "13.1.4" + "@next/swc-win32-ia32-msvc" "13.1.4" + "@next/swc-win32-x64-msvc" "13.1.4" + +node-releases@^2.0.6: + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.18, postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" + integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.4.0" + +tailwindcss@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" + integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.18" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 4cd0e8799c1c7bcb764ad0132ba0545edbe2982a Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 29 Jan 2023 21:42:36 +0330 Subject: [PATCH 004/144] Replaced JavaScript with TypeScript. --- .gitignore | 4 + SAMPLE_README.md => SAMPLE.README.md | 4 +- jsconfig.json | 8 - package.json | 16 +- pages/_app.js | 5 - pages/{index.js => _app.tsx} | 8 +- pages/{_document.js => _document.tsx} | 0 pages/api/hello.js | 5 - pages/api/hello.ts | 13 ++ pages/index.tsx | 9 + tsconfig.json | 24 ++ yarn.lock | 325 +++++++++++++++----------- 12 files changed, 249 insertions(+), 172 deletions(-) rename SAMPLE_README.md => SAMPLE.README.md (93%) delete mode 100644 jsconfig.json delete mode 100644 pages/_app.js rename pages/{index.js => _app.tsx} (65%) rename pages/{_document.js => _document.tsx} (100%) delete mode 100644 pages/api/hello.js create mode 100644 pages/api/hello.ts create mode 100644 pages/index.tsx create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 55175ef..c87c9b3 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,7 @@ yarn-error.log* # vercel .vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/SAMPLE_README.md b/SAMPLE.README.md similarity index 93% rename from SAMPLE_README.md rename to SAMPLE.README.md index ca8a3a2..965a122 100644 --- a/SAMPLE_README.md +++ b/SAMPLE.README.md @@ -14,9 +14,9 @@ pnpm dev Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. -[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index 9c33383..0000000 --- a/jsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./*"] - } - } -} diff --git a/package.json b/package.json index c551455..d7bba0c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "link-warden", + "name": "linkwarden", "version": "3.0.0", "main": "index.js", "repository": "https://github.com/Daniel31x13/link-warden.git", @@ -13,12 +13,16 @@ "lint": "next lint" }, "dependencies": { - "@next/font": "13.1.4", - "eslint": "8.32.0", - "eslint-config-next": "13.1.4", - "next": "13.1.4", + "@next/font": "13.1.6", + "@types/node": "18.11.18", + "@types/react": "18.0.27", + "@types/react-dom": "18.0.10", + "eslint": "8.33.0", + "eslint-config-next": "13.1.6", + "next": "13.1.6", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "typescript": "4.9.4" }, "devDependencies": { "autoprefixer": "^10.4.13", diff --git a/pages/_app.js b/pages/_app.js deleted file mode 100644 index 2300201..0000000 --- a/pages/_app.js +++ /dev/null @@ -1,5 +0,0 @@ -import '@/styles/globals.css' - -export default function App({ Component, pageProps }) { - return -} diff --git a/pages/index.js b/pages/_app.tsx similarity index 65% rename from pages/index.js rename to pages/_app.tsx index dd1f30b..39ac0e9 100644 --- a/pages/index.js +++ b/pages/_app.tsx @@ -1,6 +1,8 @@ +import "@/styles/globals.css"; +import type { AppProps } from "next/app"; import Head from "next/head"; -export default function Home() { +export default function App({ Component, pageProps }: AppProps) { return ( <> @@ -9,9 +11,7 @@ export default function Home() { -
-

LinkWarden

-
+ ); } diff --git a/pages/_document.js b/pages/_document.tsx similarity index 100% rename from pages/_document.js rename to pages/_document.tsx diff --git a/pages/api/hello.js b/pages/api/hello.js deleted file mode 100644 index df63de8..0000000 --- a/pages/api/hello.js +++ /dev/null @@ -1,5 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction - -export default function handler(req, res) { - res.status(200).json({ name: 'John Doe' }) -} diff --git a/pages/api/hello.ts b/pages/api/hello.ts new file mode 100644 index 0000000..f8bcc7e --- /dev/null +++ b/pages/api/hello.ts @@ -0,0 +1,13 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import type { NextApiRequest, NextApiResponse } from 'next' + +type Data = { + name: string +} + +export default function handler( + req: NextApiRequest, + res: NextApiResponse +) { + res.status(200).json({ name: 'John Doe' }) +} diff --git a/pages/index.tsx b/pages/index.tsx new file mode 100644 index 0000000..697a105 --- /dev/null +++ b/pages/index.tsx @@ -0,0 +1,9 @@ +export default function Home() { + return ( + <> +
+

Linkwarden

+
+ + ); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f4ab65f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "baseUrl": ".", + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock index e660f23..09f94bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43,87 +43,87 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@next/env@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.4.tgz#ed91156ee48791ad85992d95d8e1f46a740c0d5e" - integrity sha512-x7ydhMpi9/xX7yVK+Fw33OuwwQWVZUFRxenK3z89fmPzQZyUk35Ynb+b7JkrhfRhDIFFvvqpzVSXeseSlBAw7A== +"@next/env@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.6.tgz#c4925609f16142ded1a5cb833359ab17359b7a93" + integrity sha512-s+W9Fdqh5MFk6ECrbnVmmAOwxKQuhGMT7xXHrkYIBMBcTiOqNWhv5KbJIboKR5STXxNXl32hllnvKaffzFaWQg== -"@next/eslint-plugin-next@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.4.tgz#7dd5025d40b9564fc2cc1ea4aa9661a9552ec875" - integrity sha512-a/T30+7Q1scom5t3L+wEBkYzCa+bhT/3DTxzxlNy4Xckw2InzcckQGeIi/larDgh5r2fSSJswhYAZEcKtuJiig== +"@next/eslint-plugin-next@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.6.tgz#ad8be22dd3d8aee9a9bd9a2507e2c55a2f7ebdd9" + integrity sha512-o7cauUYsXjzSJkay8wKjpKJf2uLzlggCsGUkPu3lP09Pv97jYlekTC20KJrjQKmSv5DXV0R/uks2ZXhqjNkqAw== dependencies: glob "7.1.7" -"@next/font@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/font/-/font-13.1.4.tgz#091cfd2db6deb04c5e119d62941ede17e6304655" - integrity sha512-NfqQPAIFJhssdaZEsP0MADZKN+tc040jOkNKVlDZHtVjJWBJSgbe8UHg3w0S6YuQr7PHc0ACbFeVCBQeG4MEvg== +"@next/font@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/font/-/font-13.1.6.tgz#2bf99e3321ec9b4d65781c0d0ebff072e8752e1a" + integrity sha512-AITjmeb1RgX1HKMCiA39ztx2mxeAyxl4ljv2UoSBUGAbFFMg8MO7YAvjHCgFhD39hL7YTbFjol04e/BPBH5RzQ== -"@next/swc-android-arm-eabi@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.4.tgz#7d258554b0812f693e91d1bfc940d0e386b394f7" - integrity sha512-5PAchzFst3In6Ml+9APvBj89H29lcPXcUqEYBVv09fWK/V4IuViKc2qOqM9pyPyw7KsqaZPmuqaG595E6jdZLA== +"@next/swc-android-arm-eabi@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.6.tgz#d766dfc10e27814d947b20f052067c239913dbcc" + integrity sha512-F3/6Z8LH/pGlPzR1AcjPFxx35mPqjE5xZcf+IL+KgbW9tMkp7CYi1y7qKrEWU7W4AumxX/8OINnDQWLiwLasLQ== -"@next/swc-android-arm64@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.4.tgz#03572661993ba554c4ac6a2b99c35b5062727489" - integrity sha512-LCLjjRhsQ5fR9ExzR2fqxuyJe/D4Ct/YkdonVfJfqOfkEpFwUTQDOVo5GrQec4LZDk3zY+o6vZYjXbB0nD9VLA== +"@next/swc-android-arm64@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.6.tgz#f37a98d5f18927d8c9970d750d516ac779465176" + integrity sha512-cMwQjnB8vrYkWyK/H0Rf2c2pKIH4RGjpKUDvbjVAit6SbwPDpmaijLio0LWFV3/tOnY6kvzbL62lndVA0mkYpw== -"@next/swc-darwin-arm64@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.4.tgz#10189b4753b43941ffb0f396ee878176c8b4b662" - integrity sha512-LSc/tF1FQ1y1SwKiCdGg8IIl7+Csk6nuLcLIyQXs24UNYjXg5+7vUQXqE8y66v/Dq8qFDC9rM61QhpM9ZDftbg== +"@next/swc-darwin-arm64@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.6.tgz#ec1b90fd9bf809d8b81004c5182e254dced4ad96" + integrity sha512-KKRQH4DDE4kONXCvFMNBZGDb499Hs+xcFAwvj+rfSUssIDrZOlyfJNy55rH5t2Qxed1e4K80KEJgsxKQN1/fyw== -"@next/swc-darwin-x64@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.4.tgz#e6574b43699bfe74e38dd620fdaecd7a1676aa0a" - integrity sha512-WoApDo8xfafrNc9+Mz5MwGFKUwbDHsGqLleTGZ8upegwVqDyHsYzqJQudf+loqhV58oGTOqP1eWaHn2J7dijXA== +"@next/swc-darwin-x64@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.6.tgz#e869ac75d16995eee733a7d1550322d9051c1eb4" + integrity sha512-/uOky5PaZDoaU99ohjtNcDTJ6ks/gZ5ykTQDvNZDjIoCxFe3+t06bxsTPY6tAO6uEAw5f6vVFX5H5KLwhrkZCA== -"@next/swc-freebsd-x64@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.4.tgz#96e77d986bd22b08ce12d3a5fc884494328b94b2" - integrity sha512-fqNyeT8G4guN8AHPIoBRhGY2GJg89FyWpuwX4o0Y3vUy/84IGZpNst3paCzaYkQSqQE/AuCpkB7hKxkN7ittXw== +"@next/swc-freebsd-x64@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.6.tgz#84a7b2e423a2904afc2edca21c2f1ba6b53fa4c1" + integrity sha512-qaEALZeV7to6weSXk3Br80wtFQ7cFTpos/q+m9XVRFggu+8Ib895XhMWdJBzew6aaOcMvYR6KQ6JmHA2/eMzWw== -"@next/swc-linux-arm-gnueabihf@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.4.tgz#91b035a6c88e8d583f8b9aef465b64d05ecd1f95" - integrity sha512-MEfm8OC1YR9/tYHUzlQsxcSmiuf8XdO7bqh5VtG4pilScjc5I5t+tQgIDgoDGePfh5W99W23hb3s6oCFrt99rw== +"@next/swc-linux-arm-gnueabihf@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.6.tgz#980eed1f655ff8a72187d8a6ef9e73ac39d20d23" + integrity sha512-OybkbC58A1wJ+JrJSOjGDvZzrVEQA4sprJejGqMwiZyLqhr9Eo8FXF0y6HL+m1CPCpPhXEHz/2xKoYsl16kNqw== -"@next/swc-linux-arm64-gnu@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.4.tgz#15726af0ce29450ffde593e993b0ec1beba75154" - integrity sha512-2wgth/KsuODzW/E7jsRoWdhKmE5oZzXcBPvf9RW+ZpBNvYQkEDlzfLA7n8DtxTU8I4oMas0mdEPdCWXrSNnVZw== +"@next/swc-linux-arm64-gnu@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.6.tgz#87a71db21cded3f7c63d1d19079845c59813c53d" + integrity sha512-yCH+yDr7/4FDuWv6+GiYrPI9kcTAO3y48UmaIbrKy8ZJpi7RehJe3vIBRUmLrLaNDH3rY1rwoHi471NvR5J5NQ== -"@next/swc-linux-arm64-musl@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.4.tgz#74f449a2bb7b6f6fdaa67df0fa3665ee99a826b8" - integrity sha512-GdWhCRljsT7rNEElEsdu4RRppd+XaQOX1IJslsh/+HU6LsJGUE8tXpa68yJjCsHZHifkbdZNeCr5SYdsN6CbAA== +"@next/swc-linux-arm64-musl@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.6.tgz#c5aac8619331b9fd030603bbe2b36052011e11de" + integrity sha512-ECagB8LGX25P9Mrmlc7Q/TQBb9rGScxHbv/kLqqIWs2fIXy6Y/EiBBiM72NTwuXUFCNrWR4sjUPSooVBJJ3ESQ== -"@next/swc-linux-x64-gnu@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.4.tgz#dfaed86d84f11ce6c14c267ead267eab7cbea66d" - integrity sha512-Rsk/ojwYqMskN2eo5hUSVe7UuMV/aSjmrmJ0BCFGFPfBY9sPgmYj/oXlDDN0y5lJD9acPuiBjknLWgnOnx5JIA== +"@next/swc-linux-x64-gnu@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.6.tgz#9513d36d540bbfea575576746736054c31aacdea" + integrity sha512-GT5w2mruk90V/I5g6ScuueE7fqj/d8Bui2qxdw6lFxmuTgMeol5rnzAv4uAoVQgClOUO/MULilzlODg9Ib3Y4Q== -"@next/swc-linux-x64-musl@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.4.tgz#6f5f184967ba00379ac179546a9575bb7aff9c21" - integrity sha512-gKSVPozedA2gpA+vggYnAqpDuzWFed2oxFeXxHw0aW2ALdAZswAinn1ZwXEQ5fHnVguxjZhH0+2nBxpMdF8p5Q== +"@next/swc-linux-x64-musl@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.6.tgz#d61fc6884899f5957251f4ce3f522e34a2c479b7" + integrity sha512-keFD6KvwOPzmat4TCnlnuxJCQepPN+8j3Nw876FtULxo8005Y9Ghcl7ACcR8GoiKoddAq8gxNBrpjoxjQRHeAQ== -"@next/swc-win32-arm64-msvc@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.4.tgz#ccfa61a8ea56b55d7251f32b6c518ed0962d2923" - integrity sha512-+kAXIIVb7Q4LCKmi7dn9qVlG1XUf3Chgj5Rwl0rAP4WBV2TnJIgsOEC24G1Mm3jjif+qXm7SJS9YZ9Yg3Y8sSQ== +"@next/swc-win32-arm64-msvc@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.6.tgz#fac2077a8ae9768e31444c9ae90807e64117cda7" + integrity sha512-OwertslIiGQluFvHyRDzBCIB07qJjqabAmINlXUYt7/sY7Q7QPE8xVi5beBxX/rxTGPIbtyIe3faBE6Z2KywhQ== -"@next/swc-win32-ia32-msvc@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.4.tgz#8d164ce4de9eeaf3400ad4becdd653f68f0d9527" - integrity sha512-EsfzAFBVaw1zg1FzlLMgRaTX/DKY+EnAvJ6mCIJMGeSOPIj4Oy6xF2yEQ3VaRkwFpAafHJH6JNB/CGrdKFCMXw== +"@next/swc-win32-ia32-msvc@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.6.tgz#498bc11c91b4c482a625bf4b978f98ae91111e46" + integrity sha512-g8zowiuP8FxUR9zslPmlju7qYbs2XBtTLVSxVikPtUDQedhcls39uKYLvOOd1JZg0ehyhopobRoH1q+MHlIN/w== -"@next/swc-win32-x64-msvc@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.4.tgz#0eab48201b90e862c76add99c4feff00bfb0fb67" - integrity sha512-bygNjmnq+F9NqJXh7OfhJgqu6LGU29GNKQYVyZkxY/h5K0WWUvAE/VL+TdyMwbvQr9KByx5XLwORwetLxXCo4g== +"@next/swc-win32-x64-msvc@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.6.tgz#17ed919c723426b7d0ce1cd73d40ce3dcd342089" + integrity sha512-Ls2OL9hi3YlJKGNdKv8k3X/lLgc3VmLG3a/DeTkAd+lAituJp8ZHmRmm9f9SL84fT3CotlzcgbdaCDfFwFA6bA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -175,48 +175,79 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@typescript-eslint/parser@^5.42.0": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.2.tgz#c9edef2a0922d26a37dba03be20c5fff378313b3" - integrity sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw== +"@types/node@18.11.18": + version "18.11.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@18.0.10": + version "18.0.10" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" + integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== dependencies: - "@typescript-eslint/scope-manager" "5.48.2" - "@typescript-eslint/types" "5.48.2" - "@typescript-eslint/typescript-estree" "5.48.2" + "@types/react" "*" + +"@types/react@*", "@types/react@18.0.27": + version "18.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@typescript-eslint/parser@^5.42.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.49.0.tgz#d699734b2f20e16351e117417d34a2bc9d7c4b90" + integrity sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg== + dependencies: + "@typescript-eslint/scope-manager" "5.49.0" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/typescript-estree" "5.49.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz#bb7676cb78f1e94921eaab637a4b5d596f838abc" - integrity sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw== +"@typescript-eslint/scope-manager@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz#81b5d899cdae446c26ddf18bd47a2f5484a8af3e" + integrity sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ== dependencies: - "@typescript-eslint/types" "5.48.2" - "@typescript-eslint/visitor-keys" "5.48.2" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/visitor-keys" "5.49.0" -"@typescript-eslint/types@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.2.tgz#635706abb1ec164137f92148f06f794438c97b8e" - integrity sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA== +"@typescript-eslint/types@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.49.0.tgz#ad66766cb36ca1c89fcb6ac8b87ec2e6dac435c3" + integrity sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg== -"@typescript-eslint/typescript-estree@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz#6e206b462942b32383582a6c9251c05021cc21b0" - integrity sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg== +"@typescript-eslint/typescript-estree@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz#ebd6294c0ea97891fce6af536048181e23d729c8" + integrity sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA== dependencies: - "@typescript-eslint/types" "5.48.2" - "@typescript-eslint/visitor-keys" "5.48.2" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/visitor-keys" "5.49.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz#c247582a0bcce467461d7b696513bf9455000060" - integrity sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ== +"@typescript-eslint/visitor-keys@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz#2561c4da3f235f5c852759bf6c5faec7524f90fe" + integrity sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg== dependencies: - "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/types" "5.49.0" eslint-visitor-keys "^3.3.0" acorn-jsx@^5.3.2: @@ -244,9 +275,9 @@ acorn@^7.0.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" @@ -365,9 +396,9 @@ available-typed-arrays@^1.0.5: integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.2.tgz#6e566ab2a3d29e415f5115bc0fd2597a5eb3e5e3" - integrity sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg== + version "4.6.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" + integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== axobject-query@^3.1.1: version "3.1.1" @@ -430,9 +461,9 @@ camelcase-css@^2.0.1: integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001426: - version "1.0.30001446" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz#6d4ba828ab19f49f9bcd14a8430d30feebf1e0c5" - integrity sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw== + version "1.0.30001449" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz#a8d11f6a814c75c9ce9d851dc53eb1d1dfbcd657" + integrity sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw== chalk@^4.0.0: version "4.1.2" @@ -493,6 +524,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -705,12 +741,12 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-next@13.1.4: - version "13.1.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.1.4.tgz#f77d3f62e1b62564bd5c88c27bb5a00eb786c565" - integrity sha512-r7n9V4/kkiDDVFfBwI3tviGUV/jUzGI0lY3JefxceYaU18gdk2kMgNPyhHobowu1+yHZpZi8iEzRtzeTrtGRLg== +eslint-config-next@13.1.6: + version "13.1.6" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.1.6.tgz#ab6894fe5b80080f1e9b9306d1c4b0003230620e" + integrity sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw== dependencies: - "@next/eslint-plugin-next" "13.1.4" + "@next/eslint-plugin-next" "13.1.6" "@rushstack/eslint-patch" "^1.1.3" "@typescript-eslint/parser" "^5.42.0" eslint-import-resolver-node "^0.3.6" @@ -798,9 +834,9 @@ eslint-plugin-react-hooks@^4.5.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.31.7: - version "7.32.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.1.tgz#88cdeb4065da8ca0b64e1274404f53a0f9890200" - integrity sha512-vOjdgyd0ZHBXNsmvU+785xY8Bfe57EFbTYYk8XrROzWpr9QBvpjITvAXt9xqcE6+8cjR/g1+mfumPToxsl1www== + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" @@ -843,10 +879,10 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.32.0: - version "8.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" - integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== +eslint@8.33.0: + version "8.33.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7" + integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA== dependencies: "@eslint/eslintrc" "^1.4.1" "@humanwhocodes/config-array" "^0.11.8" @@ -1092,9 +1128,9 @@ glob@^7.1.3: path-is-absolute "^1.0.0" globals@^13.19.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" @@ -1558,30 +1594,30 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@13.1.4: - version "13.1.4" - resolved "https://registry.yarnpkg.com/next/-/next-13.1.4.tgz#fe13ff4a656153b6249c101d79a54569c0cd05e5" - integrity sha512-g0oBUU+tcOPKbXTVdsDO2adc6wd/ggqauHHysPQJxuIKqZ+fwICGJht0C5D5V0A/77eQDF5EFwNdAHkFvBDsog== +next@13.1.6: + version "13.1.6" + resolved "https://registry.yarnpkg.com/next/-/next-13.1.6.tgz#054babe20b601f21f682f197063c9b0b32f1a27c" + integrity sha512-hHlbhKPj9pW+Cymvfzc15lvhaOZ54l+8sXDXJWm3OBNBzgrVj6hwGPmqqsXg40xO1Leq+kXpllzRPuncpC0Phw== dependencies: - "@next/env" "13.1.4" + "@next/env" "13.1.6" "@swc/helpers" "0.4.14" caniuse-lite "^1.0.30001406" postcss "8.4.14" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-android-arm-eabi" "13.1.4" - "@next/swc-android-arm64" "13.1.4" - "@next/swc-darwin-arm64" "13.1.4" - "@next/swc-darwin-x64" "13.1.4" - "@next/swc-freebsd-x64" "13.1.4" - "@next/swc-linux-arm-gnueabihf" "13.1.4" - "@next/swc-linux-arm64-gnu" "13.1.4" - "@next/swc-linux-arm64-musl" "13.1.4" - "@next/swc-linux-x64-gnu" "13.1.4" - "@next/swc-linux-x64-musl" "13.1.4" - "@next/swc-win32-arm64-msvc" "13.1.4" - "@next/swc-win32-ia32-msvc" "13.1.4" - "@next/swc-win32-x64-msvc" "13.1.4" + "@next/swc-android-arm-eabi" "13.1.6" + "@next/swc-android-arm64" "13.1.6" + "@next/swc-darwin-arm64" "13.1.6" + "@next/swc-darwin-x64" "13.1.6" + "@next/swc-freebsd-x64" "13.1.6" + "@next/swc-linux-arm-gnueabihf" "13.1.6" + "@next/swc-linux-arm64-gnu" "13.1.6" + "@next/swc-linux-arm64-musl" "13.1.6" + "@next/swc-linux-x64-gnu" "13.1.6" + "@next/swc-linux-x64-musl" "13.1.6" + "@next/swc-win32-arm64-msvc" "13.1.6" + "@next/swc-win32-ia32-msvc" "13.1.6" + "@next/swc-win32-x64-msvc" "13.1.6" node-releases@^2.0.6: version "2.0.8" @@ -2086,12 +2122,12 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== synckit@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" - integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== dependencies: "@pkgr/utils" "^2.3.1" - tslib "^2.4.0" + tslib "^2.5.0" tailwindcss@^3.2.4: version "3.2.4" @@ -2162,10 +2198,10 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.4.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tsutils@^3.21.0: version "3.21.0" @@ -2195,6 +2231,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typescript@4.9.4: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" From 882bbd64d14f838dc28d01f1c414f5732ac934ff Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 31 Jan 2023 15:06:56 +0330 Subject: [PATCH 005/144] User registration. --- .env | 1 + lib/db.ts | 11 +++ package.json | 2 + pages/api/hello.ts | 12 ++-- pages/api/register.ts | 43 ++++++++++++ pages/index.tsx | 8 +-- pages/login.tsx | 0 pages/register.tsx | 69 +++++++++++++++++++ .../migrations/20230130215222_/migration.sql | 32 +++++++++ prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 37 ++++++++++ yarn.lock | 24 +++++++ 12 files changed, 231 insertions(+), 11 deletions(-) create mode 100644 .env create mode 100644 lib/db.ts create mode 100644 pages/api/register.ts create mode 100644 pages/login.tsx create mode 100644 pages/register.tsx create mode 100644 prisma/migrations/20230130215222_/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma diff --git a/.env b/.env new file mode 100644 index 0000000..081adb0 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +DATABASE_URL="postgresql://daniel:password@localhost:5432/mydb?schema=public" \ No newline at end of file diff --git a/lib/db.ts b/lib/db.ts new file mode 100644 index 0000000..8919c42 --- /dev/null +++ b/lib/db.ts @@ -0,0 +1,11 @@ +import { PrismaClient } from "@prisma/client"; + +const globalForPrisma = global as unknown as { prisma: PrismaClient }; + +export const prisma = + globalForPrisma.prisma || + new PrismaClient({ + log: ["query"], + }); + +if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma; diff --git a/package.json b/package.json index d7bba0c..fe5150e 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "@next/font": "13.1.6", + "@prisma/client": "^4.9.0", "@types/node": "18.11.18", "@types/react": "18.0.27", "@types/react-dom": "18.0.10", @@ -27,6 +28,7 @@ "devDependencies": { "autoprefixer": "^10.4.13", "postcss": "^8.4.21", + "prisma": "^4.9.0", "tailwindcss": "^3.2.4" } } diff --git a/pages/api/hello.ts b/pages/api/hello.ts index f8bcc7e..3cffb97 100644 --- a/pages/api/hello.ts +++ b/pages/api/hello.ts @@ -1,13 +1,13 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next' +import type { NextApiRequest, NextApiResponse } from "next"; type Data = { - name: string -} + name: string; +}; -export default function handler( +export default async function handler( req: NextApiRequest, res: NextApiResponse ) { - res.status(200).json({ name: 'John Doe' }) + console.log("Triggered hello.ts"); + res.status(200).json({ name: "John Doe" }); } diff --git a/pages/api/register.ts b/pages/api/register.ts new file mode 100644 index 0000000..7969475 --- /dev/null +++ b/pages/api/register.ts @@ -0,0 +1,43 @@ +import { prisma } from "@/lib/db"; +import type { NextApiRequest, NextApiResponse } from "next"; + +interface Data { + name: string; +} + +interface User { + name: string; + username: string; + password: string; +} + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + const data: User = req.body; + + const createUser = await prisma.user.create({ + data: { + name: data.name, + username: data.username, + password: data.password, + collections: { + create: [ + { + role: "owner", + collection: { + create: { + name: "First Collection", + }, + }, + }, + ], + }, + }, + }); + + console.log(createUser); + + res.status(200).json(createUser); +} diff --git a/pages/index.tsx b/pages/index.tsx index 697a105..06b1c39 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,9 +1,7 @@ export default function Home() { return ( - <> -
-

Linkwarden

-
- +
+

Linkwarden

+
); } diff --git a/pages/login.tsx b/pages/login.tsx new file mode 100644 index 0000000..e69de29 diff --git a/pages/register.tsx b/pages/register.tsx new file mode 100644 index 0000000..28f170d --- /dev/null +++ b/pages/register.tsx @@ -0,0 +1,69 @@ +import { useState } from "react"; + +interface FormData { + name: string; + username: string; + password: string; +} + +export default function Register() { + const [form, setForm] = useState({ + name: "", + username: "", + password: "", + }); + + function registerUser() { + console.log(form); + if (form.name != "" && form.username != "" && form.password != "") { + fetch("/api/register", { + body: JSON.stringify(form), + headers: { + "Content-Type": "application/json", + }, + method: "POST", + }); + + setForm({ + name: "", + username: "", + password: "", + }); + } else { + console.log("Please fill out all the fields."); + } + } + + return ( +
+

Linkwarden

+ setForm({ ...form, name: e.target.value })} + className="border border-gray-700 rounded block m-2 mx-auto p-2" + /> + setForm({ ...form, username: e.target.value })} + className="border border-gray-700 rounded block m-2 mx-auto p-2" + /> + setForm({ ...form, password: e.target.value })} + className="border border-gray-700 rounded block m-2 mx-auto p-2" + /> +
+ Register +
+
+ ); +} diff --git a/prisma/migrations/20230130215222_/migration.sql b/prisma/migrations/20230130215222_/migration.sql new file mode 100644 index 0000000..c4440fc --- /dev/null +++ b/prisma/migrations/20230130215222_/migration.sql @@ -0,0 +1,32 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "username" TEXT NOT NULL, + "password" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Collection" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserAndCollection" ( + "userId" TEXT NOT NULL, + "collectionId" TEXT NOT NULL, + "role" TEXT NOT NULL, + + CONSTRAINT "UserAndCollection_pkey" PRIMARY KEY ("userId","collectionId") +); + +-- AddForeignKey +ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..a0de59d --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,37 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id @default(cuid()) + name String + username String + password String + collections UserAndCollection[] +} + +model Collection { + id String @id @default(cuid()) + name String + users UserAndCollection[] +} + +model UserAndCollection { + user User @relation(fields: [userId], references: [id]) + userId String + + collection Collection @relation(fields: [collectionId], references: [id]) + collectionId String + + role String + + @@id([userId, collectionId]) +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 09f94bb..67f4639 100644 --- a/yarn.lock +++ b/yarn.lock @@ -158,6 +158,23 @@ tiny-glob "^0.2.9" tslib "^2.4.0" +"@prisma/client@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.9.0.tgz#4a4068f3540732ea5723c008d49ed684d20f9340" + integrity sha512-bz6QARw54sWcbyR1lLnF2QHvRW5R/Jxnbbmwh3u+969vUKXtBkXgSgjDA85nji31ZBlf7+FrHDy5x+5ydGyQDg== + dependencies: + "@prisma/engines-version" "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5" + +"@prisma/engines-version@4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5": + version "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5.tgz#9d817a5779fc05b107eb02f63d197ad296d60b3c" + integrity sha512-M16aibbxi/FhW7z1sJCX8u+0DriyQYY5AyeTH7plQm9MLnURoiyn3CZBqAyIoQ+Z1pS77usCIibYJWSgleBMBA== + +"@prisma/engines@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.9.0.tgz#05a1411964e047c1bc43f777c7a1c69f86a2a26c" + integrity sha512-t1pt0Gsp+HcgPJrHFc+d/ZSAaKKWar2G/iakrE07yeKPNavDP3iVKPpfXP22OTCHZUWf7OelwKJxQgKAm5hkgw== + "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" @@ -1863,6 +1880,13 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prisma@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.9.0.tgz#295954b2a89cd35a0e6bcf66b2b036dbf80c75ee" + integrity sha512-bS96oZ5oDFXYgoF2l7PJ3Mp1wWWfLOo8B/jAfbA2Pn0Wm5Z/owBHzaMQKS3i1CzVBDWWPVnOohmbJmjvkcHS5w== + dependencies: + "@prisma/engines" "4.9.0" + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" From e5ed2ec5db8b924708596299fc9286cc6cf3db96 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 6 Feb 2023 21:29:23 +0330 Subject: [PATCH 006/144] Added user authentication. --- .env | 3 +- middleware.ts | 3 + next.config.js | 4 +- package.json | 3 + pages/_app.tsx | 8 +- pages/api/auth/[...nextauth].ts | 63 +++ pages/api/auth/register.ts | 56 +++ pages/api/hello.ts | 19 +- pages/api/register.ts | 43 -- .../api/routes/collections/getCollections.ts | 26 ++ pages/auth/login.tsx | 80 ++++ pages/{ => auth}/register.tsx | 59 ++- pages/login.tsx | 0 .../migration.sql | 2 +- prisma/schema.prisma | 2 +- yarn.lock | 369 +++++++++++++++++- 16 files changed, 657 insertions(+), 83 deletions(-) create mode 100644 middleware.ts create mode 100644 pages/api/auth/[...nextauth].ts create mode 100644 pages/api/auth/register.ts delete mode 100644 pages/api/register.ts create mode 100644 pages/api/routes/collections/getCollections.ts create mode 100644 pages/auth/login.tsx rename pages/{ => auth}/register.tsx (50%) delete mode 100644 pages/login.tsx rename prisma/migrations/{20230130215222_ => 20230131171711_}/migration.sql (96%) diff --git a/.env b/.env index 081adb0..f2c01fa 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -DATABASE_URL="postgresql://daniel:password@localhost:5432/mydb?schema=public" \ No newline at end of file +DATABASE_URL="postgresql://daniel:password@localhost:5432/mydb?schema=public" +NEXTAUTH_SECRET=very_sensitive_secret \ No newline at end of file diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 0000000..90dc125 --- /dev/null +++ b/middleware.ts @@ -0,0 +1,3 @@ +export { default } from "next-auth/middleware"; + +export const config = { matcher: ["/"] }; diff --git a/next.config.js b/next.config.js index a843cbe..91ef62f 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, -} +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/package.json b/package.json index fe5150e..aff7d38 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,17 @@ "@types/node": "18.11.18", "@types/react": "18.0.27", "@types/react-dom": "18.0.10", + "bcrypt": "^5.1.0", "eslint": "8.33.0", "eslint-config-next": "13.1.6", "next": "13.1.6", + "next-auth": "^4.19.1", "react": "18.2.0", "react-dom": "18.2.0", "typescript": "4.9.4" }, "devDependencies": { + "@types/bcrypt": "^5.0.0", "autoprefixer": "^10.4.13", "postcss": "^8.4.21", "prisma": "^4.9.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index 39ac0e9..cfb9630 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,17 +1,17 @@ import "@/styles/globals.css"; +import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; import Head from "next/head"; export default function App({ Component, pageProps }: AppProps) { return ( - <> + - Create Next App - + Linkwarden - + ); } diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts new file mode 100644 index 0000000..ded3e96 --- /dev/null +++ b/pages/api/auth/[...nextauth].ts @@ -0,0 +1,63 @@ +import { prisma } from "@/lib/db"; +import NextAuth from "next-auth/next"; +import CredentialsProvider from "next-auth/providers/credentials"; +import { AuthOptions } from "next-auth"; +import bcrypt from "bcrypt"; + +export const authOptions: AuthOptions = { + session: { + strategy: "jwt", + }, + providers: [ + CredentialsProvider({ + type: "credentials", + credentials: {}, + async authorize(credentials, req) { + const { email, password } = credentials as { + email: string; + password: string; + }; + + console.log(email, password); + + const findUser = await prisma.user.findFirst({ + where: { + email: email, + }, + }); + + console.log(findUser); + + // const findUser = await prisma.user.findMany({ + // where: { + // email: email, + // }, + // include: { + // collections: { + // include: { + // collection: true, + // }, + // }, + // }, + // }); + + // console.log("BOOM!", findUser[0].collections); + + let passwordMatches: boolean = false; + + if (findUser?.password) { + passwordMatches = bcrypt.compareSync(password, findUser.password); + } + + if (passwordMatches) { + return { name: findUser?.name, email: findUser?.email }; + } else return null as any; + }, + }), + ], + pages: { + signIn: "/auth/login", + }, +}; + +export default NextAuth(authOptions); diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts new file mode 100644 index 0000000..535429d --- /dev/null +++ b/pages/api/auth/register.ts @@ -0,0 +1,56 @@ +import { prisma } from "@/lib/db"; +import type { NextApiRequest, NextApiResponse } from "next"; +import bcrypt from "bcrypt"; + +interface Data { + message: string | object; +} + +interface User { + name: string; + email: string; + password: string; +} + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + const body: User = req.body; + + const checkIfUserExists = await prisma.user.findFirst({ + where: { + email: body.email, + }, + }); + + if (!checkIfUserExists) { + const saltRounds = 10; + + const hashedPassword = bcrypt.hashSync(body.password, saltRounds); + + await prisma.user.create({ + data: { + name: body.name, + email: body.email, + password: hashedPassword, + collections: { + create: [ + { + role: "owner", + collection: { + create: { + name: "First Collection", + }, + }, + }, + ], + }, + }, + }); + + res.status(201).json({ message: "User successfully created." }); + } else { + res.status(400).json({ message: "User already exists." }); + } +} diff --git a/pages/api/hello.ts b/pages/api/hello.ts index 3cffb97..b170c05 100644 --- a/pages/api/hello.ts +++ b/pages/api/hello.ts @@ -1,13 +1,26 @@ import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; type Data = { - name: string; + message: string; + data?: object; }; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { - console.log("Triggered hello.ts"); - res.status(200).json({ name: "John Doe" }); + const session = await getServerSession(req, res, authOptions); + + console.log(session); + + if (!session) { + res.status(401).json({ message: "You must be logged in." }); + return; + } + + return res.json({ + message: "Success", + }); } diff --git a/pages/api/register.ts b/pages/api/register.ts deleted file mode 100644 index 7969475..0000000 --- a/pages/api/register.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { prisma } from "@/lib/db"; -import type { NextApiRequest, NextApiResponse } from "next"; - -interface Data { - name: string; -} - -interface User { - name: string; - username: string; - password: string; -} - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - const data: User = req.body; - - const createUser = await prisma.user.create({ - data: { - name: data.name, - username: data.username, - password: data.password, - collections: { - create: [ - { - role: "owner", - collection: { - create: { - name: "First Collection", - }, - }, - }, - ], - }, - }, - }); - - console.log(createUser); - - res.status(200).json(createUser); -} diff --git a/pages/api/routes/collections/getCollections.ts b/pages/api/routes/collections/getCollections.ts new file mode 100644 index 0000000..f57cc24 --- /dev/null +++ b/pages/api/routes/collections/getCollections.ts @@ -0,0 +1,26 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; + +type Data = { + message: string; + data?: object; +}; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + const session = await getServerSession(req, res, authOptions); + + if (!session) { + res.status(401).json({ message: "You must be logged in." }); + return; + } + + console.log(session?.user?.email); + + return res.json({ + message: "Success", + }); +} diff --git a/pages/auth/login.tsx b/pages/auth/login.tsx new file mode 100644 index 0000000..db1013e --- /dev/null +++ b/pages/auth/login.tsx @@ -0,0 +1,80 @@ +import { signIn } from "next-auth/react"; +import Link from "next/link"; +import { useEffect, useState } from "react"; +import { useSession } from "next-auth/react"; +import { useRouter } from "next/router"; + +interface FormData { + email: string; + password: string; +} + +export default function Login() { + const session = useSession(); + const router = useRouter(); + + useEffect(() => { + if (session.status === "authenticated") { + router.push("/"); + console.log("Already logged in."); + } + }, []); + + const [form, setForm] = useState({ + email: "", + password: "", + }); + + async function loginUser() { + console.log(form); + if (form.email != "" && form.password != "") { + const res = await signIn("credentials", { + email: form.email, + password: form.password, + redirect: false, + }); + + if (res?.ok) { + setForm({ + email: "", + password: "", + }); + + router.push("/"); + } else { + console.log("User not found or password does not match.", res); + } + } else { + console.log("Please fill out all the fields."); + } + } + + return ( +
+

Linkwarden

+ setForm({ ...form, email: e.target.value })} + className="border border-gray-700 rounded block m-2 mx-auto p-2" + /> + setForm({ ...form, password: e.target.value })} + className="border border-gray-700 rounded block m-2 mx-auto p-2" + /> +
+ Login +
+ + Register + +
+ ); +} diff --git a/pages/register.tsx b/pages/auth/register.tsx similarity index 50% rename from pages/register.tsx rename to pages/auth/register.tsx index 28f170d..f1b34b1 100644 --- a/pages/register.tsx +++ b/pages/auth/register.tsx @@ -1,34 +1,58 @@ -import { useState } from "react"; +import Link from "next/link"; +import { useEffect, useState } from "react"; +import { useSession } from "next-auth/react"; +import { useRouter } from "next/router"; interface FormData { name: string; - username: string; + email: string; password: string; } export default function Register() { + const session = useSession(); + const router = useRouter(); + + useEffect(() => { + if (session.status === "authenticated") { + router.push("/"); + console.log("Already logged in."); + } + }, [session]); + const [form, setForm] = useState({ name: "", - username: "", + email: "", password: "", }); - function registerUser() { + async function registerUser() { + let success: boolean = false; console.log(form); - if (form.name != "" && form.username != "" && form.password != "") { - fetch("/api/register", { + + if (form.name != "" && form.email != "" && form.password != "") { + await fetch("/api/auth/register", { body: JSON.stringify(form), headers: { "Content-Type": "application/json", }, method: "POST", - }); + }) + .then((res) => { + success = res.ok; + return res.json(); + }) + .then((data) => console.log(data)); - setForm({ - name: "", - username: "", - password: "", - }); + if (success) { + setForm({ + name: "", + email: "", + password: "", + }); + + router.push("/auth/login"); + } } else { console.log("Please fill out all the fields."); } @@ -46,9 +70,9 @@ export default function Register() { /> setForm({ ...form, username: e.target.value })} + placeholder="Email" + value={form.email} + onChange={(e) => setForm({ ...form, email: e.target.value })} className="border border-gray-700 rounded block m-2 mx-auto p-2" />
Register
+ + Login + ); } diff --git a/pages/login.tsx b/pages/login.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/prisma/migrations/20230130215222_/migration.sql b/prisma/migrations/20230131171711_/migration.sql similarity index 96% rename from prisma/migrations/20230130215222_/migration.sql rename to prisma/migrations/20230131171711_/migration.sql index c4440fc..4aff8b8 100644 --- a/prisma/migrations/20230130215222_/migration.sql +++ b/prisma/migrations/20230131171711_/migration.sql @@ -2,7 +2,7 @@ CREATE TABLE "User" ( "id" TEXT NOT NULL, "name" TEXT NOT NULL, - "username" TEXT NOT NULL, + "email" TEXT NOT NULL, "password" TEXT NOT NULL, CONSTRAINT "User_pkey" PRIMARY KEY ("id") diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a0de59d..29df03b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -13,7 +13,7 @@ datasource db { model User { id String @id @default(cuid()) name String - username String + email String password String collections UserAndCollection[] } diff --git a/yarn.lock b/yarn.lock index 67f4639..51cd4ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@babel/runtime@^7.20.7": +"@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== @@ -43,6 +43,21 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@mapbox/node-pre-gyp@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@next/env@13.1.6": version "13.1.6" resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.6.tgz#c4925609f16142ded1a5cb833359ab17359b7a93" @@ -146,6 +161,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@panva/hkdf@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.2.tgz#bab0f09d09de9fd83628220d496627681bc440d6" + integrity sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA== + "@pkgr/utils@^2.3.1": version "2.3.1" resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" @@ -187,11 +207,23 @@ dependencies: tslib "^2.4.0" +"@types/bcrypt@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-5.0.0.tgz#a835afa2882d165aff5690893db314eaa98b9f20" + integrity sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw== + dependencies: + "@types/node" "*" + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/node@*": + version "18.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" + integrity sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw== + "@types/node@18.11.18": version "18.11.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" @@ -267,6 +299,11 @@ "@typescript-eslint/types" "5.49.0" eslint-visitor-keys "^3.3.0" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -296,6 +333,13 @@ acorn@^8.8.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -326,6 +370,19 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -429,6 +486,14 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bcrypt@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.0.tgz#bbb27665dbc400480a524d8991ac7434e8529e17" + integrity sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.10" + node-addon-api "^5.0.0" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -505,6 +570,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -522,11 +592,26 @@ color-name@^1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -551,6 +636,13 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -558,13 +650,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - deep-equal@^2.0.5: version "2.2.0" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" @@ -611,6 +696,16 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detective@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" @@ -656,6 +751,11 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" @@ -1054,6 +1154,13 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1084,6 +1191,21 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" @@ -1242,6 +1364,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1249,6 +1376,14 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -1275,7 +1410,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1357,6 +1492,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -1473,6 +1613,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +jose@^4.10.0, jose@^4.9.3: + version "4.11.2" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23" + integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A== + js-sdsl@^4.1.4: version "4.3.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" @@ -1566,6 +1711,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1591,6 +1743,31 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.2.tgz#26fc3364d5ea6cb971c6e5259eac67a0887510d1" + integrity sha512-4Hbzei7ZyBp+1aw0874YWpKOubZd/jc53/XU+gkYry1QV+VvrbO8icLM5CUtm4F0hyXn85DXYKEMIS26gitD3A== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1611,6 +1788,21 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +next-auth@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.19.1.tgz#4b5dca8fd7dc25d2c099e4a8401dafb20d1bf8ae" + integrity sha512-Wo0b1tWtEh1ORR+AzTtBHSPxAA2zKqynoMS/nQQVrT5RD/umVzpXz25fOkoRrO9t+Is+scU2DmKeyFIkhx45WQ== + dependencies: + "@babel/runtime" "^7.16.3" + "@panva/hkdf" "^1.0.1" + cookie "^0.5.0" + jose "^4.9.3" + oauth "^0.9.15" + openid-client "^5.1.0" + preact "^10.6.3" + preact-render-to-string "^5.1.19" + uuid "^8.3.2" + next@13.1.6: version "13.1.6" resolved "https://registry.yarnpkg.com/next/-/next-13.1.6.tgz#054babe20b601f21f682f197063c9b0b32f1a27c" @@ -1636,11 +1828,30 @@ next@13.1.6: "@next/swc-win32-ia32-msvc" "13.1.6" "@next/swc-win32-x64-msvc" "13.1.6" +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-releases@^2.0.6: version "2.0.8" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -1651,11 +1862,31 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +oauth@^0.9.15: + version "0.9.15" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + object-hash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" @@ -1724,6 +1955,11 @@ object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" +oidc-token-hash@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" + integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1740,6 +1976,16 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +openid-client@^5.1.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.3.2.tgz#fcc2c16f9681fa5f03ee0581b0935f88fc49f11f" + integrity sha512-nXXt+cna0XHOw+WqjMZOmuXw/YZEMwfWD2lD7tCsFtsBjMQGVXA+NZABA3upYBET1suhIsmfd7GnxG4jCAnvYQ== + dependencies: + jose "^4.10.0" + lru-cache "^6.0.0" + object-hash "^2.0.1" + oidc-token-hash "^5.0.1" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -1875,11 +2121,28 @@ postcss@^8.4.18, postcss@^8.4.21: picocolors "^1.0.0" source-map-js "^1.0.2" +preact-render-to-string@^5.1.19: + version "5.2.6" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604" + integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw== + dependencies: + pretty-format "^3.8.0" + +preact@^10.6.3: + version "10.11.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" + integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +pretty-format@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== + prisma@^4.9.0: version "4.9.0" resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.9.0.tgz#295954b2a89cd35a0e6bcf66b2b036dbf80c75ee" @@ -1938,6 +2201,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2006,6 +2278,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -2022,18 +2299,23 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.7: +semver@^7.3.5, semver@^7.3.7: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2055,6 +2337,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2077,6 +2364,15 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -2109,6 +2405,13 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -2187,6 +2490,18 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.11: + version "6.1.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -2207,6 +2522,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -2285,11 +2605,29 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -2330,6 +2668,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" From 0bf1ec0d2a534afac16538a47850ecf809acd40f Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 9 Feb 2023 00:41:33 +0330 Subject: [PATCH 007/144] Added GET and POST routes. --- .env | 2 - .gitignore | 3 +- components/Collections.tsx | 28 ++++++ middleware.ts | 2 +- pages/api/auth/[...nextauth].ts | 31 +++---- .../api/routes/collections/getCollections.ts | 34 ++++++-- .../api/routes/collections/postCollection.ts | 87 +++++++++++++++++++ pages/dashboard.tsx | 21 +++++ pages/index.tsx | 13 +-- pages/{auth => }/login.tsx | 2 +- pages/{auth => }/register.tsx | 2 +- types/next-auth.d.ts | 9 ++ 12 files changed, 198 insertions(+), 36 deletions(-) delete mode 100644 .env create mode 100644 components/Collections.tsx create mode 100644 pages/api/routes/collections/postCollection.ts create mode 100644 pages/dashboard.tsx rename pages/{auth => }/login.tsx (100%) rename pages/{auth => }/register.tsx (100%) create mode 100644 types/next-auth.d.ts diff --git a/.env b/.env deleted file mode 100644 index f2c01fa..0000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -DATABASE_URL="postgresql://daniel:password@localhost:5432/mydb?schema=public" -NEXTAUTH_SECRET=very_sensitive_secret \ No newline at end of file diff --git a/.gitignore b/.gitignore index c87c9b3..814dcf1 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,9 @@ yarn-debug.log* yarn-error.log* .pnpm-debug.log* -# local env files +# env files .env*.local +.env # vercel .vercel diff --git a/components/Collections.tsx b/components/Collections.tsx new file mode 100644 index 0000000..bef54a4 --- /dev/null +++ b/components/Collections.tsx @@ -0,0 +1,28 @@ +import { useEffect, useState } from "react"; + +interface Collections { + id: any; + name: string; + role: string; +} + +export default function Collections() { + const [collections, setCollections] = useState([]); + useEffect(() => { + fetch("/api/routes/collections/getCollections") + .then((res) => res.json()) + .then((data) => setCollections(data.response)); + }, []); + + return ( +
+ {collections.map((e) => { + return ( +
+

{e.name}

+
+ ); + })} +
+ ); +} diff --git a/middleware.ts b/middleware.ts index 90dc125..0f4fc8c 100644 --- a/middleware.ts +++ b/middleware.ts @@ -1,3 +1,3 @@ export { default } from "next-auth/middleware"; -export const config = { matcher: ["/"] }; +export const config = { matcher: ["/", "/dashboard"] }; diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index ded3e96..09e2193 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -14,6 +14,7 @@ export const authOptions: AuthOptions = { credentials: {}, async authorize(credentials, req) { const { email, password } = credentials as { + id: string; email: string; password: string; }; @@ -28,21 +29,6 @@ export const authOptions: AuthOptions = { console.log(findUser); - // const findUser = await prisma.user.findMany({ - // where: { - // email: email, - // }, - // include: { - // collections: { - // include: { - // collection: true, - // }, - // }, - // }, - // }); - - // console.log("BOOM!", findUser[0].collections); - let passwordMatches: boolean = false; if (findUser?.password) { @@ -50,13 +36,24 @@ export const authOptions: AuthOptions = { } if (passwordMatches) { - return { name: findUser?.name, email: findUser?.email }; + return { + id: findUser?.id, + name: findUser?.name, + email: findUser?.email, + }; } else return null as any; }, }), ], pages: { - signIn: "/auth/login", + signIn: "/login", + }, + callbacks: { + session: async ({ session, token }) => { + session.user.id = token?.sub; + + return session; + }, }, }; diff --git a/pages/api/routes/collections/getCollections.ts b/pages/api/routes/collections/getCollections.ts index f57cc24..c92faaa 100644 --- a/pages/api/routes/collections/getCollections.ts +++ b/pages/api/routes/collections/getCollections.ts @@ -1,10 +1,10 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; +import { prisma } from "@/lib/db"; type Data = { - message: string; - data?: object; + response: object[] | string; }; export default async function handler( @@ -13,14 +13,32 @@ export default async function handler( ) { const session = await getServerSession(req, res, authOptions); - if (!session) { - res.status(401).json({ message: "You must be logged in." }); - return; + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); } - console.log(session?.user?.email); + const email: string = session.user.email; - return res.json({ - message: "Success", + const findCollection = await prisma.user.findFirst({ + where: { + email: email, + }, + include: { + collections: { + include: { + collection: true, + }, + }, + }, + }); + + const collections = findCollection?.collections.map((e) => { + return { id: e.collection.id, name: e.collection.name, role: e.role }; + }); + + // console.log(session?.user?.email); + + return res.status(200).json({ + response: collections || [], }); } diff --git a/pages/api/routes/collections/postCollection.ts b/pages/api/routes/collections/postCollection.ts new file mode 100644 index 0000000..eef1636 --- /dev/null +++ b/pages/api/routes/collections/postCollection.ts @@ -0,0 +1,87 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; +import { prisma } from "@/lib/db"; + +type Data = { + response: object[] | string; +}; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + const session = await getServerSession(req, res, authOptions); + + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); + } + + const email: string = session.user.email; + const collectionName: string = req?.body?.collectionName; + + if (!collectionName) { + return res + .status(401) + .json({ response: "Please enter a valid name for the collection." }); + } + + const findCollection = await prisma.user.findFirst({ + where: { + email, + }, + include: { + collections: { + where: { + collection: { + name: collectionName, + }, + }, + }, + }, + }); + + const checkIfCollectionExists = findCollection?.collections[0]; + + if (checkIfCollectionExists) { + return res.status(400).json({ response: "Collection already exists." }); + } + + // const a = await prisma.user.update({ + // where: { + // id: session.user.id, + // }, + // data: { + // // collections: { + // // create: { name: "Das" }, + // // }, + // }, + // include: { + // collections: { include: { collection: true } }, + // }, + // }); + + await prisma.user.update({ + where: { + id: session.user.id, + }, + data: { + collections: { + create: [ + { + role: "owner", + collection: { + create: { + name: collectionName, + }, + }, + }, + ], + }, + }, + }); + + return res.status(200).json({ + response: "Success", + }); +} diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx new file mode 100644 index 0000000..5a255a1 --- /dev/null +++ b/pages/dashboard.tsx @@ -0,0 +1,21 @@ +import { useSession } from "next-auth/react"; +import Collections from "@/components/Collections"; + +export default function Dashboard() { + const { data: session, status } = useSession(); + + const user = session?.user; + + console.log(); + return ( +
+
+

Linkwarden

+
+
+

Welcome {user?.name?.toLocaleUpperCase()}!

+
+ +
+ ); +} diff --git a/pages/index.tsx b/pages/index.tsx index 06b1c39..7c4db0c 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,7 +1,10 @@ +import { useRouter } from "next/router"; +import { useEffect } from "react"; + export default function Home() { - return ( -
-

Linkwarden

-
- ); + const router = useRouter(); + + useEffect(() => { + router.push("/dashboard"); + }, []); } diff --git a/pages/auth/login.tsx b/pages/login.tsx similarity index 100% rename from pages/auth/login.tsx rename to pages/login.tsx index db1013e..f4d568a 100644 --- a/pages/auth/login.tsx +++ b/pages/login.tsx @@ -15,8 +15,8 @@ export default function Login() { useEffect(() => { if (session.status === "authenticated") { - router.push("/"); console.log("Already logged in."); + router.push("/"); } }, []); diff --git a/pages/auth/register.tsx b/pages/register.tsx similarity index 100% rename from pages/auth/register.tsx rename to pages/register.tsx index f1b34b1..de5aa6f 100644 --- a/pages/auth/register.tsx +++ b/pages/register.tsx @@ -15,8 +15,8 @@ export default function Register() { useEffect(() => { if (session.status === "authenticated") { - router.push("/"); console.log("Already logged in."); + router.push("/"); } }, [session]); diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts new file mode 100644 index 0000000..ce3db1a --- /dev/null +++ b/types/next-auth.d.ts @@ -0,0 +1,9 @@ +import NextAuth, { DefaultSession } from "next-auth"; + +declare module "next-auth" { + interface Session { + user: { + id: any; + } & DefaultSession["user"]; + } +} From 18387e2dde2a7dd4f56b2c93fbd3fe17c2f32e98 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 9 Feb 2023 03:28:55 +0330 Subject: [PATCH 008/144] Route handling + Added main layout. --- components/Collections.tsx | 4 +-- components/Layouts/MainLayout.tsx | 51 +++++++++++++++++++++++++++++++ components/Loader.tsx | 7 +++++ components/Navbar.tsx | 3 ++ components/Sidebar.tsx | 13 ++++++++ hooks/useRedirection.tsx | 30 ++++++++++++++++++ middleware.ts | 3 -- pages/_app.tsx | 11 +++---- pages/dashboard.tsx | 8 +---- pages/login.tsx | 18 ++--------- pages/register.tsx | 15 ++------- 11 files changed, 117 insertions(+), 46 deletions(-) create mode 100644 components/Layouts/MainLayout.tsx create mode 100644 components/Loader.tsx create mode 100644 components/Navbar.tsx create mode 100644 components/Sidebar.tsx create mode 100644 hooks/useRedirection.tsx delete mode 100644 middleware.ts diff --git a/components/Collections.tsx b/components/Collections.tsx index bef54a4..a1b936a 100644 --- a/components/Collections.tsx +++ b/components/Collections.tsx @@ -16,9 +16,9 @@ export default function Collections() { return (
- {collections.map((e) => { + {collections.map((e, i) => { return ( -
+

{e.name}

); diff --git a/components/Layouts/MainLayout.tsx b/components/Layouts/MainLayout.tsx new file mode 100644 index 0000000..5b28d73 --- /dev/null +++ b/components/Layouts/MainLayout.tsx @@ -0,0 +1,51 @@ +import Head from "next/head"; +import Navbar from "@/components/Navbar"; +import Sidebar from "@/components/Sidebar"; +import { ReactNode } from "react"; +import { useSession } from "next-auth/react"; +import Loader from "../Loader"; +import useRedirection from "@/hooks/useRedirection"; +import { useRouter } from "next/router"; + +interface LayoutProps { + children: ReactNode; +} + +export default function Layout({ children }: LayoutProps) { + const { status } = useSession(); + const router = useRouter(); + + const redirection = useRedirection(); + + const routeExists = router.route === "/_error" ? false : true; + + if (status === "authenticated" && !redirection && routeExists) + return ( + <> + + Linkwarden + + + +
+ +
+ + {children} +
+
+ + ); + else if ((status === "unauthenticated" && !redirection) || !routeExists) + return ( + <> + + Linkwarden + + + + {children} + + ); + else return ; +} diff --git a/components/Loader.tsx b/components/Loader.tsx new file mode 100644 index 0000000..f41c4d5 --- /dev/null +++ b/components/Loader.tsx @@ -0,0 +1,7 @@ +export default function Loader() { + return ( +
+

Loading...

+
+ ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx new file mode 100644 index 0000000..17e7836 --- /dev/null +++ b/components/Navbar.tsx @@ -0,0 +1,3 @@ +export default function Navbar() { + return
Navbar
; +} diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx new file mode 100644 index 0000000..54f073e --- /dev/null +++ b/components/Sidebar.tsx @@ -0,0 +1,13 @@ +import { useSession } from "next-auth/react"; + +export default function Sidebar() { + const { data: session, status } = useSession(); + + const user = session?.user; + + return ( +
+

{user?.name}

+
+ ); +} diff --git a/hooks/useRedirection.tsx b/hooks/useRedirection.tsx new file mode 100644 index 0000000..f5d91ba --- /dev/null +++ b/hooks/useRedirection.tsx @@ -0,0 +1,30 @@ +import { ReactNode, useEffect, useState } from "react"; +import { useSession } from "next-auth/react"; +import { useRouter } from "next/router"; + +export default function useRedirection() { + const router = useRouter(); + const { status } = useSession(); + const [redirect, setRedirect] = useState(true); + + useEffect(() => { + if ( + status === "authenticated" && + (router.pathname === "/login" || router.pathname === "/register") + ) { + router.push("/").then(() => { + setRedirect(false); + }); + } else if ( + status === "unauthenticated" && + !(router.pathname === "/login" || router.pathname === "/register") + ) { + router.push("/login").then(() => { + setRedirect(false); + }); + } else if (status === "loading") setRedirect(true); + else setRedirect(false); + }, [status]); + + return redirect; +} diff --git a/middleware.ts b/middleware.ts deleted file mode 100644 index 0f4fc8c..0000000 --- a/middleware.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default } from "next-auth/middleware"; - -export const config = { matcher: ["/", "/dashboard"] }; diff --git a/pages/_app.tsx b/pages/_app.tsx index cfb9630..4101ff0 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,17 +1,14 @@ +import MainLayout from "@/components/Layouts/MainLayout"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; -import Head from "next/head"; export default function App({ Component, pageProps }: AppProps) { return ( - - Linkwarden - - - - + + + ); } diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 5a255a1..6a953c9 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -6,15 +6,9 @@ export default function Dashboard() { const user = session?.user; - console.log(); return (
-
-

Linkwarden

-
-
-

Welcome {user?.name?.toLocaleUpperCase()}!

-
+

Linkwarden

); diff --git a/pages/login.tsx b/pages/login.tsx index f4d568a..7b499a7 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -1,8 +1,6 @@ import { signIn } from "next-auth/react"; import Link from "next/link"; -import { useEffect, useState } from "react"; -import { useSession } from "next-auth/react"; -import { useRouter } from "next/router"; +import { useState } from "react"; interface FormData { email: string; @@ -10,16 +8,6 @@ interface FormData { } export default function Login() { - const session = useSession(); - const router = useRouter(); - - useEffect(() => { - if (session.status === "authenticated") { - console.log("Already logged in."); - router.push("/"); - } - }, []); - const [form, setForm] = useState({ email: "", password: "", @@ -40,7 +28,7 @@ export default function Login() { password: "", }); - router.push("/"); + // router.push("/"); } else { console.log("User not found or password does not match.", res); } @@ -72,7 +60,7 @@ export default function Login() { > Login
- + Register
diff --git a/pages/register.tsx b/pages/register.tsx index de5aa6f..2da7f4a 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -1,6 +1,5 @@ import Link from "next/link"; -import { useEffect, useState } from "react"; -import { useSession } from "next-auth/react"; +import { useState } from "react"; import { useRouter } from "next/router"; interface FormData { @@ -10,16 +9,8 @@ interface FormData { } export default function Register() { - const session = useSession(); const router = useRouter(); - useEffect(() => { - if (session.status === "authenticated") { - console.log("Already logged in."); - router.push("/"); - } - }, [session]); - const [form, setForm] = useState({ name: "", email: "", @@ -51,7 +42,7 @@ export default function Register() { password: "", }); - router.push("/auth/login"); + router.push("/login"); } } else { console.log("Please fill out all the fields."); @@ -88,7 +79,7 @@ export default function Register() { > Register - + Login From eadf021939803c3753e79fb340781085ddb3bb5e Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 9 Feb 2023 04:02:20 +0330 Subject: [PATCH 009/144] Minor improvement. --- components/Layouts/MainLayout.tsx | 8 +++++--- components/Navbar.tsx | 11 ++++++++++- pages/login.tsx | 3 --- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/components/Layouts/MainLayout.tsx b/components/Layouts/MainLayout.tsx index 5b28d73..ed4fea2 100644 --- a/components/Layouts/MainLayout.tsx +++ b/components/Layouts/MainLayout.tsx @@ -29,9 +29,11 @@ export default function Layout({ children }: LayoutProps) {
-
- - {children} +
+
+ + {children} +
diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 17e7836..cc7659f 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,3 +1,12 @@ +import { signOut } from "next-auth/react"; + export default function Navbar() { - return
Navbar
; + return ( +
+

Navbar

+
signOut()} className="cursor-pointer w-max"> + Sign Out +
+
+ ); } diff --git a/pages/login.tsx b/pages/login.tsx index 7b499a7..29a2c4c 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -19,7 +19,6 @@ export default function Login() { const res = await signIn("credentials", { email: form.email, password: form.password, - redirect: false, }); if (res?.ok) { @@ -27,8 +26,6 @@ export default function Login() { email: "", password: "", }); - - // router.push("/"); } else { console.log("User not found or password does not match.", res); } From cefeb5e7a9826adb68e0bc684bd9b07d3783dd69 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 14 Feb 2023 00:52:47 +0330 Subject: [PATCH 010/144] Added clickAwayHandler + POST functionality + Bug fixed. --- .../Layouts => Layouts}/MainLayout.tsx | 6 +-- components/ClickAwayHandler.tsx | 35 +++++++++++++ components/Collections.tsx | 2 +- components/Sidebar.tsx | 51 ++++++++++++++++++- pages/_app.tsx | 2 +- pages/api/auth/register.ts | 6 ++- 6 files changed, 94 insertions(+), 8 deletions(-) rename {components/Layouts => Layouts}/MainLayout.tsx (92%) create mode 100644 components/ClickAwayHandler.tsx diff --git a/components/Layouts/MainLayout.tsx b/Layouts/MainLayout.tsx similarity index 92% rename from components/Layouts/MainLayout.tsx rename to Layouts/MainLayout.tsx index ed4fea2..57ffbf4 100644 --- a/components/Layouts/MainLayout.tsx +++ b/Layouts/MainLayout.tsx @@ -3,15 +3,15 @@ import Navbar from "@/components/Navbar"; import Sidebar from "@/components/Sidebar"; import { ReactNode } from "react"; import { useSession } from "next-auth/react"; -import Loader from "../Loader"; +import Loader from "../components/Loader"; import useRedirection from "@/hooks/useRedirection"; import { useRouter } from "next/router"; -interface LayoutProps { +interface Props { children: ReactNode; } -export default function Layout({ children }: LayoutProps) { +export default function Layout({ children }: Props) { const { status } = useSession(); const router = useRouter(); diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx new file mode 100644 index 0000000..dec4c93 --- /dev/null +++ b/components/ClickAwayHandler.tsx @@ -0,0 +1,35 @@ +import React, { useRef, useEffect, ReactNode, RefObject } from "react"; + +interface Props { + children: ReactNode; + onClickOutside: Function; +} + +function useOutsideAlerter( + ref: RefObject, + onClickOutside: Function +) { + useEffect(() => { + function handleClickOutside(event: Event) { + if ( + ref.current && + !ref.current.contains(event.target as HTMLInputElement) + ) { + onClickOutside(); + } + } + // Bind the event listener + document.addEventListener("mousedown", handleClickOutside); + return () => { + // Unbind the event listener on clean up + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [ref, onClickOutside]); +} + +export default function OutsideAlerter({ children, onClickOutside }: Props) { + const wrapperRef = useRef(null); + useOutsideAlerter(wrapperRef, onClickOutside); + + return
{children}
; +} diff --git a/components/Collections.tsx b/components/Collections.tsx index a1b936a..99e1349 100644 --- a/components/Collections.tsx +++ b/components/Collections.tsx @@ -18,7 +18,7 @@ export default function Collections() {
{collections.map((e, i) => { return ( -
+

{e.name}

); diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index 54f073e..36caab4 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -1,13 +1,60 @@ import { useSession } from "next-auth/react"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; +import { useState } from "react"; export default function Sidebar() { const { data: session, status } = useSession(); + const [addCollection, setAddCollection] = useState(false); + const user = session?.user; + const toggleAddCollection = () => { + setAddCollection(!addCollection); + }; + + const submitCollection = async ( + event: React.KeyboardEvent + ) => { + const collectionName: string = (event.target as HTMLInputElement).value; + + if (event.key === "Enter" && collectionName) { + await fetch("/api/routes/collections/postCollection", { + body: JSON.stringify({ collectionName }), + headers: { + "Content-Type": "application/json", + }, + method: "POST", + }) + .then((res) => res.json()) + .then((data) => console.log(data)); + } + }; + return ( -
-

{user?.name}

+
+
+

{user?.name}

+ + {addCollection ? ( + + + + ) : ( +
+ Create Collection + +
+ )} +
); } diff --git a/pages/_app.tsx b/pages/_app.tsx index 4101ff0..70ecb53 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,4 +1,4 @@ -import MainLayout from "@/components/Layouts/MainLayout"; +import MainLayout from "@/Layouts/MainLayout"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index 535429d..4d7dab6 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -18,6 +18,9 @@ export default async function handler( ) { const body: User = req.body; + if (!body.email || !body.password || !body.name) + return res.status(400).json({ message: "Please fill out all the fields." }); + const checkIfUserExists = await prisma.user.findFirst({ where: { email: body.email, @@ -50,7 +53,8 @@ export default async function handler( }); res.status(201).json({ message: "User successfully created." }); - } else { + } else if (checkIfUserExists) { + console.log(checkIfUserExists); res.status(400).json({ message: "User already exists." }); } } From d19204f4c0fe3adbdc2c70b149abf5e7256e98f9 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 14 Feb 2023 03:39:13 +0330 Subject: [PATCH 011/144] Refactored schema and added link model. --- Layouts/MainLayout.tsx | 12 ++-- components/Collections.tsx | 4 +- pages/api/auth/[...nextauth].ts | 4 +- pages/api/auth/register.ts | 13 +---- .../api/routes/collections/getCollections.ts | 8 +-- .../api/routes/collections/postCollection.ts | 15 ++--- .../migrations/20230131171711_/migration.sql | 32 ----------- .../migrations/20230213224230_/migration.sql | 57 +++++++++++++++++++ prisma/schema.prisma | 33 ++++++++--- types/next-auth.d.ts | 2 +- 10 files changed, 101 insertions(+), 79 deletions(-) delete mode 100644 prisma/migrations/20230131171711_/migration.sql create mode 100644 prisma/migrations/20230213224230_/migration.sql diff --git a/Layouts/MainLayout.tsx b/Layouts/MainLayout.tsx index 57ffbf4..1e9c924 100644 --- a/Layouts/MainLayout.tsx +++ b/Layouts/MainLayout.tsx @@ -27,14 +27,10 @@ export default function Layout({ children }: Props) { -
- -
-
- - {children} -
-
+ +
+ + {children}
); diff --git a/components/Collections.tsx b/components/Collections.tsx index 99e1349..0cf0a2b 100644 --- a/components/Collections.tsx +++ b/components/Collections.tsx @@ -1,9 +1,9 @@ import { useEffect, useState } from "react"; interface Collections { - id: any; + id: number; name: string; - role: string; + createdAt: string; } export default function Collections() { diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 09e2193..2b9b237 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -14,7 +14,7 @@ export const authOptions: AuthOptions = { credentials: {}, async authorize(credentials, req) { const { email, password } = credentials as { - id: string; + id: number; email: string; password: string; }; @@ -50,7 +50,7 @@ export const authOptions: AuthOptions = { }, callbacks: { session: async ({ session, token }) => { - session.user.id = token?.sub; + session.user.id = parseInt(token?.sub as any); return session; }, diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index 4d7dab6..2c79af1 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -38,16 +38,9 @@ export default async function handler( email: body.email, password: hashedPassword, collections: { - create: [ - { - role: "owner", - collection: { - create: { - name: "First Collection", - }, - }, - }, - ], + create: { + name: "First Collection", + }, }, }, }); diff --git a/pages/api/routes/collections/getCollections.ts b/pages/api/routes/collections/getCollections.ts index c92faaa..6ab39d4 100644 --- a/pages/api/routes/collections/getCollections.ts +++ b/pages/api/routes/collections/getCollections.ts @@ -24,16 +24,12 @@ export default async function handler( email: email, }, include: { - collections: { - include: { - collection: true, - }, - }, + collections: true, }, }); const collections = findCollection?.collections.map((e) => { - return { id: e.collection.id, name: e.collection.name, role: e.role }; + return { id: e.id, name: e.name, createdAt: e.createdAt }; }); // console.log(session?.user?.email); diff --git a/pages/api/routes/collections/postCollection.ts b/pages/api/routes/collections/postCollection.ts index eef1636..61fc928 100644 --- a/pages/api/routes/collections/postCollection.ts +++ b/pages/api/routes/collections/postCollection.ts @@ -30,17 +30,17 @@ export default async function handler( where: { email, }, - include: { + select: { collections: { where: { - collection: { - name: collectionName, - }, + name: collectionName, }, }, }, }); + console.log(typeof session.user.id); + const checkIfCollectionExists = findCollection?.collections[0]; if (checkIfCollectionExists) { @@ -69,12 +69,7 @@ export default async function handler( collections: { create: [ { - role: "owner", - collection: { - create: { - name: collectionName, - }, - }, + name: collectionName, }, ], }, diff --git a/prisma/migrations/20230131171711_/migration.sql b/prisma/migrations/20230131171711_/migration.sql deleted file mode 100644 index 4aff8b8..0000000 --- a/prisma/migrations/20230131171711_/migration.sql +++ /dev/null @@ -1,32 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "email" TEXT NOT NULL, - "password" TEXT NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Collection" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - - CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "UserAndCollection" ( - "userId" TEXT NOT NULL, - "collectionId" TEXT NOT NULL, - "role" TEXT NOT NULL, - - CONSTRAINT "UserAndCollection_pkey" PRIMARY KEY ("userId","collectionId") -); - --- AddForeignKey -ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20230213224230_/migration.sql b/prisma/migrations/20230213224230_/migration.sql new file mode 100644 index 0000000..546f3c0 --- /dev/null +++ b/prisma/migrations/20230213224230_/migration.sql @@ -0,0 +1,57 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Collection" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "ownerId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserAndCollection" ( + "userId" INTEGER NOT NULL, + "collectionId" INTEGER NOT NULL, + "canCreate" BOOLEAN NOT NULL, + "canRead" BOOLEAN NOT NULL, + "canUpdate" BOOLEAN NOT NULL, + "canDelete" BOOLEAN NOT NULL, + + CONSTRAINT "UserAndCollection_pkey" PRIMARY KEY ("userId","collectionId") +); + +-- CreateTable +CREATE TABLE "Link" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "collectionId" INTEGER NOT NULL, + + CONSTRAINT "Link_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- AddForeignKey +ALTER TABLE "Collection" ADD CONSTRAINT "Collection_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Link" ADD CONSTRAINT "Link_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 29df03b..c71b3c0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -11,27 +11,44 @@ datasource db { } model User { - id String @id @default(cuid()) + id Int @id @default(autoincrement()) name String - email String + email String @unique password String - collections UserAndCollection[] + collections Collection[] + collectionsJoined UserAndCollection[] + createdAt DateTime @default(now()) } model Collection { - id String @id @default(cuid()) + id Int @id @default(autoincrement()) name String - users UserAndCollection[] + owner User @relation(fields: [ownerId], references: [id]) + ownerId Int + members UserAndCollection[] + links Link[] + createdAt DateTime @default(now()) } model UserAndCollection { user User @relation(fields: [userId], references: [id]) - userId String + userId Int collection Collection @relation(fields: [collectionId], references: [id]) - collectionId String + collectionId Int - role String + canCreate Boolean + canRead Boolean + canUpdate Boolean + canDelete Boolean @@id([userId, collectionId]) +} + +model Link { + id Int @id @default(autoincrement()) + name String + url String + collection Collection @relation(fields: [collectionId], references: [id]) + collectionId Int } \ No newline at end of file diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts index ce3db1a..cb9674b 100644 --- a/types/next-auth.d.ts +++ b/types/next-auth.d.ts @@ -3,7 +3,7 @@ import NextAuth, { DefaultSession } from "next-auth"; declare module "next-auth" { interface Session { user: { - id: any; + id: number; } & DefaultSession["user"]; } } From e0f4c71eb25f88128e20d3301cd2ea0c75dc518e Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 19 Feb 2023 07:02:02 +0330 Subject: [PATCH 012/144] Many changes. --- components/ClickAwayHandler.tsx | 13 ++- components/CollectionCards.tsx | 32 ++++++++ components/Collections.tsx | 28 ------- components/Navbar.tsx | 2 +- components/Sidebar.tsx | 80 +++++++++++++------ {Layouts => layouts}/MainLayout.tsx | 5 +- .../controllers/collections/getCollections.ts | 19 +++++ .../collections/postCollection.ts | 48 +++-------- lib/{ => api}/db.ts | 0 lib/client/getInitialData.ts | 14 ++++ package.json | 7 +- pages/_app.tsx | 3 +- pages/api/auth/[...nextauth].ts | 2 +- pages/api/auth/register.ts | 2 +- .../{getCollections.ts => index.ts} | 24 +----- pages/dashboard.tsx | 6 +- store/collection.ts | 65 +++++++++++++++ styles/globals.css | 9 +++ yarn.lock | 45 +++++++++++ 19 files changed, 282 insertions(+), 122 deletions(-) create mode 100644 components/CollectionCards.tsx delete mode 100644 components/Collections.tsx rename {Layouts => layouts}/MainLayout.tsx (94%) create mode 100644 lib/api/controllers/collections/getCollections.ts rename {pages/api/routes => lib/api/controllers}/collections/postCollection.ts (52%) rename lib/{ => api}/db.ts (100%) create mode 100644 lib/client/getInitialData.ts rename pages/api/routes/collections/{getCollections.ts => index.ts} (51%) create mode 100644 store/collection.ts diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index dec4c93..0da0137 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -3,6 +3,7 @@ import React, { useRef, useEffect, ReactNode, RefObject } from "react"; interface Props { children: ReactNode; onClickOutside: Function; + className?: string; } function useOutsideAlerter( @@ -27,9 +28,17 @@ function useOutsideAlerter( }, [ref, onClickOutside]); } -export default function OutsideAlerter({ children, onClickOutside }: Props) { +export default function OutsideAlerter({ + children, + onClickOutside, + className, +}: Props) { const wrapperRef = useRef(null); useOutsideAlerter(wrapperRef, onClickOutside); - return
{children}
; + return ( +
+ {children} +
+ ); } diff --git a/components/CollectionCards.tsx b/components/CollectionCards.tsx new file mode 100644 index 0000000..250a576 --- /dev/null +++ b/components/CollectionCards.tsx @@ -0,0 +1,32 @@ +import useCollectionSlice from "@/store/collection"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; + +export default function Collections() { + const { collections } = useCollectionSlice(); + + return ( +
+ {collections.map((e, i) => { + const formattedDate = new Date(e.createdAt).toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + + return ( +
+
+

{e.name}

+ +
+

{formattedDate}

+
+ ); + })} +
+ ); +} diff --git a/components/Collections.tsx b/components/Collections.tsx deleted file mode 100644 index 0cf0a2b..0000000 --- a/components/Collections.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useEffect, useState } from "react"; - -interface Collections { - id: number; - name: string; - createdAt: string; -} - -export default function Collections() { - const [collections, setCollections] = useState([]); - useEffect(() => { - fetch("/api/routes/collections/getCollections") - .then((res) => res.json()) - .then((data) => setCollections(data.response)); - }, []); - - return ( -
- {collections.map((e, i) => { - return ( -
-

{e.name}

-
- ); - })} -
- ); -} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index cc7659f..26d5267 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -2,7 +2,7 @@ import { signOut } from "next-auth/react"; export default function Navbar() { return ( -
+

Navbar

signOut()} className="cursor-pointer w-max"> Sign Out diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index 36caab4..8892b40 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -1,16 +1,26 @@ import { useSession } from "next-auth/react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; +import useCollectionSlice from "@/store/collection"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faFolder, faUserCircle } from "@fortawesome/free-regular-svg-icons"; +import { + faDatabase, + faPlus, + faChevronDown, +} from "@fortawesome/free-solid-svg-icons"; export default function Sidebar() { - const { data: session, status } = useSession(); + const { data: session } = useSession(); - const [addCollection, setAddCollection] = useState(false); + const [collectionInput, setCollectionInput] = useState(false); + + const { collections, addCollection } = useCollectionSlice(); const user = session?.user; - const toggleAddCollection = () => { - setAddCollection(!addCollection); + const toggleCollectionInput = () => { + setCollectionInput(!collectionInput); }; const submitCollection = async ( @@ -19,42 +29,62 @@ export default function Sidebar() { const collectionName: string = (event.target as HTMLInputElement).value; if (event.key === "Enter" && collectionName) { - await fetch("/api/routes/collections/postCollection", { - body: JSON.stringify({ collectionName }), - headers: { - "Content-Type": "application/json", - }, - method: "POST", - }) - .then((res) => res.json()) - .then((data) => console.log(data)); + addCollection(collectionName); + (event.target as HTMLInputElement).value = ""; } }; return ( -
-
-

{user?.name}

+
+
+ +
+

{user?.name}

+ +
+
- {addCollection ? ( - +
+ +

All Collections

+
+ +
+

Collections

+ {collectionInput ? ( + ) : ( -
- Create Collection + -
+ )}
+
+ {collections.map((e, i) => { + return ( +
+ +

{e.name}

+
+ ); + })} +
); } diff --git a/Layouts/MainLayout.tsx b/layouts/MainLayout.tsx similarity index 94% rename from Layouts/MainLayout.tsx rename to layouts/MainLayout.tsx index 1e9c924..e564a65 100644 --- a/Layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -6,6 +6,7 @@ import { useSession } from "next-auth/react"; import Loader from "../components/Loader"; import useRedirection from "@/hooks/useRedirection"; import { useRouter } from "next/router"; +import getInitialData from "@/lib/client/getInitialData"; interface Props { children: ReactNode; @@ -14,11 +15,11 @@ interface Props { export default function Layout({ children }: Props) { const { status } = useSession(); const router = useRouter(); - const redirection = useRedirection(); - const routeExists = router.route === "/_error" ? false : true; + getInitialData(); + if (status === "authenticated" && !redirection && routeExists) return ( <> diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts new file mode 100644 index 0000000..acfb08d --- /dev/null +++ b/lib/api/controllers/collections/getCollections.ts @@ -0,0 +1,19 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { prisma } from "@/lib/api/db"; +import { Session } from "next-auth"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, + session: Session +) { + const collections = await prisma.collection.findMany({ + where: { + ownerId: session?.user.id, + }, + }); + + return res.status(200).json({ + response: collections || [], + }); +} diff --git a/pages/api/routes/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts similarity index 52% rename from pages/api/routes/collections/postCollection.ts rename to lib/api/controllers/collections/postCollection.ts index 61fc928..22db6f7 100644 --- a/pages/api/routes/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -1,18 +1,12 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { getServerSession } from "next-auth/next"; -import { authOptions } from "pages/api/auth/[...nextauth]"; -import { prisma } from "@/lib/db"; - -type Data = { - response: object[] | string; -}; +import { prisma } from "@/lib/api/db"; +import { Session } from "next-auth"; export default async function handler( req: NextApiRequest, - res: NextApiResponse + res: NextApiResponse, + session: Session ) { - const session = await getServerSession(req, res, authOptions); - if (!session?.user?.email) { return res.status(401).json({ response: "You must be logged in." }); } @@ -39,44 +33,24 @@ export default async function handler( }, }); - console.log(typeof session.user.id); - const checkIfCollectionExists = findCollection?.collections[0]; if (checkIfCollectionExists) { return res.status(400).json({ response: "Collection already exists." }); } - // const a = await prisma.user.update({ - // where: { - // id: session.user.id, - // }, - // data: { - // // collections: { - // // create: { name: "Das" }, - // // }, - // }, - // include: { - // collections: { include: { collection: true } }, - // }, - // }); - - await prisma.user.update({ - where: { - id: session.user.id, - }, + const createCollection = await prisma.collection.create({ data: { - collections: { - create: [ - { - name: collectionName, - }, - ], + owner: { + connect: { + id: session.user.id, + }, }, + name: collectionName, }, }); return res.status(200).json({ - response: "Success", + response: createCollection, }); } diff --git a/lib/db.ts b/lib/api/db.ts similarity index 100% rename from lib/db.ts rename to lib/api/db.ts diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts new file mode 100644 index 0000000..61a08ec --- /dev/null +++ b/lib/client/getInitialData.ts @@ -0,0 +1,14 @@ +import useCollectionSlice from "@/store/collection"; +import { useEffect } from "react"; +import { useSession } from "next-auth/react"; + +export default function getInitialData() { + const { status } = useSession(); + const { setCollections } = useCollectionSlice(); + + useEffect(() => { + if (status === "authenticated") { + setCollections(); + } + }, [status]); +} diff --git a/package.json b/package.json index aff7d38..1832903 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,10 @@ "lint": "next lint" }, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.3.0", + "@fortawesome/free-regular-svg-icons": "^6.3.0", + "@fortawesome/free-solid-svg-icons": "^6.3.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@next/font": "13.1.6", "@prisma/client": "^4.9.0", "@types/node": "18.11.18", @@ -25,7 +29,8 @@ "next-auth": "^4.19.1", "react": "18.2.0", "react-dom": "18.2.0", - "typescript": "4.9.4" + "typescript": "4.9.4", + "zustand": "^4.3.3" }, "devDependencies": { "@types/bcrypt": "^5.0.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index 70ecb53..aff7668 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,4 +1,5 @@ -import MainLayout from "@/Layouts/MainLayout"; +import React from "react"; +import MainLayout from "@/layouts/MainLayout"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 2b9b237..804774f 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -1,4 +1,4 @@ -import { prisma } from "@/lib/db"; +import { prisma } from "@/lib/api/db"; import NextAuth from "next-auth/next"; import CredentialsProvider from "next-auth/providers/credentials"; import { AuthOptions } from "next-auth"; diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index 2c79af1..0677bda 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -1,4 +1,4 @@ -import { prisma } from "@/lib/db"; +import { prisma } from "@/lib/api/db"; import type { NextApiRequest, NextApiResponse } from "next"; import bcrypt from "bcrypt"; diff --git a/pages/api/routes/collections/getCollections.ts b/pages/api/routes/collections/index.ts similarity index 51% rename from pages/api/routes/collections/getCollections.ts rename to pages/api/routes/collections/index.ts index 6ab39d4..b8a102a 100644 --- a/pages/api/routes/collections/getCollections.ts +++ b/pages/api/routes/collections/index.ts @@ -1,7 +1,8 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; -import { prisma } from "@/lib/db"; +import getCollections from "@/lib/api/controllers/collections/getCollections"; +import postCollections from "@/lib/api/controllers/collections/postCollection"; type Data = { response: object[] | string; @@ -17,24 +18,7 @@ export default async function handler( return res.status(401).json({ response: "You must be logged in." }); } - const email: string = session.user.email; + if (req.method === "GET") return await getCollections(req, res, session); - const findCollection = await prisma.user.findFirst({ - where: { - email: email, - }, - include: { - collections: true, - }, - }); - - const collections = findCollection?.collections.map((e) => { - return { id: e.id, name: e.name, createdAt: e.createdAt }; - }); - - // console.log(session?.user?.email); - - return res.status(200).json({ - response: collections || [], - }); + if (req.method === "POST") return await postCollections(req, res, session); } diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 6a953c9..a8f97a7 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -1,5 +1,5 @@ import { useSession } from "next-auth/react"; -import Collections from "@/components/Collections"; +import CollectionCards from "@/components/CollectionCards"; export default function Dashboard() { const { data: session, status } = useSession(); @@ -7,9 +7,9 @@ export default function Dashboard() { const user = session?.user; return ( + // ml-80
-

Linkwarden

- +
); } diff --git a/store/collection.ts b/store/collection.ts new file mode 100644 index 0000000..f2c23ef --- /dev/null +++ b/store/collection.ts @@ -0,0 +1,65 @@ +import { create } from "zustand"; +import { Collection } from "@prisma/client"; + +type CollectionSlice = { + collections: Collection[]; + setCollections: () => void; + addCollection: (collectionName: string) => void; + updateCollection: (collection: Collection) => void; + removeCollection: (collectionId: number) => void; +}; + +const useCollectionSlice = create()((set) => ({ + collections: [], + setCollections: async () => { + const response = await fetch("/api/routes/collections"); + + const data = await response.json(); + + if (response.ok) set({ collections: data.response }); + }, + addCollection: async (collectionName) => { + const response = await fetch("/api/routes/collections", { + body: JSON.stringify({ collectionName }), + headers: { + "Content-Type": "application/json", + }, + method: "POST", + }); + + const data = await response.json(); + + if (response.ok) + set((state) => ({ + collections: [...state.collections, data.response], + })); + }, + updateCollection: (collection) => + set((state) => ({ + collections: state.collections.map((c) => + c.id === collection.id ? collection : c + ), + })), + removeCollection: (collectionId) => { + // await fetch("/api/routes/collections/postCollection", { + // body: JSON.stringify({ collectionName }), + // headers: { + // "Content-Type": "application/json", + // }, + // method: "POST", + // }) + // .then((res) => res.json()) + // .then((data) => { + // console.log(data); + // set((state) => ({ + // collections: [...state.collections, data.response], + // })); + // }); + + set((state) => ({ + collections: state.collections.filter((c) => c.id !== collectionId), + })); + }, +})); + +export default useCollectionSlice; diff --git a/styles/globals.css b/styles/globals.css index b5c61c9..edf4f20 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,3 +1,12 @@ @tailwind base; @tailwind components; @tailwind utilities; + +/* Hide scrollbar */ +.hidw-scrollbar::-webkit-scrollbar { + display: none; +} +.hide-scrollbar { + -ms-overflow-style: none; + scrollbar-width: none; +} diff --git a/yarn.lock b/yarn.lock index 51cd4ec..168f90c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,6 +24,39 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@fortawesome/fontawesome-common-types@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz#51f734e64511dbc3674cd347044d02f4dd26e86b" + integrity sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg== + +"@fortawesome/fontawesome-svg-core@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz#b6a17d48d231ac1fad93e43fca7271676bf316cf" + integrity sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw== + dependencies: + "@fortawesome/fontawesome-common-types" "6.3.0" + +"@fortawesome/free-regular-svg-icons@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.3.0.tgz#286f87f777e6c96af59151e86647c81083029ee2" + integrity sha512-cZnwiVHZ51SVzWHOaNCIA+u9wevZjCuAGSvSYpNlm6A4H4Vhwh8481Bf/5rwheIC3fFKlgXxLKaw8Xeroz8Ntg== + dependencies: + "@fortawesome/fontawesome-common-types" "6.3.0" + +"@fortawesome/free-solid-svg-icons@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz#d3bd33ae18bb15fdfc3ca136e2fea05f32768a65" + integrity sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.3.0" + +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@humanwhocodes/config-array@^0.11.8": version "0.11.8" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" @@ -2605,6 +2638,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -2704,3 +2742,10 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zustand@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.3.tgz#c9113499074dde2d6d99c1b5f591e9329572c224" + integrity sha512-x2jXq8S0kfLGNwGh87nhRfEc2eZy37tSatpSoSIN+O6HIaBhgQHSONV/F9VNrNcBcKQu/E80K1DeHDYQC/zCrQ== + dependencies: + use-sync-external-store "1.2.0" From 9b53608097cdae0af5c012fa3b4cec215f0ee288 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 24 Feb 2023 21:02:28 +0330 Subject: [PATCH 013/144] Added tag support + Post link and many more changes and optimizations. --- components/AddLinkModal.tsx | 100 +++++ components/ClickAwayHandler.tsx | 10 +- components/CollectionCard.tsx | 21 ++ components/CollectionCards.tsx | 32 -- .../InputSelect/CollectionSelection.tsx | 43 +++ components/InputSelect/TagSelection.tsx | 30 ++ components/InputSelect/styles.ts | 64 ++++ components/InputSelect/types.ts | 4 + components/Loader.tsx | 2 +- components/Navbar.tsx | 58 ++- components/Sidebar/SidebarItem.tsx | 26 ++ components/{Sidebar.tsx => Sidebar/index.tsx} | 43 ++- hooks/useRedirection.tsx | 2 +- layouts/MainLayout.tsx | 4 +- .../controllers/collections/getCollections.ts | 2 +- .../controllers/collections/postCollection.ts | 2 +- lib/api/controllers/links/postLink.ts | 106 ++++++ lib/api/controllers/tags/getTags.ts | 32 ++ lib/client/getInitialData.ts | 5 +- package.json | 1 + pages/api/auth/register.ts | 2 +- pages/api/routes/collections/index.ts | 6 +- pages/api/routes/links/index.ts | 24 ++ pages/api/routes/tags/index.ts | 21 ++ pages/collections/[id].tsx | 11 + pages/collections/index.tsx | 20 + pages/dashboard.tsx | 15 - pages/index.tsx | 2 +- pages/login.tsx | 2 +- pages/register.tsx | 2 +- .../migrations/20230213224230_/migration.sql | 57 --- .../migrations/20230224113421_/migration.sql | 90 +++++ prisma/schema.prisma | 21 +- store/collection.ts | 15 - store/tags.ts | 20 + yarn.lock | 343 +++++++++++++++++- 36 files changed, 1062 insertions(+), 176 deletions(-) create mode 100644 components/AddLinkModal.tsx create mode 100644 components/CollectionCard.tsx delete mode 100644 components/CollectionCards.tsx create mode 100644 components/InputSelect/CollectionSelection.tsx create mode 100644 components/InputSelect/TagSelection.tsx create mode 100644 components/InputSelect/styles.ts create mode 100644 components/InputSelect/types.ts create mode 100644 components/Sidebar/SidebarItem.tsx rename components/{Sidebar.tsx => Sidebar/index.tsx} (68%) create mode 100644 lib/api/controllers/links/postLink.ts create mode 100644 lib/api/controllers/tags/getTags.ts create mode 100644 pages/api/routes/links/index.ts create mode 100644 pages/api/routes/tags/index.ts create mode 100644 pages/collections/[id].tsx create mode 100644 pages/collections/index.tsx delete mode 100644 pages/dashboard.tsx delete mode 100644 prisma/migrations/20230213224230_/migration.sql create mode 100644 prisma/migrations/20230224113421_/migration.sql create mode 100644 store/tags.ts diff --git a/components/AddLinkModal.tsx b/components/AddLinkModal.tsx new file mode 100644 index 0000000..e179a8b --- /dev/null +++ b/components/AddLinkModal.tsx @@ -0,0 +1,100 @@ +import React, { useState } from "react"; +import CollectionSelection from "./InputSelect/CollectionSelection"; +import TagSelection from "./InputSelect/TagSelection"; + +interface NewLink { + name: string; + url: string; + tags: string[]; + collectionId: + | { + id: string | number; + isNew: boolean | undefined; + } + | object; +} + +export default function () { + const [newLink, setNewLink] = useState({ + name: "", + url: "", + tags: [], + collectionId: {}, + }); + + const setTags = (e: any) => { + const tagNames = e.map((e: any) => { + return e.label; + }); + + setNewLink({ ...newLink, tags: tagNames }); + }; + + const setCollection = (e: any) => { + const collection = { id: e?.value, isNew: e?.__isNew__ }; + + setNewLink({ ...newLink, collectionId: collection }); + }; + + const postLink = async () => { + const response = await fetch("/api/routes/links", { + body: JSON.stringify(newLink), + headers: { + "Content-Type": "application/json", + }, + method: "POST", + }); + + const data = await response.json(); + + console.log(newLink); + + console.log(data); + }; + + return ( +
+

New Link

+ +
+

Name

+ setNewLink({ ...newLink, name: e.target.value })} + type="text" + placeholder="e.g. Example Link" + className="w-60 rounded p-2 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + autoFocus + /> +
+ +
+

URL

+ setNewLink({ ...newLink, url: e.target.value })} + type="text" + placeholder="e.g. http://example.com/" + className="w-60 rounded p-2 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Tags

+ +
+ +
+

Collection

+ +
+ +
postLink()} + > + Add Link +
+
+ ); +} diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index 0da0137..5053783 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -20,19 +20,15 @@ function useOutsideAlerter( } } // Bind the event listener - document.addEventListener("mousedown", handleClickOutside); + document.addEventListener("mouseup", handleClickOutside); return () => { // Unbind the event listener on clean up - document.removeEventListener("mousedown", handleClickOutside); + document.removeEventListener("mouseup", handleClickOutside); }; }, [ref, onClickOutside]); } -export default function OutsideAlerter({ - children, - onClickOutside, - className, -}: Props) { +export default function ({ children, onClickOutside, className }: Props) { const wrapperRef = useRef(null); useOutsideAlerter(wrapperRef, onClickOutside); diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx new file mode 100644 index 0000000..aa5ba54 --- /dev/null +++ b/components/CollectionCard.tsx @@ -0,0 +1,21 @@ +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; +import { Collection } from "@prisma/client"; + +export default function ({ collection }: { collection: Collection }) { + const formattedDate = new Date(collection.createdAt).toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + + return ( +
+
+

{collection.name}

+ +
+

{formattedDate}

+
+ ); +} diff --git a/components/CollectionCards.tsx b/components/CollectionCards.tsx deleted file mode 100644 index 250a576..0000000 --- a/components/CollectionCards.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import useCollectionSlice from "@/store/collection"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; - -export default function Collections() { - const { collections } = useCollectionSlice(); - - return ( -
- {collections.map((e, i) => { - const formattedDate = new Date(e.createdAt).toLocaleString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - }); - - return ( -
-
-

{e.name}

- -
-

{formattedDate}

-
- ); - })} -
- ); -} diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx new file mode 100644 index 0000000..8a1822f --- /dev/null +++ b/components/InputSelect/CollectionSelection.tsx @@ -0,0 +1,43 @@ +import useCollectionSlice from "@/store/collection"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import CreatableSelect from "react-select/creatable"; +import { styles } from "./styles"; +import { Options } from "./types"; + +export default function ({ onChange }: any) { + const { collections } = useCollectionSlice(); + const router = useRouter(); + + const [options, setOptions] = useState([]); + + const collectionId = Number(router.query.id); + + const activeCollection = collections.find((e) => { + return e.id === collectionId; + }); + + const defaultCollection = { + value: activeCollection?.id, + label: activeCollection?.name, + }; + + useEffect(() => { + const formatedCollections = collections.map((e) => { + return { value: e.id, label: e.name }; + }); + + setOptions(formatedCollections); + }, [collections]); + + return ( + + ); +} diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx new file mode 100644 index 0000000..24887b5 --- /dev/null +++ b/components/InputSelect/TagSelection.tsx @@ -0,0 +1,30 @@ +import useTagSlice from "@/store/tags"; +import { useEffect, useState } from "react"; +import CreatableSelect from "react-select/creatable"; +import { styles } from "./styles"; +import { Options } from "./types"; + +export default function ({ onChange }: any) { + const { tags } = useTagSlice(); + + const [options, setOptions] = useState([]); + + useEffect(() => { + const formatedCollections = tags.map((e) => { + return { value: e.id, label: e.name }; + }); + + setOptions(formatedCollections); + }, [tags]); + + return ( + + ); +} diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts new file mode 100644 index 0000000..28940b5 --- /dev/null +++ b/components/InputSelect/styles.ts @@ -0,0 +1,64 @@ +import { StylesConfig } from "react-select"; + +const font = + "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji"; + +export const styles: StylesConfig = { + option: (styles, state) => ({ + ...styles, + fontFamily: font, + cursor: "pointer", + backgroundColor: state.isSelected ? "#0ea5e9" : "inherit", + "&:hover": { + backgroundColor: state.isSelected ? "#0ea5e9" : "#bae6fd", + }, + transition: "all 50ms", + }), + control: (styles) => ({ + ...styles, + fontFamily: font, + border: "none", + }), + container: (styles) => ({ + ...styles, + width: "15rem", + border: "1px solid #e0f2fe", + borderRadius: "0.25rem", + fontSize: "0.875rem", + lineHeight: "1.25rem", + }), + input: (styles) => ({ + ...styles, + cursor: "text", + }), + dropdownIndicator: (styles) => ({ + ...styles, + cursor: "pointer", + }), + clearIndicator: (styles) => ({ + ...styles, + cursor: "pointer", + }), + placeholder: (styles) => ({ + ...styles, + borderColor: "black", + }), + multiValue: (styles) => { + return { + ...styles, + backgroundColor: "#0ea5e9", + color: "white", + }; + }, + multiValueLabel: (styles) => ({ + ...styles, + color: "white", + }), + multiValueRemove: (styles) => ({ + ...styles, + ":hover": { + color: "white", + backgroundColor: "#38bdf8", + }, + }), +}; diff --git a/components/InputSelect/types.ts b/components/InputSelect/types.ts new file mode 100644 index 0000000..c521479 --- /dev/null +++ b/components/InputSelect/types.ts @@ -0,0 +1,4 @@ +export interface Options { + value: string | number; + label: string; +} diff --git a/components/Loader.tsx b/components/Loader.tsx index f41c4d5..88d12d8 100644 --- a/components/Loader.tsx +++ b/components/Loader.tsx @@ -1,4 +1,4 @@ -export default function Loader() { +export default function () { return (

Loading...

diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 26d5267..9b422f7 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,11 +1,59 @@ import { signOut } from "next-auth/react"; +import { useRouter } from "next/router"; +import useCollectionSlice from "@/store/collection"; +import { Collection } from "@prisma/client"; +import ClickAwayHandler from "./ClickAwayHandler"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faPlus, faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; +import { useState } from "react"; +import AddLinkModal from "./AddLinkModal"; + +export default function () { + const router = useRouter(); + const collectionId = router.query.id; + + const { collections } = useCollectionSlice(); + + const activeCollection: Collection | undefined = collections.find( + (e) => e.id.toString() == collectionId + ); + + const [collectionInput, setCollectionInput] = useState(false); + + const toggleCollectionInput = () => { + setCollectionInput(!collectionInput); + }; -export default function Navbar() { return ( -
-

Navbar

-
signOut()} className="cursor-pointer w-max"> - Sign Out +
+

{activeCollection?.name}

+
+ + +
signOut()} + className="cursor-pointer w-max text-sky-900" + > + Sign Out +
+ + {collectionInput ? ( +
+ + + +
+ ) : null}
); diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx new file mode 100644 index 0000000..2f3202f --- /dev/null +++ b/components/Sidebar/SidebarItem.tsx @@ -0,0 +1,26 @@ +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { Collection } from "@prisma/client"; +import { IconProp } from "@fortawesome/fontawesome-svg-core"; +import { MouseEventHandler } from "react"; + +interface TextObject { + name: string; +} + +interface SidebarItemProps { + item: Collection | TextObject; + icon: IconProp; + onClick?: MouseEventHandler; +} + +export default function ({ item, icon, onClick }: SidebarItemProps) { + return ( +
+ +

{item.name}

+
+ ); +} diff --git a/components/Sidebar.tsx b/components/Sidebar/index.tsx similarity index 68% rename from components/Sidebar.tsx rename to components/Sidebar/index.tsx index 8892b40..daa0a5f 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar/index.tsx @@ -3,20 +3,26 @@ import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; import useCollectionSlice from "@/store/collection"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faFolder, faUserCircle } from "@fortawesome/free-regular-svg-icons"; +import { faUserCircle } from "@fortawesome/free-regular-svg-icons"; import { - faDatabase, faPlus, faChevronDown, + faFolder, + faHouse, + faHashtag, } from "@fortawesome/free-solid-svg-icons"; +import SidebarItem from "./SidebarItem"; +import useTagSlice from "@/store/tags"; -export default function Sidebar() { +export default function () { const { data: session } = useSession(); const [collectionInput, setCollectionInput] = useState(false); const { collections, addCollection } = useCollectionSlice(); + const { tags } = useTagSlice(); + const user = session?.user; const toggleCollectionInput = () => { @@ -36,7 +42,7 @@ export default function Sidebar() { return (
-
+

{user?.name}

@@ -44,13 +50,10 @@ export default function Sidebar() {
-
- -

All Collections

-
+
-

Collections

+

Collections

{collectionInput ? ( @@ -68,21 +71,21 @@ export default function Sidebar() { )}
{collections.map((e, i) => { - return ( -
- -

{e.name}

-
- ); + return ; + })} +
+
+

Tags

+
+
+ {tags.map((e, i) => { + return ; })}
diff --git a/hooks/useRedirection.tsx b/hooks/useRedirection.tsx index f5d91ba..e5a575b 100644 --- a/hooks/useRedirection.tsx +++ b/hooks/useRedirection.tsx @@ -2,7 +2,7 @@ import { ReactNode, useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; -export default function useRedirection() { +export default function () { const router = useRouter(); const { status } = useSession(); const [redirect, setRedirect] = useState(true); diff --git a/layouts/MainLayout.tsx b/layouts/MainLayout.tsx index e564a65..e41ab6d 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -12,7 +12,7 @@ interface Props { children: ReactNode; } -export default function Layout({ children }: Props) { +export default function ({ children }: Props) { const { status } = useSession(); const router = useRouter(); const redirection = useRedirection(); @@ -29,7 +29,7 @@ export default function Layout({ children }: Props) { -
+
{children}
diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts index acfb08d..7e668b5 100644 --- a/lib/api/controllers/collections/getCollections.ts +++ b/lib/api/controllers/collections/getCollections.ts @@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; -export default async function handler( +export default async function ( req: NextApiRequest, res: NextApiResponse, session: Session diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index 22db6f7..058bf32 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; -export default async function handler( +export default async function ( req: NextApiRequest, res: NextApiResponse, session: Session diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts new file mode 100644 index 0000000..c949160 --- /dev/null +++ b/lib/api/controllers/links/postLink.ts @@ -0,0 +1,106 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { prisma } from "@/lib/api/db"; +import { Session } from "next-auth"; +import { Link } from "@prisma/client"; + +interface LinkObject { + id: number; + name: string; + url: string; + tags: string[]; + collectionId: { + id: string | number; + isNew: boolean | undefined; + }; +} + +export default async function ( + req: NextApiRequest, + res: NextApiResponse, + session: Session +) { + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); + } + + const email: string = session.user.email; + const link: LinkObject = req?.body; + + if (!link.name) { + return res + .status(401) + .json({ response: "Please enter a valid name for the link." }); + } + + if (link.collectionId.isNew) { + const collectionId = link.collectionId.id as string; + + const findCollection = await prisma.user.findFirst({ + where: { + email, + }, + select: { + collections: { + where: { + name: collectionId, + }, + }, + }, + }); + + const checkIfCollectionExists = findCollection?.collections[0]; + + if (checkIfCollectionExists) { + return res.status(400).json({ response: "Collection already exists." }); + } + + const createCollection = await prisma.collection.create({ + data: { + owner: { + connect: { + id: session.user.id, + }, + }, + name: collectionId, + }, + }); + + link.collectionId.id = createCollection.id; + } + + const collectionId = link.collectionId.id as number; + + const createLink: Link = await prisma.link.create({ + data: { + name: link.name, + url: "https://www.example.com", + collection: { + connect: { + id: collectionId, + }, + }, + tags: { + connectOrCreate: link.tags.map((name) => ({ + where: { + name_collectionId: { + name, + collectionId, + }, + }, + create: { + name, + collections: { + connect: { + id: collectionId, + }, + }, + }, + })), + }, + }, + }); + + return res.status(200).json({ + response: createLink, + }); +} diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts new file mode 100644 index 0000000..c0816d3 --- /dev/null +++ b/lib/api/controllers/tags/getTags.ts @@ -0,0 +1,32 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { prisma } from "@/lib/api/db"; +import { Session } from "next-auth"; + +export default async function ( + req: NextApiRequest, + res: NextApiResponse, + session: Session +) { + const tags = await prisma.tag.findMany({ + where: { + collections: { + OR: [ + { + ownerId: session?.user.id, + }, + { + members: { + some: { + userId: session?.user.id, + }, + }, + }, + ], + }, + }, + }); + + return res.status(200).json({ + response: tags || [], + }); +} diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts index 61a08ec..0cd8c52 100644 --- a/lib/client/getInitialData.ts +++ b/lib/client/getInitialData.ts @@ -1,14 +1,17 @@ import useCollectionSlice from "@/store/collection"; import { useEffect } from "react"; import { useSession } from "next-auth/react"; +import useTagSlice from "@/store/tags"; -export default function getInitialData() { +export default function () { const { status } = useSession(); const { setCollections } = useCollectionSlice(); + const { setTags } = useTagSlice(); useEffect(() => { if (status === "authenticated") { setCollections(); + setTags(); } }, [status]); } diff --git a/package.json b/package.json index 1832903..ed4cb04 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "next-auth": "^4.19.1", "react": "18.2.0", "react-dom": "18.2.0", + "react-select": "^5.7.0", "typescript": "4.9.4", "zustand": "^4.3.3" }, diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index 0677bda..1ef1f44 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -12,7 +12,7 @@ interface User { password: string; } -export default async function handler( +export default async function ( req: NextApiRequest, res: NextApiResponse ) { diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index b8a102a..2b25189 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -2,13 +2,13 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; import getCollections from "@/lib/api/controllers/collections/getCollections"; -import postCollections from "@/lib/api/controllers/collections/postCollection"; +import postCollection from "@/lib/api/controllers/collections/postCollection"; type Data = { response: object[] | string; }; -export default async function handler( +export default async function ( req: NextApiRequest, res: NextApiResponse ) { @@ -20,5 +20,5 @@ export default async function handler( if (req.method === "GET") return await getCollections(req, res, session); - if (req.method === "POST") return await postCollections(req, res, session); + if (req.method === "POST") return await postCollection(req, res, session); } diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts new file mode 100644 index 0000000..1ace143 --- /dev/null +++ b/pages/api/routes/links/index.ts @@ -0,0 +1,24 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; +import postLink from "@/lib/api/controllers/links/postLink"; + +type Data = { + response: object[] | string; +}; + +export default async function ( + req: NextApiRequest, + res: NextApiResponse +) { + const session = await getServerSession(req, res, authOptions); + + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); + } + + // Check if user is unauthorized to the collection (If isn't owner or doesn't has the required permission...) + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + if (req.method === "POST") return await postLink(req, res, session); +} diff --git a/pages/api/routes/tags/index.ts b/pages/api/routes/tags/index.ts new file mode 100644 index 0000000..ea0aff5 --- /dev/null +++ b/pages/api/routes/tags/index.ts @@ -0,0 +1,21 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; +import getTags from "@/lib/api/controllers/tags/getTags"; + +type Data = { + response: object[] | string; +}; + +export default async function ( + req: NextApiRequest, + res: NextApiResponse +) { + const session = await getServerSession(req, res, authOptions); + + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); + } + + if (req.method === "GET") return await getTags(req, res, session); +} diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx new file mode 100644 index 0000000..8d9e982 --- /dev/null +++ b/pages/collections/[id].tsx @@ -0,0 +1,11 @@ +import { useRouter } from "next/router"; + +export default function () { + const router = useRouter(); + + const collectionId = Number(router.query.id); + + console.log(collectionId); + + return
{"HI"}
; +} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx new file mode 100644 index 0000000..3ce9f3e --- /dev/null +++ b/pages/collections/index.tsx @@ -0,0 +1,20 @@ +import { useSession } from "next-auth/react"; +import useCollectionSlice from "@/store/collection"; + +import CollectionCard from "@/components/CollectionCard"; + +export default function () { + const { collections } = useCollectionSlice(); + const { data: session, status } = useSession(); + + const user = session?.user; + + return ( + // ml-80 +
+ {collections.map((e, i) => { + return ; + })} +
+ ); +} diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx deleted file mode 100644 index a8f97a7..0000000 --- a/pages/dashboard.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { useSession } from "next-auth/react"; -import CollectionCards from "@/components/CollectionCards"; - -export default function Dashboard() { - const { data: session, status } = useSession(); - - const user = session?.user; - - return ( - // ml-80 -
- -
- ); -} diff --git a/pages/index.tsx b/pages/index.tsx index 7c4db0c..291bd09 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -5,6 +5,6 @@ export default function Home() { const router = useRouter(); useEffect(() => { - router.push("/dashboard"); + router.push("/collections"); }, []); } diff --git a/pages/login.tsx b/pages/login.tsx index 29a2c4c..d2e8d5b 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -7,7 +7,7 @@ interface FormData { password: string; } -export default function Login() { +export default function () { const [form, setForm] = useState({ email: "", password: "", diff --git a/pages/register.tsx b/pages/register.tsx index 2da7f4a..5ea073d 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -8,7 +8,7 @@ interface FormData { password: string; } -export default function Register() { +export default function () { const router = useRouter(); const [form, setForm] = useState({ diff --git a/prisma/migrations/20230213224230_/migration.sql b/prisma/migrations/20230213224230_/migration.sql deleted file mode 100644 index 546f3c0..0000000 --- a/prisma/migrations/20230213224230_/migration.sql +++ /dev/null @@ -1,57 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "email" TEXT NOT NULL, - "password" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Collection" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "ownerId" INTEGER NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "UserAndCollection" ( - "userId" INTEGER NOT NULL, - "collectionId" INTEGER NOT NULL, - "canCreate" BOOLEAN NOT NULL, - "canRead" BOOLEAN NOT NULL, - "canUpdate" BOOLEAN NOT NULL, - "canDelete" BOOLEAN NOT NULL, - - CONSTRAINT "UserAndCollection_pkey" PRIMARY KEY ("userId","collectionId") -); - --- CreateTable -CREATE TABLE "Link" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "url" TEXT NOT NULL, - "collectionId" INTEGER NOT NULL, - - CONSTRAINT "Link_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- AddForeignKey -ALTER TABLE "Collection" ADD CONSTRAINT "Collection_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "UserAndCollection" ADD CONSTRAINT "UserAndCollection_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Link" ADD CONSTRAINT "Link_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20230224113421_/migration.sql b/prisma/migrations/20230224113421_/migration.sql new file mode 100644 index 0000000..aa386e8 --- /dev/null +++ b/prisma/migrations/20230224113421_/migration.sql @@ -0,0 +1,90 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Collection" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "ownerId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Collection_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UsersAndCollections" ( + "userId" INTEGER NOT NULL, + "collectionId" INTEGER NOT NULL, + "canCreate" BOOLEAN NOT NULL, + "canRead" BOOLEAN NOT NULL, + "canUpdate" BOOLEAN NOT NULL, + "canDelete" BOOLEAN NOT NULL, + + CONSTRAINT "UsersAndCollections_pkey" PRIMARY KEY ("userId","collectionId") +); + +-- CreateTable +CREATE TABLE "Link" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "collectionId" INTEGER NOT NULL, + + CONSTRAINT "Link_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "collectionId" INTEGER NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_LinkToTag" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Tag_name_collectionId_key" ON "Tag"("name", "collectionId"); + +-- CreateIndex +CREATE UNIQUE INDEX "_LinkToTag_AB_unique" ON "_LinkToTag"("A", "B"); + +-- CreateIndex +CREATE INDEX "_LinkToTag_B_index" ON "_LinkToTag"("B"); + +-- AddForeignKey +ALTER TABLE "Collection" ADD CONSTRAINT "Collection_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UsersAndCollections" ADD CONSTRAINT "UsersAndCollections_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UsersAndCollections" ADD CONSTRAINT "UsersAndCollections_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Link" ADD CONSTRAINT "Link_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Tag" ADD CONSTRAINT "Tag_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_LinkToTag" ADD CONSTRAINT "_LinkToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Link"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_LinkToTag" ADD CONSTRAINT "_LinkToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c71b3c0..32a0891 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,6 +1,3 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - generator client { provider = "prisma-client-js" } @@ -16,7 +13,7 @@ model User { email String @unique password String collections Collection[] - collectionsJoined UserAndCollection[] + collectionsJoined UsersAndCollections[] createdAt DateTime @default(now()) } @@ -25,12 +22,13 @@ model Collection { name String owner User @relation(fields: [ownerId], references: [id]) ownerId Int - members UserAndCollection[] + members UsersAndCollections[] links Link[] + tags Tag[] createdAt DateTime @default(now()) } -model UserAndCollection { +model UsersAndCollections { user User @relation(fields: [userId], references: [id]) userId Int @@ -51,4 +49,15 @@ model Link { url String collection Collection @relation(fields: [collectionId], references: [id]) collectionId Int + tags Tag[] +} + +model Tag { + id Int @id @default(autoincrement()) + name String + links Link[] + collections Collection @relation(fields: [collectionId], references: [id]) + collectionId Int + + @@unique([name, collectionId]) } \ No newline at end of file diff --git a/store/collection.ts b/store/collection.ts index f2c23ef..fa2ee83 100644 --- a/store/collection.ts +++ b/store/collection.ts @@ -41,21 +41,6 @@ const useCollectionSlice = create()((set) => ({ ), })), removeCollection: (collectionId) => { - // await fetch("/api/routes/collections/postCollection", { - // body: JSON.stringify({ collectionName }), - // headers: { - // "Content-Type": "application/json", - // }, - // method: "POST", - // }) - // .then((res) => res.json()) - // .then((data) => { - // console.log(data); - // set((state) => ({ - // collections: [...state.collections, data.response], - // })); - // }); - set((state) => ({ collections: state.collections.filter((c) => c.id !== collectionId), })); diff --git a/store/tags.ts b/store/tags.ts new file mode 100644 index 0000000..9fe969a --- /dev/null +++ b/store/tags.ts @@ -0,0 +1,20 @@ +import { create } from "zustand"; +import { Tag } from "@prisma/client"; + +type TagSlice = { + tags: Tag[]; + setTags: () => void; +}; + +const useTagSlice = create()((set) => ({ + tags: [], + setTags: async () => { + const response = await fetch("/api/routes/tags"); + + const data = await response.json(); + + if (response.ok) set({ tags: data.response }); + }, +})); + +export default useTagSlice; diff --git a/yarn.lock b/yarn.lock index 168f90c..f9d8433 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,46 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/helper-module-imports@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" @@ -9,6 +49,103 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/types@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.0.tgz#1da00d89c2f18b226c9207d96edbeb79316a1819" + integrity sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@emotion/babel-plugin@^11.10.6": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" + integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.3" + +"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.8.1": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + "@eslint/eslintrc@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" @@ -24,6 +161,18 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@floating-ui/core@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.1.tgz#074182a1d277f94569c50a6b456e62585d463c8e" + integrity sha512-LSqwPZkK3rYfD7GKoIeExXOyYx6Q1O4iqZWwIehDNuv3Dv425FIAE8PRwtAx1imEolFTHgBEcoFHm9MDnYgPCg== + +"@floating-ui/dom@^1.0.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.1.tgz#8f93906e1a3b9f606ce78afb058e874344dcbe07" + integrity sha512-Rt45SmRiV8eU+xXSB9t0uMYiQ/ZWGE/jumse2o3i5RGlyvcbqOF4q+1qBnzLE2kZ5JGhq0iMkcGXUKbFe7MpTA== + dependencies: + "@floating-ui/core" "^1.2.1" + "@fortawesome/fontawesome-common-types@6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz#51f734e64511dbc3674cd347044d02f4dd26e86b" @@ -262,6 +411,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -274,6 +428,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.4.0": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@18.0.27": version "18.0.27" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" @@ -388,6 +549,13 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -514,6 +682,15 @@ axobject-query@^3.1.1: dependencies: deep-equal "^2.0.5" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -580,6 +757,15 @@ caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.300014 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz#a8d11f6a814c75c9ce9d851dc53eb1d1dfbcd657" integrity sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw== +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -613,6 +799,13 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -620,6 +813,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -640,11 +838,27 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + cookie@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -779,6 +993,14 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + electron-to-chromium@^1.4.251: version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" @@ -802,6 +1024,13 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" @@ -886,6 +1115,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -1154,6 +1388,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1368,6 +1607,11 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1409,6 +1653,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -1474,6 +1725,11 @@ is-array-buffer@^3.0.1: get-intrinsic "^1.1.3" is-typed-array "^1.1.10" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -1656,7 +1912,7 @@ js-sdsl@^4.1.4: resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -1668,6 +1924,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -1718,6 +1979,11 @@ lilconfig@^2.0.5, lilconfig@^2.0.6: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -1751,6 +2017,11 @@ make-dir@^3.1.0: dependencies: semver "^6.0.0" +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -2052,6 +2323,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2183,7 +2464,7 @@ prisma@^4.9.0: dependencies: "@prisma/engines" "4.9.0" -prop-types@^15.8.1: +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -2215,11 +2496,36 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-select@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" + integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.1.2" + +react-transition-group@^4.3.0: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -2274,7 +2580,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.7, resolve@^1.22.1: +resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -2390,6 +2696,11 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -2469,6 +2780,18 @@ styled-jsx@5.1.1: dependencies: client-only "0.0.1" +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -2548,6 +2871,11 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2638,6 +2966,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-isomorphic-layout-effect@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + use-sync-external-store@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" @@ -2733,7 +3066,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== From f3e104aafead8c13656c1c61e283cdd0b7a717ac Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 25 Feb 2023 07:52:33 +0330 Subject: [PATCH 014/144] Small changes. --- components/AddLinkModal.tsx | 6 ++++-- components/InputSelect/CollectionSelection.tsx | 12 ++++++++---- components/Sidebar/index.tsx | 7 +++++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/components/AddLinkModal.tsx b/components/AddLinkModal.tsx index e179a8b..31cf1c2 100644 --- a/components/AddLinkModal.tsx +++ b/components/AddLinkModal.tsx @@ -1,7 +1,8 @@ import React, { useState } from "react"; import CollectionSelection from "./InputSelect/CollectionSelection"; import TagSelection from "./InputSelect/TagSelection"; - +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; interface NewLink { name: string; url: string; @@ -90,9 +91,10 @@ export default function () {
postLink()} > + Add Link
diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index 8a1822f..e603d3a 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -17,10 +17,14 @@ export default function ({ onChange }: any) { return e.id === collectionId; }); - const defaultCollection = { - value: activeCollection?.id, - label: activeCollection?.name, - }; + let defaultCollection = null; + + if (activeCollection) { + defaultCollection = { + value: activeCollection?.id, + label: activeCollection?.name, + }; + } useEffect(() => { const formatedCollections = collections.map((e) => { diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index daa0a5f..9e33899 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -8,8 +8,9 @@ import { faPlus, faChevronDown, faFolder, - faHouse, + faBoxesStacked, faHashtag, + faBookmark, } from "@fortawesome/free-solid-svg-icons"; import SidebarItem from "./SidebarItem"; import useTagSlice from "@/store/tags"; @@ -50,7 +51,9 @@ export default function () {
- + + +

Collections

From cff10fa9b6552d0e592e5bed862d121aa8d33207 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 6 Mar 2023 00:33:20 +0330 Subject: [PATCH 015/144] Many improvements. --- components/AddLinkModal.tsx | 29 ++++---- components/ClickAwayHandler.tsx | 2 - components/CollectionCard.tsx | 15 +++-- .../InputSelect/CollectionSelection.tsx | 2 +- components/LinkList.tsx | 23 +++++++ components/Navbar.tsx | 66 ++++++++++++++++--- components/Sidebar/SidebarItem.tsx | 25 +++---- components/Sidebar/index.tsx | 39 +++++++++-- lib/api/controllers/links/getLinks.ts | 33 ++++++++++ lib/api/controllers/links/postLink.ts | 20 ++---- lib/client/getInitialData.ts | 5 +- pages/api/routes/links/index.ts | 2 + pages/collections/[id].tsx | 21 ++++-- pages/collections/index.tsx | 2 +- pages/tags/[id].tsx | 9 +++ store/{collection.ts => collections.ts} | 0 store/links.ts | 48 ++++++++++++++ styles/globals.css | 37 +++++++++++ types/global.ts | 15 +++++ 19 files changed, 314 insertions(+), 79 deletions(-) create mode 100644 components/LinkList.tsx create mode 100644 lib/api/controllers/links/getLinks.ts create mode 100644 pages/tags/[id].tsx rename store/{collection.ts => collections.ts} (100%) create mode 100644 store/links.ts create mode 100644 types/global.ts diff --git a/components/AddLinkModal.tsx b/components/AddLinkModal.tsx index 31cf1c2..5e74380 100644 --- a/components/AddLinkModal.tsx +++ b/components/AddLinkModal.tsx @@ -3,26 +3,22 @@ import CollectionSelection from "./InputSelect/CollectionSelection"; import TagSelection from "./InputSelect/TagSelection"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; -interface NewLink { - name: string; - url: string; - tags: string[]; - collectionId: - | { - id: string | number; - isNew: boolean | undefined; - } - | object; -} +import { useRouter } from "next/router"; +import { NewLink } from "@/types/global"; +import useLinkSlice from "@/store/links"; export default function () { + const router = useRouter(); + const [newLink, setNewLink] = useState({ name: "", url: "", tags: [], - collectionId: {}, + collectionId: { id: Number(router.query.id) }, }); + const { addLink } = useLinkSlice(); + const setTags = (e: any) => { const tagNames = e.map((e: any) => { return e.label; @@ -54,7 +50,7 @@ export default function () { }; return ( -
+

New Link

@@ -64,8 +60,7 @@ export default function () { onChange={(e) => setNewLink({ ...newLink, name: e.target.value })} type="text" placeholder="e.g. Example Link" - className="w-60 rounded p-2 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" - autoFocus + className="w-60 rounded p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" />
@@ -76,7 +71,7 @@ export default function () { onChange={(e) => setNewLink({ ...newLink, url: e.target.value })} type="text" placeholder="e.g. http://example.com/" - className="w-60 rounded p-2 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-60 rounded p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" />
@@ -92,7 +87,7 @@ export default function () {
postLink()} + onClick={() => addLink(newLink)} > Add Link diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index 5053783..3c8567d 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -19,10 +19,8 @@ function useOutsideAlerter( onClickOutside(); } } - // Bind the event listener document.addEventListener("mouseup", handleClickOutside); return () => { - // Unbind the event listener on clean up document.removeEventListener("mouseup", handleClickOutside); }; }, [ref, onClickOutside]); diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index aa5ba54..6a682cd 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -1,6 +1,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; import { Collection } from "@prisma/client"; +import Link from "next/link"; export default function ({ collection }: { collection: Collection }) { const formattedDate = new Date(collection.createdAt).toLocaleString("en-US", { @@ -10,12 +11,14 @@ export default function ({ collection }: { collection: Collection }) { }); return ( -
-
-

{collection.name}

- + +
+
+

{collection.name}

+ +
+

{formattedDate}

-

{formattedDate}

-
+ ); } diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index e603d3a..1c3348a 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -1,4 +1,4 @@ -import useCollectionSlice from "@/store/collection"; +import useCollectionSlice from "@/store/collections"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import CreatableSelect from "react-select/creatable"; diff --git a/components/LinkList.tsx b/components/LinkList.tsx new file mode 100644 index 0000000..8afd658 --- /dev/null +++ b/components/LinkList.tsx @@ -0,0 +1,23 @@ +import { LinkAndTags } from "@/types/global"; + +export default function ({ + link, + count, +}: { + link: LinkAndTags; + count: number; +}) { + return ( +
+
+

{count + 1}.

+

{link.name}

+
+
+ {link.tags.map((e, i) => ( +

{e.name}

+ ))} +
+
+ ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 9b422f7..d439ed4 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,22 +1,63 @@ import { signOut } from "next-auth/react"; import { useRouter } from "next/router"; -import useCollectionSlice from "@/store/collection"; -import { Collection } from "@prisma/client"; +import useCollectionSlice from "@/store/collections"; +import { Collection, Tag } from "@prisma/client"; import ClickAwayHandler from "./ClickAwayHandler"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faPlus, faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; -import { useState } from "react"; +import { + faPlus, + faFolder, + faBox, + faTag, + faBookmark, + faMagnifyingGlass, + IconDefinition, +} from "@fortawesome/free-solid-svg-icons"; +import { useEffect, useState } from "react"; import AddLinkModal from "./AddLinkModal"; +import useTagSlice from "@/store/tags"; export default function () { const router = useRouter(); - const collectionId = router.query.id; + const [pageName, setPageName] = useState(""); + const [pageIcon, setPageIcon] = useState(null); const { collections } = useCollectionSlice(); + const { tags } = useTagSlice(); - const activeCollection: Collection | undefined = collections.find( - (e) => e.id.toString() == collectionId - ); + useEffect(() => { + if (router.route === "/collections/[id]") { + const collectionId = router.query.id; + + const activeCollection: Collection | undefined = collections.find( + (e) => e.id.toString() == collectionId + ); + + if (activeCollection) { + setPageName(activeCollection?.name); + } + + setPageIcon(faFolder); + } else if (router.route === "/tags/[id]") { + const tagId = router.query.id; + + const activeTag: Tag | undefined = tags.find( + (e) => e.id.toString() == tagId + ); + + if (activeTag) { + setPageName(activeTag?.name); + } + + setPageIcon(faTag); + } else if (router.route === "/collections") { + setPageName("All Collections"); + setPageIcon(faBox); + } else if (router.route === "/links") { + setPageName("All Links"); + setPageIcon(faBookmark); + } + }, [router, collections, tags]); const [collectionInput, setCollectionInput] = useState(false); @@ -26,7 +67,12 @@ export default function () { return (
-

{activeCollection?.name}

+
+ {pageIcon ? ( + + ) : null} +

{pageName}

+
{collectionInput ? ( -
+
- -

{item.name}

-
+ +
+ +

{text}

+
+ ); } diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 9e33899..66d725e 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -1,19 +1,20 @@ import { useSession } from "next-auth/react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; -import useCollectionSlice from "@/store/collection"; +import useCollectionSlice from "@/store/collections"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faUserCircle } from "@fortawesome/free-regular-svg-icons"; import { faPlus, faChevronDown, faFolder, - faBoxesStacked, - faHashtag, + faBox, + faTag, faBookmark, } from "@fortawesome/free-solid-svg-icons"; import SidebarItem from "./SidebarItem"; import useTagSlice from "@/store/tags"; +import Link from "next/link"; export default function () { const { data: session } = useSession(); @@ -51,9 +52,19 @@ export default function () {
- + +
+ +

All Links

+
+ - + +
+ +

All Collections

+
+

Collections

@@ -80,7 +91,14 @@ export default function () {
{collections.map((e, i) => { - return ; + return ( + + ); })}
@@ -88,7 +106,14 @@ export default function () {
{tags.map((e, i) => { - return ; + return ( + + ); })}
diff --git a/lib/api/controllers/links/getLinks.ts b/lib/api/controllers/links/getLinks.ts new file mode 100644 index 0000000..9884aac --- /dev/null +++ b/lib/api/controllers/links/getLinks.ts @@ -0,0 +1,33 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { prisma } from "@/lib/api/db"; +import { Session } from "next-auth"; + +export default async function ( + req: NextApiRequest, + res: NextApiResponse, + session: Session +) { + const tags = await prisma.link.findMany({ + where: { + collection: { + OR: [ + { + ownerId: session?.user.id, + }, + { + members: { + some: { + userId: session?.user.id, + }, + }, + }, + ], + }, + }, + include: { tags: true }, + }); + + return res.status(200).json({ + response: tags || [], + }); +} diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index c949160..3cb87be 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -1,18 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; -import { Link } from "@prisma/client"; - -interface LinkObject { - id: number; - name: string; - url: string; - tags: string[]; - collectionId: { - id: string | number; - isNew: boolean | undefined; - }; -} +import { LinkAndTags, NewLink } from "@/types/global"; export default async function ( req: NextApiRequest, @@ -24,7 +13,7 @@ export default async function ( } const email: string = session.user.email; - const link: LinkObject = req?.body; + const link: NewLink = req?.body; if (!link.name) { return res @@ -70,10 +59,10 @@ export default async function ( const collectionId = link.collectionId.id as number; - const createLink: Link = await prisma.link.create({ + const createLink: LinkAndTags = await prisma.link.create({ data: { name: link.name, - url: "https://www.example.com", + url: link.url, collection: { connect: { id: collectionId, @@ -98,6 +87,7 @@ export default async function ( })), }, }, + include: { tags: true }, }); return res.status(200).json({ diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts index 0cd8c52..b0afa40 100644 --- a/lib/client/getInitialData.ts +++ b/lib/client/getInitialData.ts @@ -1,17 +1,20 @@ -import useCollectionSlice from "@/store/collection"; +import useCollectionSlice from "@/store/collections"; import { useEffect } from "react"; import { useSession } from "next-auth/react"; import useTagSlice from "@/store/tags"; +import useLinkSlice from "@/store/links"; export default function () { const { status } = useSession(); const { setCollections } = useCollectionSlice(); const { setTags } = useTagSlice(); + const { setLinks } = useLinkSlice(); useEffect(() => { if (status === "authenticated") { setCollections(); setTags(); + setLinks(); } }, [status]); } diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 1ace143..cd54885 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -1,6 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; +import getLinks from "@/lib/api/controllers/links/getLinks"; import postLink from "@/lib/api/controllers/links/postLink"; type Data = { @@ -20,5 +21,6 @@ export default async function ( // Check if user is unauthorized to the collection (If isn't owner or doesn't has the required permission...) // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + if (req.method === "GET") return await getLinks(req, res, session); if (req.method === "POST") return await postLink(req, res, session); } diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 8d9e982..08b76bb 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -1,11 +1,24 @@ +import LinkList from "@/components/LinkList"; +import useLinkSlice from "@/store/links"; import { useRouter } from "next/router"; export default function () { const router = useRouter(); + const { links } = useLinkSlice(); - const collectionId = Number(router.query.id); + const linksByCollection = links.filter( + (e) => e.collectionId === Number(router.query.id) + ); - console.log(collectionId); - - return
{"HI"}
; + return ( + // ml-80 +
+

+ {linksByCollection.length || 0} Links Found +

+ {linksByCollection.map((e, i) => { + return ; + })} +
+ ); } diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 3ce9f3e..5b5312d 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -1,5 +1,5 @@ import { useSession } from "next-auth/react"; -import useCollectionSlice from "@/store/collection"; +import useCollectionSlice from "@/store/collections"; import CollectionCard from "@/components/CollectionCard"; diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx new file mode 100644 index 0000000..3d89f4d --- /dev/null +++ b/pages/tags/[id].tsx @@ -0,0 +1,9 @@ +import { useRouter } from "next/router"; + +export default function () { + const router = useRouter(); + + const tagId = Number(router.query.id); + + return
{"HI"}
; +} diff --git a/store/collection.ts b/store/collections.ts similarity index 100% rename from store/collection.ts rename to store/collections.ts diff --git a/store/links.ts b/store/links.ts new file mode 100644 index 0000000..63e2df8 --- /dev/null +++ b/store/links.ts @@ -0,0 +1,48 @@ +import { create } from "zustand"; +import { LinkAndTags, NewLink } from "@/types/global"; + +type LinkSlice = { + links: LinkAndTags[]; + setLinks: () => void; + addLink: (linkName: NewLink) => void; + updateLink: (link: LinkAndTags) => void; + removeLink: (linkId: number) => void; +}; + +const useLinkSlice = create()((set) => ({ + links: [], + setLinks: async () => { + const response = await fetch("/api/routes/links"); + + const data = await response.json(); + + if (response.ok) set({ links: data.response }); + }, + addLink: async (newLink) => { + const response = await fetch("/api/routes/links", { + body: JSON.stringify(newLink), + headers: { + "Content-Type": "application/json", + }, + method: "POST", + }); + + const data = await response.json(); + + if (response.ok) + set((state) => ({ + links: [...state.links, data.response], + })); + }, + updateLink: (link) => + set((state) => ({ + links: state.links.map((c) => (c.id === link.id ? link : c)), + })), + removeLink: (linkId) => { + set((state) => ({ + links: state.links.filter((c) => c.id !== linkId), + })); + }, +})); + +export default useLinkSlice; diff --git a/styles/globals.css b/styles/globals.css index edf4f20..790abe3 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -10,3 +10,40 @@ -ms-overflow-style: none; scrollbar-width: none; } + +::selection { + background-color: #0ea5e9; + color: white; +} + +.hyphens { + hyphens: auto; +} + +.slide-up { + animation: slide-up-animation 70ms; +} + +.fade-in { + animation: fade-in-animation 100ms; +} + +@keyframes fade-in-animation { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes slide-up-animation { + 0% { + transform: translateY(10%); + opacity: 0; + } + 100% { + transform: translateY(0); + opacity: 1; + } +} diff --git a/types/global.ts b/types/global.ts new file mode 100644 index 0000000..c8d0a23 --- /dev/null +++ b/types/global.ts @@ -0,0 +1,15 @@ +import { Link, Tag } from "@prisma/client"; + +export interface LinkAndTags extends Link { + tags: Tag[]; +} + +export interface NewLink { + name: string; + url: string; + tags: string[]; + collectionId: { + id: string | number; + isNew?: boolean; + }; +} From bd3b2f50f2373b82c72213d0316e1a5b45cf5d92 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 6 Mar 2023 23:38:11 +0330 Subject: [PATCH 016/144] Extended "Link" model. --- .../{20230224113421_ => 20230306200620_}/migration.sql | 5 +++++ prisma/schema.prisma | 5 +++++ 2 files changed, 10 insertions(+) rename prisma/migrations/{20230224113421_ => 20230306200620_}/migration.sql (93%) diff --git a/prisma/migrations/20230224113421_/migration.sql b/prisma/migrations/20230306200620_/migration.sql similarity index 93% rename from prisma/migrations/20230224113421_/migration.sql rename to prisma/migrations/20230306200620_/migration.sql index aa386e8..801d317 100644 --- a/prisma/migrations/20230224113421_/migration.sql +++ b/prisma/migrations/20230306200620_/migration.sql @@ -36,7 +36,12 @@ CREATE TABLE "Link" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "url" TEXT NOT NULL, + "title" TEXT NOT NULL, "collectionId" INTEGER NOT NULL, + "isFavorites" BOOLEAN NOT NULL, + "screenshotPath" TEXT NOT NULL, + "pdfPath" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "Link_pkey" PRIMARY KEY ("id") ); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 32a0891..09c6e0a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -47,9 +47,14 @@ model Link { id Int @id @default(autoincrement()) name String url String + title String collection Collection @relation(fields: [collectionId], references: [id]) collectionId Int tags Tag[] + isFavorites Boolean + screenshotPath String + pdfPath String + createdAt DateTime @default(now()) } model Tag { From 0d5579b56d2096bec4b57de63c9c6cf36104add3 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 9 Mar 2023 01:01:24 +0330 Subject: [PATCH 017/144] feat!: added PDF and screenshot archive support --- .gitignore | 5 +- components/AddLinkModal.tsx | 24 +++------- components/LinkList.tsx | 5 +- components/Navbar.tsx | 14 +++--- lib/api/archive.ts | 21 ++++++++ .../controllers/collections/postCollection.ts | 9 +++- lib/api/controllers/links/postLink.ts | 48 ++++++++++++++++--- lib/api/getTitle.ts | 9 ++++ lib/api/hasAccessToCollection.ts | 15 ++++++ package.json | 3 ++ pages/api/archives/[...params].ts | 44 +++++++++++++++++ pages/api/auth/register.ts | 6 --- .../migration.sql | 1 - prisma/schema.prisma | 1 - store/links.ts | 4 +- types/global.ts | 2 +- yarn.lock | 22 +++++++++ 17 files changed, 186 insertions(+), 47 deletions(-) create mode 100644 lib/api/archive.ts create mode 100644 lib/api/getTitle.ts create mode 100644 lib/api/hasAccessToCollection.ts create mode 100644 pages/api/archives/[...params].ts rename prisma/migrations/{20230306200620_ => 20230308212222_}/migration.sql (98%) diff --git a/.gitignore b/.gitignore index 814dcf1..bebba3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - # dependencies /node_modules /.pnp @@ -35,3 +33,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# generated files and folders +/data diff --git a/components/AddLinkModal.tsx b/components/AddLinkModal.tsx index 5e74380..fd4bfcb 100644 --- a/components/AddLinkModal.tsx +++ b/components/AddLinkModal.tsx @@ -7,14 +7,14 @@ import { useRouter } from "next/router"; import { NewLink } from "@/types/global"; import useLinkSlice from "@/store/links"; -export default function () { +export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { const router = useRouter(); const [newLink, setNewLink] = useState({ name: "", url: "", tags: [], - collectionId: { id: Number(router.query.id) }, + collection: { id: Number(router.query.id) }, }); const { addLink } = useLinkSlice(); @@ -30,23 +30,13 @@ export default function () { const setCollection = (e: any) => { const collection = { id: e?.value, isNew: e?.__isNew__ }; - setNewLink({ ...newLink, collectionId: collection }); + setNewLink({ ...newLink, collection: collection }); }; - const postLink = async () => { - const response = await fetch("/api/routes/links", { - body: JSON.stringify(newLink), - headers: { - "Content-Type": "application/json", - }, - method: "POST", - }); + const submitLink = async () => { + const response = await addLink(newLink); - const data = await response.json(); - - console.log(newLink); - - console.log(data); + if (response) toggleLinkModal(); }; return ( @@ -87,7 +77,7 @@ export default function () {
addLink(newLink)} + onClick={submitLink} > Add Link diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 8afd658..0917971 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -9,7 +9,7 @@ export default function ({ }) { return (
-
+ {/*

{count + 1}.

{link.name}

@@ -17,7 +17,8 @@ export default function ({ {link.tags.map((e, i) => (

{e.name}

))} -
+
*/} + {JSON.stringify(link)}
); } diff --git a/components/Navbar.tsx b/components/Navbar.tsx index d439ed4..7293b68 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -59,10 +59,10 @@ export default function () { } }, [router, collections, tags]); - const [collectionInput, setCollectionInput] = useState(false); + const [linkModal, setLinkModal] = useState(false); - const toggleCollectionInput = () => { - setCollectionInput(!collectionInput); + const toggleLinkModal = () => { + setLinkModal(!linkModal); }; return ( @@ -76,7 +76,7 @@ export default function () {
- {collectionInput ? ( + {linkModal ? (
- +
) : null} diff --git a/lib/api/archive.ts b/lib/api/archive.ts new file mode 100644 index 0000000..9dd401c --- /dev/null +++ b/lib/api/archive.ts @@ -0,0 +1,21 @@ +import { chromium, devices } from "playwright"; + +export default async (url: string, collectionId: number, linkId: number) => { + const archivePath = `data/archives/${collectionId}/${linkId}`; + + const browser = await chromium.launch(); + const context = await browser.newContext(devices["Desktop Chrome"]); + const page = await context.newPage(); + + // const contexts = browser.contexts(); + // console.log(contexts.length); + + await page.goto(url); + + await page.pdf({ path: archivePath + ".pdf" }); + + await page.screenshot({ fullPage: true, path: archivePath + ".png" }); + + await context.close(); + await browser.close(); +}; diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index 058bf32..d938755 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -1,6 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; +import { existsSync, mkdirSync } from "fs"; export default async function ( req: NextApiRequest, @@ -39,7 +40,7 @@ export default async function ( return res.status(400).json({ response: "Collection already exists." }); } - const createCollection = await prisma.collection.create({ + const newCollection = await prisma.collection.create({ data: { owner: { connect: { @@ -50,7 +51,11 @@ export default async function ( }, }); + const collectionPath = `data/archives/${newCollection.id}`; + if (!existsSync(collectionPath)) + mkdirSync(collectionPath, { recursive: true }); + return res.status(200).json({ - response: createCollection, + response: newCollection, }); } diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index 3cb87be..c758725 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -2,6 +2,11 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; import { LinkAndTags, NewLink } from "@/types/global"; +import { existsSync, mkdirSync } from "fs"; +import getTitle from "../../getTitle"; +import archive from "../../archive"; +import { Link } from "@prisma/client"; +import AES from "crypto-js/aes"; export default async function ( req: NextApiRequest, @@ -21,8 +26,8 @@ export default async function ( .json({ response: "Please enter a valid name for the link." }); } - if (link.collectionId.isNew) { - const collectionId = link.collectionId.id as string; + if (link.collection.isNew) { + const collectionId = link.collection.id as string; const findCollection = await prisma.user.findFirst({ where: { @@ -43,7 +48,7 @@ export default async function ( return res.status(400).json({ response: "Collection already exists." }); } - const createCollection = await prisma.collection.create({ + const newCollection = await prisma.collection.create({ data: { owner: { connect: { @@ -54,12 +59,18 @@ export default async function ( }, }); - link.collectionId.id = createCollection.id; + const collectionPath = `data/archives/${newCollection.id}`; + if (!existsSync(collectionPath)) + mkdirSync(collectionPath, { recursive: true }); + + link.collection.id = newCollection.id; } - const collectionId = link.collectionId.id as number; + const collectionId = link.collection.id as number; - const createLink: LinkAndTags = await prisma.link.create({ + const title = await getTitle(link.url); + + const newLink: Link = await prisma.link.create({ data: { name: link.name, url: link.url, @@ -86,11 +97,34 @@ export default async function ( }, })), }, + title, + isFavorites: false, + screenshotPath: "", + pdfPath: "", }, + }); + + const AES_SECRET = process.env.AES_SECRET as string; + + const screenShotHashedPath = AES.encrypt( + `data/archives/${newLink.collectionId}/${newLink.id}.png`, + AES_SECRET + ).toString(); + + const pdfHashedPath = AES.encrypt( + `data/archives/${newLink.collectionId}/${newLink.id}.pdf`, + AES_SECRET + ).toString(); + + const updatedLink: LinkAndTags = await prisma.link.update({ + where: { id: newLink.id }, + data: { screenshotPath: screenShotHashedPath, pdfPath: pdfHashedPath }, include: { tags: true }, }); + archive(updatedLink.url, updatedLink.collectionId, updatedLink.id); + return res.status(200).json({ - response: createLink, + response: updatedLink, }); } diff --git a/lib/api/getTitle.ts b/lib/api/getTitle.ts new file mode 100644 index 0000000..07187ee --- /dev/null +++ b/lib/api/getTitle.ts @@ -0,0 +1,9 @@ +export default async (url: string) => { + const response = await fetch(url); + const text = await response.text(); + + // regular expression to find the tag + let match = text.match(/<title.*>([^<]*)<\/title>/); + if (match) return match[1]; + else return ""; +}; diff --git a/lib/api/hasAccessToCollection.ts b/lib/api/hasAccessToCollection.ts new file mode 100644 index 0000000..d7ad859 --- /dev/null +++ b/lib/api/hasAccessToCollection.ts @@ -0,0 +1,15 @@ +import { prisma } from "@/lib/api/db"; + +export default async (userId: number, collectionId: number) => { + const check: any = await prisma.collection.findFirst({ + where: { + AND: { + id: collectionId, + OR: [{ ownerId: userId }, { members: { some: { userId } } }], + }, + }, + include: { members: true }, + }); + + return check; +}; diff --git a/package.json b/package.json index ed4cb04..dd18e92 100644 --- a/package.json +++ b/package.json @@ -19,14 +19,17 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@next/font": "13.1.6", "@prisma/client": "^4.9.0", + "@types/crypto-js": "^4.1.1", "@types/node": "18.11.18", "@types/react": "18.0.27", "@types/react-dom": "18.0.10", "bcrypt": "^5.1.0", + "crypto-js": "^4.1.1", "eslint": "8.33.0", "eslint-config-next": "13.1.6", "next": "13.1.6", "next-auth": "^4.19.1", + "playwright": "^1.31.2", "react": "18.2.0", "react-dom": "18.2.0", "react-select": "^5.7.0", diff --git a/pages/api/archives/[...params].ts b/pages/api/archives/[...params].ts new file mode 100644 index 0000000..5ec56b3 --- /dev/null +++ b/pages/api/archives/[...params].ts @@ -0,0 +1,44 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; +import AES from "crypto-js/aes"; +import enc from "crypto-js/enc-utf8"; +import path from "path"; +import fs from "fs"; +import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; + +export default async function (req: NextApiRequest, res: NextApiResponse) { + if (!req.query.params) + return res.status(401).json({ response: "Invalid parameters." }); + + const collectionId = req.query.params[0]; + + const session = await getServerSession(req, res, authOptions); + + if (!session?.user?.email) + return res.status(401).json({ response: "You must be logged in." }); + + const collectionIsAccessible = await hasAccessToCollection( + session.user.id, + Number(collectionId) + ); + + if (!collectionIsAccessible) + return res + .status(401) + .json({ response: "You don't have access to this collection." }); + + const AES_SECRET = process.env.AES_SECRET as string; + const encryptedPath = decodeURIComponent(req.query.params[1]) as string; + const decryptedPath = AES.decrypt(encryptedPath, AES_SECRET).toString(enc); + + const filePath = path.join(process.cwd(), decryptedPath); + const file = fs.readFileSync(filePath); + + if (filePath.endsWith(".pdf")) + res.setHeader("Content-Type", "application/pdf"); + + if (filePath.endsWith(".png")) res.setHeader("Content-Type", "image/png"); + + return res.status(200).send(file); +} diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index 1ef1f44..d0d2006 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -37,17 +37,11 @@ export default async function ( name: body.name, email: body.email, password: hashedPassword, - collections: { - create: { - name: "First Collection", - }, - }, }, }); res.status(201).json({ message: "User successfully created." }); } else if (checkIfUserExists) { - console.log(checkIfUserExists); res.status(400).json({ message: "User already exists." }); } } diff --git a/prisma/migrations/20230306200620_/migration.sql b/prisma/migrations/20230308212222_/migration.sql similarity index 98% rename from prisma/migrations/20230306200620_/migration.sql rename to prisma/migrations/20230308212222_/migration.sql index 801d317..0158c62 100644 --- a/prisma/migrations/20230306200620_/migration.sql +++ b/prisma/migrations/20230308212222_/migration.sql @@ -24,7 +24,6 @@ CREATE TABLE "UsersAndCollections" ( "userId" INTEGER NOT NULL, "collectionId" INTEGER NOT NULL, "canCreate" BOOLEAN NOT NULL, - "canRead" BOOLEAN NOT NULL, "canUpdate" BOOLEAN NOT NULL, "canDelete" BOOLEAN NOT NULL, diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 09c6e0a..872617b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -36,7 +36,6 @@ model UsersAndCollections { collectionId Int canCreate Boolean - canRead Boolean canUpdate Boolean canDelete Boolean diff --git a/store/links.ts b/store/links.ts index 63e2df8..bcdaf8a 100644 --- a/store/links.ts +++ b/store/links.ts @@ -4,7 +4,7 @@ import { LinkAndTags, NewLink } from "@/types/global"; type LinkSlice = { links: LinkAndTags[]; setLinks: () => void; - addLink: (linkName: NewLink) => void; + addLink: (linkName: NewLink) => Promise<boolean>; updateLink: (link: LinkAndTags) => void; removeLink: (linkId: number) => void; }; @@ -33,6 +33,8 @@ const useLinkSlice = create<LinkSlice>()((set) => ({ set((state) => ({ links: [...state.links, data.response], })); + + return response.ok; }, updateLink: (link) => set((state) => ({ diff --git a/types/global.ts b/types/global.ts index c8d0a23..e9a8de5 100644 --- a/types/global.ts +++ b/types/global.ts @@ -8,7 +8,7 @@ export interface NewLink { name: string; url: string; tags: string[]; - collectionId: { + collection: { id: string | number; isNew?: boolean; }; diff --git a/yarn.lock b/yarn.lock index f9d8433..0aeaf73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -396,6 +396,11 @@ dependencies: "@types/node" "*" +"@types/crypto-js@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" + integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -868,6 +873,11 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -2373,6 +2383,18 @@ pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +playwright-core@1.31.2: + version "1.31.2" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.2.tgz#debf4b215d14cb619adb7e511c164d068075b2ed" + integrity sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ== + +playwright@^1.31.2: + version "1.31.2" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.31.2.tgz#4252280586c596746122cd1fdf9f8ff6a63fa852" + integrity sha512-jpC47n2PKQNtzB7clmBuWh6ftBRS/Bt5EGLigJ9k2QAKcNeYXZkEaDH5gmvb6+AbcE0DO6GnXdbl9ogG6Eh+og== + dependencies: + playwright-core "1.31.2" + postcss-import@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" From 48bdf29161e2cf7fae509907bc44e0c15f33750d Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Fri, 10 Mar 2023 22:55:33 +0330 Subject: [PATCH 018/144] feat: created the Link component --- components/LinkList.tsx | 120 +++++++++++++++++++++++--- components/Navbar.tsx | 4 +- components/Sidebar/SidebarItem.tsx | 4 +- components/Sidebar/index.tsx | 4 +- lib/api/controllers/links/getLinks.ts | 5 +- lib/api/controllers/links/postLink.ts | 24 ++++-- lib/api/hasAccessToCollection.ts | 2 +- pages/api/routes/links/index.ts | 3 - store/links.ts | 6 +- types/global.ts | 5 +- 10 files changed, 144 insertions(+), 33 deletions(-) diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 0917971..2687453 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -1,24 +1,122 @@ -import { LinkAndTags } from "@/types/global"; +import { ExtendedLink } from "@/types/global"; +import { + faFolder, + faArrowUpRightFromSquare, + faCaretRight, + faEllipsis, + faFileImage, + faFilePdf, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useState } from "react"; export default function ({ link, count, }: { - link: LinkAndTags; + link: ExtendedLink; count: number; }) { + const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); + + const shortendURL = new URL(link.url).host.toLowerCase(); + const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + return ( <div className="border border-sky-100 mb-5 bg-gray-100 p-5 rounded"> - {/* <div className="flex items-baseline gap-1"> - <p className="text-sm text-sky-600">{count + 1}.</p> - <p className="text-lg text-sky-500">{link.name}</p> + <div className="flex justify-between h-full"> + <div> + <div className="flex items-baseline gap-1"> + <p className="text-sm text-sky-300 font-bold">{count + 1}.</p> + <p className="text-lg text-sky-600">{link.name}</p> + </div> + <p className="text-sky-400 text-sm font-medium">{link.title}</p> + <div className="flex gap-3 items-center flex-wrap my-3"> + <div className="flex items-center gap-1 cursor-pointer"> + <FontAwesomeIcon icon={faFolder} className="w-4 text-sky-300" /> + <p className="text-sky-900">{link.collection.name}</p> + </div> + <div className="flex gap-1 items-center flex-wrap"> + {link.tags.map((e, i) => ( + <p + key={i} + className="px-2 py-1 bg-sky-200 text-sky-700 text-xs rounded-3xl cursor-pointer" + > + # {e.name} + </p> + ))} + </div> + </div> + <div className="flex gap-2 items-center"> + <p className="text-gray-500">{formattedDate}</p> + <FontAwesomeIcon + icon={faCaretRight} + className="w-3 text-gray-400" + /> + <a href={link.url} className="group"> + <div className="text-gray-500 font-bold flex items-center gap-1"> + <p>{shortendURL}</p> + <FontAwesomeIcon + icon={faArrowUpRightFromSquare} + className="w-3 opacity-0 group-hover:opacity-100 duration-75" + /> + </div> + </a> + </div> + </div> + <div className="flex flex-col justify-between items-end"> + <FontAwesomeIcon + icon={faEllipsis} + className="w-6 h-6 text-gray-500 cursor-pointer" + /> + <div> + <p className="text-center text-sky-500 text-sm font-bold"> + {archiveLabel} + </p> + + <div + className="flex justify-between mt-3 gap-3" + onMouseLeave={() => setArchiveLabel("Archived Formats")} + > + <a + href={`/api/archives/${link.collectionId}/${encodeURIComponent( + link.screenshotPath + )}`} + onMouseEnter={() => setArchiveLabel("Screenshot")} + > + <FontAwesomeIcon + icon={faFileImage} + className="w-8 h-8 text-sky-600 cursor-pointer" + /> + </a> + <a + href={`/api/archives/${link.collectionId}/${encodeURIComponent( + link.pdfPath + )}`} + onMouseEnter={() => setArchiveLabel("PDF")} + > + <FontAwesomeIcon + icon={faFilePdf} + className="w-8 h-8 text-sky-600 cursor-pointer" + /> + </a> + <FontAwesomeIcon + icon={faArrowUpRightFromSquare} + className="w-8 h-8 text-sky-600 cursor-pointer" + onMouseEnter={() => setArchiveLabel("Web.archive.org")} + /> + </div> + </div> + </div> </div> - <div className="flex gap-1 items-baseline"> - {link.tags.map((e, i) => ( - <p key={i}>{e.name}</p> - ))} - </div> */} - {JSON.stringify(link)} + {/* <br /> + <hr /> + <br /> + <p className="break-words text-sm">{JSON.stringify(link)}</p> */} </div> ); } diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 7293b68..10e0ec2 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -8,7 +8,7 @@ import { faPlus, faFolder, faBox, - faTag, + faHashtag, faBookmark, faMagnifyingGlass, IconDefinition, @@ -49,7 +49,7 @@ export default function () { setPageName(activeTag?.name); } - setPageIcon(faTag); + setPageIcon(faHashtag); } else if (router.route === "/collections") { setPageName("All Collections"); setPageIcon(faBox); diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index d956a3c..679537d 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -12,9 +12,9 @@ interface SidebarItemProps { export default function ({ text, icon, path }: SidebarItemProps) { return ( <Link href={path}> - <div className="hover:bg-gray-50 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 duration-100 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={icon} className="w-4 text-sky-300" /> - <p>{text}</p> + <p className="text-sky-900">{text}</p> </div> </Link> ); diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 66d725e..73b4263 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -9,7 +9,7 @@ import { faChevronDown, faFolder, faBox, - faTag, + faHashtag, faBookmark, } from "@fortawesome/free-solid-svg-icons"; import SidebarItem from "./SidebarItem"; @@ -110,7 +110,7 @@ export default function () { <SidebarItem key={i} text={e.name} - icon={faTag} + icon={faHashtag} path={`/tags/${e.id}`} /> ); diff --git a/lib/api/controllers/links/getLinks.ts b/lib/api/controllers/links/getLinks.ts index 9884aac..bf07860 100644 --- a/lib/api/controllers/links/getLinks.ts +++ b/lib/api/controllers/links/getLinks.ts @@ -24,7 +24,10 @@ export default async function ( ], }, }, - include: { tags: true }, + include: { + tags: true, + collection: true, + }, }); return res.status(200).json({ diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index c758725..bf677cd 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -1,12 +1,13 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; -import { LinkAndTags, NewLink } from "@/types/global"; +import { ExtendedLink, NewLink } from "@/types/global"; import { existsSync, mkdirSync } from "fs"; import getTitle from "../../getTitle"; import archive from "../../archive"; -import { Link } from "@prisma/client"; +import { Link, UsersAndCollections } from "@prisma/client"; import AES from "crypto-js/aes"; +import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; export default async function ( req: NextApiRequest, @@ -44,9 +45,8 @@ export default async function ( const checkIfCollectionExists = findCollection?.collections[0]; - if (checkIfCollectionExists) { + if (checkIfCollectionExists) return res.status(400).json({ response: "Collection already exists." }); - } const newCollection = await prisma.collection.create({ data: { @@ -68,6 +68,18 @@ export default async function ( const collectionId = link.collection.id as number; + const collectionIsAccessible = await hasAccessToCollection( + session.user.id, + collectionId + ); + + const memberHasAccess = collectionIsAccessible?.members.some( + (e: UsersAndCollections) => e.userId === session.user.id && e.canCreate + ); + + if (!(collectionIsAccessible?.ownerId === session.user.id || memberHasAccess)) + return res.status(401).json({ response: "Collection is not accessible." }); + const title = await getTitle(link.url); const newLink: Link = await prisma.link.create({ @@ -116,10 +128,10 @@ export default async function ( AES_SECRET ).toString(); - const updatedLink: LinkAndTags = await prisma.link.update({ + const updatedLink: ExtendedLink = await prisma.link.update({ where: { id: newLink.id }, data: { screenshotPath: screenShotHashedPath, pdfPath: pdfHashedPath }, - include: { tags: true }, + include: { tags: true, collection: true }, }); archive(updatedLink.url, updatedLink.collectionId, updatedLink.id); diff --git a/lib/api/hasAccessToCollection.ts b/lib/api/hasAccessToCollection.ts index d7ad859..49bbc04 100644 --- a/lib/api/hasAccessToCollection.ts +++ b/lib/api/hasAccessToCollection.ts @@ -1,7 +1,7 @@ import { prisma } from "@/lib/api/db"; export default async (userId: number, collectionId: number) => { - const check: any = await prisma.collection.findFirst({ + const check = await prisma.collection.findFirst({ where: { AND: { id: collectionId, diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index cd54885..1ded56f 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -18,9 +18,6 @@ export default async function ( return res.status(401).json({ response: "You must be logged in." }); } - // Check if user is unauthorized to the collection (If isn't owner or doesn't has the required permission...) - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if (req.method === "GET") return await getLinks(req, res, session); if (req.method === "POST") return await postLink(req, res, session); } diff --git a/store/links.ts b/store/links.ts index bcdaf8a..ecde3dd 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,11 +1,11 @@ import { create } from "zustand"; -import { LinkAndTags, NewLink } from "@/types/global"; +import { ExtendedLink, NewLink } from "@/types/global"; type LinkSlice = { - links: LinkAndTags[]; + links: ExtendedLink[]; setLinks: () => void; addLink: (linkName: NewLink) => Promise<boolean>; - updateLink: (link: LinkAndTags) => void; + updateLink: (link: ExtendedLink) => void; removeLink: (linkId: number) => void; }; diff --git a/types/global.ts b/types/global.ts index e9a8de5..3a3fffc 100644 --- a/types/global.ts +++ b/types/global.ts @@ -1,7 +1,8 @@ -import { Link, Tag } from "@prisma/client"; +import { Collection, Link, Tag } from "@prisma/client"; -export interface LinkAndTags extends Link { +export interface ExtendedLink extends Link { tags: Tag[]; + collection: Collection; } export interface NewLink { From 9304870178058ef3698d6b9065b0691fd395f9f1 Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Sat, 11 Mar 2023 08:40:10 +0330 Subject: [PATCH 019/144] feat: improved Links UI --- components/LinkList.tsx | 48 +++++++++++++++++------------- components/Navbar.tsx | 2 +- components/Sidebar/SidebarItem.tsx | 2 +- components/Sidebar/index.tsx | 6 ++-- next.config.js | 3 ++ 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 2687453..8147cc1 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -2,13 +2,14 @@ import { ExtendedLink } from "@/types/global"; import { faFolder, faArrowUpRightFromSquare, - faCaretRight, faEllipsis, - faFileImage, - faFilePdf, + faHeart, } from "@fortawesome/free-solid-svg-icons"; +import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; + import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; +import Image from "next/image"; export default function ({ link, @@ -27,16 +28,27 @@ export default function ({ }); return ( - <div className="border border-sky-100 mb-5 bg-gray-100 p-5 rounded"> - <div className="flex justify-between h-full"> + <div className="border border-sky-100 mb-5 bg-gray-100 p-5 rounded flex items-center gap-5 group/item"> + <Image + src={`http://icons.duckduckgo.com/ip3/${shortendURL}.ico`} + width={100} + height={100} + alt="" + className="blur-sm opacity-80 group-hover/item:opacity-100 duration-100" + draggable="false" + /> + <div className="flex justify-between gap-5 w-full"> <div> <div className="flex items-baseline gap-1"> <p className="text-sm text-sky-300 font-bold">{count + 1}.</p> <p className="text-lg text-sky-600">{link.name}</p> + {link.isFavorites ? ( + <FontAwesomeIcon icon={faHeart} className="w-3 text-red-600" /> + ) : null} </div> <p className="text-sky-400 text-sm font-medium">{link.title}</p> <div className="flex gap-3 items-center flex-wrap my-3"> - <div className="flex items-center gap-1 cursor-pointer"> + <div className="flex items-center gap-1 cursor-pointer hover:bg-gray-50 duration-100 py-1 px-2 text-sm rounded hover:outline outline-sky-100 outline-1"> <FontAwesomeIcon icon={faFolder} className="w-4 text-sky-300" /> <p className="text-sky-900">{link.collection.name}</p> </div> @@ -44,25 +56,21 @@ export default function ({ {link.tags.map((e, i) => ( <p key={i} - className="px-2 py-1 bg-sky-200 text-sky-700 text-xs rounded-3xl cursor-pointer" + className="px-2 py-1 bg-sky-200 text-sky-700 text-xs rounded-3xl cursor-pointer hover:bg-sky-100 duration-100" > # {e.name} </p> ))} </div> </div> - <div className="flex gap-2 items-center"> + <div className="flex gap-2 items-center flex-wrap"> <p className="text-gray-500">{formattedDate}</p> - <FontAwesomeIcon - icon={faCaretRight} - className="w-3 text-gray-400" - /> - <a href={link.url} className="group"> + <a href={link.url} target="_blank" className="group/url"> <div className="text-gray-500 font-bold flex items-center gap-1"> <p>{shortendURL}</p> <FontAwesomeIcon icon={faArrowUpRightFromSquare} - className="w-3 opacity-0 group-hover:opacity-100 duration-75" + className="w-3 opacity-0 group-hover/url:opacity-100 duration-75" /> </div> </a> @@ -87,36 +95,34 @@ export default function ({ link.screenshotPath )}`} onMouseEnter={() => setArchiveLabel("Screenshot")} + target="_blank" > <FontAwesomeIcon icon={faFileImage} - className="w-8 h-8 text-sky-600 cursor-pointer" + className="w-8 h-8 text-sky-600 cursor-pointer hover:text-sky-500 duration-100" /> </a> <a href={`/api/archives/${link.collectionId}/${encodeURIComponent( link.pdfPath )}`} + target="_blank" onMouseEnter={() => setArchiveLabel("PDF")} > <FontAwesomeIcon icon={faFilePdf} - className="w-8 h-8 text-sky-600 cursor-pointer" + className="w-8 h-8 text-sky-600 cursor-pointer hover:text-sky-500 duration-100" /> </a> <FontAwesomeIcon icon={faArrowUpRightFromSquare} - className="w-8 h-8 text-sky-600 cursor-pointer" + className="w-8 h-8 text-sky-600 cursor-pointer hover:text-sky-500 duration-100" onMouseEnter={() => setArchiveLabel("Web.archive.org")} /> </div> </div> </div> </div> - {/* <br /> - <hr /> - <br /> - <p className="break-words text-sm">{JSON.stringify(link)}</p> */} </div> ); } diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 10e0ec2..4619427 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -91,7 +91,7 @@ export default function () { </div> {linkModal ? ( - <div className="fixed top-0 bottom-0 right-0 left-0 bg-gray-500 bg-opacity-10 flex items-center fade-in"> + <div className="fixed top-0 bottom-0 right-0 left-0 bg-gray-500 bg-opacity-10 flex items-center fade-in z-10"> <ClickAwayHandler onClickOutside={toggleLinkModal} className="w-fit mx-auto" diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index 679537d..4746b79 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -12,7 +12,7 @@ interface SidebarItemProps { export default function ({ text, icon, path }: SidebarItemProps) { return ( <Link href={path}> - <div className="hover:bg-gray-50 duration-100 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={icon} className="w-4 text-sky-300" /> <p className="text-sky-900">{text}</p> </div> diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 73b4263..c70f3f1 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -43,7 +43,7 @@ export default function () { }; return ( - <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-5 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border"> + <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-5 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-10"> <div className="flex gap-3 items-center mb-5 p-3 cursor-pointer w-fit text-gray-600"> <FontAwesomeIcon icon={faUserCircle} className="h-8" /> <div className="flex items-center gap-1"> @@ -53,14 +53,14 @@ export default function () { </div> <Link href="links"> - <div className="hover:bg-gray-50 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={faBookmark} className="w-4 text-sky-300" /> <p>All Links</p> </div> </Link> <Link href="/collections"> - <div className="hover:bg-gray-50 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={faBox} className="w-4 text-sky-300" /> <p>All Collections</p> </div> diff --git a/next.config.js b/next.config.js index 91ef62f..db40b80 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,9 @@ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, + images: { + domains: ["icons.duckduckgo.com"], + }, }; module.exports = nextConfig; From 1c81dcdd281e37cf000a1ec743c45dc3654140bc Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Sat, 11 Mar 2023 21:38:56 +0330 Subject: [PATCH 020/144] small UI changes --- LICENSE | 21 --------------------- components/LinkList.tsx | 4 ++-- 2 files changed, 2 insertions(+), 23 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 2eff537..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Daniel31X13 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 8147cc1..3c01e2c 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -48,7 +48,7 @@ export default function ({ </div> <p className="text-sky-400 text-sm font-medium">{link.title}</p> <div className="flex gap-3 items-center flex-wrap my-3"> - <div className="flex items-center gap-1 cursor-pointer hover:bg-gray-50 duration-100 py-1 px-2 text-sm rounded hover:outline outline-sky-100 outline-1"> + <div className="flex items-center gap-1 cursor-pointer hover:opacity-80 duration-100"> <FontAwesomeIcon icon={faFolder} className="w-4 text-sky-300" /> <p className="text-sky-900">{link.collection.name}</p> </div> @@ -117,7 +117,7 @@ export default function ({ <FontAwesomeIcon icon={faArrowUpRightFromSquare} className="w-8 h-8 text-sky-600 cursor-pointer hover:text-sky-500 duration-100" - onMouseEnter={() => setArchiveLabel("Web.archive.org")} + onMouseEnter={() => setArchiveLabel("Wayback Machine")} /> </div> </div> From e5e2a615fcae98e397538ac0601d408b36c9b0a3 Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Sun, 12 Mar 2023 00:11:27 +0330 Subject: [PATCH 021/144] Update package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index dd18e92..a1d83ee 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "main": "index.js", "repository": "https://github.com/Daniel31x13/link-warden.git", "author": "Daniel31X13 <daniel31x13@gmail.com>", - "license": "MIT", "private": true, "scripts": { "dev": "next dev", From f80113c487c8b4256b2937d686c62bbd2f79f5e5 Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Thu, 23 Mar 2023 02:41:54 +0330 Subject: [PATCH 022/144] feat: added dropdown component --- components/AddLinkModal.tsx | 4 +- components/ClickAwayHandler.tsx | 4 +- components/Dropdown.tsx | 47 +++++++++++++++++++ .../InputSelect/CollectionSelection.tsx | 4 +- components/InputSelect/TagSelection.tsx | 4 +- components/LinkList.tsx | 37 +++++++++++++-- components/Navbar.tsx | 15 ++---- components/Sidebar/index.tsx | 44 +++++++++++++---- lib/api/controllers/links/postLink.ts | 2 +- lib/client/getInitialData.ts | 12 ++--- package.json | 1 + pages/collections/[id].tsx | 4 +- pages/collections/index.tsx | 4 +- .../migration.sql | 0 .../migration.sql | 2 + prisma/schema.prisma | 2 +- store/collections.ts | 6 +-- store/links.ts | 6 +-- store/tags.ts | 6 +-- styles/globals.css | 2 +- 20 files changed, 152 insertions(+), 54 deletions(-) create mode 100644 components/Dropdown.tsx rename prisma/migrations/{20230308212222_ => 20230312184928_init}/migration.sql (100%) create mode 100644 prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql diff --git a/components/AddLinkModal.tsx b/components/AddLinkModal.tsx index fd4bfcb..8ba37db 100644 --- a/components/AddLinkModal.tsx +++ b/components/AddLinkModal.tsx @@ -5,7 +5,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { useRouter } from "next/router"; import { NewLink } from "@/types/global"; -import useLinkSlice from "@/store/links"; +import useLinkStore from "@/store/links"; export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { const router = useRouter(); @@ -17,7 +17,7 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { collection: { id: Number(router.query.id) }, }); - const { addLink } = useLinkSlice(); + const { addLink } = useLinkStore(); const setTags = (e: any) => { const tagNames = e.map((e: any) => { diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index 3c8567d..d69edca 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -1,10 +1,10 @@ import React, { useRef, useEffect, ReactNode, RefObject } from "react"; -interface Props { +type Props = { children: ReactNode; onClickOutside: Function; className?: string; -} +}; function useOutsideAlerter( ref: RefObject<HTMLElement>, diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx new file mode 100644 index 0000000..157f3da --- /dev/null +++ b/components/Dropdown.tsx @@ -0,0 +1,47 @@ +import Link from "next/link"; +import React, { MouseEventHandler, ReactElement } from "react"; +import ClickAwayHandler from "./ClickAwayHandler"; + +type MenuItem = { + name: string; + icon: ReactElement; + onClick?: MouseEventHandler; + href?: string; +}; + +type Props = { + onClickOutside: Function; + className?: string; + items: MenuItem[]; +}; + +export default function ({ onClickOutside, className, items }: Props) { + return ( + <ClickAwayHandler + onClickOutside={onClickOutside} + className={`${className} border border-sky-100 shadow mb-5 bg-gray-50 p-4 rounded flex flex-col gap-4`} + > + {items.map((e, i) => { + return e.href ? ( + <Link key={i} href={e.href}> + <div className="flex items-center gap-2 px-2 cursor-pointer"> + {React.cloneElement(e.icon, { + className: "text-sky-500 w-5 h-5", + })} + <p className="text-sky-900">{e.name}</p> + </div> + </Link> + ) : ( + <div key={i} onClick={e.onClick}> + <div className="flex items-center gap-2 px-2 cursor-pointer"> + {React.cloneElement(e.icon, { + className: "text-sky-500 w-5 h-5", + })} + <p className="text-sky-900">{e.name}</p> + </div> + </div> + ); + })} + </ClickAwayHandler> + ); +} diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index 1c3348a..aa5be0d 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -1,4 +1,4 @@ -import useCollectionSlice from "@/store/collections"; +import useCollectionStore from "@/store/collections"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import CreatableSelect from "react-select/creatable"; @@ -6,7 +6,7 @@ import { styles } from "./styles"; import { Options } from "./types"; export default function ({ onChange }: any) { - const { collections } = useCollectionSlice(); + const { collections } = useCollectionStore(); const router = useRouter(); const [options, setOptions] = useState<Options[]>([]); diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index 24887b5..87ac38b 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -1,11 +1,11 @@ -import useTagSlice from "@/store/tags"; +import useTagStore from "@/store/tags"; import { useEffect, useState } from "react"; import CreatableSelect from "react-select/creatable"; import { styles } from "./styles"; import { Options } from "./types"; export default function ({ onChange }: any) { - const { tags } = useTagSlice(); + const { tags } = useTagStore(); const [options, setOptions] = useState<Options[]>([]); diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 3c01e2c..c3ff611 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -3,13 +3,16 @@ import { faFolder, faArrowUpRightFromSquare, faEllipsis, - faHeart, + faStar, + faPenToSquare, + faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; import Image from "next/image"; +import Dropdown from "./Dropdown"; export default function ({ link, @@ -18,6 +21,7 @@ export default function ({ link: ExtendedLink; count: number; }) { + const [editDropdown, setEditDropdown] = useState(false); const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); const shortendURL = new URL(link.url).host.toLowerCase(); @@ -42,8 +46,8 @@ export default function ({ <div className="flex items-baseline gap-1"> <p className="text-sm text-sky-300 font-bold">{count + 1}.</p> <p className="text-lg text-sky-600">{link.name}</p> - {link.isFavorites ? ( - <FontAwesomeIcon icon={faHeart} className="w-3 text-red-600" /> + {link.starred ? ( + <FontAwesomeIcon icon={faStar} className="w-3 text-amber-400" /> ) : null} </div> <p className="text-sky-400 text-sm font-medium">{link.title}</p> @@ -76,10 +80,12 @@ export default function ({ </a> </div> </div> - <div className="flex flex-col justify-between items-end"> + + <div className="flex flex-col justify-between items-end relative"> <FontAwesomeIcon icon={faEllipsis} - className="w-6 h-6 text-gray-500 cursor-pointer" + className="w-6 h-6 text-gray-500 hover:text-gray-400 duration-100 cursor-pointer" + onClick={() => setEditDropdown(!editDropdown)} /> <div> <p className="text-center text-sky-500 text-sm font-bold"> @@ -121,6 +127,27 @@ export default function ({ /> </div> </div> + + {editDropdown ? ( + <Dropdown + items={[ + { + name: "Star", + icon: <FontAwesomeIcon icon={faStar} />, + }, + { + name: "Edit", + icon: <FontAwesomeIcon icon={faPenToSquare} />, + }, + { + name: "Delete", + icon: <FontAwesomeIcon icon={faTrashCan} />, + }, + ]} + onClickOutside={() => setEditDropdown(!editDropdown)} + className="absolute top-8 right-0" + /> + ) : null} </div> </div> </div> diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 4619427..075463b 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,6 +1,5 @@ -import { signOut } from "next-auth/react"; import { useRouter } from "next/router"; -import useCollectionSlice from "@/store/collections"; +import useCollectionStore from "@/store/collections"; import { Collection, Tag } from "@prisma/client"; import ClickAwayHandler from "./ClickAwayHandler"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -15,15 +14,15 @@ import { } from "@fortawesome/free-solid-svg-icons"; import { useEffect, useState } from "react"; import AddLinkModal from "./AddLinkModal"; -import useTagSlice from "@/store/tags"; +import useTagStore from "@/store/tags"; export default function () { const router = useRouter(); const [pageName, setPageName] = useState<string | null>(""); const [pageIcon, setPageIcon] = useState<IconDefinition | null>(null); - const { collections } = useCollectionSlice(); - const { tags } = useTagSlice(); + const { collections } = useCollectionStore(); + const { tags } = useTagStore(); useEffect(() => { if (router.route === "/collections/[id]") { @@ -83,12 +82,6 @@ export default function () { icon={faMagnifyingGlass} className="select-none cursor-pointer w-5 h-5 text-white bg-sky-500 p-2 rounded hover:bg-sky-400 duration-100" /> - <div - onClick={() => signOut()} - className="cursor-pointer w-max text-sky-900" - > - Sign Out - </div> {linkModal ? ( <div className="fixed top-0 bottom-0 right-0 left-0 bg-gray-500 bg-opacity-10 flex items-center fade-in z-10"> diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index c70f3f1..8d6c48e 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -1,9 +1,9 @@ import { useSession } from "next-auth/react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; -import useCollectionSlice from "@/store/collections"; +import useCollectionStore from "@/store/collections"; +import { signOut } from "next-auth/react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faUserCircle } from "@fortawesome/free-regular-svg-icons"; import { faPlus, faChevronDown, @@ -11,19 +11,24 @@ import { faBox, faHashtag, faBookmark, + faCircleUser, + faSliders, + faArrowRightFromBracket, } from "@fortawesome/free-solid-svg-icons"; import SidebarItem from "./SidebarItem"; -import useTagSlice from "@/store/tags"; +import useTagStore from "@/store/tags"; import Link from "next/link"; +import Dropdown from "@/components/Dropdown"; export default function () { const { data: session } = useSession(); const [collectionInput, setCollectionInput] = useState(false); + const [profileDropdown, setProfileDropdown] = useState(false); - const { collections, addCollection } = useCollectionSlice(); + const { collections, addCollection } = useCollectionStore(); - const { tags } = useTagSlice(); + const { tags } = useTagStore(); const user = session?.user; @@ -44,12 +49,35 @@ export default function () { return ( <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-5 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-10"> - <div className="flex gap-3 items-center mb-5 p-3 cursor-pointer w-fit text-gray-600"> - <FontAwesomeIcon icon={faUserCircle} className="h-8" /> - <div className="flex items-center gap-1"> + <div className="flex gap-3 items-center mb-5 p-3 w-fit text-gray-600 relative"> + <FontAwesomeIcon icon={faCircleUser} className="h-8" /> + <div + className="flex items-center gap-1 cursor-pointer" + onClick={() => setProfileDropdown(!profileDropdown)} + > <p>{user?.name}</p> <FontAwesomeIcon icon={faChevronDown} className="h-3" /> </div> + {profileDropdown ? ( + <Dropdown + items={[ + { + name: "Settings", + icon: <FontAwesomeIcon icon={faSliders} />, + }, + { + name: "Logout", + icon: <FontAwesomeIcon icon={faArrowRightFromBracket} />, + onClick: () => { + signOut(); + setProfileDropdown(!profileDropdown); + }, + }, + ]} + onClickOutside={() => setProfileDropdown(!profileDropdown)} + className="absolute top-14 left-0" + /> + ) : null} </div> <Link href="links"> diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index bf677cd..d333e68 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -110,7 +110,7 @@ export default async function ( })), }, title, - isFavorites: false, + starred: false, screenshotPath: "", pdfPath: "", }, diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts index b0afa40..4ab47e6 100644 --- a/lib/client/getInitialData.ts +++ b/lib/client/getInitialData.ts @@ -1,14 +1,14 @@ -import useCollectionSlice from "@/store/collections"; +import useCollectionStore from "@/store/collections"; import { useEffect } from "react"; import { useSession } from "next-auth/react"; -import useTagSlice from "@/store/tags"; -import useLinkSlice from "@/store/links"; +import useTagStore from "@/store/tags"; +import useLinkStore from "@/store/links"; export default function () { const { status } = useSession(); - const { setCollections } = useCollectionSlice(); - const { setTags } = useTagSlice(); - const { setLinks } = useLinkSlice(); + const { setCollections } = useCollectionStore(); + const { setTags } = useTagStore(); + const { setLinks } = useLinkStore(); useEffect(() => { if (status === "authenticated") { diff --git a/package.json b/package.json index a1d83ee..dd18e92 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "main": "index.js", "repository": "https://github.com/Daniel31x13/link-warden.git", "author": "Daniel31X13 <daniel31x13@gmail.com>", + "license": "MIT", "private": true, "scripts": { "dev": "next dev", diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 08b76bb..032e439 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -1,10 +1,10 @@ import LinkList from "@/components/LinkList"; -import useLinkSlice from "@/store/links"; +import useLinkStore from "@/store/links"; import { useRouter } from "next/router"; export default function () { const router = useRouter(); - const { links } = useLinkSlice(); + const { links } = useLinkStore(); const linksByCollection = links.filter( (e) => e.collectionId === Number(router.query.id) diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 5b5312d..1b8e76b 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -1,10 +1,10 @@ import { useSession } from "next-auth/react"; -import useCollectionSlice from "@/store/collections"; +import useCollectionStore from "@/store/collections"; import CollectionCard from "@/components/CollectionCard"; export default function () { - const { collections } = useCollectionSlice(); + const { collections } = useCollectionStore(); const { data: session, status } = useSession(); const user = session?.user; diff --git a/prisma/migrations/20230308212222_/migration.sql b/prisma/migrations/20230312184928_init/migration.sql similarity index 100% rename from prisma/migrations/20230308212222_/migration.sql rename to prisma/migrations/20230312184928_init/migration.sql diff --git a/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql b/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql new file mode 100644 index 0000000..48f56e6 --- /dev/null +++ b/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Link" RENAME COLUMN "isFavorites" TO "starred"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 872617b..19c207c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -50,7 +50,7 @@ model Link { collection Collection @relation(fields: [collectionId], references: [id]) collectionId Int tags Tag[] - isFavorites Boolean + starred Boolean screenshotPath String pdfPath String createdAt DateTime @default(now()) diff --git a/store/collections.ts b/store/collections.ts index fa2ee83..5b4f648 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -1,7 +1,7 @@ import { create } from "zustand"; import { Collection } from "@prisma/client"; -type CollectionSlice = { +type CollectionStore = { collections: Collection[]; setCollections: () => void; addCollection: (collectionName: string) => void; @@ -9,7 +9,7 @@ type CollectionSlice = { removeCollection: (collectionId: number) => void; }; -const useCollectionSlice = create<CollectionSlice>()((set) => ({ +const useCollectionStore = create<CollectionStore>()((set) => ({ collections: [], setCollections: async () => { const response = await fetch("/api/routes/collections"); @@ -47,4 +47,4 @@ const useCollectionSlice = create<CollectionSlice>()((set) => ({ }, })); -export default useCollectionSlice; +export default useCollectionStore; diff --git a/store/links.ts b/store/links.ts index ecde3dd..6eb05d1 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,7 +1,7 @@ import { create } from "zustand"; import { ExtendedLink, NewLink } from "@/types/global"; -type LinkSlice = { +type LinkStore = { links: ExtendedLink[]; setLinks: () => void; addLink: (linkName: NewLink) => Promise<boolean>; @@ -9,7 +9,7 @@ type LinkSlice = { removeLink: (linkId: number) => void; }; -const useLinkSlice = create<LinkSlice>()((set) => ({ +const useLinkStore = create<LinkStore>()((set) => ({ links: [], setLinks: async () => { const response = await fetch("/api/routes/links"); @@ -47,4 +47,4 @@ const useLinkSlice = create<LinkSlice>()((set) => ({ }, })); -export default useLinkSlice; +export default useLinkStore; diff --git a/store/tags.ts b/store/tags.ts index 9fe969a..17b5c52 100644 --- a/store/tags.ts +++ b/store/tags.ts @@ -1,12 +1,12 @@ import { create } from "zustand"; import { Tag } from "@prisma/client"; -type TagSlice = { +type TagStore = { tags: Tag[]; setTags: () => void; }; -const useTagSlice = create<TagSlice>()((set) => ({ +const useTagStore = create<TagStore>()((set) => ({ tags: [], setTags: async () => { const response = await fetch("/api/routes/tags"); @@ -17,4 +17,4 @@ const useTagSlice = create<TagSlice>()((set) => ({ }, })); -export default useTagSlice; +export default useTagStore; diff --git a/styles/globals.css b/styles/globals.css index 790abe3..e755efd 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -39,7 +39,7 @@ @keyframes slide-up-animation { 0% { - transform: translateY(10%); + transform: translateY(15%); opacity: 0; } 100% { From bcb467ea020f65e7b50bd1cbd77732abbe47e8da Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Thu, 23 Mar 2023 06:36:15 +0330 Subject: [PATCH 023/144] feat: improvements --- components/Dropdown.tsx | 25 ++++++++++++------------- components/LinkList.tsx | 6 +++--- components/Sidebar/SidebarItem.tsx | 9 +++++---- components/Sidebar/index.tsx | 18 ++++++++++-------- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index 157f3da..6490027 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -19,26 +19,25 @@ export default function ({ onClickOutside, className, items }: Props) { return ( <ClickAwayHandler onClickOutside={onClickOutside} - className={`${className} border border-sky-100 shadow mb-5 bg-gray-50 p-4 rounded flex flex-col gap-4`} + className={`${className} border border-sky-100 shadow mb-5 bg-gray-50 p-2 rounded flex flex-col gap-1`} > {items.map((e, i) => { + const inner = ( + <div className="flex items-center gap-2 p-2 rounded cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100"> + {React.cloneElement(e.icon, { + className: "text-sky-500 w-5 h-5", + })} + <p className="text-sky-900">{e.name}</p> + </div> + ); + return e.href ? ( <Link key={i} href={e.href}> - <div className="flex items-center gap-2 px-2 cursor-pointer"> - {React.cloneElement(e.icon, { - className: "text-sky-500 w-5 h-5", - })} - <p className="text-sky-900">{e.name}</p> - </div> + {inner} </Link> ) : ( <div key={i} onClick={e.onClick}> - <div className="flex items-center gap-2 px-2 cursor-pointer"> - {React.cloneElement(e.icon, { - className: "text-sky-500 w-5 h-5", - })} - <p className="text-sky-900">{e.name}</p> - </div> + {inner} </div> ); })} diff --git a/components/LinkList.tsx b/components/LinkList.tsx index c3ff611..11d3cac 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -84,11 +84,11 @@ export default function ({ <div className="flex flex-col justify-between items-end relative"> <FontAwesomeIcon icon={faEllipsis} - className="w-6 h-6 text-gray-500 hover:text-gray-400 duration-100 cursor-pointer" + className="w-6 h-6 text-gray-500 rounded cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-2" onClick={() => setEditDropdown(!editDropdown)} /> <div> - <p className="text-center text-sky-500 text-sm font-bold"> + <p className="text-center text-sky-400 text-sm font-bold"> {archiveLabel} </p> @@ -145,7 +145,7 @@ export default function ({ }, ]} onClickOutside={() => setEditDropdown(!editDropdown)} - className="absolute top-8 right-0" + className="absolute top-10 right-0" /> ) : null} </div> diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index 4746b79..b1e7f4f 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -1,11 +1,10 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { IconProp } from "@fortawesome/fontawesome-svg-core"; -import { MouseEventHandler } from "react"; import Link from "next/link"; +import React, { ReactElement } from "react"; interface SidebarItemProps { text: string; - icon: IconProp; + icon: ReactElement; path: string; } @@ -13,7 +12,9 @@ export default function ({ text, icon, path }: SidebarItemProps) { return ( <Link href={path}> <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> - <FontAwesomeIcon icon={icon} className="w-4 text-sky-300" /> + {React.cloneElement(icon, { + className: "w-4 text-sky-300", + })} <p className="text-sky-900">{text}</p> </div> </Link> diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 8d6c48e..c1ba807 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -49,14 +49,16 @@ export default function () { return ( <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-5 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-10"> - <div className="flex gap-3 items-center mb-5 p-3 w-fit text-gray-600 relative"> - <FontAwesomeIcon icon={faCircleUser} className="h-8" /> + <div className="relative w-fit"> <div - className="flex items-center gap-1 cursor-pointer" + className="flex gap-2 items-center mb-5 p-3 w-fit text-gray-600 cursor-pointer hover:outline outline-sky-100 outline-1 hover:bg-gray-50 rounded duration-100" onClick={() => setProfileDropdown(!profileDropdown)} > - <p>{user?.name}</p> - <FontAwesomeIcon icon={faChevronDown} className="h-3" /> + <FontAwesomeIcon icon={faCircleUser} className="h-5" /> + <div className="flex items-center gap-1"> + <p className="font-bold">{user?.name}</p> + <FontAwesomeIcon icon={faChevronDown} className="h-3" /> + </div> </div> {profileDropdown ? ( <Dropdown @@ -75,7 +77,7 @@ export default function () { }, ]} onClickOutside={() => setProfileDropdown(!profileDropdown)} - className="absolute top-14 left-0" + className="absolute top-12 left-0" /> ) : null} </div> @@ -123,7 +125,7 @@ export default function () { <SidebarItem key={i} text={e.name} - icon={faFolder} + icon={<FontAwesomeIcon icon={faFolder} />} path={`/collections/${e.id}`} /> ); @@ -138,7 +140,7 @@ export default function () { <SidebarItem key={i} text={e.name} - icon={faHashtag} + icon={<FontAwesomeIcon icon={faHashtag} />} path={`/tags/${e.id}`} /> ); From 2e3ec53d2a3785f8c828b8f9441ef4c2c6301f90 Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Thu, 23 Mar 2023 18:55:17 +0330 Subject: [PATCH 024/144] feat: added delete link functionality --- components/ClickAwayHandler.tsx | 2 +- components/Dropdown.tsx | 14 ++++---- components/LinkList.tsx | 12 +++++-- components/Sidebar/index.tsx | 13 +++++-- lib/api/controllers/links/deleteLink.ts | 48 +++++++++++++++++++++++++ pages/api/archives/[...params].ts | 16 +++++---- pages/api/routes/links/index.ts | 4 ++- store/links.ts | 25 ++++++++++--- 8 files changed, 110 insertions(+), 24 deletions(-) create mode 100644 lib/api/controllers/links/deleteLink.ts diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index d69edca..fa5191a 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -16,7 +16,7 @@ function useOutsideAlerter( ref.current && !ref.current.contains(event.target as HTMLInputElement) ) { - onClickOutside(); + onClickOutside(event); } } document.addEventListener("mouseup", handleClickOutside); diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index 6490027..e6d165a 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -19,15 +19,17 @@ export default function ({ onClickOutside, className, items }: Props) { return ( <ClickAwayHandler onClickOutside={onClickOutside} - className={`${className} border border-sky-100 shadow mb-5 bg-gray-50 p-2 rounded flex flex-col gap-1`} + className={`${className} border border-sky-100 shadow mb-5 bg-gray-50 rounded flex flex-col `} > {items.map((e, i) => { const inner = ( - <div className="flex items-center gap-2 p-2 rounded cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100"> - {React.cloneElement(e.icon, { - className: "text-sky-500 w-5 h-5", - })} - <p className="text-sky-900">{e.name}</p> + <div className="cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100"> + <div className="flex items-center gap-2 p-2 rounded hover:opacity-60 duration-100"> + {React.cloneElement(e.icon, { + className: "text-sky-500 w-5 h-5", + })} + <p className="text-sky-900">{e.name}</p> + </div> </div> ); diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 11d3cac..48d7209 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -13,6 +13,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; import Image from "next/image"; import Dropdown from "./Dropdown"; +import useLinkStore from "@/store/links"; export default function ({ link, @@ -24,6 +25,8 @@ export default function ({ const [editDropdown, setEditDropdown] = useState(false); const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); + const { removeLink } = useLinkStore(); + const shortendURL = new URL(link.url).host.toLowerCase(); const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { year: "numeric", @@ -52,7 +55,7 @@ export default function ({ </div> <p className="text-sky-400 text-sm font-medium">{link.title}</p> <div className="flex gap-3 items-center flex-wrap my-3"> - <div className="flex items-center gap-1 cursor-pointer hover:opacity-80 duration-100"> + <div className="flex items-center gap-1 cursor-pointer hover:opacity-60 duration-100"> <FontAwesomeIcon icon={faFolder} className="w-4 text-sky-300" /> <p className="text-sky-900">{link.collection.name}</p> </div> @@ -86,6 +89,7 @@ export default function ({ icon={faEllipsis} className="w-6 h-6 text-gray-500 rounded cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-2" onClick={() => setEditDropdown(!editDropdown)} + id="edit-dropdown" /> <div> <p className="text-center text-sky-400 text-sm font-bold"> @@ -142,9 +146,13 @@ export default function ({ { name: "Delete", icon: <FontAwesomeIcon icon={faTrashCan} />, + onClick: () => removeLink(link), }, ]} - onClickOutside={() => setEditDropdown(!editDropdown)} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setEditDropdown(false); + }} className="absolute top-10 right-0" /> ) : null} diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index c1ba807..8004545 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -53,9 +53,13 @@ export default function () { <div className="flex gap-2 items-center mb-5 p-3 w-fit text-gray-600 cursor-pointer hover:outline outline-sky-100 outline-1 hover:bg-gray-50 rounded duration-100" onClick={() => setProfileDropdown(!profileDropdown)} + id="profile-dropdown" > - <FontAwesomeIcon icon={faCircleUser} className="h-5" /> - <div className="flex items-center gap-1"> + <FontAwesomeIcon + icon={faCircleUser} + className="h-5 pointer-events-none" + /> + <div className="flex items-center gap-1 pointer-events-none"> <p className="font-bold">{user?.name}</p> <FontAwesomeIcon icon={faChevronDown} className="h-3" /> </div> @@ -76,7 +80,10 @@ export default function () { }, }, ]} - onClickOutside={() => setProfileDropdown(!profileDropdown)} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "profile-dropdown") setProfileDropdown(false); + }} className="absolute top-12 left-0" /> ) : null} diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts new file mode 100644 index 0000000..05ae85d --- /dev/null +++ b/lib/api/controllers/links/deleteLink.ts @@ -0,0 +1,48 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { prisma } from "@/lib/api/db"; +import { Session } from "next-auth"; +import { ExtendedLink, NewLink } from "@/types/global"; +import { existsSync, mkdirSync } from "fs"; +import getTitle from "../../getTitle"; +import archive from "../../archive"; +import { Link, UsersAndCollections } from "@prisma/client"; +import AES from "crypto-js/aes"; +import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; + +export default async function ( + req: NextApiRequest, + res: NextApiResponse, + session: Session +) { + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); + } + + const link: ExtendedLink = req?.body; + + if (!link) { + return res.status(401).json({ response: "Please choose a valid link." }); + } + + const collectionIsAccessible = await hasAccessToCollection( + session.user.id, + link.collectionId + ); + + const memberHasAccess = collectionIsAccessible?.members.some( + (e: UsersAndCollections) => e.userId === session.user.id && e.canDelete + ); + + if (!(collectionIsAccessible?.ownerId === session.user.id || memberHasAccess)) + return res.status(401).json({ response: "Collection is not accessible." }); + + const deleteLink: Link = await prisma.link.delete({ + where: { + id: link.id, + }, + }); + + return res.status(200).json({ + response: deleteLink, + }); +} diff --git a/pages/api/archives/[...params].ts b/pages/api/archives/[...params].ts index 5ec56b3..64dc43a 100644 --- a/pages/api/archives/[...params].ts +++ b/pages/api/archives/[...params].ts @@ -33,12 +33,16 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { const decryptedPath = AES.decrypt(encryptedPath, AES_SECRET).toString(enc); const filePath = path.join(process.cwd(), decryptedPath); - const file = fs.readFileSync(filePath); + const file = fs.existsSync(filePath) + ? fs.readFileSync(filePath) + : "File not found, it's possible that the file you're looking for either doesn't exist or hasn't been created yet."; - if (filePath.endsWith(".pdf")) - res.setHeader("Content-Type", "application/pdf"); + if (!fs.existsSync(filePath)) + res.setHeader("Content-Type", "text/plain").status(404); + else if (filePath.endsWith(".pdf")) + res.setHeader("Content-Type", "application/pdf").status(200); + else if (filePath.endsWith(".png")) + res.setHeader("Content-Type", "image/png").status(200); - if (filePath.endsWith(".png")) res.setHeader("Content-Type", "image/png"); - - return res.status(200).send(file); + return res.send(file); } diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 1ded56f..7f8cb26 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -3,6 +3,7 @@ import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; import getLinks from "@/lib/api/controllers/links/getLinks"; import postLink from "@/lib/api/controllers/links/postLink"; +import deleteLink from "@/lib/api/controllers/links/deleteLink"; type Data = { response: object[] | string; @@ -19,5 +20,6 @@ export default async function ( } if (req.method === "GET") return await getLinks(req, res, session); - if (req.method === "POST") return await postLink(req, res, session); + else if (req.method === "POST") return await postLink(req, res, session); + else if (req.method === "DELETE") return await deleteLink(req, res, session); } diff --git a/store/links.ts b/store/links.ts index 6eb05d1..a9ba598 100644 --- a/store/links.ts +++ b/store/links.ts @@ -6,7 +6,7 @@ type LinkStore = { setLinks: () => void; addLink: (linkName: NewLink) => Promise<boolean>; updateLink: (link: ExtendedLink) => void; - removeLink: (linkId: number) => void; + removeLink: (link: ExtendedLink) => void; }; const useLinkStore = create<LinkStore>()((set) => ({ @@ -40,10 +40,25 @@ const useLinkStore = create<LinkStore>()((set) => ({ set((state) => ({ links: state.links.map((c) => (c.id === link.id ? link : c)), })), - removeLink: (linkId) => { - set((state) => ({ - links: state.links.filter((c) => c.id !== linkId), - })); + removeLink: async (link) => { + const response = await fetch("/api/routes/links", { + body: JSON.stringify(link), + headers: { + "Content-Type": "application/json", + }, + method: "DELETE", + }); + + const data = await response.json(); + + if (response.ok) + set((state) => ({ + links: state.links.filter((e) => e.id !== link.id), + })); + + console.log(data); + + return response.ok; }, })); From 3a5ae28f869d4096717f82fc17580f83fcfc4742 Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Sat, 25 Mar 2023 17:47:34 +0330 Subject: [PATCH 025/144] ui improvements --- components/AddLinkModal.tsx | 8 +++---- components/CollectionCard.tsx | 2 +- components/Dropdown.tsx | 6 ++--- components/InputSelect/styles.ts | 2 +- components/LinkList.tsx | 31 ++++++++++++++++++------ components/Navbar.tsx | 32 ++++++++++++++++++------- components/Sidebar/SidebarItem.tsx | 3 +-- components/Sidebar/index.tsx | 19 ++++++++------- lib/api/archive.ts | 14 +++++++++-- lib/api/controllers/links/deleteLink.ts | 15 ++++++++---- lib/api/controllers/links/postLink.ts | 4 ++-- lib/api/controllers/tags/getTags.ts | 9 +++++++ pages/collections/[id].tsx | 4 ++-- pages/collections/index.tsx | 2 +- pages/login.tsx | 6 ++--- pages/register.tsx | 8 +++---- store/links.ts | 7 +++++- 17 files changed, 117 insertions(+), 55 deletions(-) diff --git a/components/AddLinkModal.tsx b/components/AddLinkModal.tsx index 8ba37db..d4f8519 100644 --- a/components/AddLinkModal.tsx +++ b/components/AddLinkModal.tsx @@ -40,7 +40,7 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { }; return ( - <div className="slide-up border-sky-100 border-solid border rounded-md shadow-lg p-5 bg-white flex flex-col gap-3"> + <div className="slide-up border-sky-100 rounded-md border-solid border rounded-md-md shadow-lg p-5 bg-white flex flex-col gap-3"> <p className="font-bold text-sky-300 mb-2 text-center">New Link</p> <div className="flex gap-5 items-center justify-between"> @@ -50,7 +50,7 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { onChange={(e) => setNewLink({ ...newLink, name: e.target.value })} type="text" placeholder="e.g. Example Link" - className="w-60 rounded p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" /> </div> @@ -61,7 +61,7 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { onChange={(e) => setNewLink({ ...newLink, url: e.target.value })} type="text" placeholder="e.g. http://example.com/" - className="w-60 rounded p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" /> </div> @@ -76,7 +76,7 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { </div> <div - className="mx-auto mt-2 bg-sky-500 text-white flex items-center gap-2 py-2 px-5 rounded select-none font-bold cursor-pointer duration-100 hover:bg-sky-400" + className="mx-auto mt-2 bg-sky-500 text-white flex items-center gap-2 py-2 px-5 rounded-md select-none font-bold cursor-pointer duration-100 hover:bg-sky-400" onClick={submitLink} > <FontAwesomeIcon icon={faPlus} className="h-5" /> diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 6a682cd..b9efac6 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -12,7 +12,7 @@ export default function ({ collection }: { collection: Collection }) { return ( <Link href={`/collections/${collection.id}`}> - <div className="p-5 bg-gray-100 m-2 h-40 w-60 rounded border-sky-100 border-solid border flex flex-col justify-between cursor-pointer hover:bg-gray-50 duration-100"> + <div className="p-5 bg-gray-100 h-40 w-60 rounded-md border-sky-100 border-solid border flex flex-col justify-between cursor-pointer hover:bg-gray-50 duration-100"> <div className="flex justify-between text-sky-900 items-center"> <p className="text-lg w-max">{collection.name}</p> <FontAwesomeIcon icon={faChevronRight} className="w-3" /> diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index e6d165a..3d64adf 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -19,12 +19,12 @@ export default function ({ onClickOutside, className, items }: Props) { return ( <ClickAwayHandler onClickOutside={onClickOutside} - className={`${className} border border-sky-100 shadow mb-5 bg-gray-50 rounded flex flex-col `} + className={`${className} border border-sky-100 shadow-md mb-5 bg-gray-50 rounded-md flex flex-col w-36`} > {items.map((e, i) => { const inner = ( - <div className="cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100"> - <div className="flex items-center gap-2 p-2 rounded hover:opacity-60 duration-100"> + <div className="cursor-pointer rounded-md hover:bg-white hover:outline outline-sky-100 outline-1 duration-100"> + <div className="flex items-center gap-2 p-2 rounded-md hover:opacity-60 duration-100"> {React.cloneElement(e.icon, { className: "text-sky-500 w-5 h-5", })} diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts index 28940b5..81fd567 100644 --- a/components/InputSelect/styles.ts +++ b/components/InputSelect/styles.ts @@ -23,7 +23,7 @@ export const styles: StylesConfig = { ...styles, width: "15rem", border: "1px solid #e0f2fe", - borderRadius: "0.25rem", + borderRadius: "0.375rem", fontSize: "0.875rem", lineHeight: "1.25rem", }), diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 48d7209..b513a26 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -35,16 +35,32 @@ export default function ({ }); return ( - <div className="border border-sky-100 mb-5 bg-gray-100 p-5 rounded flex items-center gap-5 group/item"> + <div className="mx-auto border border-sky-100 mb-5 bg-gray-100 p-2 rounded-md flex items-start relative gap-5 group/item"> <Image src={`http://icons.duckduckgo.com/ip3/${shortendURL}.ico`} - width={100} - height={100} + width={32} + height={32} alt="" - className="blur-sm opacity-80 group-hover/item:opacity-100 duration-100" + className="opacity-100 duration-100 select-none mt-3" draggable="false" + onError={(e) => { + const target = e.target as HTMLElement; + target.style.opacity = "0"; + }} /> - <div className="flex justify-between gap-5 w-full"> + <Image + src={`http://icons.duckduckgo.com/ip3/${shortendURL}.ico`} + width={80} + height={80} + alt="" + className="blur-sm absolute left-0 opacity-50 select-none" + draggable="false" + onError={(e) => { + const target = e.target as HTMLElement; + target.style.opacity = "0"; + }} + /> + <div className="flex justify-between gap-5 w-full z-0"> <div> <div className="flex items-baseline gap-1"> <p className="text-sm text-sky-300 font-bold">{count + 1}.</p> @@ -87,7 +103,8 @@ export default function ({ <div className="flex flex-col justify-between items-end relative"> <FontAwesomeIcon icon={faEllipsis} - className="w-6 h-6 text-gray-500 rounded cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-2" + title="More" + className="w-6 h-6 text-gray-500 rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" onClick={() => setEditDropdown(!editDropdown)} id="edit-dropdown" /> @@ -153,7 +170,7 @@ export default function ({ const target = e.target as HTMLInputElement; if (target.id !== "edit-dropdown") setEditDropdown(false); }} - className="absolute top-10 right-0" + className="absolute top-8 right-0" /> ) : null} </div> diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 075463b..c5aa529 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -65,22 +65,38 @@ export default function () { }; return ( - <div className="flex justify-between items-center p-5 border-solid border-b-sky-100 border border-l-white"> - <div className="text-sky-900 rounded my-1 flex items-center gap-2 font-bold"> + <div className="flex justify-between items-center p-2 border-solid border-b-sky-100 border-b"> + <div className="text-sky-900 rounded-md my-1 flex items-center gap-2 font-bold"> {pageIcon ? ( <FontAwesomeIcon icon={pageIcon} className="w-4 text-sky-300" /> ) : null} <p>{pageName}</p> </div> - <div className="flex items-center gap-3"> + + <div className="flex items-center gap-2 justify-between"> + <div className="flex items-center relative"> + <label + htmlFor="search-box" + className="inline-flex w-fit absolute right-0 cursor-pointer" + title="Search" + > + <FontAwesomeIcon + icon={faMagnifyingGlass} + className="select-none w-5 h-5 rounded-md p-1 text-sky-500 " + /> + </label> + <input + id="search-box" + type="text" + placeholder="Search for Links" + className="border border-sky-100 rounded-md pr-6 w-6 focus:border-sky-500 focus:w-60 hover:border-sky-500 duration-100 outline-none p-1 text-sm" + /> + </div> <FontAwesomeIcon icon={faPlus} onClick={toggleLinkModal} - className="select-none cursor-pointer w-5 h-5 text-white bg-sky-500 p-2 rounded hover:bg-sky-400 duration-100" - /> - <FontAwesomeIcon - icon={faMagnifyingGlass} - className="select-none cursor-pointer w-5 h-5 text-white bg-sky-500 p-2 rounded hover:bg-sky-400 duration-100" + title="New Link" + className="select-none cursor-pointer w-5 h-5 text-sky-500 p-1 rounded-md hover:outline-sky-500 outline duration-100 hover:bg-white outline-sky-100 outline-1" /> {linkModal ? ( diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index b1e7f4f..45d9c0f 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -1,4 +1,3 @@ -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import Link from "next/link"; import React, { ReactElement } from "react"; @@ -11,7 +10,7 @@ interface SidebarItemProps { export default function ({ text, icon, path }: SidebarItemProps) { return ( <Link href={path}> - <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 rounded-md my-1 p-2 cursor-pointer flex items-center gap-2"> {React.cloneElement(icon, { className: "w-4 text-sky-300", })} diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 8004545..de03dd1 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -48,10 +48,10 @@ export default function () { }; return ( - <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-5 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-10"> + <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-2 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-10"> <div className="relative w-fit"> <div - className="flex gap-2 items-center mb-5 p-3 w-fit text-gray-600 cursor-pointer hover:outline outline-sky-100 outline-1 hover:bg-gray-50 rounded duration-100" + className="flex gap-2 items-center mb-5 p-2 w-fit text-gray-600 cursor-pointer hover:outline outline-sky-100 outline-1 hover:bg-gray-50 rounded-md duration-100" onClick={() => setProfileDropdown(!profileDropdown)} id="profile-dropdown" > @@ -84,27 +84,27 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "profile-dropdown") setProfileDropdown(false); }} - className="absolute top-12 left-0" + className="absolute top-10 left-0" /> ) : null} </div> <Link href="links"> - <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded-md my-1 p-2 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={faBookmark} className="w-4 text-sky-300" /> <p>All Links</p> </div> </Link> <Link href="/collections"> - <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded my-1 p-3 cursor-pointer flex items-center gap-2"> + <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded-md my-1 p-2 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={faBox} className="w-4 text-sky-300" /> <p>All Collections</p> </div> </Link> <div className="text-gray-500 flex items-center justify-between mt-5"> - <p className="text-sm p-3">Collections</p> + <p className="text-sm p-2">Collections</p> {collectionInput ? ( <ClickAwayHandler onClickOutside={toggleCollectionInput} @@ -113,7 +113,7 @@ export default function () { <input type="text" placeholder="Enter Collection Name" - className="w-44 rounded p-2 border-sky-100 border-solid border text-sm outline-none" + className="w-44 rounded-md p-1 border-sky-500 border-solid border text-sm outline-none" onKeyDown={submitCollection} autoFocus /> @@ -122,7 +122,8 @@ export default function () { <FontAwesomeIcon icon={faPlus} onClick={toggleCollectionInput} - className="select-none cursor-pointer p-2 w-3" + title="Add Collection" + className="select-none text-gray-500 rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1 w-3" /> )} </div> @@ -139,7 +140,7 @@ export default function () { })} </div> <div className="text-gray-500 flex items-center justify-between mt-5"> - <p className="text-sm p-3">Tags</p> + <p className="text-sm p-2">Tags</p> </div> <div> {tags.map((e, i) => { diff --git a/lib/api/archive.ts b/lib/api/archive.ts index 9dd401c..b4f12f5 100644 --- a/lib/api/archive.ts +++ b/lib/api/archive.ts @@ -1,4 +1,5 @@ import { chromium, devices } from "playwright"; +import { prisma } from "@/lib/api/db"; export default async (url: string, collectionId: number, linkId: number) => { const archivePath = `data/archives/${collectionId}/${linkId}`; @@ -12,9 +13,18 @@ export default async (url: string, collectionId: number, linkId: number) => { await page.goto(url); - await page.pdf({ path: archivePath + ".pdf" }); + const linkExists = await prisma.link.findFirst({ + where: { + id: linkId, + }, + }); - await page.screenshot({ fullPage: true, path: archivePath + ".png" }); + if (linkExists) { + await Promise.all([ + page.pdf({ path: archivePath + ".pdf" }), + page.screenshot({ fullPage: true, path: archivePath + ".png" }), + ]); + } await context.close(); await browser.close(); diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index 05ae85d..15f119e 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -1,12 +1,9 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; import { Session } from "next-auth"; -import { ExtendedLink, NewLink } from "@/types/global"; -import { existsSync, mkdirSync } from "fs"; -import getTitle from "../../getTitle"; -import archive from "../../archive"; +import { ExtendedLink } from "@/types/global"; +import fs from "fs"; import { Link, UsersAndCollections } from "@prisma/client"; -import AES from "crypto-js/aes"; import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; export default async function ( @@ -42,6 +39,14 @@ export default async function ( }, }); + fs.unlink(`data/archives/${link.collectionId}/${link.id}.pdf`, (err) => { + if (err) console.log(err); + }); + + fs.unlink(`data/archives/${link.collectionId}/${link.id}.png`, (err) => { + if (err) console.log(err); + }); + return res.status(200).json({ response: deleteLink, }); diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index d333e68..2994843 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -118,7 +118,7 @@ export default async function ( const AES_SECRET = process.env.AES_SECRET as string; - const screenShotHashedPath = AES.encrypt( + const screenshotHashedPath = AES.encrypt( `data/archives/${newLink.collectionId}/${newLink.id}.png`, AES_SECRET ).toString(); @@ -130,7 +130,7 @@ export default async function ( const updatedLink: ExtendedLink = await prisma.link.update({ where: { id: newLink.id }, - data: { screenshotPath: screenShotHashedPath, pdfPath: pdfHashedPath }, + data: { screenshotPath: screenshotHashedPath, pdfPath: pdfHashedPath }, include: { tags: true, collection: true }, }); diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index c0816d3..0fd7bf9 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -7,6 +7,15 @@ export default async function ( res: NextApiResponse, session: Session ) { + // tag cleanup + await prisma.tag.deleteMany({ + where: { + links: { + none: {}, + }, + }, + }); + const tags = await prisma.tag.findMany({ where: { collections: { diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 032e439..cf06f26 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -12,8 +12,8 @@ export default function () { return ( // ml-80 - <div className="p-5"> - <p className="text-center mb-5 text-gray-500 font-bold text-sm"> + <div className="p-2"> + <p className="text-right mb-2 text-gray-500 font-bold text-sm"> {linksByCollection.length || 0} Links Found </p> {linksByCollection.map((e, i) => { diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 1b8e76b..8a9dfe6 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -11,7 +11,7 @@ export default function () { return ( // ml-80 - <div className="flex flex-wrap p-5"> + <div className="flex flex-wrap p-2 gap-2"> {collections.map((e, i) => { return <CollectionCard key={i} collection={e} />; })} diff --git a/pages/login.tsx b/pages/login.tsx index d2e8d5b..5f32162 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -42,17 +42,17 @@ export default function () { placeholder="Email" value={form.email} onChange={(e) => setForm({ ...form, email: e.target.value })} - className="border border-gray-700 rounded block m-2 mx-auto p-2" + className="border border-gray-700 rounded-md block m-2 mx-auto p-2" /> <input type="text" placeholder="Password" value={form.password} onChange={(e) => setForm({ ...form, password: e.target.value })} - className="border border-gray-700 rounded block m-2 mx-auto p-2" + className="border border-gray-700 rounded-md block m-2 mx-auto p-2" /> <div - className="mx-auto bg-black w-min p-3 m-5 text-white rounded cursor-pointer" + className="mx-auto bg-black w-min p-3 m-5 text-white rounded-md cursor-pointer" onClick={loginUser} > Login diff --git a/pages/register.tsx b/pages/register.tsx index 5ea073d..abae07f 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -57,24 +57,24 @@ export default function () { placeholder="Name" value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} - className="border border-gray-700 rounded block m-2 mx-auto p-2" + className="border border-gray-700 rounded-md block m-2 mx-auto p-2" /> <input type="text" placeholder="Email" value={form.email} onChange={(e) => setForm({ ...form, email: e.target.value })} - className="border border-gray-700 rounded block m-2 mx-auto p-2" + className="border border-gray-700 rounded-md block m-2 mx-auto p-2" /> <input type="text" placeholder="Password" value={form.password} onChange={(e) => setForm({ ...form, password: e.target.value })} - className="border border-gray-700 rounded block m-2 mx-auto p-2" + className="border border-gray-700 rounded-md block m-2 mx-auto p-2" /> <div - className="mx-auto bg-black w-min p-3 m-5 text-white rounded cursor-pointer" + className="mx-auto bg-black w-min p-3 m-5 text-white rounded-md cursor-pointer" onClick={registerUser} > Register diff --git a/store/links.ts b/store/links.ts index a9ba598..9fe9db7 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,5 +1,7 @@ import { create } from "zustand"; import { ExtendedLink, NewLink } from "@/types/global"; +import useTagStore from "./tags"; +import useCollectionStore from "./collections"; type LinkStore = { links: ExtendedLink[]; @@ -34,6 +36,9 @@ const useLinkStore = create<LinkStore>()((set) => ({ links: [...state.links, data.response], })); + useTagStore.getState().setTags(); + useCollectionStore.getState().setCollections(); + return response.ok; }, updateLink: (link) => @@ -56,7 +61,7 @@ const useLinkStore = create<LinkStore>()((set) => ({ links: state.links.filter((e) => e.id !== link.id), })); - console.log(data); + useTagStore.getState().setTags(); return response.ok; }, From b9567ca3c27dea7e507ea27d62e7b10a98e2ee53 Mon Sep 17 00:00:00 2001 From: Daniel <daniel31x13@gmail.com> Date: Tue, 28 Mar 2023 11:01:50 +0330 Subject: [PATCH 026/144] many breaking changes/fixes --- components/CollectionCard.tsx | 5 +- .../InputSelect/CollectionSelection.tsx | 22 +- components/InputSelect/TagSelection.tsx | 11 +- components/LinkList.tsx | 56 +- .../{AddLinkModal.tsx => Modal/AddLink.tsx} | 67 +- components/Modal/EditLink.tsx | 101 +++ components/Modal/index.tsx | 19 + components/Navbar.tsx | 164 +++-- components/Sidebar/index.tsx | 69 +-- layouts/MainLayout.tsx | 17 +- lib/api/archive.ts | 71 ++- .../controllers/collections/getCollections.ts | 14 +- .../controllers/collections/postCollection.ts | 40 +- lib/api/controllers/links/deleteLink.ts | 30 +- lib/api/controllers/links/getLinks.ts | 19 +- lib/api/controllers/links/postLink.ts | 124 ++-- lib/api/controllers/tags/getTags.ts | 27 +- package.json | 5 +- pages/_app.tsx | 23 + pages/api/auth/[...nextauth].ts | 2 + pages/api/routes/collections/index.ts | 26 +- pages/api/routes/links/index.ts | 26 +- pages/api/routes/tags/index.ts | 5 +- pages/collections/[id].tsx | 5 +- pages/collections/index.tsx | 54 +- pages/links.tsx | 14 + pages/login.tsx | 2 + .../migration.sql | 2 - .../migration.sql | 11 +- .../20230328031049_init/migration.sql | 2 + .../migrations/20230328072406_/migration.sql | 11 + prisma/schema.prisma | 11 +- public/android-chrome-192x192.png | Bin 0 -> 7020 bytes public/android-chrome-512x512.png | Bin 0 -> 23412 bytes public/apple-touch-icon.png | Bin 0 -> 6896 bytes public/favicon-16x16.png | Bin 0 -> 402 bytes public/favicon-32x32.png | Bin 0 -> 767 bytes public/favicon.ico | Bin 25931 -> 15406 bytes public/icon.png | Bin 0 -> 21476 bytes public/site.webmanifest | 1 + store/links.ts | 8 +- types/global.ts | 7 +- yarn.lock | 575 +++++++++++++++++- 43 files changed, 1180 insertions(+), 466 deletions(-) rename components/{AddLinkModal.tsx => Modal/AddLink.tsx} (60%) create mode 100644 components/Modal/EditLink.tsx create mode 100644 components/Modal/index.tsx create mode 100644 pages/links.tsx delete mode 100644 prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql rename prisma/migrations/{20230312184928_init => 20230327225044_init}/migration.sql (88%) create mode 100644 prisma/migrations/20230328031049_init/migration.sql create mode 100644 prisma/migrations/20230328072406_/migration.sql create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/icon.png create mode 100644 public/site.webmanifest diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index b9efac6..cad3db7 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -15,7 +15,10 @@ export default function ({ collection }: { collection: Collection }) { <div className="p-5 bg-gray-100 h-40 w-60 rounded-md border-sky-100 border-solid border flex flex-col justify-between cursor-pointer hover:bg-gray-50 duration-100"> <div className="flex justify-between text-sky-900 items-center"> <p className="text-lg w-max">{collection.name}</p> - <FontAwesomeIcon icon={faChevronRight} className="w-3" /> + <FontAwesomeIcon + icon={faChevronRight} + className="w-3 h-3 text-gray-500" + /> </div> <p className="text-sm text-sky-300 font-bold">{formattedDate}</p> </div> diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index aa5be0d..b14a658 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -5,7 +5,17 @@ import CreatableSelect from "react-select/creatable"; import { styles } from "./styles"; import { Options } from "./types"; -export default function ({ onChange }: any) { +type Props = { + onChange: any; + defaultValue: + | { + value: number; + label: string; + } + | undefined; +}; + +export default function ({ onChange, defaultValue }: Props) { const { collections } = useCollectionStore(); const router = useRouter(); @@ -17,10 +27,8 @@ export default function ({ onChange }: any) { return e.id === collectionId; }); - let defaultCollection = null; - - if (activeCollection) { - defaultCollection = { + if (activeCollection && !defaultValue) { + defaultValue = { value: activeCollection?.id, label: activeCollection?.name, }; @@ -28,7 +36,7 @@ export default function ({ onChange }: any) { useEffect(() => { const formatedCollections = collections.map((e) => { - return { value: e.id, label: e.name }; + return { value: e.id, label: e.name, ownerId: e.ownerId }; }); setOptions(formatedCollections); @@ -40,7 +48,7 @@ export default function ({ onChange }: any) { onChange={onChange} options={options} styles={styles} - defaultValue={defaultCollection} + defaultValue={defaultValue} menuPosition="fixed" /> ); diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index 87ac38b..819c9ae 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -4,7 +4,15 @@ import CreatableSelect from "react-select/creatable"; import { styles } from "./styles"; import { Options } from "./types"; -export default function ({ onChange }: any) { +type Props = { + onChange: any; + defaultValue?: { + value: number; + label: string; + }[]; +}; + +export default function ({ onChange, defaultValue }: Props) { const { tags } = useTagStore(); const [options, setOptions] = useState<Options[]>([]); @@ -23,6 +31,7 @@ export default function ({ onChange }: any) { onChange={onChange} options={options} styles={styles} + defaultValue={defaultValue} menuPosition="fixed" isMulti /> diff --git a/components/LinkList.tsx b/components/LinkList.tsx index b513a26..0dd5a0c 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -3,17 +3,17 @@ import { faFolder, faArrowUpRightFromSquare, faEllipsis, - faStar, faPenToSquare, faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; import Image from "next/image"; import Dropdown from "./Dropdown"; import useLinkStore from "@/store/links"; +import Modal from "./Modal"; +import EditLink from "./Modal/EditLink"; export default function ({ link, @@ -23,6 +23,7 @@ export default function ({ count: number; }) { const [editDropdown, setEditDropdown] = useState(false); + const [editModal, setEditModal] = useState(false); const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); const { removeLink } = useLinkStore(); @@ -34,14 +35,24 @@ export default function ({ day: "numeric", }); + const toggleEditModal = () => { + setEditModal(!editModal); + }; + return ( - <div className="mx-auto border border-sky-100 mb-5 bg-gray-100 p-2 rounded-md flex items-start relative gap-5 group/item"> + <div className="border border-sky-100 bg-gray-100 p-5 rounded-md flex items-start relative gap-5 sm:gap-14 group/item"> + {editModal ? ( + <Modal toggleModal={toggleEditModal}> + <EditLink toggleLinkModal={toggleEditModal} link={link} /> + </Modal> + ) : null} + <Image src={`http://icons.duckduckgo.com/ip3/${shortendURL}.ico`} width={32} height={32} alt="" - className="opacity-100 duration-100 select-none mt-3" + className="select-none mt-3 z-10 rounded-md" draggable="false" onError={(e) => { const target = e.target as HTMLElement; @@ -53,7 +64,7 @@ export default function ({ width={80} height={80} alt="" - className="blur-sm absolute left-0 opacity-50 select-none" + className="blur-sm absolute left-2 opacity-50 select-none hidden sm:block" draggable="false" onError={(e) => { const target = e.target as HTMLElement; @@ -65,9 +76,6 @@ export default function ({ <div className="flex items-baseline gap-1"> <p className="text-sm text-sky-300 font-bold">{count + 1}.</p> <p className="text-lg text-sky-600">{link.name}</p> - {link.starred ? ( - <FontAwesomeIcon icon={faStar} className="w-3 text-amber-400" /> - ) : null} </div> <p className="text-sky-400 text-sm font-medium">{link.title}</p> <div className="flex gap-3 items-center flex-wrap my-3"> @@ -101,20 +109,25 @@ export default function ({ </div> <div className="flex flex-col justify-between items-end relative"> - <FontAwesomeIcon - icon={faEllipsis} - title="More" - className="w-6 h-6 text-gray-500 rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" + <div onClick={() => setEditDropdown(!editDropdown)} id="edit-dropdown" - /> + className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" + > + <FontAwesomeIcon + icon={faEllipsis} + title="More" + className="w-6 h-6" + id="edit-dropdown" + /> + </div> <div> <p className="text-center text-sky-400 text-sm font-bold"> {archiveLabel} </p> <div - className="flex justify-between mt-3 gap-3" + className="flex justify-center mt-3 gap-3" onMouseLeave={() => setArchiveLabel("Archived Formats")} > <a @@ -152,25 +165,28 @@ export default function ({ {editDropdown ? ( <Dropdown items={[ - { - name: "Star", - icon: <FontAwesomeIcon icon={faStar} />, - }, { name: "Edit", icon: <FontAwesomeIcon icon={faPenToSquare} />, + onClick: () => { + setEditModal(true); + setEditDropdown(false); + }, }, { name: "Delete", icon: <FontAwesomeIcon icon={faTrashCan} />, - onClick: () => removeLink(link), + onClick: () => { + removeLink(link); + setEditDropdown(false); + }, }, ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; if (target.id !== "edit-dropdown") setEditDropdown(false); }} - className="absolute top-8 right-0" + className="absolute top-9 right-0" /> ) : null} </div> diff --git a/components/AddLinkModal.tsx b/components/Modal/AddLink.tsx similarity index 60% rename from components/AddLinkModal.tsx rename to components/Modal/AddLink.tsx index d4f8519..a803d2d 100644 --- a/components/AddLinkModal.tsx +++ b/components/Modal/AddLink.tsx @@ -1,46 +1,76 @@ -import React, { useState } from "react"; -import CollectionSelection from "./InputSelect/CollectionSelection"; -import TagSelection from "./InputSelect/TagSelection"; +import React, { useEffect, useState } from "react"; +import CollectionSelection from "@/components/InputSelect/CollectionSelection"; +import TagSelection from "@/components/InputSelect/TagSelection"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; -import { useRouter } from "next/router"; -import { NewLink } from "@/types/global"; +import { ExtendedLink, NewLink } from "@/types/global"; import useLinkStore from "@/store/links"; +import { useRouter } from "next/router"; +import useCollectionStore from "@/store/collections"; -export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { +type Props = { + toggleLinkModal: Function; +}; + +export default function AddLink({ toggleLinkModal }: Props) { const router = useRouter(); - const [newLink, setNewLink] = useState<NewLink>({ name: "", url: "", tags: [], - collection: { id: Number(router.query.id) }, + collection: { + id: undefined, + name: "", + ownerId: undefined, + }, }); const { addLink } = useLinkStore(); + const { collections } = useCollectionStore(); + + useEffect(() => { + if (router.query.id) { + const currentCollection = collections.find( + (e) => e.id == Number(router.query.id) + ); + + setNewLink({ + ...newLink, + collection: { + id: currentCollection?.id, + name: currentCollection?.name, + ownerId: currentCollection?.ownerId, + }, + }); + } + }, []); const setTags = (e: any) => { const tagNames = e.map((e: any) => { - return e.label; + return { name: e.label }; }); setNewLink({ ...newLink, tags: tagNames }); }; const setCollection = (e: any) => { - const collection = { id: e?.value, isNew: e?.__isNew__ }; + if (e?.__isNew__) e.value = null; - setNewLink({ ...newLink, collection: collection }); + setNewLink({ + ...newLink, + collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId }, + }); }; const submitLink = async () => { - const response = await addLink(newLink); + console.log(newLink); + + const response = await addLink(newLink as ExtendedLink); if (response) toggleLinkModal(); }; - return ( - <div className="slide-up border-sky-100 rounded-md border-solid border rounded-md-md shadow-lg p-5 bg-white flex flex-col gap-3"> + <div className="flex flex-col gap-3"> <p className="font-bold text-sky-300 mb-2 text-center">New Link</p> <div className="flex gap-5 items-center justify-between"> @@ -72,7 +102,14 @@ export default function ({ toggleLinkModal }: { toggleLinkModal: Function }) { <div className="flex gap-5 items-center justify-between"> <p className="text-sm font-bold text-sky-300">Collection</p> - <CollectionSelection onChange={setCollection} /> + <CollectionSelection + defaultValue={ + newLink.collection.name && newLink.collection.id + ? { value: newLink.collection.id, label: newLink.collection.name } + : undefined + } + onChange={setCollection} + /> </div> <div diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx new file mode 100644 index 0000000..5321284 --- /dev/null +++ b/components/Modal/EditLink.tsx @@ -0,0 +1,101 @@ +import React, { useState } from "react"; +import CollectionSelection from "@/components/InputSelect/CollectionSelection"; +import TagSelection from "@/components/InputSelect/TagSelection"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { ExtendedLink } from "@/types/global"; +import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; +import useLinkStore from "@/store/links"; + +type Props = { + toggleLinkModal: Function; + link: ExtendedLink; +}; + +export default function EditLink({ toggleLinkModal, link }: Props) { + const [currentLink, setCurrentLink] = useState<ExtendedLink>(link); + + const { updateLink } = useLinkStore(); + + const setTags = (e: any) => { + const tagNames = e.map((e: any) => { + return { name: e.label }; + }); + + setCurrentLink({ ...currentLink, tags: tagNames }); + }; + + const setCollection = (e: any) => { + if (e?.__isNew__) e.value = null; + + setCurrentLink({ + ...currentLink, + collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId } as any, + }); + }; + + const submitLink = async () => { + updateLink(currentLink); + toggleLinkModal(); + }; + + return ( + <div className="flex flex-col gap-3"> + <p className="font-bold text-sky-300 mb-2 text-center">New Link</p> + + <div className="flex gap-5 items-center justify-between"> + <p className="text-sm font-bold text-sky-300">Name</p> + <input + value={currentLink.name} + onChange={(e) => + setCurrentLink({ ...currentLink, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Link" + className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> + </div> + + <div className="flex gap-5 items-center justify-between"> + <p className="text-sm font-bold text-sky-300">URL</p> + <input + value={currentLink.url} + onChange={(e) => + setCurrentLink({ ...currentLink, url: e.target.value }) + } + type="text" + placeholder="e.g. http://example.com/" + className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> + </div> + + <div className="flex gap-5 items-center justify-between"> + <p className="text-sm font-bold text-sky-300">Tags</p> + <TagSelection + onChange={setTags} + defaultValue={link.tags.map((e) => { + return { label: e.name, value: e.id }; + })} + /> + </div> + + <div className="flex gap-5 items-center justify-between"> + <p className="text-sm font-bold text-sky-300">Collection</p> + <CollectionSelection + onChange={setCollection} + defaultValue={{ + label: link.collection.name, + value: link.collection.id, + }} + /> + </div> + + <div + className="mx-auto mt-2 bg-sky-500 text-white flex items-center gap-2 py-2 px-5 rounded-md select-none font-bold cursor-pointer duration-100 hover:bg-sky-400" + onClick={submitLink} + > + <FontAwesomeIcon icon={faPenToSquare} className="h-5" /> + Edit Link + </div> + </div> + ); +} diff --git a/components/Modal/index.tsx b/components/Modal/index.tsx new file mode 100644 index 0000000..915a80d --- /dev/null +++ b/components/Modal/index.tsx @@ -0,0 +1,19 @@ +import { ReactNode } from "react"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; + +type Props = { + toggleModal: Function; + children: ReactNode; +}; + +export default function ({ toggleModal, children }: Props) { + return ( + <div className="fixed top-0 bottom-0 right-0 left-0 bg-gray-500 bg-opacity-10 flex items-center fade-in z-30"> + <ClickAwayHandler onClickOutside={toggleModal} className="w-fit mx-auto"> + <div className="slide-up border-sky-100 rounded-md border-solid border shadow-lg p-5 bg-white"> + {children} + </div> + </ClickAwayHandler> + </div> + ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index c5aa529..5abe047 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,62 +1,25 @@ -import { useRouter } from "next/router"; -import useCollectionStore from "@/store/collections"; -import { Collection, Tag } from "@prisma/client"; -import ClickAwayHandler from "./ClickAwayHandler"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { signOut } from "next-auth/react"; +import { useSession } from "next-auth/react"; import { faPlus, - faFolder, - faBox, - faHashtag, - faBookmark, faMagnifyingGlass, - IconDefinition, + faCircleUser, + faSliders, + faArrowRightFromBracket, + faChevronDown, } from "@fortawesome/free-solid-svg-icons"; -import { useEffect, useState } from "react"; -import AddLinkModal from "./AddLinkModal"; -import useTagStore from "@/store/tags"; +import { useState } from "react"; +import Dropdown from "@/components/Dropdown"; +import Modal from "./Modal"; +import AddLink from "./Modal/AddLink"; export default function () { - const router = useRouter(); - const [pageName, setPageName] = useState<string | null>(""); - const [pageIcon, setPageIcon] = useState<IconDefinition | null>(null); + const { data: session } = useSession(); - const { collections } = useCollectionStore(); - const { tags } = useTagStore(); + const [profileDropdown, setProfileDropdown] = useState(false); - useEffect(() => { - if (router.route === "/collections/[id]") { - const collectionId = router.query.id; - - const activeCollection: Collection | undefined = collections.find( - (e) => e.id.toString() == collectionId - ); - - if (activeCollection) { - setPageName(activeCollection?.name); - } - - setPageIcon(faFolder); - } else if (router.route === "/tags/[id]") { - const tagId = router.query.id; - - const activeTag: Tag | undefined = tags.find( - (e) => e.id.toString() == tagId - ); - - if (activeTag) { - setPageName(activeTag?.name); - } - - setPageIcon(faHashtag); - } else if (router.route === "/collections") { - setPageName("All Collections"); - setPageIcon(faBox); - } else if (router.route === "/links") { - setPageName("All Links"); - setPageIcon(faBookmark); - } - }, [router, collections, tags]); + const user = session?.user; const [linkModal, setLinkModal] = useState(false); @@ -65,50 +28,75 @@ export default function () { }; return ( - <div className="flex justify-between items-center p-2 border-solid border-b-sky-100 border-b"> - <div className="text-sky-900 rounded-md my-1 flex items-center gap-2 font-bold"> - {pageIcon ? ( - <FontAwesomeIcon icon={pageIcon} className="w-4 text-sky-300" /> - ) : null} - <p>{pageName}</p> + <div className="flex justify-between gap-2 items-center px-5 py-2 border-solid border-b-sky-100 border-b"> + <div className="flex items-center relative"> + <label + htmlFor="search-box" + className="inline-flex w-fit absolute right-0 cursor-pointer select-none rounded-md p-1 text-sky-500" + > + <FontAwesomeIcon icon={faMagnifyingGlass} className="w-5 h-5" /> + </label> + <input + id="search-box" + type="text" + placeholder="Search for Links" + className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1 text-sm" + /> </div> - - <div className="flex items-center gap-2 justify-between"> - <div className="flex items-center relative"> - <label - htmlFor="search-box" - className="inline-flex w-fit absolute right-0 cursor-pointer" - title="Search" - > - <FontAwesomeIcon - icon={faMagnifyingGlass} - className="select-none w-5 h-5 rounded-md p-1 text-sky-500 " - /> - </label> - <input - id="search-box" - type="text" - placeholder="Search for Links" - className="border border-sky-100 rounded-md pr-6 w-6 focus:border-sky-500 focus:w-60 hover:border-sky-500 duration-100 outline-none p-1 text-sm" - /> - </div> - <FontAwesomeIcon - icon={faPlus} + <div className="flex items-center gap-2"> + <div onClick={toggleLinkModal} title="New Link" - className="select-none cursor-pointer w-5 h-5 text-sky-500 p-1 rounded-md hover:outline-sky-500 outline duration-100 hover:bg-white outline-sky-100 outline-1" - /> + className="inline-flex gap-1 items-center select-none cursor-pointer p-1 text-sky-500 rounded-md hover:outline-sky-500 outline duration-100 bg-white outline-sky-100 outline-1" + > + <FontAwesomeIcon icon={faPlus} className="w-5 h-5" /> + </div> {linkModal ? ( - <div className="fixed top-0 bottom-0 right-0 left-0 bg-gray-500 bg-opacity-10 flex items-center fade-in z-10"> - <ClickAwayHandler - onClickOutside={toggleLinkModal} - className="w-fit mx-auto" - > - <AddLinkModal toggleLinkModal={toggleLinkModal} /> - </ClickAwayHandler> - </div> + <Modal toggleModal={toggleLinkModal}> + <AddLink toggleLinkModal={toggleLinkModal} /> + </Modal> ) : null} + + <div className="relative"> + <div + className="flex gap-2 items-center p-1 w-fit bg-white text-gray-600 cursor-pointer border border-sky-100 hover:border-sky-500 rounded-md duration-100" + onClick={() => setProfileDropdown(!profileDropdown)} + id="profile-dropdown" + > + <FontAwesomeIcon + icon={faCircleUser} + className="h-5 w-5 pointer-events-none" + /> + <div className="flex items-center gap-1 pointer-events-none"> + <p className="font-bold leading-3">{user?.name}</p> + <FontAwesomeIcon icon={faChevronDown} className="h-3 w-3" /> + </div> + </div> + {profileDropdown ? ( + <Dropdown + items={[ + { + name: "Settings", + icon: <FontAwesomeIcon icon={faSliders} />, + }, + { + name: "Logout", + icon: <FontAwesomeIcon icon={faArrowRightFromBracket} />, + onClick: () => { + signOut(); + setProfileDropdown(!profileDropdown); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "profile-dropdown") setProfileDropdown(false); + }} + className="absolute top-8 right-0 z-20" + /> + ) : null} + </div> </div> </div> ); diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index de03dd1..d4566e3 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -1,37 +1,25 @@ -import { useSession } from "next-auth/react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; import useCollectionStore from "@/store/collections"; -import { signOut } from "next-auth/react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus, - faChevronDown, faFolder, faBox, faHashtag, faBookmark, - faCircleUser, - faSliders, - faArrowRightFromBracket, } from "@fortawesome/free-solid-svg-icons"; import SidebarItem from "./SidebarItem"; import useTagStore from "@/store/tags"; import Link from "next/link"; -import Dropdown from "@/components/Dropdown"; export default function () { - const { data: session } = useSession(); - const [collectionInput, setCollectionInput] = useState(false); - const [profileDropdown, setProfileDropdown] = useState(false); const { collections, addCollection } = useCollectionStore(); const { tags } = useTagStore(); - const user = session?.user; - const toggleCollectionInput = () => { setCollectionInput(!collectionInput); }; @@ -48,48 +36,12 @@ export default function () { }; return ( - <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-2 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-10"> - <div className="relative w-fit"> - <div - className="flex gap-2 items-center mb-5 p-2 w-fit text-gray-600 cursor-pointer hover:outline outline-sky-100 outline-1 hover:bg-gray-50 rounded-md duration-100" - onClick={() => setProfileDropdown(!profileDropdown)} - id="profile-dropdown" - > - <FontAwesomeIcon - icon={faCircleUser} - className="h-5 pointer-events-none" - /> - <div className="flex items-center gap-1 pointer-events-none"> - <p className="font-bold">{user?.name}</p> - <FontAwesomeIcon icon={faChevronDown} className="h-3" /> - </div> - </div> - {profileDropdown ? ( - <Dropdown - items={[ - { - name: "Settings", - icon: <FontAwesomeIcon icon={faSliders} />, - }, - { - name: "Logout", - icon: <FontAwesomeIcon icon={faArrowRightFromBracket} />, - onClick: () => { - signOut(); - setProfileDropdown(!profileDropdown); - }, - }, - ]} - onClickOutside={(e: Event) => { - const target = e.target as HTMLInputElement; - if (target.id !== "profile-dropdown") setProfileDropdown(false); - }} - className="absolute top-10 left-0" - /> - ) : null} - </div> + <div className="fixed bg-gray-100 top-0 bottom-0 left-0 w-80 p-2 overflow-y-auto hide-scrollbar border-solid border-r-sky-100 border z-20"> + <p className="p-2 text-sky-500 font-bold text-xl mb-5 leading-4"> + Linkwarden + </p> - <Link href="links"> + <Link href="/links"> <div className="hover:bg-gray-50 hover:outline outline-sky-100 outline-1 duration-100 text-sky-900 rounded-md my-1 p-2 cursor-pointer flex items-center gap-2"> <FontAwesomeIcon icon={faBookmark} className="w-4 text-sky-300" /> <p>All Links</p> @@ -119,12 +71,13 @@ export default function () { /> </ClickAwayHandler> ) : ( - <FontAwesomeIcon - icon={faPlus} - onClick={toggleCollectionInput} + <div title="Add Collection" - className="select-none text-gray-500 rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1 w-3" - /> + onClick={toggleCollectionInput} + className="select-none text-gray-500 rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" + > + <FontAwesomeIcon icon={faPlus} className="h-3 w-3" /> + </div> )} </div> <div> diff --git a/layouts/MainLayout.tsx b/layouts/MainLayout.tsx index e41ab6d..4ddb3ab 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -1,4 +1,3 @@ -import Head from "next/head"; import Navbar from "@/components/Navbar"; import Sidebar from "@/components/Sidebar"; import { ReactNode } from "react"; @@ -23,11 +22,6 @@ export default function ({ children }: Props) { if (status === "authenticated" && !redirection && routeExists) return ( <> - <Head> - <title>Linkwarden - - -
@@ -36,15 +30,6 @@ export default function ({ children }: Props) { ); else if ((status === "unauthenticated" && !redirection) || !routeExists) - return ( - <> - - Linkwarden - - - - {children} - - ); + return <>{children}; else return ; } diff --git a/lib/api/archive.ts b/lib/api/archive.ts index b4f12f5..496a464 100644 --- a/lib/api/archive.ts +++ b/lib/api/archive.ts @@ -1,31 +1,62 @@ -import { chromium, devices } from "playwright"; +import { Page } from "puppeteer"; import { prisma } from "@/lib/api/db"; +import puppeteer from "puppeteer-extra"; +import AdblockerPlugin from "puppeteer-extra-plugin-adblocker"; +import StealthPlugin from "puppeteer-extra-plugin-stealth"; export default async (url: string, collectionId: number, linkId: number) => { const archivePath = `data/archives/${collectionId}/${linkId}`; - const browser = await chromium.launch(); - const context = await browser.newContext(devices["Desktop Chrome"]); - const page = await context.newPage(); + const browser = await puppeteer.launch(); - // const contexts = browser.contexts(); - // console.log(contexts.length); + try { + puppeteer.use(AdblockerPlugin()).use(StealthPlugin()); - await page.goto(url); + const page = await browser.newPage(); - const linkExists = await prisma.link.findFirst({ - where: { - id: linkId, - }, - }); + await page.goto(url, { waitUntil: "domcontentloaded", timeout: 300000 }); - if (linkExists) { - await Promise.all([ - page.pdf({ path: archivePath + ".pdf" }), - page.screenshot({ fullPage: true, path: archivePath + ".png" }), - ]); + await page.setViewport({ width: 1080, height: 1024 }); + + await autoScroll(page); + + const linkExists = await prisma.link.findFirst({ + where: { + id: linkId, + }, + }); + + if (linkExists) { + await Promise.all([ + page.pdf({ path: archivePath + ".pdf", format: "a4" }), + page.screenshot({ fullPage: true, path: archivePath + ".png" }), + ]); + } + + await browser.close(); + } catch (err) { + console.log(err); + await browser.close(); } - - await context.close(); - await browser.close(); +}; + +const autoScroll = async (page: Page) => { + await page.evaluate(async () => { + await new Promise((resolve, reject) => { + let totalHeight = 0; + let distance = 100; + let scrollDown = setInterval(() => { + let scrollHeight = document.body.scrollHeight; + window.scrollBy(0, distance); + totalHeight += distance; + if (totalHeight >= scrollHeight) { + clearInterval(scrollDown); + window.scroll(0, 0); + resolve(); + } + }, 100); + }); + + await new Promise((r) => setTimeout(r, 2000)); + }); }; diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts index 7e668b5..110cd41 100644 --- a/lib/api/controllers/collections/getCollections.ts +++ b/lib/api/controllers/collections/getCollections.ts @@ -1,19 +1,11 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { +export default async function (userId: number) { const collections = await prisma.collection.findMany({ where: { - ownerId: session?.user.id, + ownerId: userId, }, }); - return res.status(200).json({ - response: collections || [], - }); + return { response: collections, status: 200 }; } diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index d938755..d8dc865 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -1,29 +1,16 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; import { existsSync, mkdirSync } from "fs"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - if (!session?.user?.email) { - return res.status(401).json({ response: "You must be logged in." }); - } +export default async function (collectionName: string, userId: number) { + if (!collectionName) + return { + response: "Please enter a valid name for the collection.", + status: 400, + }; - const email: string = session.user.email; - const collectionName: string = req?.body?.collectionName; - - if (!collectionName) { - return res - .status(401) - .json({ response: "Please enter a valid name for the collection." }); - } - - const findCollection = await prisma.user.findFirst({ + const findCollection = await prisma.user.findUnique({ where: { - email, + id: userId, }, select: { collections: { @@ -36,15 +23,14 @@ export default async function ( const checkIfCollectionExists = findCollection?.collections[0]; - if (checkIfCollectionExists) { - return res.status(400).json({ response: "Collection already exists." }); - } + if (checkIfCollectionExists) + return { response: "Collection already exists.", status: 400 }; const newCollection = await prisma.collection.create({ data: { owner: { connect: { - id: session.user.id, + id: userId, }, }, name: collectionName, @@ -55,7 +41,5 @@ export default async function ( if (!existsSync(collectionPath)) mkdirSync(collectionPath, { recursive: true }); - return res.status(200).json({ - response: newCollection, - }); + return { response: newCollection, status: 200 }; } diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index 15f119e..54b1e28 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -1,37 +1,23 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; import { ExtendedLink } from "@/types/global"; import fs from "fs"; import { Link, UsersAndCollections } from "@prisma/client"; import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - if (!session?.user?.email) { - return res.status(401).json({ response: "You must be logged in." }); - } - - const link: ExtendedLink = req?.body; - - if (!link) { - return res.status(401).json({ response: "Please choose a valid link." }); - } +export default async function (link: ExtendedLink, userId: number) { + if (!link) return { response: "Please choose a valid link.", status: 401 }; const collectionIsAccessible = await hasAccessToCollection( - session.user.id, + userId, link.collectionId ); const memberHasAccess = collectionIsAccessible?.members.some( - (e: UsersAndCollections) => e.userId === session.user.id && e.canDelete + (e: UsersAndCollections) => e.userId === userId && e.canDelete ); - if (!(collectionIsAccessible?.ownerId === session.user.id || memberHasAccess)) - return res.status(401).json({ response: "Collection is not accessible." }); + if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) + return { response: "Collection is not accessible.", status: 401 }; const deleteLink: Link = await prisma.link.delete({ where: { @@ -47,7 +33,5 @@ export default async function ( if (err) console.log(err); }); - return res.status(200).json({ - response: deleteLink, - }); + return { response: deleteLink, status: 200 }; } diff --git a/lib/api/controllers/links/getLinks.ts b/lib/api/controllers/links/getLinks.ts index bf07860..12ee450 100644 --- a/lib/api/controllers/links/getLinks.ts +++ b/lib/api/controllers/links/getLinks.ts @@ -1,23 +1,16 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - const tags = await prisma.link.findMany({ +export default async function (userId: number) { + const links = await prisma.link.findMany({ where: { collection: { OR: [ { - ownerId: session?.user.id, + ownerId: userId, }, { members: { some: { - userId: session?.user.id, + userId, }, }, }, @@ -30,7 +23,5 @@ export default async function ( }, }); - return res.status(200).json({ - response: tags || [], - }); + return { response: links, status: 200 }; } diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index 2994843..f184b97 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -1,7 +1,5 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; -import { ExtendedLink, NewLink } from "@/types/global"; +import { ExtendedLink } from "@/types/global"; import { existsSync, mkdirSync } from "fs"; import getTitle from "../../getTitle"; import archive from "../../archive"; @@ -9,77 +7,31 @@ import { Link, UsersAndCollections } from "@prisma/client"; import AES from "crypto-js/aes"; import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { - if (!session?.user?.email) { - return res.status(401).json({ response: "You must be logged in." }); - } - - const email: string = session.user.email; - const link: NewLink = req?.body; +export default async function (link: ExtendedLink, userId: number) { + link.collection.name = link.collection.name.trim(); if (!link.name) { - return res - .status(401) - .json({ response: "Please enter a valid name for the link." }); + return { response: "Please enter a valid name for the link.", status: 401 }; + } else if (!link.collection.name) { + return { response: "Please enter a valid collection name.", status: 401 }; } - if (link.collection.isNew) { - const collectionId = link.collection.id as string; + if (link.collection.ownerId) { + const collectionIsAccessible = await hasAccessToCollection( + userId, + link.collection.id + ); - const findCollection = await prisma.user.findFirst({ - where: { - email, - }, - select: { - collections: { - where: { - name: collectionId, - }, - }, - }, - }); + const memberHasAccess = collectionIsAccessible?.members.some( + (e: UsersAndCollections) => e.userId === userId && e.canCreate + ); - const checkIfCollectionExists = findCollection?.collections[0]; - - if (checkIfCollectionExists) - return res.status(400).json({ response: "Collection already exists." }); - - const newCollection = await prisma.collection.create({ - data: { - owner: { - connect: { - id: session.user.id, - }, - }, - name: collectionId, - }, - }); - - const collectionPath = `data/archives/${newCollection.id}`; - if (!existsSync(collectionPath)) - mkdirSync(collectionPath, { recursive: true }); - - link.collection.id = newCollection.id; + if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) + return { response: "Collection is not accessible.", status: 401 }; + } else { + link.collection.ownerId = userId; } - const collectionId = link.collection.id as number; - - const collectionIsAccessible = await hasAccessToCollection( - session.user.id, - collectionId - ); - - const memberHasAccess = collectionIsAccessible?.members.some( - (e: UsersAndCollections) => e.userId === session.user.id && e.canCreate - ); - - if (!(collectionIsAccessible?.ownerId === session.user.id || memberHasAccess)) - return res.status(401).json({ response: "Collection is not accessible." }); - const title = await getTitle(link.url); const newLink: Link = await prisma.link.create({ @@ -87,35 +39,45 @@ export default async function ( name: link.name, url: link.url, collection: { - connect: { - id: collectionId, - }, - }, - tags: { - connectOrCreate: link.tags.map((name) => ({ + connectOrCreate: { where: { - name_collectionId: { - name, - collectionId, + name_ownerId: { + ownerId: link.collection.ownerId, + name: link.collection.name, }, }, create: { - name, - collections: { + name: link.collection.name, + ownerId: userId, + }, + }, + }, + tags: { + connectOrCreate: link.tags.map((tag) => ({ + where: { + name_ownerId: { + name: tag.name, + ownerId: link.collection.ownerId, + }, + }, + create: { + name: tag.name, + owner: { connect: { - id: collectionId, + id: link.collection.ownerId, }, }, }, })), }, title, - starred: false, screenshotPath: "", pdfPath: "", }, }); + console.log(newLink); + const AES_SECRET = process.env.AES_SECRET as string; const screenshotHashedPath = AES.encrypt( @@ -136,7 +98,5 @@ export default async function ( archive(updatedLink.url, updatedLink.collectionId, updatedLink.id); - return res.status(200).json({ - response: updatedLink, - }); + return { response: updatedLink, status: 200 }; } diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 0fd7bf9..0654eba 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -1,12 +1,6 @@ -import type { NextApiRequest, NextApiResponse } from "next"; import { prisma } from "@/lib/api/db"; -import { Session } from "next-auth"; -export default async function ( - req: NextApiRequest, - res: NextApiResponse, - session: Session -) { +export default async function (userId: number) { // tag cleanup await prisma.tag.deleteMany({ where: { @@ -18,15 +12,22 @@ export default async function ( const tags = await prisma.tag.findMany({ where: { - collections: { + ownerId: userId, + owner: { OR: [ { - ownerId: session?.user.id, + id: userId, }, { - members: { + collections: { some: { - userId: session?.user.id, + members: { + some: { + user: { + id: userId, + }, + }, + }, }, }, }, @@ -35,7 +36,5 @@ export default async function ( }, }); - return res.status(200).json({ - response: tags || [], - }); + return { response: tags, status: 200 }; } diff --git a/package.json b/package.json index dd18e92..d70957e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,10 @@ "eslint-config-next": "13.1.6", "next": "13.1.6", "next-auth": "^4.19.1", - "playwright": "^1.31.2", + "puppeteer": "^19.8.0", + "puppeteer-extra": "^3.3.6", + "puppeteer-extra-plugin-adblocker": "^2.13.6", + "puppeteer-extra-plugin-stealth": "^2.11.2", "react": "18.2.0", "react-dom": "18.2.0", "react-select": "^5.7.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index aff7668..2aa706b 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -3,10 +3,33 @@ import MainLayout from "@/layouts/MainLayout"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; +import Head from "next/head"; export default function App({ Component, pageProps }: AppProps) { return ( + + Linkwarden + + + + + + diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 804774f..c21967b 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -35,6 +35,8 @@ export const authOptions: AuthOptions = { passwordMatches = bcrypt.compareSync(password, findUser.password); } + console.log(passwordMatches); + if (passwordMatches) { return { id: findUser?.id, diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index 2b25189..b2f4b63 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -4,21 +4,25 @@ import { authOptions } from "pages/api/auth/[...nextauth]"; import getCollections from "@/lib/api/controllers/collections/getCollections"; import postCollection from "@/lib/api/controllers/collections/postCollection"; -type Data = { - response: object[] | string; -}; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse -) { +export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); if (!session?.user?.email) { return res.status(401).json({ response: "You must be logged in." }); } - if (req.method === "GET") return await getCollections(req, res, session); - - if (req.method === "POST") return await postCollection(req, res, session); + if (req.method === "GET") { + const collections = await getCollections(session.user.id); + return res + .status(collections.status) + .json({ response: collections.response }); + } else if (req.method === "POST") { + const newCollection = await postCollection( + req.body.collectionName.trim(), + session.user.id + ); + return res + .status(newCollection.status) + .json({ response: newCollection.response }); + } } diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 7f8cb26..2ef7ae2 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -5,21 +5,25 @@ import getLinks from "@/lib/api/controllers/links/getLinks"; import postLink from "@/lib/api/controllers/links/postLink"; import deleteLink from "@/lib/api/controllers/links/deleteLink"; -type Data = { - response: object[] | string; -}; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse -) { +export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); if (!session?.user?.email) { return res.status(401).json({ response: "You must be logged in." }); } - if (req.method === "GET") return await getLinks(req, res, session); - else if (req.method === "POST") return await postLink(req, res, session); - else if (req.method === "DELETE") return await deleteLink(req, res, session); + if (req.method === "GET") { + const links = await getLinks(session.user.id); + return res.status(links.status).json({ response: links.response }); + } else if (req.method === "POST") { + const newlink = await postLink(req.body, session.user.id); + return res.status(newlink.status).json({ + response: newlink.response, + }); + } else if (req.method === "DELETE") { + const deleted = await deleteLink(req.body, session.user.id); + return res.status(deleted.status).json({ + response: deleted.response, + }); + } } diff --git a/pages/api/routes/tags/index.ts b/pages/api/routes/tags/index.ts index ea0aff5..5bc9b6a 100644 --- a/pages/api/routes/tags/index.ts +++ b/pages/api/routes/tags/index.ts @@ -17,5 +17,8 @@ export default async function ( return res.status(401).json({ response: "You must be logged in." }); } - if (req.method === "GET") return await getTags(req, res, session); + if (req.method === "GET") { + const tags = await getTags(session.user.id); + return res.status(tags.status).json({ response: tags.response }); + } } diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index cf06f26..f1c0cff 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -12,10 +12,7 @@ export default function () { return ( // ml-80 -
-

- {linksByCollection.length || 0} Links Found -

+
{linksByCollection.map((e, i) => { return ; })} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 8a9dfe6..b2db463 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -1,20 +1,56 @@ -import { useSession } from "next-auth/react"; import useCollectionStore from "@/store/collections"; - +import { faAdd, faBox, faEllipsis } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import CollectionCard from "@/components/CollectionCard"; +import Dropdown from "@/components/Dropdown"; +import { useState } from "react"; export default function () { const { collections } = useCollectionStore(); - const { data: session, status } = useSession(); - - const user = session?.user; + const [editDropdown, setEditDropdown] = useState(false); return ( // ml-80 -
- {collections.map((e, i) => { - return ; - })} +
+
+
+ +

All Collections

+
+
+
setEditDropdown(!editDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ {editDropdown ? ( + , + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setEditDropdown(false); + }} + className="absolute top-7 left-0" + /> + ) : null} +
+
+
+ {collections.map((e, i) => { + return ; + })} +
); } diff --git a/pages/links.tsx b/pages/links.tsx new file mode 100644 index 0000000..01fb4e8 --- /dev/null +++ b/pages/links.tsx @@ -0,0 +1,14 @@ +import LinkList from "@/components/LinkList"; +import useLinkStore from "@/store/links"; + +export default function Links() { + const { links } = useLinkStore(); + + return ( +
+ {links.map((e, i) => { + return ; + })} +
+ ); +} diff --git a/pages/login.tsx b/pages/login.tsx index 5f32162..ab3c60d 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -21,6 +21,8 @@ export default function () { password: form.password, }); + console.log(res?.status); + if (res?.ok) { setForm({ email: "", diff --git a/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql b/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql deleted file mode 100644 index 48f56e6..0000000 --- a/prisma/migrations/20230322214726_renamed_is_favorite_to_starred/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Link" RENAME COLUMN "isFavorites" TO "starred"; diff --git a/prisma/migrations/20230312184928_init/migration.sql b/prisma/migrations/20230327225044_init/migration.sql similarity index 88% rename from prisma/migrations/20230312184928_init/migration.sql rename to prisma/migrations/20230327225044_init/migration.sql index 0158c62..b58779b 100644 --- a/prisma/migrations/20230312184928_init/migration.sql +++ b/prisma/migrations/20230327225044_init/migration.sql @@ -37,7 +37,6 @@ CREATE TABLE "Link" ( "url" TEXT NOT NULL, "title" TEXT NOT NULL, "collectionId" INTEGER NOT NULL, - "isFavorites" BOOLEAN NOT NULL, "screenshotPath" TEXT NOT NULL, "pdfPath" TEXT NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -50,6 +49,7 @@ CREATE TABLE "Tag" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "collectionId" INTEGER NOT NULL, + "ownerId" INTEGER NOT NULL, CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") ); @@ -63,6 +63,12 @@ CREATE TABLE "_LinkToTag" ( -- CreateIndex CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); +-- CreateIndex +CREATE UNIQUE INDEX "Collection_name_ownerId_key" ON "Collection"("name", "ownerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Tag_name_ownerId_key" ON "Tag"("name", "ownerId"); + -- CreateIndex CREATE UNIQUE INDEX "Tag_name_collectionId_key" ON "Tag"("name", "collectionId"); @@ -87,6 +93,9 @@ ALTER TABLE "Link" ADD CONSTRAINT "Link_collectionId_fkey" FOREIGN KEY ("collect -- AddForeignKey ALTER TABLE "Tag" ADD CONSTRAINT "Tag_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "Tag" ADD CONSTRAINT "Tag_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "_LinkToTag" ADD CONSTRAINT "_LinkToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Link"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20230328031049_init/migration.sql b/prisma/migrations/20230328031049_init/migration.sql new file mode 100644 index 0000000..562ef5b --- /dev/null +++ b/prisma/migrations/20230328031049_init/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "Tag_name_collectionId_key"; diff --git a/prisma/migrations/20230328072406_/migration.sql b/prisma/migrations/20230328072406_/migration.sql new file mode 100644 index 0000000..a70afb8 --- /dev/null +++ b/prisma/migrations/20230328072406_/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - You are about to drop the column `collectionId` on the `Tag` table. All the data in the column will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "Tag" DROP CONSTRAINT "Tag_collectionId_fkey"; + +-- AlterTable +ALTER TABLE "Tag" DROP COLUMN "collectionId"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 19c207c..9c5acdf 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -13,6 +13,7 @@ model User { email String @unique password String collections Collection[] + tags Tag[] collectionsJoined UsersAndCollections[] createdAt DateTime @default(now()) } @@ -24,8 +25,9 @@ model Collection { ownerId Int members UsersAndCollections[] links Link[] - tags Tag[] createdAt DateTime @default(now()) + + @@unique([name, ownerId]) } model UsersAndCollections { @@ -50,7 +52,6 @@ model Link { collection Collection @relation(fields: [collectionId], references: [id]) collectionId Int tags Tag[] - starred Boolean screenshotPath String pdfPath String createdAt DateTime @default(now()) @@ -60,8 +61,8 @@ model Tag { id Int @id @default(autoincrement()) name String links Link[] - collections Collection @relation(fields: [collectionId], references: [id]) - collectionId Int + owner User @relation(fields: [ownerId], references: [id]) + ownerId Int - @@unique([name, collectionId]) + @@unique([name, ownerId]) } \ No newline at end of file diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..7e10908b10a42356422b3a79a57bdaee7f3303ab GIT binary patch literal 7020 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 literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd41834c45fc4d764dd6d70e98b57ecba0bba3b GIT binary patch literal 23412 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 literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4045c7d1b681fe4a5d669303ae5a48e6b5422bbf GIT binary patch literal 402 zcmV;D0d4+?P)s^p`|}?|;JyzGhQcfi{ieJOOh7}3HUOkK?7#LCYz75xy*@XC3Lh(2 zbK9k_467Uj7=+oG@OuH~>@Womh7FH?FqG(UqiDt(h{%5Kx$>1EK#qf9)q@{!n_*Ff zH4u?CgZzBw({F~xi(eTgnDK#~jSMgh*zGFF-~tSodIN5FfX%=ConeWc0M_(@VZZ@* zL570UpBV&M85wLP*f9KzZVFZ}`~zl-LZBh%-~MJ;?<9!fY`k88C1p_F`u&fAfsGk| w#z1iaI5WKiW+oDVfglURL|A4bK_7-v0IJOY(Okhx8vpB7PrvLx| literal 0 HcmV?d00001 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..99c38086e25ef2e23957db55fe70bae34aa5aea2 GIT binary patch literal 767 zcmVw+s+N?rJ>;=+}P zt))r@Q9%W}6H|31iMC*E)6}F%JBjB^JIQ2Bnu#-Goo&edzw_VoxJSs-hZX#U{{~<@ zt)ORg7O_;$Q9oLJF7$3|K+q?uIt2$#y-wia*9DcyM!%Tnf{xg zU4~?Ua1?;WkCV8EL}wTBh_p)RCx|*7gku0hBz}y5!~OntTl*x1i?9BJHXR;21j2OBWH2#i~Uka@F(VSd3@+@##*mvKfuLzGk89p z#bdJFC>|M^LYx{~e|vzgqF&{)&4H2c8AKBcINRm}1qin;(Kzy=xJ=@nf-ANFXxTnb zUHi=DdR*S&hafE0yk7h+MSgH8a*e<;fF{n_zD0IpD4xZIuou1C{Uzdh+x4y05`bQu zOD*Vi;WW(dR&tMi`GB(6r& zI1rNXk&@Av?Ug24%>d=Z`EYJDm)<9F{nH$^T9lO9a^tin0OOtO>s+DQm)poA+s12w%LOgX^weCwl0b(Fq|tghJM?(db+6*3ojO;y15 z@>m^+WpTcZYrH{iG}W4n87oXVzz59}1V1bWmmtoCeWvQX8iZ*8BZS{As8fv}82a8` zP0(^5U?)zJ6T{!Krc2G1D$pOoIq@TtQ|GzWucj-oDpv0Q6`$pW#Uvm)xtHL}jDl`j xOl}z$lYh0E@fhdTY@Km6bHZ*jXRi2m{2O0Aq`%Yr#^?Y5002ovPDHLkV1lT&ZHoW^ literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..9844cefdb127351480c0858e56550c4dc6cf56b0 100644 GIT binary patch literal 15406 zcmeHNTZ|M%6m6s5WV6qef#)Bqkd9!5Dl4#z;&6i80Z{koe<=zkc|o zKg!D|k40XFhX^bx68zAJXkdY5cIUA@13SGl-F?01_S9}aXS!#)cSmE+a}u_Q@4@V!p?~{s=aMnr1!6;{LY8TGV+ma z@q@oTaM8AWVm%ob_fcWjV@>-Av}eu*#zk8cTuTR^m+xU8{`PnWoPn$QsOhJvbm)ap z9%1eMeH8XQL0A6xI8>IX_U=BUE%y@}BAB^j?wS-!d_Gkdkz*WWFUgi(mbL=_9@9M|asIEG?hB}1=58-Ee zxjxDj{wb<-MDl;s*c=_Ck;5yfxMy*ub>#4JGOt_=Xb#x94YMe}V-eT;GpdUiV>ZjV zJb(|mft_^$MsfGz08BG{+cL=7Wz8rnQpI2avrh>P#WF8}-vnU@D>c!bqZl844qohueR~%2 zD|%|p!n!#jcTN2)*DUb?;Bc5D@q=wm$gN0ZjSn2yni_9~tFDuQudu?dQStZq{$o4# z9~o8d8+#mJ`OD<(zgF=6YtRorZSSM<0@LL=@+6$1)n4H`lP8(B(_m5sw{4SZg_Be{ z`9A4KS9Mh_pLkEW`D04Ag6jI8l;6Hk)_AP*-B$D4?iCr_oZa6mr#^5vZ@P&}`qw6C=IBL>I53-PA-C(hsMEQ4hfLUGf2mJ-_`vM+Uwx?t3~@89L$bwHaO)Hr+t_@wdpTm1*S1*W~OWYg_7szhg6;>xa#- zyv87^KrZ4@p z%fB}K%lKTCd{Tt3fee0IN^?%P%im`G>;0@-whheL(xDd{IkAbeWk=EMSADiLdgim# z#-LsPARzVu8N_Gyhzyny=JRdmU7p*y&GQoF|62*#34f8nC~&*Wk$D9|u1B z=iI4f8Zt-f`d?%W9_0C6YDKZ>@162jGQ_hb$Y3+?1H49XZiUaRI`vCw@D~~2Yg*V6 zxK}UirQvVxZ1^PXC3*;c$!ycNro~^4Lo-{d6;ILdwtIy8(3W|84)Oro-E5Je-FPWY z{z`^$TjKv(?S0bW{>3eH<@Bdiuly5OS8+&KPU&-LNrF!{q8a=athQ7R2 zY^kvOal9H>i_mXV&oB97Zs0d>8GLJ;>_vH=%HF@RKSi!U&Z&Jqw;TAYad5{=$O(9C zrjeKND4%b-g};))ZA(!$ literal 25931 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 LrJugUA?W`A8`#=m diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4dfafd8d828b96ffc90db8dad5c8fbe980cd6a GIT binary patch literal 21476 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 literal 0 HcmV?d00001 diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/store/links.ts b/store/links.ts index 9fe9db7..858c2e0 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,12 +1,12 @@ import { create } from "zustand"; -import { ExtendedLink, NewLink } from "@/types/global"; +import { ExtendedLink } from "@/types/global"; import useTagStore from "./tags"; import useCollectionStore from "./collections"; type LinkStore = { links: ExtendedLink[]; setLinks: () => void; - addLink: (linkName: NewLink) => Promise; + addLink: (linkName: ExtendedLink) => Promise; updateLink: (link: ExtendedLink) => void; removeLink: (link: ExtendedLink) => void; }; @@ -31,6 +31,8 @@ const useLinkStore = create()((set) => ({ const data = await response.json(); + console.log(data); + if (response.ok) set((state) => ({ links: [...state.links, data.response], @@ -43,7 +45,7 @@ const useLinkStore = create()((set) => ({ }, updateLink: (link) => set((state) => ({ - links: state.links.map((c) => (c.id === link.id ? link : c)), + links: state.links.map((e) => (e.id === link.id ? link : e)), })), removeLink: async (link) => { const response = await fetch("/api/routes/links", { diff --git a/types/global.ts b/types/global.ts index 3a3fffc..79decde 100644 --- a/types/global.ts +++ b/types/global.ts @@ -8,9 +8,10 @@ export interface ExtendedLink extends Link { export interface NewLink { name: string; url: string; - tags: string[]; + tags: Tag[]; collection: { - id: string | number; - isNew?: boolean; + id: number | undefined; + name: string | undefined; + ownerId: number | undefined; }; } diff --git a/yarn.lock b/yarn.lock index 0aeaf73..ff456d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,6 +58,41 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@cliqz/adblocker-content@^1.23.8", "@cliqz/adblocker-content@^1.26.3": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.26.3.tgz#6f0c78883d6574f0d0ce081a6a79d052c1c89e47" + integrity sha512-Bg6Ex5LNBUnijhlQlkeZqrtKqViqfcTXiXvpXQHMY01pdeZQ70rYBT7HRV5FpQYV3xWkRaQrClanhWz36XWRew== + dependencies: + "@cliqz/adblocker-extended-selectors" "^1.26.3" + +"@cliqz/adblocker-extended-selectors@^1.26.3": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.26.3.tgz#7553158ae78e7a50a263bfc595e521746cceec00" + integrity sha512-wLcP7gkc3YVee/iqkIbFoeweSMbX9aaNUissIlzqDz+8BAci0RXOt4SHj+Ri/TIpTkR5urvhKsmQ8sb1hnJX6Q== + +"@cliqz/adblocker-puppeteer@1.23.8": + version "1.23.8" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-puppeteer/-/adblocker-puppeteer-1.23.8.tgz#e74636cd200459d1734929e41504a76939504311" + integrity sha512-Ca1/DBqQXsOpKTFVAHX6OpLTSEupXmUkUWHj6iXhLLleC7RPISN5B0b801VDmaGRqoC5zKRxn0vYbIfpgCWVug== + dependencies: + "@cliqz/adblocker" "^1.23.8" + "@cliqz/adblocker-content" "^1.23.8" + tldts-experimental "^5.6.21" + +"@cliqz/adblocker@^1.23.8": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.26.3.tgz#8ae59ffaf731d26ee515eeb3a9b3d51c28480b90" + integrity sha512-RdXlgNRWEvT+QAVuc81hsitSOObXFkAJiXPL/8PmJ8rFKh0RHfkOpdXl8Xb2GOh2HUbKhy5u9vAhSFMCBKCbCg== + dependencies: + "@cliqz/adblocker-content" "^1.26.3" + "@cliqz/adblocker-extended-selectors" "^1.26.3" + "@remusao/guess-url-type" "^1.1.2" + "@remusao/small" "^1.1.2" + "@remusao/smaz" "^1.7.1" + "@types/chrome" "^0.0.224" + "@types/firefox-webext-browser" "^111.0.0" + tldts-experimental "^5.6.21" + "@emotion/babel-plugin@^11.10.6": version "11.10.6" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" @@ -377,6 +412,41 @@ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.9.0.tgz#05a1411964e047c1bc43f777c7a1c69f86a2a26c" integrity sha512-t1pt0Gsp+HcgPJrHFc+d/ZSAaKKWar2G/iakrE07yeKPNavDP3iVKPpfXP22OTCHZUWf7OelwKJxQgKAm5hkgw== +"@remusao/guess-url-type@^1.1.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz#b3e7c32abdf98d0fb4f93cc67cad580b5fe4ba57" + integrity sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA== + +"@remusao/small@^1.1.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@remusao/small/-/small-1.2.1.tgz#63bfe4548832289f94ac868a0c305970c9a0e5f9" + integrity sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw== + +"@remusao/smaz-compress@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz#fc75eaf9bcac2d58bc4c3d518183a7cb9612d275" + integrity sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw== + dependencies: + "@remusao/trie" "^1.4.1" + +"@remusao/smaz-decompress@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz#8094f997e8fb591a678cda9cf08c209c825eba5b" + integrity sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A== + +"@remusao/smaz@^1.7.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@remusao/smaz/-/smaz-1.9.1.tgz#a2b9b045385f81e1615a68d932b7cc8b04c9db8d" + integrity sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA== + dependencies: + "@remusao/smaz-compress" "^1.9.1" + "@remusao/smaz-decompress" "^1.9.1" + +"@remusao/trie@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@remusao/trie/-/trie-1.4.1.tgz#755d09f8a007476334e611f42719b2d581f00720" + integrity sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q== + "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" @@ -396,16 +466,58 @@ dependencies: "@types/node" "*" +"@types/chrome@^0.0.224": + version "0.0.224" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.224.tgz#0138497299eaaf261d61ece62d7d6af3868ce856" + integrity sha512-YkL7q3KDV7OAKgVCBNIfH73rnjNMbIzAYHzTa2DKhSK/2z0Wf/n8yJnK/UoW+lvuYJJR4LtAkG3YvsIZTy7BOA== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + "@types/crypto-js@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== +"@types/debug@^4.1.0": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/filesystem@*": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" + integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" + integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== + +"@types/firefox-webext-browser@^111.0.0": + version "111.0.0" + resolved "https://registry.yarnpkg.com/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.0.tgz#16311d8da94e21a715d1688ba8547069eb89cf5a" + integrity sha512-KboW0ughUYzuYAvzWGJsiSMmH9AgJDvnstjsNrXMgf6cpJ5g1eBGzkqpjPzVqkOyTH/mFl7gd15+XyaVQhKywA== + +"@types/har-format@*": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.10.tgz#7b4e1e0ada4d17684ac3b05d601a4871cfab11fc" + integrity sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/node@*": version "18.11.19" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" @@ -454,6 +566,13 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@typescript-eslint/parser@^5.42.0": version "5.49.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.49.0.tgz#d699734b2f20e16351e117417d34a2bc9d7c4b90" @@ -606,6 +725,11 @@ aria-query@^5.1.3: dependencies: deep-equal "^2.0.5" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" @@ -701,6 +825,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + bcrypt@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.0.tgz#bbb27665dbc400480a524d8991ac7434e8529e17" @@ -714,6 +843,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -739,6 +877,19 @@ browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -794,16 +945,39 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chromium-bidi@0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.5.tgz#a352e755536dde609bd2c77e4b1f0906bff8784e" + integrity sha512-rkav9YzRfAshSTG3wNXF7P7yNiI29QAo1xBXElPoCoSQR5n20q3cOyVhDv6S7+GlF/CJ/emUxlQiR0xOPurkGg== + dependencies: + mitt "3.0.0" + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -853,6 +1027,16 @@ cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cosmiconfig@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -864,6 +1048,13 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -893,7 +1084,7 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -935,6 +1126,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -972,6 +1168,11 @@ detective@^5.2.1: defined "^1.0.0" minimist "^1.2.6" +devtools-protocol@0.0.1107588: + version "0.0.1107588" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz#f8cac707840b97cc30b029359341bcbbb0ad8ffa" + integrity sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -1026,6 +1227,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.10.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" @@ -1351,6 +1559,17 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1384,6 +1603,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1431,11 +1657,42 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== + dependencies: + for-in "^1.0.1" + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -1497,6 +1754,13 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -1602,6 +1866,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -1670,7 +1939,7 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -1678,6 +1947,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -1704,7 +1978,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1762,6 +2036,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -1786,6 +2065,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1830,6 +2114,13 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-object@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -1912,6 +2203,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + jose@^4.10.0, jose@^4.9.3: version "4.11.2" resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23" @@ -1956,6 +2252,15 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -1964,6 +2269,20 @@ json5@^1.0.1: array-includes "^3.1.5" object.assign "^4.1.3" +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -1976,6 +2295,16 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2032,6 +2361,15 @@ memoize-one@^6.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== +merge-deep@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -2077,6 +2415,24 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" +mitt@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -2147,7 +2503,14 @@ node-addon-api@^5.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== -node-fetch@^2.6.7: +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.0, node-fetch@^2.6.7: version "2.6.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== @@ -2274,7 +2637,7 @@ oidc-token-hash@^5.0.1: resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -2368,6 +2731,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -2383,18 +2751,6 @@ pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -playwright-core@1.31.2: - version "1.31.2" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.2.tgz#debf4b215d14cb619adb7e511c164d068075b2ed" - integrity sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ== - -playwright@^1.31.2: - version "1.31.2" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.31.2.tgz#4252280586c596746122cd1fdf9f8ff6a63fa852" - integrity sha512-jpC47n2PKQNtzB7clmBuWh6ftBRS/Bt5EGLigJ9k2QAKcNeYXZkEaDH5gmvb6+AbcE0DO6GnXdbl9ogG6Eh+og== - dependencies: - playwright-core "1.31.2" - postcss-import@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" @@ -2486,6 +2842,11 @@ prisma@^4.9.0: dependencies: "@prisma/engines" "4.9.0" +progress@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -2495,11 +2856,108 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +puppeteer-core@19.8.0: + version "19.8.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.8.0.tgz#0152f652a64274f93f681b52ed03baf7de7905dd" + integrity sha512-5gBkLR9nae7chWDhI3mpj5QA+hPmjEOW29qw5ap5g51Uo5Lxe5Yip1uyQwZSjg5Wn/eyE9grh2Lyx3m8rPK90A== + dependencies: + chromium-bidi "0.4.5" + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1107588" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.13.0" + +puppeteer-extra-plugin-adblocker@^2.13.6: + version "2.13.6" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-adblocker/-/puppeteer-extra-plugin-adblocker-2.13.6.tgz#99828243579b59ed81e8b1da23d16a3a0dbae557" + integrity sha512-AftgnUZ1rg2RPe9RpX6rkYAxEohwp3iFeGIyjsAuTaIiw4VLZqOb1LSY8/S60vAxpeat60fbCajxoUetmLy4Dw== + dependencies: + "@cliqz/adblocker-puppeteer" "1.23.8" + debug "^4.1.1" + node-fetch "^2.6.0" + puppeteer-extra-plugin "^3.2.3" + +puppeteer-extra-plugin-stealth@^2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.11.2.tgz#bd3f5a1781cac8a98c983d148086585a84fcc8f1" + integrity sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ== + dependencies: + debug "^4.1.1" + puppeteer-extra-plugin "^3.2.3" + puppeteer-extra-plugin-user-preferences "^2.4.1" + +puppeteer-extra-plugin-user-data-dir@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.4.1.tgz#4ea9d56d20455672a54fe086309a102a5126411c" + integrity sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g== + dependencies: + debug "^4.1.1" + fs-extra "^10.0.0" + puppeteer-extra-plugin "^3.2.3" + rimraf "^3.0.2" + +puppeteer-extra-plugin-user-preferences@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.4.1.tgz#db8ec63c04a6a10a8f8997e15fdffdf13272161d" + integrity sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A== + dependencies: + debug "^4.1.1" + deepmerge "^4.2.2" + puppeteer-extra-plugin "^3.2.3" + puppeteer-extra-plugin-user-data-dir "^2.4.1" + +puppeteer-extra-plugin@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.2.3.tgz#50c9f0749c005bbc7b8b208bcd00a9d46a15b585" + integrity sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q== + dependencies: + "@types/debug" "^4.1.0" + debug "^4.1.1" + merge-deep "^3.0.1" + +puppeteer-extra@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz#fc16ff396aae52664842da9a557ea8fa51eaa8b7" + integrity sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A== + dependencies: + "@types/debug" "^4.1.0" + debug "^4.1.1" + deepmerge "^4.2.2" + +puppeteer@^19.8.0: + version "19.8.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.8.0.tgz#2d2225fb24ba6813cd31304d41c6b8340c9f3582" + integrity sha512-MpQClmttCUxv4bVokX/YSXLCU12CUApuRf0rIJyGknYcIrDQNkLUx1N7hNt88Ya4lq9VDsdiDEJ3bcPijqJYPQ== + dependencies: + cosmiconfig "8.1.3" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "19.8.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2562,6 +3020,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -2677,6 +3144,16 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw== + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2868,6 +3345,27 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.1.11: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -2885,6 +3383,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tiny-glob@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" @@ -2893,6 +3396,18 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +tldts-core@^5.7.112: + version "5.7.112" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.112.tgz#168459aa79495f5d46407a685a7a9f0cdc9a272b" + integrity sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q== + +tldts-experimental@^5.6.21: + version "5.7.112" + resolved "https://registry.yarnpkg.com/tldts-experimental/-/tldts-experimental-5.7.112.tgz#6a44be12811161e7daf2e89950563b8e7da94ed1" + integrity sha512-Nq5qWN4OiLziAOOOEoSME7cZI4Hz8Srt+9q6cl8mZ5EAhCfmeE6l7K5XjuIKN+pySuGUvthE5aPiD185YU1/lg== + dependencies: + tldts-core "^5.7.112" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -2973,6 +3488,19 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -3078,6 +3606,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + xtend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -3093,6 +3626,14 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From e41c49267518defafcbe7414c9c9d0b5d02e8eb2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 28 Mar 2023 18:41:34 +0330 Subject: [PATCH 027/144] feat: added links update functionality --- components/InputSelect/TagSelection.tsx | 2 +- components/Modal/EditLink.tsx | 20 ++------ components/Sidebar/index.tsx | 2 +- lib/api/controllers/links/updateLink.ts | 63 +++++++++++++++++++++++++ pages/api/routes/links/index.ts | 8 ++++ store/links.ts | 40 +++++++++++----- 6 files changed, 107 insertions(+), 28 deletions(-) create mode 100644 lib/api/controllers/links/updateLink.ts diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index 819c9ae..a8f02d0 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -27,7 +27,7 @@ export default function ({ onChange, defaultValue }: Props) { return ( { const tagNames = e.map((e: any) => { return { name: e.label }; @@ -40,8 +42,9 @@ export default function EditLink({ toggleLinkModal, link }: Props) { return (
-

New Link

- +

Edit Link

+

{shortendURL}

+

{link.title}

Name

-
-

URL

- - setCurrentLink({ ...currentLink, url: e.target.value }) - } - type="text" - placeholder="e.g. http://example.com/" - className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" - /> -
-

Tags

+

Linkwarden

diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts new file mode 100644 index 0000000..9a6a27e --- /dev/null +++ b/lib/api/controllers/links/updateLink.ts @@ -0,0 +1,63 @@ +import { prisma } from "@/lib/api/db"; +import { ExtendedLink } from "@/types/global"; +import { Link, UsersAndCollections } from "@prisma/client"; +import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; + +export default async function (link: ExtendedLink, userId: number) { + if (!link) return { response: "Please choose a valid link.", status: 401 }; + + const collectionIsAccessible = await hasAccessToCollection( + userId, + link.collectionId + ); + + const memberHasAccess = collectionIsAccessible?.members.some( + (e: UsersAndCollections) => e.userId === userId && e.canUpdate + ); + + if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) + return { response: "Collection is not accessible.", status: 401 }; + + const updatedLink: Link = await prisma.link.update({ + where: { + id: link.id, + }, + data: { + name: link.name, + collection: { + connectOrCreate: { + where: { + name_ownerId: { + ownerId: link.collection.ownerId, + name: link.collection.name, + }, + }, + create: { + name: link.collection.name, + ownerId: userId, + }, + }, + }, + tags: { + connectOrCreate: link.tags.map((tag) => ({ + where: { + name_ownerId: { + name: tag.name, + ownerId: link.collection.ownerId, + }, + }, + create: { + name: tag.name, + owner: { + connect: { + id: link.collection.ownerId, + }, + }, + }, + })), + }, + }, + }); + + return { response: updatedLink, status: 200 }; +} diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 2ef7ae2..8f3c09d 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -4,6 +4,7 @@ import { authOptions } from "pages/api/auth/[...nextauth]"; import getLinks from "@/lib/api/controllers/links/getLinks"; import postLink from "@/lib/api/controllers/links/postLink"; import deleteLink from "@/lib/api/controllers/links/deleteLink"; +import updateLink from "@/lib/api/controllers/links/updateLink"; export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); @@ -25,5 +26,12 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { return res.status(deleted.status).json({ response: deleted.response, }); + } else if (req.method === "PUT") { + console.log("AAAAAAAAAAAAAAAAAAAAAAaa"); + + const updated = await updateLink(req.body, session.user.id); + return res.status(updated.status).json({ + response: updated.response, + }); } } diff --git a/store/links.ts b/store/links.ts index 858c2e0..312007c 100644 --- a/store/links.ts +++ b/store/links.ts @@ -33,20 +33,38 @@ const useLinkStore = create()((set) => ({ console.log(data); - if (response.ok) + if (response.ok) { set((state) => ({ links: [...state.links, data.response], })); - - useTagStore.getState().setTags(); - useCollectionStore.getState().setCollections(); + useTagStore.getState().setTags(); + useCollectionStore.getState().setCollections(); + } return response.ok; }, - updateLink: (link) => - set((state) => ({ - links: state.links.map((e) => (e.id === link.id ? link : e)), - })), + updateLink: async (link) => { + console.log(link); + + const response = await fetch("/api/routes/links", { + body: JSON.stringify(link), + headers: { + "Content-Type": "application/json", + }, + method: "PUT", + }); + + const data = await response.json(); + + console.log(data); + + if (response.ok) { + set((state) => ({ + links: state.links.map((e) => (e.id === link.id ? link : e)), + })); + useTagStore.getState().setTags(); + } + }, removeLink: async (link) => { const response = await fetch("/api/routes/links", { body: JSON.stringify(link), @@ -58,12 +76,12 @@ const useLinkStore = create()((set) => ({ const data = await response.json(); - if (response.ok) + if (response.ok) { set((state) => ({ links: state.links.filter((e) => e.id !== link.id), })); - - useTagStore.getState().setTags(); + useTagStore.getState().setTags(); + } return response.ok; }, From 5328be208b00496f763e02b3e12b2f4f21309f83 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 28 Mar 2023 19:07:36 +0330 Subject: [PATCH 028/144] fix: update tags --- components/InputSelect/TagSelection.tsx | 2 +- lib/api/controllers/links/updateLink.ts | 1 + store/links.ts | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index a8f02d0..819c9ae 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -27,7 +27,7 @@ export default function ({ onChange, defaultValue }: Props) { return ( ({ where: { name_ownerId: { diff --git a/store/links.ts b/store/links.ts index 312007c..62c773f 100644 --- a/store/links.ts +++ b/store/links.ts @@ -44,8 +44,6 @@ const useLinkStore = create()((set) => ({ return response.ok; }, updateLink: async (link) => { - console.log(link); - const response = await fetch("/api/routes/links", { body: JSON.stringify(link), headers: { From 94be799586d16161e32904ef6300e8918f00913c Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 29 Mar 2023 06:15:25 +0330 Subject: [PATCH 029/144] small improvements --- components/LinkList.tsx | 8 ++++---- components/Modal/EditLink.tsx | 5 +++-- next.config.js | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 0dd5a0c..ff5e786 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -28,7 +28,7 @@ export default function ({ const { removeLink } = useLinkStore(); - const shortendURL = new URL(link.url).host.toLowerCase(); + const url = new URL(link.url); const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { year: "numeric", month: "short", @@ -48,7 +48,7 @@ export default function ({ ) : null} {formattedDate}

-

{shortendURL}

+

{url.host}

Edit Link

-

{shortendURL}

-

{link.title}

+

+ {shortendURL} | {link.title} +

Name

Date: Sat, 8 Apr 2023 04:40:55 +0330 Subject: [PATCH 030/144] changes to the link listing pages --- components/Modal/AddLink.tsx | 2 +- components/Modal/EditLink.tsx | 4 +- pages/api/routes/links/index.ts | 2 - pages/collections/[id].tsx | 76 +++++++++++++++++++++++++++++++-- 4 files changed, 75 insertions(+), 9 deletions(-) diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index a803d2d..d1a992f 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -70,7 +70,7 @@ export default function AddLink({ toggleLinkModal }: Props) { if (response) toggleLinkModal(); }; return ( -
+

New Link

diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx index e43b740..763de29 100644 --- a/components/Modal/EditLink.tsx +++ b/components/Modal/EditLink.tsx @@ -41,10 +41,10 @@ export default function EditLink({ toggleLinkModal, link }: Props) { }; return ( -
+

Edit Link

- {shortendURL} | {link.title} + {shortendURL} | {link.title}

Name

diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 8f3c09d..dd12f22 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -27,8 +27,6 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { response: deleted.response, }); } else if (req.method === "PUT") { - console.log("AAAAAAAAAAAAAAAAAAAAAAaa"); - const updated = await updateLink(req.body, session.user.id); return res.status(updated.status).json({ response: updated.response, diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index f1c0cff..db26986 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -1,18 +1,86 @@ +import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; +import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; +import { ExtendedLink } from "@/types/global"; +import { + faAdd, + faEllipsis, + faFolder, + faPenToSquare, + faTrashCan, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { Collection } from "@prisma/client"; import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; export default function () { const router = useRouter(); - const { links } = useLinkStore(); - const linksByCollection = links.filter( - (e) => e.collectionId === Number(router.query.id) - ); + const { links } = useLinkStore(); + const { collections } = useCollectionStore(); + + const [editDropdown, setEditDropdown] = useState(false); + const [activeCollection, setActiveCollection] = useState(); + const [linksByCollection, setLinksByCollection] = + useState(links); + + useEffect(() => { + setLinksByCollection( + links.filter((e) => e.collection.id === Number(router.query.id)) + ); + + setActiveCollection( + collections.find((e) => e.id === Number(router.query.id)) + ); + }, [links, router, collections]); return ( // ml-80
+
+
+ +

{activeCollection?.name}

+
+
+
setEditDropdown(!editDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ {editDropdown ? ( + , + }, + { + name: "Edit Collection", + icon: , + }, + { + name: "Delete Collection", + icon: , + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setEditDropdown(false); + }} + className="absolute top-7 left-0 z-10 w-44" + /> + ) : null} +
+
{linksByCollection.map((e, i) => { return ; })} From b02766f6c85a24bd51a60d72b50158b3cfb1bf77 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 23 Apr 2023 16:56:39 +0330 Subject: [PATCH 031/144] changes accross the files --- .env.sample | 4 + LICENSE.md | 674 ++++++++++++++++++ components/ClickAwayHandler.tsx | 5 + components/CollectionCard.tsx | 5 + components/Dropdown.tsx | 7 +- .../InputSelect/CollectionSelection.tsx | 5 + components/InputSelect/TagSelection.tsx | 5 + components/InputSelect/styles.ts | 5 + components/InputSelect/types.ts | 5 + components/LinkList.tsx | 19 +- components/Loader.tsx | 5 + components/Modal/AddCollection.tsx | 66 ++ components/Modal/AddLink.tsx | 5 + components/Modal/EditLink.tsx | 5 + components/Modal/index.tsx | 5 + components/Navbar.tsx | 7 +- components/Sidebar/SidebarItem.tsx | 5 + components/Sidebar/index.tsx | 5 + hooks/useRedirection.tsx | 5 + layouts/MainLayout.tsx | 5 + lib/api/archive.ts | 5 + .../controllers/collections/getCollections.ts | 5 + .../controllers/collections/postCollection.ts | 5 + lib/api/controllers/links/deleteLink.ts | 5 + lib/api/controllers/links/getLinks.ts | 5 + lib/api/controllers/links/postLink.ts | 6 +- lib/api/controllers/links/updateLink.ts | 5 + lib/api/controllers/tags/getTags.ts | 5 + lib/api/db.ts | 5 + lib/api/getTitle.ts | 5 + lib/api/hasAccessToCollection.ts | 5 + lib/client/getInitialData.ts | 5 + package.json | 2 +- pages/_app.tsx | 5 + pages/_document.tsx | 9 +- pages/api/archives/[...params].ts | 5 + pages/api/auth/[...nextauth].ts | 5 + pages/api/auth/register.ts | 5 + pages/api/hello.ts | 5 + pages/api/routes/collections/index.ts | 5 + pages/api/routes/links/index.ts | 5 + pages/api/routes/tags/index.ts | 5 + pages/collections/[id].tsx | 13 +- pages/collections/index.tsx | 33 +- pages/index.tsx | 5 + pages/links.tsx | 13 + pages/login.tsx | 5 + pages/register.tsx | 5 + pages/tags/[id].tsx | 5 + prisma/schema.prisma | 5 + store/collections.ts | 5 + store/links.ts | 5 + store/tags.ts | 5 + styles/globals.css | 7 + types/global.ts | 5 + types/next-auth.d.ts | 5 + 56 files changed, 1053 insertions(+), 22 deletions(-) create mode 100644 .env.sample create mode 100644 LICENSE.md create mode 100644 components/Modal/AddCollection.tsx diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..db674ce --- /dev/null +++ b/.env.sample @@ -0,0 +1,4 @@ +AES_SECRET=very_sensitive_secret1 +NEXTAUTH_SECRET=very_sensitive_secret2 +DATABASE_URL=postgresql://user:password@localhost:5432/linkwarden +NEXTAUTH_URL=http://localhost:3000 \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a5eae15 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + +The Corresponding Source for a work in source code form is that +same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + +The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index fa5191a..7b3b0a8 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import React, { useRef, useEffect, ReactNode, RefObject } from "react"; type Props = { diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index cad3db7..506445e 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; import { Collection } from "@prisma/client"; diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index 3d64adf..2542cd1 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import Link from "next/link"; import React, { MouseEventHandler, ReactElement } from "react"; import ClickAwayHandler from "./ClickAwayHandler"; @@ -19,7 +24,7 @@ export default function ({ onClickOutside, className, items }: Props) { return ( {items.map((e, i) => { const inner = ( diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index b14a658..79957d9 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import useCollectionStore from "@/store/collections"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index 819c9ae..ca3c7a6 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import useTagStore from "@/store/tags"; import { useEffect, useState } from "react"; import CreatableSelect from "react-select/creatable"; diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts index 81fd567..967ce64 100644 --- a/components/InputSelect/styles.ts +++ b/components/InputSelect/styles.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { StylesConfig } from "react-select"; const font = diff --git a/components/InputSelect/types.ts b/components/InputSelect/types.ts index c521479..e32f849 100644 --- a/components/InputSelect/types.ts +++ b/components/InputSelect/types.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + export interface Options { value: string | number; label: string; diff --git a/components/LinkList.tsx b/components/LinkList.tsx index ff5e786..432da8f 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { ExtendedLink } from "@/types/global"; import { faFolder, @@ -22,7 +27,7 @@ export default function ({ link: ExtendedLink; count: number; }) { - const [editDropdown, setEditDropdown] = useState(false); + const [expandDropdown, setExpandDropdown] = useState(false); const [editModal, setEditModal] = useState(false); const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); @@ -110,7 +115,7 @@ export default function ({
setEditDropdown(!editDropdown)} + onClick={() => setExpandDropdown(!expandDropdown)} id="edit-dropdown" className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" > @@ -162,7 +167,7 @@ export default function ({
- {editDropdown ? ( + {expandDropdown ? ( , onClick: () => { setEditModal(true); - setEditDropdown(false); + setExpandDropdown(false); }, }, { @@ -178,15 +183,15 @@ export default function ({ icon: , onClick: () => { removeLink(link); - setEditDropdown(false); + setExpandDropdown(false); }, }, ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setEditDropdown(false); + if (target.id !== "edit-dropdown") setExpandDropdown(false); }} - className="absolute top-9 right-0" + className="absolute top-9 right-0 w-36" /> ) : null}
diff --git a/components/Loader.tsx b/components/Loader.tsx index 88d12d8..adfe021 100644 --- a/components/Loader.tsx +++ b/components/Loader.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + export default function () { return (
diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx new file mode 100644 index 0000000..61eb8ae --- /dev/null +++ b/components/Modal/AddCollection.tsx @@ -0,0 +1,66 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +// import React, { useState } from "react"; +// import CollectionSelection from "@/components/InputSelect/CollectionSelection"; +// import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +// import { faPlus } from "@fortawesome/free-solid-svg-icons"; +// import useCollectionStore from "@/store/collections"; + +// type Props = { +// toggleCollectionModal: Function; +// }; + +// export default function AddCollection({ toggleCollectionModal }: Props) { +// const [newCollection, setNewCollection] = useState({ +// name: "", +// ownerId: undefined, +// }); + +// const { addCollection } = useCollectionStore(); + +// const setCollectionOwner = (e: any) => { +// if (e?.__isNew__) e.value = null; + +// setNewCollection({ +// ...newCollection, +// ownerId: e?.value, +// }); +// }; + +// return ( +//
+//

New Collection

+ +//
+//

Name

+// +// setNewCollection({ ...newCollection, name: e.target.value }) +// } +// type="text" +// placeholder="e.g. Example Collection" +// className="w-full rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" +// /> +//
+ +//
+//

Owner

+// +//
+ +//
+// +//
+//
+// ); +// } diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index d1a992f..399192e 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import React, { useEffect, useState } from "react"; import CollectionSelection from "@/components/InputSelect/CollectionSelection"; import TagSelection from "@/components/InputSelect/TagSelection"; diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx index 763de29..fe9027d 100644 --- a/components/Modal/EditLink.tsx +++ b/components/Modal/EditLink.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import React, { useState } from "react"; import CollectionSelection from "@/components/InputSelect/CollectionSelection"; import TagSelection from "@/components/InputSelect/TagSelection"; diff --git a/components/Modal/index.tsx b/components/Modal/index.tsx index 915a80d..7098d2b 100644 --- a/components/Modal/index.tsx +++ b/components/Modal/index.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { ReactNode } from "react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 5abe047..110c218 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { signOut } from "next-auth/react"; import { useSession } from "next-auth/react"; @@ -93,7 +98,7 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "profile-dropdown") setProfileDropdown(false); }} - className="absolute top-8 right-0 z-20" + className="absolute top-8 right-0 z-20 w-36" /> ) : null}
diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index 45d9c0f..2437985 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import Link from "next/link"; import React, { ReactElement } from "react"; diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 5b449e9..f6149fb 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useState } from "react"; import useCollectionStore from "@/store/collections"; diff --git a/hooks/useRedirection.tsx b/hooks/useRedirection.tsx index e5a575b..70611d3 100644 --- a/hooks/useRedirection.tsx +++ b/hooks/useRedirection.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { ReactNode, useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; diff --git a/layouts/MainLayout.tsx b/layouts/MainLayout.tsx index 4ddb3ab..5447931 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import Navbar from "@/components/Navbar"; import Sidebar from "@/components/Sidebar"; import { ReactNode } from "react"; diff --git a/lib/api/archive.ts b/lib/api/archive.ts index 496a464..ef73807 100644 --- a/lib/api/archive.ts +++ b/lib/api/archive.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { Page } from "puppeteer"; import { prisma } from "@/lib/api/db"; import puppeteer from "puppeteer-extra"; diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts index 110cd41..c53a7ea 100644 --- a/lib/api/controllers/collections/getCollections.ts +++ b/lib/api/controllers/collections/getCollections.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; export default async function (userId: number) { diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index d8dc865..ed270a9 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; import { existsSync, mkdirSync } from "fs"; diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index 54b1e28..e96458c 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; import { ExtendedLink } from "@/types/global"; import fs from "fs"; diff --git a/lib/api/controllers/links/getLinks.ts b/lib/api/controllers/links/getLinks.ts index 12ee450..651f63a 100644 --- a/lib/api/controllers/links/getLinks.ts +++ b/lib/api/controllers/links/getLinks.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; export default async function (userId: number) { const links = await prisma.link.findMany({ diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index f184b97..093e9cf 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -1,6 +1,10 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; import { ExtendedLink } from "@/types/global"; -import { existsSync, mkdirSync } from "fs"; import getTitle from "../../getTitle"; import archive from "../../archive"; import { Link, UsersAndCollections } from "@prisma/client"; diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts index b331836..1a7e53d 100644 --- a/lib/api/controllers/links/updateLink.ts +++ b/lib/api/controllers/links/updateLink.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; import { ExtendedLink } from "@/types/global"; import { Link, UsersAndCollections } from "@prisma/client"; diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 0654eba..3ca0183 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; export default async function (userId: number) { diff --git a/lib/api/db.ts b/lib/api/db.ts index 8919c42..66fa5fe 100644 --- a/lib/api/db.ts +++ b/lib/api/db.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { PrismaClient } from "@prisma/client"; const globalForPrisma = global as unknown as { prisma: PrismaClient }; diff --git a/lib/api/getTitle.ts b/lib/api/getTitle.ts index 07187ee..6fcc53b 100644 --- a/lib/api/getTitle.ts +++ b/lib/api/getTitle.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + export default async (url: string) => { const response = await fetch(url); const text = await response.text(); diff --git a/lib/api/hasAccessToCollection.ts b/lib/api/hasAccessToCollection.ts index 49bbc04..a4a07b2 100644 --- a/lib/api/hasAccessToCollection.ts +++ b/lib/api/hasAccessToCollection.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; export default async (userId: number, collectionId: number) => { diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts index 4ab47e6..4d98f41 100644 --- a/lib/client/getInitialData.ts +++ b/lib/client/getInitialData.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import useCollectionStore from "@/store/collections"; import { useEffect } from "react"; import { useSession } from "next-auth/react"; diff --git a/package.json b/package.json index d70957e..f35dbbf 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "index.js", "repository": "https://github.com/Daniel31x13/link-warden.git", "author": "Daniel31X13 ", - "license": "MIT", + "license": "GPL-3.0", "private": true, "scripts": { "dev": "next dev", diff --git a/pages/_app.tsx b/pages/_app.tsx index 2aa706b..9716086 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import React from "react"; import MainLayout from "@/layouts/MainLayout"; import "@/styles/globals.css"; diff --git a/pages/_document.tsx b/pages/_document.tsx index 54e8bf3..8fe71a1 100644 --- a/pages/_document.tsx +++ b/pages/_document.tsx @@ -1,4 +1,9 @@ -import { Html, Head, Main, NextScript } from 'next/document' +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { Html, Head, Main, NextScript } from "next/document"; export default function Document() { return ( @@ -9,5 +14,5 @@ export default function Document() { - ) + ); } diff --git a/pages/api/archives/[...params].ts b/pages/api/archives/[...params].ts index 64dc43a..5f2d188 100644 --- a/pages/api/archives/[...params].ts +++ b/pages/api/archives/[...params].ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index c21967b..7ba7493 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; import NextAuth from "next-auth/next"; import CredentialsProvider from "next-auth/providers/credentials"; diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index d0d2006..1f57328 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { prisma } from "@/lib/api/db"; import type { NextApiRequest, NextApiResponse } from "next"; import bcrypt from "bcrypt"; diff --git a/pages/api/hello.ts b/pages/api/hello.ts index b170c05..0225841 100644 --- a/pages/api/hello.ts +++ b/pages/api/hello.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index b2f4b63..86f43fd 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index dd12f22..811c545 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/routes/tags/index.ts b/pages/api/routes/tags/index.ts index 5bc9b6a..b929edf 100644 --- a/pages/api/routes/tags/index.ts +++ b/pages/api/routes/tags/index.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index db26986..84aea87 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; import useCollectionStore from "@/store/collections"; @@ -21,7 +26,7 @@ export default function () { const { links } = useLinkStore(); const { collections } = useCollectionStore(); - const [editDropdown, setEditDropdown] = useState(false); + const [expandDropdown, setExpandDropdown] = useState(false); const [activeCollection, setActiveCollection] = useState(); const [linksByCollection, setLinksByCollection] = useState(links); @@ -46,7 +51,7 @@ export default function () {
setEditDropdown(!editDropdown)} + onClick={() => setExpandDropdown(!expandDropdown)} id="edit-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" > @@ -56,7 +61,7 @@ export default function () { className="w-4 h-4 text-gray-500" />
- {editDropdown ? ( + {expandDropdown ? ( { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setEditDropdown(false); + if (target.id !== "edit-dropdown") setExpandDropdown(false); }} className="absolute top-7 left-0 z-10 w-44" /> diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index b2db463..f6e8bf8 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -1,13 +1,26 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import useCollectionStore from "@/store/collections"; import { faAdd, faBox, faEllipsis } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import CollectionCard from "@/components/CollectionCard"; import Dropdown from "@/components/Dropdown"; import { useState } from "react"; +import Modal from "@/components/Modal"; +import AddCollection from "@/components/Modal/AddCollection"; export default function () { const { collections } = useCollectionStore(); - const [editDropdown, setEditDropdown] = useState(false); + const [expandDropdown, setExpandDropdown] = useState(false); + + const [linkModal, setLinkModal] = useState(false); + + const toggleLinkModal = () => { + setLinkModal(!linkModal); + }; return ( // ml-80 @@ -19,7 +32,7 @@ export default function () {
setEditDropdown(!editDropdown)} + onClick={() => setExpandDropdown(!expandDropdown)} id="edit-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" > @@ -29,22 +42,32 @@ export default function () { className="w-4 h-4 text-gray-500" />
- {editDropdown ? ( + {expandDropdown ? ( , + onClick: () => { + toggleLinkModal(); + setExpandDropdown(false); + }, }, ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setEditDropdown(false); + if (target.id !== "edit-dropdown") setExpandDropdown(false); }} - className="absolute top-7 left-0" + className="absolute top-7 left-0 w-36" /> ) : null}
+ + {linkModal ? ( + + + + ) : null}
{collections.map((e, i) => { diff --git a/pages/index.tsx b/pages/index.tsx index 291bd09..c0c4a0f 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { useRouter } from "next/router"; import { useEffect } from "react"; diff --git a/pages/links.tsx b/pages/links.tsx index 01fb4e8..e372f43 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -1,11 +1,24 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import LinkList from "@/components/LinkList"; import useLinkStore from "@/store/links"; +import { faBookmark } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; export default function Links() { const { links } = useLinkStore(); return (
+
+
+ +

All Links

+
+
{links.map((e, i) => { return ; })} diff --git a/pages/login.tsx b/pages/login.tsx index ab3c60d..eb79d92 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { signIn } from "next-auth/react"; import Link from "next/link"; import { useState } from "react"; diff --git a/pages/register.tsx b/pages/register.tsx index abae07f..f39e8c1 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import Link from "next/link"; import { useState } from "react"; import { useRouter } from "next/router"; diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index 3d89f4d..31a0c95 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { useRouter } from "next/router"; export default function () { diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9c5acdf..96f1952 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + generator client { provider = "prisma-client-js" } diff --git a/store/collections.ts b/store/collections.ts index 5b4f648..01d6320 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { create } from "zustand"; import { Collection } from "@prisma/client"; diff --git a/store/links.ts b/store/links.ts index 62c773f..fb8469c 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { create } from "zustand"; import { ExtendedLink } from "@/types/global"; import useTagStore from "./tags"; diff --git a/store/tags.ts b/store/tags.ts index 17b5c52..e4d364f 100644 --- a/store/tags.ts +++ b/store/tags.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { create } from "zustand"; import { Tag } from "@prisma/client"; diff --git a/styles/globals.css b/styles/globals.css index e755efd..0cd5402 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,3 +1,10 @@ +/* + Copyright (C) 2022-present Daniel31x13 + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with this program. If not, see . +*/ + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/types/global.ts b/types/global.ts index 79decde..43cffd5 100644 --- a/types/global.ts +++ b/types/global.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { Collection, Link, Tag } from "@prisma/client"; export interface ExtendedLink extends Link { diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts index cb9674b..47439a1 100644 --- a/types/next-auth.d.ts +++ b/types/next-auth.d.ts @@ -1,3 +1,8 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import NextAuth, { DefaultSession } from "next-auth"; declare module "next-auth" { From 4bfb08a52e2fa358dae09af838209d07a93df235 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 25 Apr 2023 01:00:40 +0330 Subject: [PATCH 032/144] feat: add collection functionality --- components/Modal/AddCollection.tsx | 109 +++++++++--------- components/Modal/AddLink.tsx | 2 +- components/Sidebar/index.tsx | 48 +------- .../controllers/collections/postCollection.ts | 12 +- pages/api/routes/collections/index.ts | 5 +- .../20230328031049_init/migration.sql | 2 - .../migrations/20230328072406_/migration.sql | 11 -- .../migration.sql | 8 +- prisma/schema.prisma | 1 + store/collections.ts | 9 +- store/links.ts | 8 +- types/global.ts | 5 + 12 files changed, 86 insertions(+), 134 deletions(-) delete mode 100644 prisma/migrations/20230328031049_init/migration.sql delete mode 100644 prisma/migrations/20230328072406_/migration.sql rename prisma/migrations/{20230327225044_init => 20230424185742_}/migration.sql (90%) diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index 61eb8ae..04d207a 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -3,64 +3,69 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -// import React, { useState } from "react"; -// import CollectionSelection from "@/components/InputSelect/CollectionSelection"; -// import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -// import { faPlus } from "@fortawesome/free-solid-svg-icons"; -// import useCollectionStore from "@/store/collections"; +import React, { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import useCollectionStore from "@/store/collections"; +import { NewCollection } from "@/types/global"; -// type Props = { -// toggleCollectionModal: Function; -// }; +type Props = { + toggleCollectionModal: Function; +}; -// export default function AddCollection({ toggleCollectionModal }: Props) { -// const [newCollection, setNewCollection] = useState({ -// name: "", -// ownerId: undefined, -// }); +export default function AddCollection({ toggleCollectionModal }: Props) { + const [newCollection, setNewCollection] = useState({ + name: "", + description: "", + }); -// const { addCollection } = useCollectionStore(); + const { addCollection } = useCollectionStore(); -// const setCollectionOwner = (e: any) => { -// if (e?.__isNew__) e.value = null; + const submitCollection = async () => { + console.log(newCollection); -// setNewCollection({ -// ...newCollection, -// ownerId: e?.value, -// }); -// }; + const response = await addCollection(newCollection as NewCollection); -// return ( -//
-//

New Collection

+ if (response) toggleCollectionModal(); + }; -//
-//

Name

-// -// setNewCollection({ ...newCollection, name: e.target.value }) -// } -// type="text" -// placeholder="e.g. Example Collection" -// className="w-full rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" -// /> -//
+ return ( +
+

New Collection

-//
-//

Owner

-// -//
+
+

Name

+ + setNewCollection({ ...newCollection, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Collection" + className="w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
-//
-// -//
-//
-// ); -// } +
+

Description

+ + setNewCollection({ ...newCollection, description: e.target.value }) + } + type="text" + placeholder="Collection description (Optional)" + className="w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ +
+ + Add Collection +
+
+ ); +} diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index 399192e..b5fce22 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -70,7 +70,7 @@ export default function AddLink({ toggleLinkModal }: Props) { const submitLink = async () => { console.log(newLink); - const response = await addLink(newLink as ExtendedLink); + const response = await addLink(newLink as NewLink); if (response) toggleLinkModal(); }; diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index f6149fb..63e97ff 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -3,12 +3,9 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import ClickAwayHandler from "@/components/ClickAwayHandler"; -import { useState } from "react"; import useCollectionStore from "@/store/collections"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { - faPlus, faFolder, faBox, faHashtag, @@ -19,27 +16,10 @@ import useTagStore from "@/store/tags"; import Link from "next/link"; export default function () { - const [collectionInput, setCollectionInput] = useState(false); - - const { collections, addCollection } = useCollectionStore(); + const { collections } = useCollectionStore(); const { tags } = useTagStore(); - const toggleCollectionInput = () => { - setCollectionInput(!collectionInput); - }; - - const submitCollection = async ( - event: React.KeyboardEvent - ) => { - const collectionName: string = (event.target as HTMLInputElement).value; - - if (event.key === "Enter" && collectionName) { - addCollection(collectionName); - (event.target as HTMLInputElement).value = ""; - } - }; - return (

@@ -60,30 +40,8 @@ export default function () {

-
+

Collections

- {collectionInput ? ( - - - - ) : ( -
- -
- )}
{collections.map((e, i) => { @@ -97,7 +55,7 @@ export default function () { ); })}
-
+

Tags

diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index ed270a9..2a26b72 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -4,12 +4,13 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { prisma } from "@/lib/api/db"; +import { Collection } from "@prisma/client"; import { existsSync, mkdirSync } from "fs"; -export default async function (collectionName: string, userId: number) { - if (!collectionName) +export default async function (collection: Collection, userId: number) { + if (!collection) return { - response: "Please enter a valid name for the collection.", + response: "Please enter a valid collection.", status: 400, }; @@ -20,7 +21,7 @@ export default async function (collectionName: string, userId: number) { select: { collections: { where: { - name: collectionName, + name: collection.name, }, }, }, @@ -38,7 +39,8 @@ export default async function (collectionName: string, userId: number) { id: userId, }, }, - name: collectionName, + name: collection.name, + description: collection.description, }, }); diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index 86f43fd..e4ba78d 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -22,10 +22,7 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { .status(collections.status) .json({ response: collections.response }); } else if (req.method === "POST") { - const newCollection = await postCollection( - req.body.collectionName.trim(), - session.user.id - ); + const newCollection = await postCollection(req.body, session.user.id); return res .status(newCollection.status) .json({ response: newCollection.response }); diff --git a/prisma/migrations/20230328031049_init/migration.sql b/prisma/migrations/20230328031049_init/migration.sql deleted file mode 100644 index 562ef5b..0000000 --- a/prisma/migrations/20230328031049_init/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- DropIndex -DROP INDEX "Tag_name_collectionId_key"; diff --git a/prisma/migrations/20230328072406_/migration.sql b/prisma/migrations/20230328072406_/migration.sql deleted file mode 100644 index a70afb8..0000000 --- a/prisma/migrations/20230328072406_/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `collectionId` on the `Tag` table. All the data in the column will be lost. - -*/ --- DropForeignKey -ALTER TABLE "Tag" DROP CONSTRAINT "Tag_collectionId_fkey"; - --- AlterTable -ALTER TABLE "Tag" DROP COLUMN "collectionId"; diff --git a/prisma/migrations/20230327225044_init/migration.sql b/prisma/migrations/20230424185742_/migration.sql similarity index 90% rename from prisma/migrations/20230327225044_init/migration.sql rename to prisma/migrations/20230424185742_/migration.sql index b58779b..03e3bce 100644 --- a/prisma/migrations/20230327225044_init/migration.sql +++ b/prisma/migrations/20230424185742_/migration.sql @@ -13,6 +13,7 @@ CREATE TABLE "User" ( CREATE TABLE "Collection" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, + "description" TEXT NOT NULL DEFAULT '', "ownerId" INTEGER NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -48,7 +49,6 @@ CREATE TABLE "Link" ( CREATE TABLE "Tag" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, - "collectionId" INTEGER NOT NULL, "ownerId" INTEGER NOT NULL, CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") @@ -69,9 +69,6 @@ CREATE UNIQUE INDEX "Collection_name_ownerId_key" ON "Collection"("name", "owner -- CreateIndex CREATE UNIQUE INDEX "Tag_name_ownerId_key" ON "Tag"("name", "ownerId"); --- CreateIndex -CREATE UNIQUE INDEX "Tag_name_collectionId_key" ON "Tag"("name", "collectionId"); - -- CreateIndex CREATE UNIQUE INDEX "_LinkToTag_AB_unique" ON "_LinkToTag"("A", "B"); @@ -90,9 +87,6 @@ ALTER TABLE "UsersAndCollections" ADD CONSTRAINT "UsersAndCollections_collection -- AddForeignKey ALTER TABLE "Link" ADD CONSTRAINT "Link_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; --- AddForeignKey -ALTER TABLE "Tag" ADD CONSTRAINT "Tag_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - -- AddForeignKey ALTER TABLE "Tag" ADD CONSTRAINT "Tag_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 96f1952..b4a5fef 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -26,6 +26,7 @@ model User { model Collection { id Int @id @default(autoincrement()) name String + description String @default("") owner User @relation(fields: [ownerId], references: [id]) ownerId Int members UsersAndCollections[] diff --git a/store/collections.ts b/store/collections.ts index 01d6320..a629aa8 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -5,11 +5,12 @@ import { create } from "zustand"; import { Collection } from "@prisma/client"; +import { NewCollection } from "@/types/global"; type CollectionStore = { collections: Collection[]; setCollections: () => void; - addCollection: (collectionName: string) => void; + addCollection: (body: NewCollection) => Promise; updateCollection: (collection: Collection) => void; removeCollection: (collectionId: number) => void; }; @@ -23,9 +24,9 @@ const useCollectionStore = create()((set) => ({ if (response.ok) set({ collections: data.response }); }, - addCollection: async (collectionName) => { + addCollection: async (body) => { const response = await fetch("/api/routes/collections", { - body: JSON.stringify({ collectionName }), + body: JSON.stringify(body), headers: { "Content-Type": "application/json", }, @@ -38,6 +39,8 @@ const useCollectionStore = create()((set) => ({ set((state) => ({ collections: [...state.collections, data.response], })); + + return response.ok; }, updateCollection: (collection) => set((state) => ({ diff --git a/store/links.ts b/store/links.ts index fb8469c..35d57b1 100644 --- a/store/links.ts +++ b/store/links.ts @@ -4,14 +4,14 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { create } from "zustand"; -import { ExtendedLink } from "@/types/global"; +import { ExtendedLink, NewLink } from "@/types/global"; import useTagStore from "./tags"; import useCollectionStore from "./collections"; type LinkStore = { links: ExtendedLink[]; setLinks: () => void; - addLink: (linkName: ExtendedLink) => Promise; + addLink: (body: NewLink) => Promise; updateLink: (link: ExtendedLink) => void; removeLink: (link: ExtendedLink) => void; }; @@ -25,9 +25,9 @@ const useLinkStore = create()((set) => ({ if (response.ok) set({ links: data.response }); }, - addLink: async (newLink) => { + addLink: async (body) => { const response = await fetch("/api/routes/links", { - body: JSON.stringify(newLink), + body: JSON.stringify(body), headers: { "Content-Type": "application/json", }, diff --git a/types/global.ts b/types/global.ts index 43cffd5..d352910 100644 --- a/types/global.ts +++ b/types/global.ts @@ -20,3 +20,8 @@ export interface NewLink { ownerId: number | undefined; }; } + +export interface NewCollection { + name: string; + description: string; +} From e715756cbe466b5042b9e0e47f865b1e47a10bd8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 25 Apr 2023 16:09:46 +0330 Subject: [PATCH 033/144] small changes --- components/CollectionCard.tsx | 17 +++++++++----- components/Modal/AddCollection.tsx | 4 ++-- .../controllers/collections/postCollection.ts | 2 +- pages/collections/[id].tsx | 17 ++++++++++++++ pages/collections/index.tsx | 23 +++++++++++++++---- store/collections.ts | 2 ++ 6 files changed, 51 insertions(+), 14 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 506445e..a85a7ee 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -18,12 +18,17 @@ export default function ({ collection }: { collection: Collection }) { return (
-
-

{collection.name}

- +
+
+

{collection.name}

+ +
+

+ {collection.description} +

{formattedDate}

diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index 04d207a..d2674b7 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -42,7 +42,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) { } type="text" placeholder="e.g. Example Collection" - className="w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" />
@@ -55,7 +55,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) { } type="text" placeholder="Collection description (Optional)" - className="w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" />
diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index 2a26b72..569d223 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -8,7 +8,7 @@ import { Collection } from "@prisma/client"; import { existsSync, mkdirSync } from "fs"; export default async function (collection: Collection, userId: number) { - if (!collection) + if (!collection || collection.name.trim() === "") return { response: "Please enter a valid collection.", status: 400, diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 84aea87..748a427 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -5,6 +5,8 @@ import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; +import Modal from "@/components/Modal"; +import AddLink from "@/components/Modal/AddLink"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; import { ExtendedLink } from "@/types/global"; @@ -27,10 +29,15 @@ export default function () { const { collections } = useCollectionStore(); const [expandDropdown, setExpandDropdown] = useState(false); + const [linkModal, setLinkModal] = useState(false); const [activeCollection, setActiveCollection] = useState(); const [linksByCollection, setLinksByCollection] = useState(links); + const toggleLinkModal = () => { + setLinkModal(!linkModal); + }; + useEffect(() => { setLinksByCollection( links.filter((e) => e.collection.id === Number(router.query.id)) @@ -67,6 +74,10 @@ export default function () { { name: "Add Link Here", icon: , + onClick: () => { + toggleLinkModal(); + setExpandDropdown(false); + }, }, { name: "Edit Collection", @@ -84,6 +95,12 @@ export default function () { className="absolute top-7 left-0 z-10 w-44" /> ) : null} + + {linkModal ? ( + + + + ) : null}
{linksByCollection.map((e, i) => { diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index f6e8bf8..15b9f2b 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -4,7 +4,12 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import useCollectionStore from "@/store/collections"; -import { faAdd, faBox, faEllipsis } from "@fortawesome/free-solid-svg-icons"; +import { + faAdd, + faBox, + faEllipsis, + faPlus, +} from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import CollectionCard from "@/components/CollectionCard"; import Dropdown from "@/components/Dropdown"; @@ -18,7 +23,7 @@ export default function () { const [linkModal, setLinkModal] = useState(false); - const toggleLinkModal = () => { + const toggleCollectionModal = () => { setLinkModal(!linkModal); }; @@ -49,7 +54,7 @@ export default function () { name: "New", icon: , onClick: () => { - toggleLinkModal(); + toggleCollectionModal(); setExpandDropdown(false); }, }, @@ -64,8 +69,8 @@ export default function () {
{linkModal ? ( - - + + ) : null}
@@ -73,6 +78,14 @@ export default function () { {collections.map((e, i) => { return ; })} + +
+

New Collection

+ +
); diff --git a/store/collections.ts b/store/collections.ts index a629aa8..bcf4639 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -35,6 +35,8 @@ const useCollectionStore = create()((set) => ({ const data = await response.json(); + console.log(data); + if (response.ok) set((state) => ({ collections: [...state.collections, data.response], From cc8e8dbe9aa0fb39ffc508ee664b5a20afbf07b6 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 27 Apr 2023 00:10:48 +0330 Subject: [PATCH 034/144] added collaboration mode for collections --- components/Modal/AddCollection.tsx | 186 +++++++++++++++++- components/Modal/EditCollection.tsx | 0 .../controllers/collections/getCollections.ts | 8 +- .../controllers/collections/postCollection.ts | 12 +- lib/api/controllers/links/deleteLink.ts | 7 +- lib/api/controllers/links/postLink.ts | 4 +- lib/api/controllers/links/updateLink.ts | 7 +- lib/api/controllers/users/getUsers.ts | 22 +++ ...AccessToCollection.ts => getPermission.ts} | 0 pages/api/archives/[...params].ts | 4 +- pages/api/routes/tags/index.ts | 9 +- pages/api/routes/users/index.ts | 23 +++ pages/register.tsx | 1 - store/collections.ts | 18 +- store/links.ts | 2 + types/global.ts | 13 +- 16 files changed, 279 insertions(+), 37 deletions(-) create mode 100644 components/Modal/EditCollection.tsx create mode 100644 lib/api/controllers/users/getUsers.ts rename lib/api/{hasAccessToCollection.ts => getPermission.ts} (100%) create mode 100644 pages/api/routes/users/index.ts diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index d2674b7..899e282 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -5,9 +5,10 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import { faClose, faPlus } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { NewCollection } from "@/types/global"; +import { useSession } from "next-auth/react"; type Props = { toggleCollectionModal: Function; @@ -17,10 +18,15 @@ export default function AddCollection({ toggleCollectionModal }: Props) { const [newCollection, setNewCollection] = useState({ name: "", description: "", + members: [], }); + const [memberEmail, setMemberEmail] = useState(""); + const { addCollection } = useCollectionStore(); + const session = useSession(); + const submitCollection = async () => { console.log(newCollection); @@ -29,6 +35,14 @@ export default function AddCollection({ toggleCollectionModal }: Props) { if (response) toggleCollectionModal(); }; + const getUserByEmail = async (email: string) => { + const response = await fetch(`/api/routes/users?email=${email}`); + + const data = await response.json(); + + return data.response; + }; + return (

New Collection

@@ -59,6 +73,176 @@ export default function AddCollection({ toggleCollectionModal }: Props) { />
+
+ +
+

Members

+ { + setMemberEmail(e.target.value); + }} + onKeyDown={async (e) => { + const checkIfMemberAlreadyExists = newCollection.members.find( + (e) => e.email === memberEmail + ); + + const ownerEmail = session.data?.user.email; + + if ( + e.key === "Enter" && + // no duplicate members + !checkIfMemberAlreadyExists && + // member can't be empty + memberEmail.trim() !== "" && + // member can't be the owner + memberEmail.trim() !== ownerEmail + ) { + // Lookup, get data/err, list ... + const user = await getUserByEmail(memberEmail.trim()); + + if (user.email) { + const newMember = { + name: user.name, + email: user.email, + canCreate: false, + canUpdate: false, + canDelete: false, + }; + + setNewCollection({ + ...newCollection, + members: [...newCollection.members, newMember], + }); + + setMemberEmail(""); + } + } + }} + type="text" + placeholder="Email (Optional)" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ + {newCollection.members[0] ? ( +

+ (All Members will have Read access to this collection.) +

+ ) : null} + + {newCollection.members.map((e, i) => { + return ( +
+
+

{e.name}

+

{e.email}

+
+
+ { + const updatedMembers = newCollection.members.filter( + (member) => { + return member.email !== e.email; + } + ); + setNewCollection({ + ...newCollection, + members: updatedMembers, + }); + }} + /> +

Permissions

+

(Click to toggle.)

+ + + + + + +
+
+ ); + })} +
. import { prisma } from "@/lib/api/db"; -import { Collection } from "@prisma/client"; +import { NewCollection } from "@/types/global"; import { existsSync, mkdirSync } from "fs"; -export default async function (collection: Collection, userId: number) { +export default async function (collection: NewCollection, userId: number) { if (!collection || collection.name.trim() === "") return { response: "Please enter a valid collection.", @@ -41,6 +41,14 @@ export default async function (collection: Collection, userId: number) { }, name: collection.name, description: collection.description, + members: { + create: collection.members.map((e) => ({ + user: { connect: { email: e.email } }, + canCreate: e.canCreate, + canUpdate: e.canUpdate, + canDelete: e.canDelete, + })), + }, }, }); diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index e96458c..12342b5 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -7,15 +7,12 @@ import { prisma } from "@/lib/api/db"; import { ExtendedLink } from "@/types/global"; import fs from "fs"; import { Link, UsersAndCollections } from "@prisma/client"; -import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; +import getPermission from "@/lib/api/getPermission"; export default async function (link: ExtendedLink, userId: number) { if (!link) return { response: "Please choose a valid link.", status: 401 }; - const collectionIsAccessible = await hasAccessToCollection( - userId, - link.collectionId - ); + const collectionIsAccessible = await getPermission(userId, link.collectionId); const memberHasAccess = collectionIsAccessible?.members.some( (e: UsersAndCollections) => e.userId === userId && e.canDelete diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index 093e9cf..26eb2dc 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -9,7 +9,7 @@ import getTitle from "../../getTitle"; import archive from "../../archive"; import { Link, UsersAndCollections } from "@prisma/client"; import AES from "crypto-js/aes"; -import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; +import getPermission from "@/lib/api/getPermission"; export default async function (link: ExtendedLink, userId: number) { link.collection.name = link.collection.name.trim(); @@ -21,7 +21,7 @@ export default async function (link: ExtendedLink, userId: number) { } if (link.collection.ownerId) { - const collectionIsAccessible = await hasAccessToCollection( + const collectionIsAccessible = await getPermission( userId, link.collection.id ); diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts index 1a7e53d..a1cfd23 100644 --- a/lib/api/controllers/links/updateLink.ts +++ b/lib/api/controllers/links/updateLink.ts @@ -6,15 +6,12 @@ import { prisma } from "@/lib/api/db"; import { ExtendedLink } from "@/types/global"; import { Link, UsersAndCollections } from "@prisma/client"; -import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; +import getPermission from "@/lib/api/getPermission"; export default async function (link: ExtendedLink, userId: number) { if (!link) return { response: "Please choose a valid link.", status: 401 }; - const collectionIsAccessible = await hasAccessToCollection( - userId, - link.collectionId - ); + const collectionIsAccessible = await getPermission(userId, link.collectionId); const memberHasAccess = collectionIsAccessible?.members.some( (e: UsersAndCollections) => e.userId === userId && e.canUpdate diff --git a/lib/api/controllers/users/getUsers.ts b/lib/api/controllers/users/getUsers.ts new file mode 100644 index 0000000..f1780a4 --- /dev/null +++ b/lib/api/controllers/users/getUsers.ts @@ -0,0 +1,22 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { prisma } from "@/lib/api/db"; + +export default async function (email: string) { + const user = await prisma.user.findUnique({ + where: { + email, + }, + }); + + const unsensitiveUserInfo = { + name: user?.name, + email: user?.email, + createdAt: user?.createdAt, + }; + + return { response: unsensitiveUserInfo || null, status: 200 }; +} diff --git a/lib/api/hasAccessToCollection.ts b/lib/api/getPermission.ts similarity index 100% rename from lib/api/hasAccessToCollection.ts rename to lib/api/getPermission.ts diff --git a/pages/api/archives/[...params].ts b/pages/api/archives/[...params].ts index 5f2d188..317a05f 100644 --- a/pages/api/archives/[...params].ts +++ b/pages/api/archives/[...params].ts @@ -10,7 +10,7 @@ import AES from "crypto-js/aes"; import enc from "crypto-js/enc-utf8"; import path from "path"; import fs from "fs"; -import hasAccessToCollection from "@/lib/api/hasAccessToCollection"; +import getPermission from "@/lib/api/getPermission"; export default async function (req: NextApiRequest, res: NextApiResponse) { if (!req.query.params) @@ -23,7 +23,7 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { if (!session?.user?.email) return res.status(401).json({ response: "You must be logged in." }); - const collectionIsAccessible = await hasAccessToCollection( + const collectionIsAccessible = await getPermission( session.user.id, Number(collectionId) ); diff --git a/pages/api/routes/tags/index.ts b/pages/api/routes/tags/index.ts index b929edf..c14d9c9 100644 --- a/pages/api/routes/tags/index.ts +++ b/pages/api/routes/tags/index.ts @@ -8,14 +8,7 @@ import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; import getTags from "@/lib/api/controllers/tags/getTags"; -type Data = { - response: object[] | string; -}; - -export default async function ( - req: NextApiRequest, - res: NextApiResponse -) { +export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); if (!session?.user?.email) { diff --git a/pages/api/routes/users/index.ts b/pages/api/routes/users/index.ts new file mode 100644 index 0000000..b3359ea --- /dev/null +++ b/pages/api/routes/users/index.ts @@ -0,0 +1,23 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import type { NextApiRequest, NextApiResponse } from "next"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "pages/api/auth/[...nextauth]"; +import getUsers from "@/lib/api/controllers/users/getUsers"; + +export default async function (req: NextApiRequest, res: NextApiResponse) { + const session = await getServerSession(req, res, authOptions); + + if (!session?.user?.email) { + return res.status(401).json({ response: "You must be logged in." }); + } + + // get unsensitive user info by email + if (req.method === "GET") { + const users = await getUsers(req.query.email as string); + return res.status(users.status).json({ response: users.response }); + } +} diff --git a/pages/register.tsx b/pages/register.tsx index f39e8c1..e9fae86 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -24,7 +24,6 @@ export default function () { async function registerUser() { let success: boolean = false; - console.log(form); if (form.name != "" && form.email != "" && form.password != "") { await fetch("/api/auth/register", { diff --git a/store/collections.ts b/store/collections.ts index bcf4639..ee39c9c 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -5,13 +5,13 @@ import { create } from "zustand"; import { Collection } from "@prisma/client"; -import { NewCollection } from "@/types/global"; +import { ExtendedCollection, NewCollection } from "@/types/global"; type CollectionStore = { - collections: Collection[]; + collections: ExtendedCollection[]; setCollections: () => void; addCollection: (body: NewCollection) => Promise; - updateCollection: (collection: Collection) => void; + // updateCollection: (collection: Collection) => void; removeCollection: (collectionId: number) => void; }; @@ -44,12 +44,12 @@ const useCollectionStore = create()((set) => ({ return response.ok; }, - updateCollection: (collection) => - set((state) => ({ - collections: state.collections.map((c) => - c.id === collection.id ? collection : c - ), - })), + // updateCollection: (collection) => + // set((state) => ({ + // collections: state.collections.map((c) => + // c.id === collection.id ? collection : c + // ), + // })), removeCollection: (collectionId) => { set((state) => ({ collections: state.collections.filter((c) => c.id !== collectionId), diff --git a/store/links.ts b/store/links.ts index 35d57b1..68e9f51 100644 --- a/store/links.ts +++ b/store/links.ts @@ -79,6 +79,8 @@ const useLinkStore = create()((set) => ({ const data = await response.json(); + console.log(data); + if (response.ok) { set((state) => ({ links: state.links.filter((e) => e.id !== link.id), diff --git a/types/global.ts b/types/global.ts index d352910..21500a9 100644 --- a/types/global.ts +++ b/types/global.ts @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import { Collection, Link, Tag } from "@prisma/client"; +import { Collection, Link, Tag, UsersAndCollections } from "@prisma/client"; export interface ExtendedLink extends Link { tags: Tag[]; @@ -24,4 +24,15 @@ export interface NewLink { export interface NewCollection { name: string; description: string; + members: { + name: string; + email: string; + canCreate: boolean; + canUpdate: boolean; + canDelete: boolean; + }[]; +} + +export interface ExtendedCollection extends Collection { + members: UsersAndCollections[]; } From ca30e42f0ced150178dbb3ef84e7f97ee628e541 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 28 Apr 2023 02:43:21 +0330 Subject: [PATCH 035/144] collection editing frontend --- components/Modal/AddCollection.tsx | 188 ++++++------ components/Modal/EditCollection.tsx | 267 ++++++++++++++++++ .../controllers/collections/getCollections.ts | 11 +- lib/api/controllers/users/getUsers.ts | 1 + pages/collections/[id].tsx | 24 +- .../migration.sql | 0 types/global.ts | 14 +- 7 files changed, 408 insertions(+), 97 deletions(-) rename prisma/migrations/{20230424185742_ => 20230427184353_init}/migration.sql (100%) diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index 899e282..239a235 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -135,109 +135,113 @@ export default function AddCollection({ toggleCollectionModal }: Props) { return (
+ { + const updatedMembers = newCollection.members.filter( + (member) => { + return member.email !== e.email; + } + ); + setNewCollection({ + ...newCollection, + members: updatedMembers, + }); + }} + />

{e.name}

{e.email}

-
- { - const updatedMembers = newCollection.members.filter( - (member) => { - return member.email !== e.email; - } - ); - setNewCollection({ - ...newCollection, - members: updatedMembers, - }); - }} - /> -

Permissions

-

(Click to toggle.)

+
+
+

Permissions

+

(Click to toggle.)

+
-
); diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index e69de29..2049622 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -0,0 +1,267 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import React, { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faClose, faPlus } from "@fortawesome/free-solid-svg-icons"; +import useCollectionStore from "@/store/collections"; +import { ExtendedCollection, NewCollection } from "@/types/global"; +import { useSession } from "next-auth/react"; + +type Props = { + toggleCollectionModal: Function; + collection: ExtendedCollection; +}; + +export default function EditCollection({ + toggleCollectionModal, + collection, +}: Props) { + const [activeCollection, setActiveCollection] = + useState(collection); + + const [memberEmail, setMemberEmail] = useState(""); + + // const { addCollection } = useCollectionStore(); + + const session = useSession(); + + const submitCollection = async () => { + console.log(activeCollection); + + // const response = await addCollection(newCollection as NewCollection); + + // if (response) toggleCollectionModal(); + }; + + const getUserByEmail = async (email: string) => { + const response = await fetch(`/api/routes/users?email=${email}`); + + const data = await response.json(); + + return data.response; + }; + + return ( +
+

Edit Collection

+ +
+

Name

+ + setActiveCollection({ ...activeCollection, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Collection" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Description

+ + setActiveCollection({ + ...activeCollection, + description: e.target.value, + }) + } + type="text" + placeholder="Collection description (Optional)" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ +
+ +
+

Members

+ { + setMemberEmail(e.target.value); + }} + onKeyDown={async (e) => { + const checkIfMemberAlreadyExists = activeCollection.members.find( + (e) => e.user.email === memberEmail + ); + + const ownerEmail = session.data?.user.email; + + if ( + e.key === "Enter" && + // no duplicate members + !checkIfMemberAlreadyExists && + // member can't be empty + memberEmail.trim() !== "" && + // member can't be the owner + memberEmail.trim() !== ownerEmail + ) { + // Lookup, get data/err, list ... + const user = await getUserByEmail(memberEmail.trim()); + + if (user.email) { + const newMember = { + collectionId: activeCollection.id, + userId: user.id, + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: user.name, + email: user.email, + }, + }; + + setActiveCollection({ + ...activeCollection, + members: [...activeCollection.members, newMember], + }); + + setMemberEmail(""); + } + } + }} + type="text" + placeholder="Email (Optional)" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> +
+ + {activeCollection.members[0] ? ( +

+ (All Members will have Read access to this collection.) +

+ ) : null} + + {activeCollection.members.map((e, i) => { + return ( +
+ { + const updatedMembers = activeCollection.members.filter( + (member) => { + return member.user.email !== e.user.email; + } + ); + setActiveCollection({ + ...activeCollection, + members: updatedMembers, + }); + }} + /> +
+

{e.user.name}

+

{e.user.email}

+
+
+
+

Permissions

+

(Click to toggle.)

+
+ +
+ + + + + +
+
+
+ ); + })} + +
+ + Add Collection +
+
+ ); +} diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts index a494b8b..3e1ab30 100644 --- a/lib/api/controllers/collections/getCollections.ts +++ b/lib/api/controllers/collections/getCollections.ts @@ -14,7 +14,16 @@ export default async function (userId: number) { ], }, include: { - members: true, + members: { + include: { + user: { + select: { + email: true, + name: true, + }, + }, + }, + }, }, }); diff --git a/lib/api/controllers/users/getUsers.ts b/lib/api/controllers/users/getUsers.ts index f1780a4..1da4aee 100644 --- a/lib/api/controllers/users/getUsers.ts +++ b/lib/api/controllers/users/getUsers.ts @@ -13,6 +13,7 @@ export default async function (email: string) { }); const unsensitiveUserInfo = { + id: user?.id, name: user?.name, email: user?.email, createdAt: user?.createdAt, diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 748a427..d6c5653 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -7,9 +7,10 @@ import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; import Modal from "@/components/Modal"; import AddLink from "@/components/Modal/AddLink"; +import EditCollection from "@/components/Modal/EditCollection"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; -import { ExtendedLink } from "@/types/global"; +import { ExtendedCollection, ExtendedLink } from "@/types/global"; import { faAdd, faEllipsis, @@ -30,7 +31,9 @@ export default function () { const [expandDropdown, setExpandDropdown] = useState(false); const [linkModal, setLinkModal] = useState(false); - const [activeCollection, setActiveCollection] = useState(); + const [collectionModal, setCollectionModal] = useState(false); + const [activeCollection, setActiveCollection] = + useState(); const [linksByCollection, setLinksByCollection] = useState(links); @@ -38,6 +41,10 @@ export default function () { setLinkModal(!linkModal); }; + const toggleCollectionModal = () => { + setCollectionModal(!collectionModal); + }; + useEffect(() => { setLinksByCollection( links.filter((e) => e.collection.id === Number(router.query.id)) @@ -82,6 +89,10 @@ export default function () { { name: "Edit Collection", icon: , + onClick: () => { + toggleCollectionModal(); + setExpandDropdown(false); + }, }, { name: "Delete Collection", @@ -101,6 +112,15 @@ export default function () { ) : null} + + {collectionModal && activeCollection ? ( + + + + ) : null}
{linksByCollection.map((e, i) => { diff --git a/prisma/migrations/20230424185742_/migration.sql b/prisma/migrations/20230427184353_init/migration.sql similarity index 100% rename from prisma/migrations/20230424185742_/migration.sql rename to prisma/migrations/20230427184353_init/migration.sql diff --git a/types/global.ts b/types/global.ts index 21500a9..5da7f89 100644 --- a/types/global.ts +++ b/types/global.ts @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import { Collection, Link, Tag, UsersAndCollections } from "@prisma/client"; +import { Collection, Link, Tag } from "@prisma/client"; export interface ExtendedLink extends Link { tags: Tag[]; @@ -34,5 +34,15 @@ export interface NewCollection { } export interface ExtendedCollection extends Collection { - members: UsersAndCollections[]; + members: { + collectionId: number; + userId: number; + canCreate: boolean; + canUpdate: boolean; + canDelete: boolean; + user: { + name: string; + email: string; + }; + }[]; } From 8b7a660766ba3c8fa45d448d29e8b74f8200e5c2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 29 Apr 2023 00:40:29 +0330 Subject: [PATCH 036/144] feat: added edit + delete collection functionality --- components/Modal/AddCollection.tsx | 4 +- components/Modal/AddLink.tsx | 4 +- components/Modal/DeleteCollection.tsx | 67 +++++++++++++++++++ components/Modal/EditCollection.tsx | 31 ++++----- components/Modal/EditLink.tsx | 4 +- .../collections/deleteCollection.ts | 48 +++++++++++++ .../collections/updateCollection.ts | 48 +++++++++++++ lib/api/controllers/tags/getTags.ts | 2 +- lib/api/controllers/users/getUsers.ts | 4 +- lib/client/getPublicUserDataByEmail.ts | 12 ++++ pages/api/routes/collections/index.ts | 8 +++ pages/api/routes/links/index.ts | 10 +-- pages/collections/[id].tsx | 34 +++++++--- store/collections.ts | 61 +++++++++++++---- 14 files changed, 285 insertions(+), 52 deletions(-) create mode 100644 components/Modal/DeleteCollection.tsx create mode 100644 lib/api/controllers/collections/deleteCollection.ts create mode 100644 lib/api/controllers/collections/updateCollection.ts create mode 100644 lib/client/getPublicUserDataByEmail.ts diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index 239a235..ef60264 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -27,7 +27,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) { const session = useSession(); - const submitCollection = async () => { + const submit = async () => { console.log(newCollection); const response = await addCollection(newCollection as NewCollection); @@ -249,7 +249,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) {
Add Collection diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index b5fce22..7e6941d 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -67,7 +67,7 @@ export default function AddLink({ toggleLinkModal }: Props) { }); }; - const submitLink = async () => { + const submit = async () => { console.log(newLink); const response = await addLink(newLink as NewLink); @@ -119,7 +119,7 @@ export default function AddLink({ toggleLinkModal }: Props) {
Add Link diff --git a/components/Modal/DeleteCollection.tsx b/components/Modal/DeleteCollection.tsx new file mode 100644 index 0000000..64483b7 --- /dev/null +++ b/components/Modal/DeleteCollection.tsx @@ -0,0 +1,67 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import React, { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faPlus, faTrashCan } from "@fortawesome/free-solid-svg-icons"; +import { ExtendedCollection } from "@/types/global"; +import useCollectionStore from "@/store/collections"; +import { useRouter } from "next/router"; + +type Props = { + toggleCollectionModal: Function; + collection: ExtendedCollection; +}; + +export default function AddCollection({ + toggleCollectionModal, + collection, +}: Props) { + const [inputField, setInputField] = useState(""); + + const { removeCollection } = useCollectionStore(); + + const router = useRouter(); + + const submit = async () => { + const response = await removeCollection(collection.id); + if (response) { + toggleCollectionModal(); + router.push("/collections"); + } + }; + + return ( +
+

Delete Collection

+ +

+ To confirm, type " + {collection.name}" in + the box below: +

+ + setInputField(e.target.value)} + type="text" + placeholder={`Type "${collection.name}" Here.`} + className=" w-72 sm:w-96 rounded-md p-3 mx-auto border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + /> + +
+ + Delete Collection +
+
+ ); +} diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index 2049622..444ec7e 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -5,10 +5,11 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faClose, faPlus } from "@fortawesome/free-solid-svg-icons"; +import { faClose, faPenToSquare } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; -import { ExtendedCollection, NewCollection } from "@/types/global"; +import { ExtendedCollection } from "@/types/global"; import { useSession } from "next-auth/react"; +import getPublicUserDataByEmail from "@/lib/client/getPublicUserDataByEmail"; type Props = { toggleCollectionModal: Function; @@ -24,24 +25,18 @@ export default function EditCollection({ const [memberEmail, setMemberEmail] = useState(""); - // const { addCollection } = useCollectionStore(); + const { updateCollection } = useCollectionStore(); const session = useSession(); - const submitCollection = async () => { + const submit = async () => { console.log(activeCollection); - // const response = await addCollection(newCollection as NewCollection); + const response = await updateCollection( + activeCollection as ExtendedCollection + ); - // if (response) toggleCollectionModal(); - }; - - const getUserByEmail = async (email: string) => { - const response = await fetch(`/api/routes/users?email=${email}`); - - const data = await response.json(); - - return data.response; + if (response) toggleCollectionModal(); }; return ( @@ -103,7 +98,7 @@ export default function EditCollection({ memberEmail.trim() !== ownerEmail ) { // Lookup, get data/err, list ... - const user = await getUserByEmail(memberEmail.trim()); + const user = await getPublicUserDataByEmail(memberEmail.trim()); if (user.email) { const newMember = { @@ -257,10 +252,10 @@ export default function EditCollection({
- - Add Collection + + Edit Collection
); diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx index fe9027d..a59d289 100644 --- a/components/Modal/EditLink.tsx +++ b/components/Modal/EditLink.tsx @@ -40,7 +40,7 @@ export default function EditLink({ toggleLinkModal, link }: Props) { }); }; - const submitLink = async () => { + const submit = async () => { updateLink(currentLink); toggleLinkModal(); }; @@ -87,7 +87,7 @@ export default function EditLink({ toggleLinkModal, link }: Props) {
Edit Link diff --git a/lib/api/controllers/collections/deleteCollection.ts b/lib/api/controllers/collections/deleteCollection.ts new file mode 100644 index 0000000..97d20e6 --- /dev/null +++ b/lib/api/controllers/collections/deleteCollection.ts @@ -0,0 +1,48 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { prisma } from "@/lib/api/db"; +import getPermission from "@/lib/api/getPermission"; +import fs from "fs"; + +export default async function (collection: { id: number }, userId: number) { + console.log(collection.id); + + if (!collection.id) + return { response: "Please choose a valid collection.", status: 401 }; + + const collectionIsAccessible = await getPermission(userId, collection.id); + + if (!(collectionIsAccessible?.ownerId === userId)) + return { response: "Collection is not accessible.", status: 401 }; + + const deletedCollection = await prisma.$transaction(async () => { + await prisma.usersAndCollections.deleteMany({ + where: { + collection: { + id: collection.id, + }, + }, + }); + + await prisma.link.deleteMany({ + where: { + collection: { + id: collection.id, + }, + }, + }); + + fs.rmdirSync(`data/archives/${collection.id}`, { recursive: true }); + + return await prisma.collection.delete({ + where: { + id: collection.id, + }, + }); + }); + + return { response: deletedCollection, status: 200 }; +} diff --git a/lib/api/controllers/collections/updateCollection.ts b/lib/api/controllers/collections/updateCollection.ts new file mode 100644 index 0000000..4f8519a --- /dev/null +++ b/lib/api/controllers/collections/updateCollection.ts @@ -0,0 +1,48 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { prisma } from "@/lib/api/db"; +import { ExtendedCollection } from "@/types/global"; +import getPermission from "@/lib/api/getPermission"; + +export default async function (collection: ExtendedCollection, userId: number) { + if (!collection) + return { response: "Please choose a valid collection.", status: 401 }; + + const collectionIsAccessible = await getPermission(userId, collection.id); + + if (!(collectionIsAccessible?.ownerId === userId)) + return { response: "Collection is not accessible.", status: 401 }; + + const updatedCollection = await prisma.$transaction(async () => { + await prisma.usersAndCollections.deleteMany({ + where: { + collection: { + id: collection.id, + }, + }, + }); + + return await prisma.collection.update({ + where: { + id: collection.id, + }, + data: { + name: collection.name, + description: collection.description, + members: { + create: collection.members.map((e) => ({ + user: { connect: { email: e.user.email } }, + canCreate: e.canCreate, + canUpdate: e.canUpdate, + canDelete: e.canDelete, + })), + }, + }, + }); + }); + + return { response: updatedCollection, status: 200 }; +} diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 3ca0183..7e73dea 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -6,7 +6,7 @@ import { prisma } from "@/lib/api/db"; export default async function (userId: number) { - // tag cleanup + // remove empty tags await prisma.tag.deleteMany({ where: { links: { diff --git a/lib/api/controllers/users/getUsers.ts b/lib/api/controllers/users/getUsers.ts index 1da4aee..ae119e7 100644 --- a/lib/api/controllers/users/getUsers.ts +++ b/lib/api/controllers/users/getUsers.ts @@ -19,5 +19,7 @@ export default async function (email: string) { createdAt: user?.createdAt, }; - return { response: unsensitiveUserInfo || null, status: 200 }; + const statusCode = user?.id ? 200 : 404; + + return { response: unsensitiveUserInfo || null, status: statusCode }; } diff --git a/lib/client/getPublicUserDataByEmail.ts b/lib/client/getPublicUserDataByEmail.ts new file mode 100644 index 0000000..a91fa07 --- /dev/null +++ b/lib/client/getPublicUserDataByEmail.ts @@ -0,0 +1,12 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +export default async function (email: string) { + const response = await fetch(`/api/routes/users?email=${email}`); + + const data = await response.json(); + + return data.response; +} diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index e4ba78d..096e7e7 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -8,6 +8,8 @@ import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; import getCollections from "@/lib/api/controllers/collections/getCollections"; import postCollection from "@/lib/api/controllers/collections/postCollection"; +import updateCollection from "@/lib/api/controllers/collections/updateCollection"; +import deleteCollection from "@/lib/api/controllers/collections/deleteCollection"; export default async function (req: NextApiRequest, res: NextApiResponse) { const session = await getServerSession(req, res, authOptions); @@ -26,5 +28,11 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { return res .status(newCollection.status) .json({ response: newCollection.response }); + } else if (req.method === "PUT") { + const updated = await updateCollection(req.body, session.user.id); + return res.status(updated.status).json({ response: updated.response }); + } else if (req.method === "DELETE") { + const deleted = await deleteCollection(req.body, session.user.id); + return res.status(deleted.status).json({ response: deleted.response }); } } diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 811c545..979b308 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -26,15 +26,15 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { return res.status(newlink.status).json({ response: newlink.response, }); - } else if (req.method === "DELETE") { - const deleted = await deleteLink(req.body, session.user.id); - return res.status(deleted.status).json({ - response: deleted.response, - }); } else if (req.method === "PUT") { const updated = await updateLink(req.body, session.user.id); return res.status(updated.status).json({ response: updated.response, }); + } else if (req.method === "DELETE") { + const deleted = await deleteLink(req.body, session.user.id); + return res.status(deleted.status).json({ + response: deleted.response, + }); } } diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index d6c5653..1376e70 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -8,6 +8,7 @@ import LinkList from "@/components/LinkList"; import Modal from "@/components/Modal"; import AddLink from "@/components/Modal/AddLink"; import EditCollection from "@/components/Modal/EditCollection"; +import DeleteCollection from "@/components/Modal/DeleteCollection"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; import { ExtendedCollection, ExtendedLink } from "@/types/global"; @@ -19,7 +20,6 @@ import { faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { Collection } from "@prisma/client"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; @@ -31,7 +31,8 @@ export default function () { const [expandDropdown, setExpandDropdown] = useState(false); const [linkModal, setLinkModal] = useState(false); - const [collectionModal, setCollectionModal] = useState(false); + const [editCollectionModal, setEditCollectionModal] = useState(false); + const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); const [activeCollection, setActiveCollection] = useState(); const [linksByCollection, setLinksByCollection] = @@ -41,8 +42,12 @@ export default function () { setLinkModal(!linkModal); }; - const toggleCollectionModal = () => { - setCollectionModal(!collectionModal); + const toggleEditCollectionModal = () => { + setEditCollectionModal(!editCollectionModal); + }; + + const toggleDeleteCollectionModal = () => { + setDeleteCollectionModal(!deleteCollectionModal); }; useEffect(() => { @@ -90,13 +95,17 @@ export default function () { name: "Edit Collection", icon: , onClick: () => { - toggleCollectionModal(); + toggleEditCollectionModal(); setExpandDropdown(false); }, }, { name: "Delete Collection", icon: , + onClick: () => { + toggleDeleteCollectionModal(); + setExpandDropdown(false); + }, }, ]} onClickOutside={(e: Event) => { @@ -113,14 +122,23 @@ export default function () { ) : null} - {collectionModal && activeCollection ? ( - + {editCollectionModal && activeCollection ? ( + ) : null} + + {deleteCollectionModal && activeCollection ? ( + + + + ) : null}
{linksByCollection.map((e, i) => { diff --git a/store/collections.ts b/store/collections.ts index ee39c9c..c180e6d 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -4,15 +4,15 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { create } from "zustand"; -import { Collection } from "@prisma/client"; import { ExtendedCollection, NewCollection } from "@/types/global"; +import useTagStore from "./tags"; type CollectionStore = { collections: ExtendedCollection[]; setCollections: () => void; addCollection: (body: NewCollection) => Promise; - // updateCollection: (collection: Collection) => void; - removeCollection: (collectionId: number) => void; + updateCollection: (collection: ExtendedCollection) => Promise; + removeCollection: (collectionId: number) => Promise; }; const useCollectionStore = create()((set) => ({ @@ -44,16 +44,51 @@ const useCollectionStore = create()((set) => ({ return response.ok; }, - // updateCollection: (collection) => - // set((state) => ({ - // collections: state.collections.map((c) => - // c.id === collection.id ? collection : c - // ), - // })), - removeCollection: (collectionId) => { - set((state) => ({ - collections: state.collections.filter((c) => c.id !== collectionId), - })); + updateCollection: async (collection) => { + const response = await fetch("/api/routes/collections", { + body: JSON.stringify(collection), + headers: { + "Content-Type": "application/json", + }, + method: "PUT", + }); + + const data = await response.json(); + + console.log(data); + + if (response.ok) + set((state) => ({ + collections: state.collections.map((e) => + e.id === collection.id ? collection : e + ), + })); + + return response.ok; + }, + removeCollection: async (id) => { + const response = await fetch("/api/routes/collections", { + body: JSON.stringify({ id }), + headers: { + "Content-Type": "application/json", + }, + method: "DELETE", + }); + + console.log(id); + + const data = await response.json(); + + console.log(data); + + if (response.ok) { + set((state) => ({ + collections: state.collections.filter((e) => e.id !== id), + })); + useTagStore.getState().setTags(); + } + + return response.ok; }, })); From eb2464db20b9256d29df3199838075d93e28d631 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 29 Apr 2023 00:47:04 +0330 Subject: [PATCH 037/144] small fix --- store/collections.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/store/collections.ts b/store/collections.ts index c180e6d..c0c0663 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -6,6 +6,7 @@ import { create } from "zustand"; import { ExtendedCollection, NewCollection } from "@/types/global"; import useTagStore from "./tags"; +import useLinkStore from "./links"; type CollectionStore = { collections: ExtendedCollection[]; @@ -86,6 +87,7 @@ const useCollectionStore = create()((set) => ({ collections: state.collections.filter((e) => e.id !== id), })); useTagStore.getState().setTags(); + useLinkStore.getState().setLinks(); } return response.ok; From 57b2e36abda1f3536bdd5e4b837c084f0487f05d Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 29 Apr 2023 01:05:49 +0330 Subject: [PATCH 038/144] small cleanup --- lib/api/controllers/collections/deleteCollection.ts | 2 -- store/collections.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/lib/api/controllers/collections/deleteCollection.ts b/lib/api/controllers/collections/deleteCollection.ts index 97d20e6..6cc27ef 100644 --- a/lib/api/controllers/collections/deleteCollection.ts +++ b/lib/api/controllers/collections/deleteCollection.ts @@ -8,8 +8,6 @@ import getPermission from "@/lib/api/getPermission"; import fs from "fs"; export default async function (collection: { id: number }, userId: number) { - console.log(collection.id); - if (!collection.id) return { response: "Please choose a valid collection.", status: 401 }; diff --git a/store/collections.ts b/store/collections.ts index c0c0663..9fd6ca5 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -76,8 +76,6 @@ const useCollectionStore = create()((set) => ({ method: "DELETE", }); - console.log(id); - const data = await response.json(); console.log(data); From c1d1d4a4a2a93ac3c30d70340b54aa7aa710625b Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 1 May 2023 00:24:40 +0330 Subject: [PATCH 039/144] responsive sidenav + code refactoring --- components/Navbar.tsx | 30 +++- components/Sidebar/index.tsx | 2 +- hooks/{useRedirection.tsx => useRedirect.tsx} | 2 +- layouts/AuthRedirect.tsx | 45 +++++ layouts/{MainLayout.tsx => Dashboard.tsx} | 22 +-- pages/_app.tsx | 6 +- pages/api/auth/[...nextauth].ts | 4 - pages/collections/[id].tsx | 160 +++++++++--------- pages/collections/index.tsx | 107 ++++++------ pages/links.tsx | 24 ++- pages/login.tsx | 13 +- pages/tags/[id].tsx | 7 +- styles/globals.css | 30 +++- 13 files changed, 279 insertions(+), 173 deletions(-) rename hooks/{useRedirection.tsx => useRedirect.tsx} (96%) create mode 100644 layouts/AuthRedirect.tsx rename layouts/{MainLayout.tsx => Dashboard.tsx} (76%) diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 110c218..f51d9ea 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -13,11 +13,14 @@ import { faSliders, faArrowRightFromBracket, faChevronDown, + faBars, } from "@fortawesome/free-solid-svg-icons"; import { useState } from "react"; import Dropdown from "@/components/Dropdown"; import Modal from "./Modal"; import AddLink from "./Modal/AddLink"; +import ClickAwayHandler from "./ClickAwayHandler"; +import Sidebar from "./Sidebar"; export default function () { const { data: session } = useSession(); @@ -27,6 +30,13 @@ export default function () { const user = session?.user; const [linkModal, setLinkModal] = useState(false); + const [sidebar, setSidebar] = useState(false); + + window.addEventListener("resize", () => setSidebar(false)); + + const toggleSidebar = () => { + setSidebar(!sidebar); + }; const toggleLinkModal = () => { setLinkModal(!linkModal); @@ -34,6 +44,12 @@ export default function () { return (
+
+ +
@@ -101,6 +119,16 @@ export default function () { className="absolute top-8 right-0 z-20 w-36" /> ) : null} + + {sidebar ? ( +
+ +
+ +
+
+
+ ) : null}
diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 63e97ff..81489d5 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -21,7 +21,7 @@ export default function () { const { tags } = useTagStore(); return ( -
+

Linkwarden

diff --git a/hooks/useRedirection.tsx b/hooks/useRedirect.tsx similarity index 96% rename from hooks/useRedirection.tsx rename to hooks/useRedirect.tsx index 70611d3..64219ee 100644 --- a/hooks/useRedirection.tsx +++ b/hooks/useRedirect.tsx @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import { ReactNode, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; diff --git a/layouts/AuthRedirect.tsx b/layouts/AuthRedirect.tsx new file mode 100644 index 0000000..8e9bfcd --- /dev/null +++ b/layouts/AuthRedirect.tsx @@ -0,0 +1,45 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { ReactNode } from "react"; +import { useSession } from "next-auth/react"; +import Loader from "../components/Loader"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import getInitialData from "@/lib/client/getInitialData"; + +interface Props { + children: ReactNode; +} + +export default function ({ children }: Props) { + const router = useRouter(); + const { status } = useSession(); + const [redirect, setRedirect] = useState(true); + + getInitialData(); + + useEffect(() => { + if ( + status === "authenticated" && + (router.pathname === "/login" || router.pathname === "/register") + ) { + router.push("/").then(() => { + setRedirect(false); + }); + } else if ( + status === "unauthenticated" && + !(router.pathname === "/login" || router.pathname === "/register") + ) { + router.push("/login").then(() => { + setRedirect(false); + }); + } else if (status === "loading") setRedirect(true); + else setRedirect(false); + }, [status]); + + if (status !== "loading" && !redirect) return <>{children}; + else return ; +} diff --git a/layouts/MainLayout.tsx b/layouts/Dashboard.tsx similarity index 76% rename from layouts/MainLayout.tsx rename to layouts/Dashboard.tsx index 5447931..a1588e2 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/Dashboard.tsx @@ -8,9 +8,8 @@ import Sidebar from "@/components/Sidebar"; import { ReactNode } from "react"; import { useSession } from "next-auth/react"; import Loader from "../components/Loader"; -import useRedirection from "@/hooks/useRedirection"; +import useRedirect from "@/hooks/useRedirect"; import { useRouter } from "next/router"; -import getInitialData from "@/lib/client/getInitialData"; interface Props { children: ReactNode; @@ -19,22 +18,23 @@ interface Props { export default function ({ children }: Props) { const { status } = useSession(); const router = useRouter(); - const redirection = useRedirection(); + const redirect = useRedirect(); const routeExists = router.route === "/_error" ? false : true; - getInitialData(); - - if (status === "authenticated" && !redirection && routeExists) + if (status === "authenticated" && !redirect && routeExists) return ( - <> - -
+
+
+ +
+ +
{children}
- +
); - else if ((status === "unauthenticated" && !redirection) || !routeExists) + else if ((status === "unauthenticated" && !redirect) || !routeExists) return <>{children}; else return ; } diff --git a/pages/_app.tsx b/pages/_app.tsx index 9716086..9b28aac 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -4,11 +4,11 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import React from "react"; -import MainLayout from "@/layouts/MainLayout"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; import type { AppProps } from "next/app"; import Head from "next/head"; +import AuthRedirect from "@/layouts/AuthRedirect"; export default function App({ Component, pageProps }: AppProps) { return ( @@ -35,9 +35,9 @@ export default function App({ Component, pageProps }: AppProps) { /> - + - + ); } diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 7ba7493..1b475f5 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -32,16 +32,12 @@ export const authOptions: AuthOptions = { }, }); - console.log(findUser); - let passwordMatches: boolean = false; if (findUser?.password) { passwordMatches = bcrypt.compareSync(password, findUser.password); } - console.log(passwordMatches); - if (passwordMatches) { return { id: findUser?.id, diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 1376e70..234d18b 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -22,6 +22,7 @@ import { import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; +import Dashboard from "@/layouts/Dashboard"; export default function () { const router = useRouter(); @@ -61,89 +62,90 @@ export default function () { }, [links, router, collections]); return ( - // ml-80 -
-
-
- -

{activeCollection?.name}

-
-
-
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" - className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" - > - + +
+
+
+ +

{activeCollection?.name}

- {expandDropdown ? ( - , - onClick: () => { - toggleLinkModal(); - setExpandDropdown(false); - }, - }, - { - name: "Edit Collection", - icon: , - onClick: () => { - toggleEditCollectionModal(); - setExpandDropdown(false); - }, - }, - { - name: "Delete Collection", - icon: , - onClick: () => { - toggleDeleteCollectionModal(); - setExpandDropdown(false); - }, - }, - ]} - onClickOutside={(e: Event) => { - const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); - }} - className="absolute top-7 left-0 z-10 w-44" - /> - ) : null} - - {linkModal ? ( - - - - ) : null} - - {editCollectionModal && activeCollection ? ( - - +
setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + - - ) : null} - - {deleteCollectionModal && activeCollection ? ( - - + {expandDropdown ? ( + , + onClick: () => { + toggleLinkModal(); + setExpandDropdown(false); + }, + }, + { + name: "Edit Collection", + icon: , + onClick: () => { + toggleEditCollectionModal(); + setExpandDropdown(false); + }, + }, + { + name: "Delete Collection", + icon: , + onClick: () => { + toggleDeleteCollectionModal(); + setExpandDropdown(false); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setExpandDropdown(false); + }} + className="absolute top-7 left-0 z-10 w-44" /> - - ) : null} + ) : null} + + {linkModal ? ( + + + + ) : null} + + {editCollectionModal && activeCollection ? ( + + + + ) : null} + + {deleteCollectionModal && activeCollection ? ( + + + + ) : null} +
+ {linksByCollection.map((e, i) => { + return ; + })}
- {linksByCollection.map((e, i) => { - return ; - })} -
+ ); } diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 15b9f2b..755b9a8 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -16,6 +16,7 @@ import Dropdown from "@/components/Dropdown"; import { useState } from "react"; import Modal from "@/components/Modal"; import AddCollection from "@/components/Modal/AddCollection"; +import Dashboard from "@/layouts/Dashboard"; export default function () { const { collections } = useCollectionStore(); @@ -29,64 +30,66 @@ export default function () { return ( // ml-80 -
-
-
- -

All Collections

-
-
-
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" - className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" - > - + +
+
+
+ +

All Collections

- {expandDropdown ? ( - , - onClick: () => { - toggleCollectionModal(); - setExpandDropdown(false); +
+
setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ {expandDropdown ? ( + , + onClick: () => { + toggleCollectionModal(); + setExpandDropdown(false); + }, }, - }, - ]} - onClickOutside={(e: Event) => { - const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); - }} - className="absolute top-7 left-0 w-36" - /> + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setExpandDropdown(false); + }} + className="absolute top-7 left-0 w-36" + /> + ) : null} +
+ + {linkModal ? ( + + + ) : null}
+
+ {collections.map((e, i) => { + return ; + })} - {linkModal ? ( - - - - ) : null} -
-
- {collections.map((e, i) => { - return ; - })} - -
-

New Collection

- +
+

New Collection

+ +
-
+
); } diff --git a/pages/links.tsx b/pages/links.tsx index e372f43..8923dc6 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -4,6 +4,7 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import LinkList from "@/components/LinkList"; +import Dashboard from "@/layouts/Dashboard"; import useLinkStore from "@/store/links"; import { faBookmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -12,16 +13,21 @@ export default function Links() { const { links } = useLinkStore(); return ( -
-
-
- -

All Links

+ +
+
+
+ +

All Links

+
+ {links.map((e, i) => { + return ; + })}
- {links.map((e, i) => { - return ; - })} -
+ ); } diff --git a/pages/login.tsx b/pages/login.tsx index eb79d92..cc23739 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -5,6 +5,7 @@ import { signIn } from "next-auth/react"; import Link from "next/link"; +import { useRouter } from "next/router"; import { useState } from "react"; interface FormData { @@ -13,6 +14,8 @@ interface FormData { } export default function () { + const router = useRouter(); + const [form, setForm] = useState({ email: "", password: "", @@ -24,16 +27,12 @@ export default function () { const res = await signIn("credentials", { email: form.email, password: form.password, + redirect: false, }); - console.log(res?.status); + console.log(res); - if (res?.ok) { - setForm({ - email: "", - password: "", - }); - } else { + if (!res?.ok) { console.log("User not found or password does not match.", res); } } else { diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index 31a0c95..4a06f14 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -3,6 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . +import Dashboard from "@/layouts/Dashboard"; import { useRouter } from "next/router"; export default function () { @@ -10,5 +11,9 @@ export default function () { const tagId = Number(router.query.id); - return
{"HI"}
; + return ( + +
{"HI"}
+
+ ); } diff --git a/styles/globals.css b/styles/globals.css index 0cd5402..971a0b9 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -27,14 +27,17 @@ hyphens: auto; } -.slide-up { - animation: slide-up-animation 70ms; -} - .fade-in { animation: fade-in-animation 100ms; } +/* Bug: "lg:block" just didn't work... */ +@media (min-width: 1024px) { + .lgblock { + display: block; + } +} + @keyframes fade-in-animation { 0% { opacity: 0; @@ -44,6 +47,10 @@ } } +.slide-up { + animation: slide-up-animation 70ms; +} + @keyframes slide-up-animation { 0% { transform: translateY(15%); @@ -54,3 +61,18 @@ opacity: 1; } } + +.slide-right { + animation: slide-right-animation 100ms; +} + +@keyframes slide-right-animation { + 0% { + transform: translateX(-25%); + opacity: 0; + } + 100% { + transform: translateX(0); + opacity: 1; + } +} From 0d0e53218f8f2f51cfaa0a22afc8aaf3ef6e44a5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 1 May 2023 13:37:01 +0330 Subject: [PATCH 040/144] many changes across the app --- components/LinkList.tsx | 25 +++++---- components/Modal/DeleteCollection.tsx | 2 +- components/Modal/EditCollection.tsx | 54 +++++++++++++++--- components/Modal/EditLink.tsx | 35 +++++++++--- components/Modal/index.tsx | 19 +++++-- components/Navbar.tsx | 11 +++- components/Sidebar/SidebarItem.tsx | 21 +++++-- components/Sidebar/index.tsx | 55 ++++++++++++++++--- layouts/AuthRedirect.tsx | 2 +- layouts/Dashboard.tsx | 2 +- .../collections/deleteCollection.ts | 8 ++- lib/api/controllers/links/updateLink.ts | 25 +++++++-- store/links.ts | 5 +- styles/globals.css | 6 +- 14 files changed, 215 insertions(+), 55 deletions(-) diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 432da8f..01ed6c7 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -19,6 +19,7 @@ import Dropdown from "./Dropdown"; import useLinkStore from "@/store/links"; import Modal from "./Modal"; import EditLink from "./Modal/EditLink"; +import Link from "next/link"; export default function ({ link, @@ -57,7 +58,7 @@ export default function ({ width={32} height={32} alt="" - className="select-none mt-3 z-10 rounded-md" + className="select-none mt-3 z-10 rounded-md shadow" draggable="false" onError={(e) => { const target = e.target as HTMLElement; @@ -84,18 +85,20 @@ export default function ({

{link.title}

-
- -

{link.collection.name}

-
+ +
+ +

{link.collection.name}

+
+ +
{link.tags.map((e, i) => ( -

- # {e.name} -

+ +

+ # {e.name} +

+ ))}
diff --git a/components/Modal/DeleteCollection.tsx b/components/Modal/DeleteCollection.tsx index 64483b7..c643f43 100644 --- a/components/Modal/DeleteCollection.tsx +++ b/components/Modal/DeleteCollection.tsx @@ -34,7 +34,7 @@ export default function AddCollection({ }; return ( -
+

Delete Collection

diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index 444ec7e..2b8d116 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -5,11 +5,17 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faClose, faPenToSquare } from "@fortawesome/free-solid-svg-icons"; +import { + faClose, + faPenToSquare, + faTrashCan, +} from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { ExtendedCollection } from "@/types/global"; import { useSession } from "next-auth/react"; import getPublicUserDataByEmail from "@/lib/client/getPublicUserDataByEmail"; +import Modal from "@/components/Modal"; +import DeleteCollection from "@/components/Modal/DeleteCollection"; type Props = { toggleCollectionModal: Function; @@ -27,6 +33,12 @@ export default function EditCollection({ const { updateCollection } = useCollectionStore(); + const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); + + const toggleDeleteCollectionModal = () => { + setDeleteCollectionModal(!deleteCollectionModal); + }; + const session = useSession(); const submit = async () => { @@ -250,13 +262,41 @@ export default function EditCollection({ ); })} -

- - Edit Collection +
+
+ + Edit Collection +
+ +
+
+ +

OR

+ +
+
+ +
{ + toggleDeleteCollectionModal(); + }} + className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" + > + +
+ + {deleteCollectionModal ? ( + + + + ) : null}
); } diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx index a59d289..8ce35ad 100644 --- a/components/Modal/EditLink.tsx +++ b/components/Modal/EditLink.tsx @@ -10,6 +10,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ExtendedLink } from "@/types/global"; import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; import useLinkStore from "@/store/links"; +import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; type Props = { toggleLinkModal: Function; @@ -19,7 +20,7 @@ type Props = { export default function EditLink({ toggleLinkModal, link }: Props) { const [currentLink, setCurrentLink] = useState(link); - const { updateLink } = useLinkStore(); + const { updateLink, removeLink } = useLinkStore(); const shortendURL = new URL(link.url).host.toLowerCase(); @@ -85,12 +86,32 @@ export default function EditLink({ toggleLinkModal, link }: Props) { />
-
- - Edit Link +
+
+ + Edit Link +
+ +
+
+ +

OR

+ +
+
+ +
{ + removeLink(link); + toggleLinkModal(); + }} + className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" + > + +
); diff --git a/components/Modal/index.tsx b/components/Modal/index.tsx index 7098d2b..5f7f01e 100644 --- a/components/Modal/index.tsx +++ b/components/Modal/index.tsx @@ -3,8 +3,10 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import { ReactNode } from "react"; +import { MouseEventHandler, ReactNode } from "react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faChevronLeft } from "@fortawesome/free-solid-svg-icons"; type Props = { toggleModal: Function; @@ -13,9 +15,18 @@ type Props = { export default function ({ toggleModal, children }: Props) { return ( -
- -
+
+ +
+
} + className="absolute top-5 left-5 inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
{children}
diff --git a/components/Navbar.tsx b/components/Navbar.tsx index f51d9ea..8fe2389 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -15,12 +15,13 @@ import { faChevronDown, faBars, } from "@fortawesome/free-solid-svg-icons"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import Dropdown from "@/components/Dropdown"; import Modal from "./Modal"; import AddLink from "./Modal/AddLink"; import ClickAwayHandler from "./ClickAwayHandler"; import Sidebar from "./Sidebar"; +import { useRouter } from "next/router"; export default function () { const { data: session } = useSession(); @@ -32,8 +33,14 @@ export default function () { const [linkModal, setLinkModal] = useState(false); const [sidebar, setSidebar] = useState(false); + const router = useRouter(); + window.addEventListener("resize", () => setSidebar(false)); + useEffect(() => { + setSidebar(false); + }, [router]); + const toggleSidebar = () => { setSidebar(!sidebar); }; @@ -123,7 +130,7 @@ export default function () { {sidebar ? (
-
+
diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index 2437985..be17ecd 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -4,7 +4,8 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import Link from "next/link"; -import React, { ReactElement } from "react"; +import React, { ReactElement, useEffect, useState } from "react"; +import { useRouter } from "next/router"; interface SidebarItemProps { text: string; @@ -13,13 +14,25 @@ interface SidebarItemProps { } export default function ({ text, icon, path }: SidebarItemProps) { + const router = useRouter(); + const [active, setActive] = useState(false); + + useEffect(() => { + if (router.asPath === path) setActive(true); + else setActive(false); + }, [router]); + return ( -
+
{React.cloneElement(icon, { - className: "w-4 text-sky-300", + className: `w-4 ${active ? "text-white" : "text-sky-300"}`, })} -

{text}

+

{text}

); diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 81489d5..89fa8f3 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -14,12 +14,21 @@ import { import SidebarItem from "./SidebarItem"; import useTagStore from "@/store/tags"; import Link from "next/link"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; export default function () { const { collections } = useCollectionStore(); - const { tags } = useTagStore(); + const router = useRouter(); + + const [active, setActive] = useState(""); + + useEffect(() => { + setActive(router.asPath); + }, [router]); + return (

@@ -27,16 +36,48 @@ export default function () {

-
- -

All Links

+
+ +

+ All Links +

-
- -

All Collections

+
+ +

+ All Collections +

diff --git a/layouts/AuthRedirect.tsx b/layouts/AuthRedirect.tsx index 8e9bfcd..c0c1980 100644 --- a/layouts/AuthRedirect.tsx +++ b/layouts/AuthRedirect.tsx @@ -41,5 +41,5 @@ export default function ({ children }: Props) { }, [status]); if (status !== "loading" && !redirect) return <>{children}; - else return ; + // else return ; } diff --git a/layouts/Dashboard.tsx b/layouts/Dashboard.tsx index a1588e2..4bb28f8 100644 --- a/layouts/Dashboard.tsx +++ b/layouts/Dashboard.tsx @@ -36,5 +36,5 @@ export default function ({ children }: Props) { ); else if ((status === "unauthenticated" && !redirect) || !routeExists) return <>{children}; - else return ; + else return <>; } diff --git a/lib/api/controllers/collections/deleteCollection.ts b/lib/api/controllers/collections/deleteCollection.ts index 6cc27ef..c94c69a 100644 --- a/lib/api/controllers/collections/deleteCollection.ts +++ b/lib/api/controllers/collections/deleteCollection.ts @@ -33,7 +33,13 @@ export default async function (collection: { id: number }, userId: number) { }, }); - fs.rmdirSync(`data/archives/${collection.id}`, { recursive: true }); + try { + fs.rmdirSync(`data/archives/${collection.id}`, { recursive: true }); + } catch (error) { + console.log( + "Collection's archive directory wasn't deleted most likely because it didn't exist..." + ); + } return await prisma.collection.delete({ where: { diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts index a1cfd23..f30860b 100644 --- a/lib/api/controllers/links/updateLink.ts +++ b/lib/api/controllers/links/updateLink.ts @@ -5,7 +5,7 @@ import { prisma } from "@/lib/api/db"; import { ExtendedLink } from "@/types/global"; -import { Link, UsersAndCollections } from "@prisma/client"; +import { UsersAndCollections } from "@prisma/client"; import getPermission from "@/lib/api/getPermission"; export default async function (link: ExtendedLink, userId: number) { @@ -17,10 +17,23 @@ export default async function (link: ExtendedLink, userId: number) { (e: UsersAndCollections) => e.userId === userId && e.canUpdate ); - if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) - return { response: "Collection is not accessible.", status: 401 }; + if (link.collection.ownerId) { + const collectionIsAccessible = await getPermission( + userId, + link.collection.id + ); - const updatedLink: Link = await prisma.link.update({ + const memberHasAccess = collectionIsAccessible?.members.some( + (e: UsersAndCollections) => e.userId === userId && e.canCreate + ); + + if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess)) + return { response: "Collection is not accessible.", status: 401 }; + } else { + link.collection.ownerId = userId; + } + + const updatedLink: ExtendedLink = await prisma.link.update({ where: { id: link.id, }, @@ -60,6 +73,10 @@ export default async function (link: ExtendedLink, userId: number) { })), }, }, + include: { + tags: true, + collection: true, + }, }); return { response: updatedLink, status: 200 }; diff --git a/store/links.ts b/store/links.ts index 68e9f51..819a51d 100644 --- a/store/links.ts +++ b/store/links.ts @@ -63,9 +63,12 @@ const useLinkStore = create()((set) => ({ if (response.ok) { set((state) => ({ - links: state.links.map((e) => (e.id === link.id ? link : e)), + links: state.links.map((e) => + e.id === data.response.id ? data.response : e + ), })); useTagStore.getState().setTags(); + useCollectionStore.getState().setCollections(); } }, removeLink: async (link) => { diff --git a/styles/globals.css b/styles/globals.css index 971a0b9..76cc6d6 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -63,16 +63,14 @@ } .slide-right { - animation: slide-right-animation 100ms; + animation: slide-right-animation 200ms; } @keyframes slide-right-animation { 0% { - transform: translateX(-25%); - opacity: 0; + transform: translateX(-100%); } 100% { transform: translateX(0); - opacity: 1; } } From a2023e19ef0b81e9ffc1f1bbf2c32c35431799d5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 1 May 2023 23:30:23 +0330 Subject: [PATCH 041/144] bug fixes + small visual improvements --- .../InputSelect/CollectionSelection.tsx | 2 +- components/InputSelect/TagSelection.tsx | 2 +- components/InputSelect/styles.ts | 4 ++- components/LinkList.tsx | 6 ++-- components/Modal/AddCollection.tsx | 16 +++++---- components/Modal/AddLink.tsx | 30 +++++++++++------ components/Modal/DeleteCollection.tsx | 2 +- components/Modal/EditCollection.tsx | 16 +++++---- components/Modal/EditLink.tsx | 33 +++++++++++-------- components/Modal/index.tsx | 2 +- components/Navbar.tsx | 8 ++--- components/RequiredBadge.tsx | 13 ++++++++ layouts/AuthRedirect.tsx | 2 +- .../controllers/collections/postCollection.ts | 12 +++++++ .../collections/updateCollection.ts | 12 +++++++ pages/collections/[id].tsx | 4 +-- pages/collections/index.tsx | 4 +-- store/collections.ts | 2 +- 18 files changed, 117 insertions(+), 53 deletions(-) create mode 100644 components/RequiredBadge.tsx diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index 79957d9..e202d6e 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -54,7 +54,7 @@ export default function ({ onChange, defaultValue }: Props) { options={options} styles={styles} defaultValue={defaultValue} - menuPosition="fixed" + // menuPosition="fixed" /> ); } diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index ca3c7a6..9f277eb 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -37,7 +37,7 @@ export default function ({ onChange, defaultValue }: Props) { options={options} styles={styles} defaultValue={defaultValue} - menuPosition="fixed" + // menuPosition="fixed" isMulti /> ); diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts index 967ce64..c24357f 100644 --- a/components/InputSelect/styles.ts +++ b/components/InputSelect/styles.ts @@ -29,8 +29,10 @@ export const styles: StylesConfig = { width: "15rem", border: "1px solid #e0f2fe", borderRadius: "0.375rem", - fontSize: "0.875rem", lineHeight: "1.25rem", + // "@media screen and (min-width: 1024px)": { + // fontSize: "0.875rem", + // }, }), input: (styles) => ({ ...styles, diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 01ed6c7..a666a7e 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -58,7 +58,7 @@ export default function ({ width={32} height={32} alt="" - className="select-none mt-3 z-10 rounded-md shadow" + className="select-none mt-3 z-10 rounded-md" draggable="false" onError={(e) => { const target = e.target as HTMLElement; @@ -70,7 +70,7 @@ export default function ({ width={80} height={80} alt="" - className="blur-sm absolute left-2 opacity-50 select-none hidden sm:block" + className="blur-sm absolute left-2 opacity-40 select-none hidden sm:block" draggable="false" onError={(e) => { const target = e.target as HTMLElement; @@ -194,7 +194,7 @@ export default function ({ const target = e.target as HTMLInputElement; if (target.id !== "edit-dropdown") setExpandDropdown(false); }} - className="absolute top-9 right-0 w-36" + className="absolute top-8 right-0 w-36" /> ) : null}
diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index ef60264..5459845 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -9,6 +9,7 @@ import { faClose, faPlus } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { NewCollection } from "@/types/global"; import { useSession } from "next-auth/react"; +import RequiredBadge from "../RequiredBadge"; type Props = { toggleCollectionModal: Function; @@ -48,7 +49,10 @@ export default function AddCollection({ toggleCollectionModal }: Props) {

New Collection

-

Name

+

+ Name + +

@@ -56,7 +60,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) { } type="text" placeholder="e.g. Example Collection" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
@@ -68,8 +72,8 @@ export default function AddCollection({ toggleCollectionModal }: Props) { setNewCollection({ ...newCollection, description: e.target.value }) } type="text" - placeholder="Collection description (Optional)" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + placeholder="Collection description" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
@@ -120,8 +124,8 @@ export default function AddCollection({ toggleCollectionModal }: Props) { } }} type="text" - placeholder="Email (Optional)" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + placeholder="Email" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index 7e6941d..ccdfc77 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -12,6 +12,7 @@ import { ExtendedLink, NewLink } from "@/types/global"; import useLinkStore from "@/store/links"; import { useRouter } from "next/router"; import useCollectionStore from "@/store/collections"; +import RequiredBadge from "../RequiredBadge"; type Props = { toggleLinkModal: Function; @@ -79,34 +80,38 @@ export default function AddLink({ toggleLinkModal }: Props) {

New Link

-

Name

+

+ Name + +

setNewLink({ ...newLink, name: e.target.value })} type="text" placeholder="e.g. Example Link" - className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-60 rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
-

URL

+

+ URL + +

setNewLink({ ...newLink, url: e.target.value })} type="text" placeholder="e.g. http://example.com/" - className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-60 rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
-

Tags

- -
- -
-

Collection

+

+ Collection + +

+
+

Tags

+ +
+
setInputField(e.target.value)} type="text" placeholder={`Type "${collection.name}" Here.`} - className=" w-72 sm:w-96 rounded-md p-3 mx-auto border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className=" w-72 sm:w-96 rounded-md p-3 mx-auto border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
Edit Collection

-

Name

+

+ Name + +

@@ -64,7 +68,7 @@ export default function EditCollection({ } type="text" placeholder="e.g. Example Collection" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
@@ -79,8 +83,8 @@ export default function EditCollection({ }) } type="text" - placeholder="Collection description (Optional)" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + placeholder="Collection description" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
@@ -135,8 +139,8 @@ export default function EditCollection({ } }} type="text" - placeholder="Email (Optional)" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + placeholder="Email" + className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx index 8ce35ad..c085900 100644 --- a/components/Modal/EditLink.tsx +++ b/components/Modal/EditLink.tsx @@ -11,6 +11,7 @@ import { ExtendedLink } from "@/types/global"; import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; import useLinkStore from "@/store/links"; import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; +import RequiredBadge from "../RequiredBadge"; type Props = { toggleLinkModal: Function; @@ -53,7 +54,10 @@ export default function EditLink({ toggleLinkModal, link }: Props) { {shortendURL} | {link.title}

-

Name

+

+ Name + +

@@ -61,7 +65,21 @@ export default function EditLink({ toggleLinkModal, link }: Props) { } type="text" placeholder="e.g. Example Link" - className="w-60 rounded-md p-3 border-sky-100 border-solid border text-sm outline-none focus:border-sky-500 duration-100" + className="w-60 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

+ Collection + +

+
@@ -75,17 +93,6 @@ export default function EditLink({ toggleLinkModal, link }: Props) { />
-
-

Collection

- -
-
{children} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 8fe2389..c1d6c3b 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -68,7 +68,7 @@ export default function () { id="search-box" type="text" placeholder="Search for Links" - className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1 text-sm" + className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1" />
@@ -77,7 +77,7 @@ export default function () { title="New Link" className="inline-flex gap-1 items-center select-none cursor-pointer p-1 text-sky-500 rounded-md hover:outline-sky-500 outline duration-100 bg-white outline-sky-100 outline-1" > - +
{linkModal ? ( @@ -94,7 +94,7 @@ export default function () { >

@@ -123,7 +123,7 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "profile-dropdown") setProfileDropdown(false); }} - className="absolute top-8 right-0 z-20 w-36" + className="absolute top-9 right-0 z-20 w-36" /> ) : null} diff --git a/components/RequiredBadge.tsx b/components/RequiredBadge.tsx new file mode 100644 index 0000000..40eb3e2 --- /dev/null +++ b/components/RequiredBadge.tsx @@ -0,0 +1,13 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +export default function RequiredBadge() { + return ( + + {" "} + * + + ); +} diff --git a/layouts/AuthRedirect.tsx b/layouts/AuthRedirect.tsx index c0c1980..132a2da 100644 --- a/layouts/AuthRedirect.tsx +++ b/layouts/AuthRedirect.tsx @@ -41,5 +41,5 @@ export default function ({ children }: Props) { }, [status]); if (status !== "loading" && !redirect) return <>{children}; - // else return ; + else return <>; } diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index 70f1e1a..3de0478 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -50,6 +50,18 @@ export default async function (collection: NewCollection, userId: number) { })), }, }, + include: { + members: { + include: { + user: { + select: { + email: true, + name: true, + }, + }, + }, + }, + }, }); const collectionPath = `data/archives/${newCollection.id}`; diff --git a/lib/api/controllers/collections/updateCollection.ts b/lib/api/controllers/collections/updateCollection.ts index 4f8519a..4815fe4 100644 --- a/lib/api/controllers/collections/updateCollection.ts +++ b/lib/api/controllers/collections/updateCollection.ts @@ -41,6 +41,18 @@ export default async function (collection: ExtendedCollection, userId: number) { })), }, }, + include: { + members: { + include: { + user: { + select: { + email: true, + name: true, + }, + }, + }, + }, + }, }); }); diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 234d18b..ab8fe6f 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -78,7 +78,7 @@ export default function () {

{expandDropdown ? ( @@ -113,7 +113,7 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "edit-dropdown") setExpandDropdown(false); }} - className="absolute top-7 left-0 z-10 w-44" + className="absolute top-8 left-0 z-10 w-44" /> ) : null} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 755b9a8..080e7c1 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -46,7 +46,7 @@ export default function () {
{expandDropdown ? ( @@ -65,7 +65,7 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "edit-dropdown") setExpandDropdown(false); }} - className="absolute top-7 left-0 w-36" + className="absolute top-8 left-0 w-36" /> ) : null}
diff --git a/store/collections.ts b/store/collections.ts index 9fd6ca5..67fb8e4 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -61,7 +61,7 @@ const useCollectionStore = create()((set) => ({ if (response.ok) set((state) => ({ collections: state.collections.map((e) => - e.id === collection.id ? collection : e + e.id === data.response.id ? data.response : e ), })); From 1c45c6934dbe00bd9408f162d89d4257010cdfa5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 May 2023 18:05:39 +0330 Subject: [PATCH 042/144] added searching functionality --- components/Modal/DeleteCollection.tsx | 1 + components/Navbar.tsx | 25 ++---- components/Search.tsx | 106 ++++++++++++++++++++++++++ pages/search.tsx | 59 ++++++++++++++ store/search.ts | 47 ++++++++++++ types/global.ts | 11 +++ 6 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 components/Search.tsx create mode 100644 pages/search.tsx create mode 100644 store/search.ts diff --git a/components/Modal/DeleteCollection.tsx b/components/Modal/DeleteCollection.tsx index 5fb0790..634f0b7 100644 --- a/components/Modal/DeleteCollection.tsx +++ b/components/Modal/DeleteCollection.tsx @@ -44,6 +44,7 @@ export default function AddCollection({

setInputField(e.target.value)} type="text" diff --git a/components/Navbar.tsx b/components/Navbar.tsx index c1d6c3b..c04858e 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -8,7 +8,6 @@ import { signOut } from "next-auth/react"; import { useSession } from "next-auth/react"; import { faPlus, - faMagnifyingGlass, faCircleUser, faSliders, faArrowRightFromBracket, @@ -17,11 +16,12 @@ import { } from "@fortawesome/free-solid-svg-icons"; import { useEffect, useState } from "react"; import Dropdown from "@/components/Dropdown"; -import Modal from "./Modal"; -import AddLink from "./Modal/AddLink"; -import ClickAwayHandler from "./ClickAwayHandler"; -import Sidebar from "./Sidebar"; +import Modal from "@/components/Modal"; +import AddLink from "@/components/Modal/AddLink"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; +import Sidebar from "@/components/Sidebar"; import { useRouter } from "next/router"; +import Search from "@/components/Search"; export default function () { const { data: session } = useSession(); @@ -57,20 +57,7 @@ export default function () { >
-
- - -
+
setSearchBox(false)}> +
setSearchBox(true)} + > + + + setSearchQuery(e.target.value)} + onFocus={() => router.push("/search")} + autoFocus={searchBox} + className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1" + /> + {searchBox ? ( +
+

Filter by:

+
+ + + + + +
+
+ ) : null} +
+ + ); +} diff --git a/pages/search.tsx b/pages/search.tsx new file mode 100644 index 0000000..4126896 --- /dev/null +++ b/pages/search.tsx @@ -0,0 +1,59 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import LinkList from "@/components/LinkList"; +import Dashboard from "@/layouts/Dashboard"; +import useLinkStore from "@/store/links"; +import useSearchSettingsStore from "@/store/search"; +import { ExtendedLink } from "@/types/global"; +import { faSearch } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useEffect, useState } from "react"; + +export default function Links() { + const { links } = useLinkStore(); + + const [filteredLinks, setFilteredLinks] = useState([]); + + const { searchSettings } = useSearchSettingsStore(); + + useEffect(() => { + const { name, url, title, collection, tags } = searchSettings.filter; + + const filter = links.filter((link) => { + const query = searchSettings.query.toLowerCase(); + + if ( + (name && link.name.toLowerCase().includes(query)) || + (url && link.url.toLowerCase().includes(query)) || + (title && link.title.toLowerCase().includes(query)) || + (collection && link.collection.name.toLowerCase().includes(query)) || + (tags && + link.tags.some((tag) => tag.name.toLowerCase().includes(query))) + ) + return true; + }); + + setFilteredLinks(filter); + }, [searchSettings]); + + return ( + +
+
+
+ +

Search Results

+
+
+ {filteredLinks[0] + ? filteredLinks.map((e, i) => { + return ; + }) + : "No results..."} +
+
+ ); +} diff --git a/store/search.ts b/store/search.ts new file mode 100644 index 0000000..62ef8b5 --- /dev/null +++ b/store/search.ts @@ -0,0 +1,47 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { SearchSettings } from "@/types/global"; +import { create } from "zustand"; + +type SearchSettingsState = { + searchSettings: SearchSettings; + setSearchSettings: (searchSettings: SearchSettings) => void; + toggleCheckbox: (name: keyof SearchSettings["filter"]) => void; + setSearchQuery: (query: string) => void; +}; + +const useSearchSettingsStore = create((set) => ({ + searchSettings: { + query: "", + filter: { + name: true, + url: true, + title: true, + collection: true, + tags: true, + }, + }, + setSearchSettings: (searchSettings) => set({ searchSettings }), + toggleCheckbox: (name) => + set((state) => ({ + searchSettings: { + ...state.searchSettings, + filter: { + ...state.searchSettings.filter, + [name]: !state.searchSettings.filter[name], + }, + }, + })), + setSearchQuery: (query) => + set((state) => ({ + searchSettings: { + ...state.searchSettings, + query, + }, + })), +})); + +export default useSearchSettingsStore; diff --git a/types/global.ts b/types/global.ts index 5da7f89..c9ec1ac 100644 --- a/types/global.ts +++ b/types/global.ts @@ -46,3 +46,14 @@ export interface ExtendedCollection extends Collection { }; }[]; } + +export type SearchSettings = { + query: string; + filter: { + name: boolean; + url: boolean; + title: boolean; + collection: boolean; + tags: boolean; + }; +}; From d5c9e7aaf381dddd8893f6e828051a289d58fa5c Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 May 2023 22:48:10 +0330 Subject: [PATCH 043/144] small patch --- pages/search.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/search.tsx b/pages/search.tsx index 4126896..cbbfa7b 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -37,7 +37,7 @@ export default function Links() { }); setFilteredLinks(filter); - }, [searchSettings]); + }, [searchSettings, links]); return ( From 90106279975c9bc9cd135a9eeaadd68ee9b77f41 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 14 May 2023 19:11:08 +0330 Subject: [PATCH 044/144] added dashboard + sorting functionality done partially --- components/CollectionCard.tsx | 33 ++++- components/Dashboard/CollectionItem.tsx | 59 ++++++++ components/Dashboard/LinkItem.tsx | 131 +++++++++++++++++ components/LinkList.tsx | 2 + components/Search.tsx | 6 +- components/Sidebar/index.tsx | 25 ++++ layouts/{Dashboard.tsx => MainLayout.tsx} | 0 pages/collections/[id].tsx | 6 +- pages/collections/index.tsx | 163 +++++++++++++++++----- pages/dashboard.tsx | 117 ++++++++++++++++ pages/index.tsx | 2 +- pages/links.tsx | 6 +- pages/search.tsx | 23 +-- pages/tags/[id].tsx | 6 +- 14 files changed, 518 insertions(+), 61 deletions(-) create mode 100644 components/Dashboard/CollectionItem.tsx create mode 100644 components/Dashboard/LinkItem.tsx rename layouts/{Dashboard.tsx => MainLayout.tsx} (100%) create mode 100644 pages/dashboard.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index a85a7ee..7b20782 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -5,10 +5,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; -import { Collection } from "@prisma/client"; import Link from "next/link"; +import { ExtendedCollection } from "@/types/global"; +import useLinkStore from "@/store/links"; -export default function ({ collection }: { collection: Collection }) { +export default function ({ collection }: { collection: ExtendedCollection }) { + const { links } = useLinkStore(); const formattedDate = new Date(collection.createdAt).toLocaleString("en-US", { year: "numeric", month: "short", @@ -17,20 +19,37 @@ export default function ({ collection }: { collection: Collection }) { return ( -
+
-

{collection.name}

+

{collection.name}

-

- {collection.description} +

{collection.description}

+
+
+

Members:

+ {collection.members.map((e, i) => { + return ( +

+ {e.user.name} +

+ ); + })} +
+
+

{formattedDate}

+

+ {links.filter((e) => e.collectionId === collection.id).length} Links

-

{formattedDate}

); diff --git a/components/Dashboard/CollectionItem.tsx b/components/Dashboard/CollectionItem.tsx new file mode 100644 index 0000000..ded9cb5 --- /dev/null +++ b/components/Dashboard/CollectionItem.tsx @@ -0,0 +1,59 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; +import Link from "next/link"; +import { ExtendedCollection } from "@/types/global"; +import useLinkStore from "@/store/links"; + +export default function ({ collection }: { collection: ExtendedCollection }) { + const { links } = useLinkStore(); + const formattedDate = new Date(collection.createdAt).toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + + return ( + +
+
+
+
+

{collection.name}

+

{collection.description}

+
+ + +
+
+
+

Members:

+ {collection.members.map((e, i) => { + return ( +

+ {e.user.name} +

+ ); + })} +
+
+

{formattedDate}

+

+ {links.filter((e) => e.collectionId === collection.id).length} Links +

+
+
+ + ); +} diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx new file mode 100644 index 0000000..fd4c34c --- /dev/null +++ b/components/Dashboard/LinkItem.tsx @@ -0,0 +1,131 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { ExtendedLink } from "@/types/global"; +import { + faFolder, + faArrowUpRightFromSquare, +} from "@fortawesome/free-solid-svg-icons"; +import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useState } from "react"; +import Image from "next/image"; +import Link from "next/link"; + +export default function ({ + link, + count, +}: { + link: ExtendedLink; + count: number; +}) { + const [editModal, setEditModal] = useState(false); + + const url = new URL(link.url); + const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + + return ( +
+ ); +} diff --git a/components/LinkList.tsx b/components/LinkList.tsx index a666a7e..1445a5c 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -144,6 +144,7 @@ export default function ({ )}`} onMouseEnter={() => setArchiveLabel("Screenshot")} target="_blank" + title="Screenshot" > setArchiveLabel("PDF")} + title="PDF" > { + if (router.pathname !== "/search") setSearchQuery(""); + }, [router]); + return ( setSearchBox(false)}>
+ +
+ +

+ Dashboard +

+
+ +
+
@@ -146,6 +146,6 @@ export default function () { return ; })}
- + ); } diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 080e7c1..45dd254 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -7,75 +7,162 @@ import useCollectionStore from "@/store/collections"; import { faAdd, faBox, + faCheck, faEllipsis, faPlus, + faSort, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import CollectionCard from "@/components/CollectionCard"; import Dropdown from "@/components/Dropdown"; -import { useState } from "react"; +import { ChangeEvent, useState } from "react"; import Modal from "@/components/Modal"; import AddCollection from "@/components/Modal/AddCollection"; -import Dashboard from "@/layouts/Dashboard"; +import MainLayout from "@/layouts/MainLayout"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; export default function () { const { collections } = useCollectionStore(); const [expandDropdown, setExpandDropdown] = useState(false); + const [sortDropdown, setSortDropdown] = useState(false); - const [linkModal, setLinkModal] = useState(false); + const [collectionModal, setCollectionModal] = useState(false); const toggleCollectionModal = () => { - setLinkModal(!linkModal); + setCollectionModal(!collectionModal); + }; + + const [sortBy, setSortBy] = useState(""); + + const handleSortChange = (event: ChangeEvent) => { + setSortBy(event.target.value); }; return ( // ml-80 - +
-
-
- -

All Collections

+
+
+
+ +

All Collections

+
+
+
setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ + {expandDropdown ? ( + , + onClick: () => { + toggleCollectionModal(); + setExpandDropdown(false); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setExpandDropdown(false); + }} + className="absolute top-8 left-0 w-36" + /> + ) : null} +
+
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + onClick={() => setSortDropdown(!sortDropdown)} + id="sort-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" >
- {expandDropdown ? ( - , - onClick: () => { - toggleCollectionModal(); - setExpandDropdown(false); - }, - }, - ]} + + {sortDropdown ? ( + { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); + if (target.id !== "sort-dropdown") setSortDropdown(false); }} - className="absolute top-8 left-0 w-36" - /> + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-36" + > +

Sort by

+
+ + + +
+
) : null}
- - {linkModal ? ( - - - - ) : null}
+
{collections.map((e, i) => { return ; @@ -90,6 +177,12 @@ export default function () {
- + + {collectionModal ? ( + + + + ) : null} + ); } diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx new file mode 100644 index 0000000..393ca83 --- /dev/null +++ b/pages/dashboard.tsx @@ -0,0 +1,117 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import useCollectionStore from "@/store/collections"; +import { faArrowRight, faChartSimple } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import MainLayout from "@/layouts/MainLayout"; +import useLinkStore from "@/store/links"; +import useTagStore from "@/store/tags"; +import LinkItem from "@/components/Dashboard/LinkItem"; +import Link from "next/link"; +import CollectionItem from "@/components/Dashboard/CollectionItem"; +import { useEffect, useState } from "react"; + +export default function () { + const { collections } = useCollectionStore(); + const { links } = useLinkStore(); + const { tags } = useTagStore(); + + const [sortedCollections, setSortedCollections] = useState([]); + + useEffect(() => { + const collectionsWithLinkCount = collections.map((collection) => { + const linkCount = links.filter( + (link) => link.collectionId === collection.id + ).length; + return { ...collection, linkCount }; + }); + + setSortedCollections( + collectionsWithLinkCount.sort((a, b) => b.linkCount - a.linkCount) as any + ); + }, [collections]); + + return ( + // ml-80 + +
+
+
+ +

Dashboard

+
+
+ +
+
+

{links.length}

+

Links

+
+ +
+

+ {collections.length} +

+

Collections

+
+ +
+

{tags.length}

+

Tags

+
+
+ +
+
+
+

Recently added Links

+ +
+ View All + +
+ +
+ {links + .sort( + (a, b) => + new Date(b.createdAt).getTime() - + new Date(a.createdAt).getTime() + ) + .slice(0, 5) + .map((e, i) => ( + + ))} +
+ +
+
+

Top Collections

+ +
+ View All + +
+ +
+ {sortedCollections.map((e, i) => ( + + ))} +
+
+
+
+ ); +} diff --git a/pages/index.tsx b/pages/index.tsx index c0c4a0f..d82e286 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -10,6 +10,6 @@ export default function Home() { const router = useRouter(); useEffect(() => { - router.push("/collections"); + router.push("/MainLayout"); }, []); } diff --git a/pages/links.tsx b/pages/links.tsx index 8923dc6..68ad350 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -4,7 +4,7 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import LinkList from "@/components/LinkList"; -import Dashboard from "@/layouts/Dashboard"; +import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; import { faBookmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -13,7 +13,7 @@ export default function Links() { const { links } = useLinkStore(); return ( - +
@@ -28,6 +28,6 @@ export default function Links() { return ; })}
- + ); } diff --git a/pages/search.tsx b/pages/search.tsx index cbbfa7b..8bb25cb 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -4,7 +4,7 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import LinkList from "@/components/LinkList"; -import Dashboard from "@/layouts/Dashboard"; +import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; import useSearchSettingsStore from "@/store/search"; import { ExtendedLink } from "@/types/global"; @@ -40,7 +40,7 @@ export default function Links() { }, [searchSettings, links]); return ( - +
@@ -48,12 +48,19 @@ export default function Links() {

Search Results

- {filteredLinks[0] - ? filteredLinks.map((e, i) => { - return ; - }) - : "No results..."} + {filteredLinks[0] ? ( + filteredLinks.map((e, i) => { + return ; + }) + ) : ( +

+ Nothing found.{" "} + + ¯\_(ツ)_/¯ + +

+ )}
-
+ ); } diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index 4a06f14..70d0f87 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import Dashboard from "@/layouts/Dashboard"; +import MainLayout from "@/layouts/MainLayout"; import { useRouter } from "next/router"; export default function () { @@ -12,8 +12,8 @@ export default function () { const tagId = Number(router.query.id); return ( - +
{"HI"}
-
+ ); } From 5e27c971ff04a00a5a9cdf14f9d57e9ef7dbfdc4 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 14 May 2023 19:12:58 +0330 Subject: [PATCH 045/144] minor fix --- pages/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/index.tsx b/pages/index.tsx index d82e286..bbfb791 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -10,6 +10,6 @@ export default function Home() { const router = useRouter(); useEffect(() => { - router.push("/MainLayout"); + router.push("/dashboard"); }, []); } From 9b064bbb1ee5687a929f04eec5efc5d6216e5e29 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 15 May 2023 21:59:51 +0330 Subject: [PATCH 046/144] visual changes improvements --- components/CollectionCard.tsx | 2 +- components/Dashboard/CollectionItem.tsx | 6 ++--- components/Dashboard/LinkItem.tsx | 6 ++--- components/Sidebar/index.tsx | 6 +++-- layouts/MainLayout.tsx | 6 ++--- lib/api/controllers/tags/getTags.ts | 5 ++++ pages/dashboard.tsx | 36 +++++++++++++++++++++---- 7 files changed, 49 insertions(+), 18 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 7b20782..4c7370b 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -21,7 +21,7 @@ export default function ({ collection }: { collection: ExtendedCollection }) {
-
+

{collection.name}

-
+ +
-
+

{collection.name}

{collection.description}

diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index fd4c34c..ec606b5 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -21,8 +21,6 @@ export default function ({ link: ExtendedLink; count: number; }) { - const [editModal, setEditModal] = useState(false); - const url = new URL(link.url); const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { year: "numeric", @@ -31,7 +29,7 @@ export default function ({ }); return ( -
+
{ const target = e.target as HTMLElement; diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 4ced79f..fe225fc 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -18,7 +18,7 @@ import Link from "next/link"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; -export default function () { +export default function ({ className }: { className?: string }) { const { collections } = useCollectionStore(); const { tags } = useTagStore(); @@ -31,7 +31,9 @@ export default function () { }, [router]); return ( -
+

Linkwarden

diff --git a/layouts/MainLayout.tsx b/layouts/MainLayout.tsx index 4bb28f8..2cfe01a 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -24,11 +24,11 @@ export default function ({ children }: Props) { if (status === "authenticated" && !redirect && routeExists) return (
-
- +
+
-
+
{children}
diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 7e73dea..07bf3bb 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -39,6 +39,11 @@ export default async function (userId: number) { ], }, }, + orderBy: { + links: { + _count: "desc", + }, + }, }); return { response: tags, status: 200 }; diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 393ca83..c66b89e 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -67,12 +67,12 @@ export default function () {
-
-
+
+

Recently added Links

-
+
View All -
+

Top Collections

-
+
View All ))}
+ +
+
+

Top Tags

+ +
+ View All + +
+ +
+
+ {tags.slice(0, 19).map((e, i) => ( + + # {e.name} + + ))} +
+
From ff158915e7e48e3bd72125d37709912d90486459 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 15 May 2023 22:48:33 +0330 Subject: [PATCH 047/144] modularized a bit of a code --- components/Checkbox.tsx | 31 +++++++++++++ components/RadioButton.tsx | 32 ++++++++++++++ components/Search.tsx | 87 +++++++++++++------------------------ pages/collections/index.tsx | 77 ++++++++++---------------------- 4 files changed, 115 insertions(+), 112 deletions(-) create mode 100644 components/Checkbox.tsx create mode 100644 components/RadioButton.tsx diff --git a/components/Checkbox.tsx b/components/Checkbox.tsx new file mode 100644 index 0000000..4294d7c --- /dev/null +++ b/components/Checkbox.tsx @@ -0,0 +1,31 @@ +import { faSquare, faSquareCheck } from "@fortawesome/free-regular-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { ChangeEventHandler } from "react"; + +type Props = { + label: string; + state: boolean; + onClick: ChangeEventHandler; +}; + +export default function Checkbox({ label, state, onClick }: Props) { + return ( + + ); +} diff --git a/components/RadioButton.tsx b/components/RadioButton.tsx new file mode 100644 index 0000000..f700033 --- /dev/null +++ b/components/RadioButton.tsx @@ -0,0 +1,32 @@ +import { faCircle, faCircleCheck } from "@fortawesome/free-regular-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { ChangeEventHandler } from "react"; + +type Props = { + label: string; + state: boolean; + onClick: ChangeEventHandler; +}; + +export default function RadioButton({ label, state, onClick }: Props) { + return ( + + ); +} diff --git a/components/Search.tsx b/components/Search.tsx index c2685de..3c5d3d9 100644 --- a/components/Search.tsx +++ b/components/Search.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from "react"; import ClickAwayHandler from "./ClickAwayHandler"; import useSearchSettingsStore from "@/store/search"; import { useRouter } from "next/router"; +import Checkbox from "./Checkbox"; export default function Search() { const router = useRouter(); @@ -43,64 +44,34 @@ export default function Search() { className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1" /> {searchBox ? ( -
-

Filter by:

-
- - - - - +
+
+

Filter by

+ toggleCheckbox("name")} + /> + toggleCheckbox("url")} + /> + toggleCheckbox("title")} + /> + toggleCheckbox("collection")} + /> + toggleCheckbox("tags")} + />
) : null} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 45dd254..a04b76e 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -7,7 +7,6 @@ import useCollectionStore from "@/store/collections"; import { faAdd, faBox, - faCheck, faEllipsis, faPlus, faSort, @@ -20,6 +19,8 @@ import Modal from "@/components/Modal"; import AddCollection from "@/components/Modal/AddCollection"; import MainLayout from "@/layouts/MainLayout"; import ClickAwayHandler from "@/components/ClickAwayHandler"; +import { faCircle, faCircleCheck } from "@fortawesome/free-regular-svg-icons"; +import RadioButton from "@/components/RadioButton"; export default function () { const { collections } = useCollectionStore(); @@ -32,7 +33,7 @@ export default function () { setCollectionModal(!collectionModal); }; - const [sortBy, setSortBy] = useState(""); + const [sortBy, setSortBy] = useState("Name"); const handleSortChange = (event: ChangeEvent) => { setSortBy(event.target.value); @@ -104,59 +105,27 @@ export default function () { }} className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-36" > -

Sort by

+

+ Sort by +

- - - + + + + +
) : null} From 6cb806ad3ae47c7ffc89c97e027c228af0fb5fc7 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 16 May 2023 00:15:06 +0330 Subject: [PATCH 048/144] fully implemented sorting functionality --- pages/collections/[id].tsx | 245 +++++++++++++++++++++++++----------- pages/collections/index.tsx | 80 ++++++++++-- pages/links.tsx | 109 +++++++++++++++- pages/tags/[id].tsx | 145 ++++++++++++++++++++- 4 files changed, 491 insertions(+), 88 deletions(-) diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index f0921b8..94f0436 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -11,18 +11,21 @@ import EditCollection from "@/components/Modal/EditCollection"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; -import { ExtendedCollection, ExtendedLink } from "@/types/global"; +import { ExtendedCollection } from "@/types/global"; import { faAdd, faEllipsis, faFolder, faPenToSquare, + faSort, faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; +import { ChangeEvent, useEffect, useState } from "react"; import MainLayout from "@/layouts/MainLayout"; +import RadioButton from "@/components/RadioButton"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; export default function () { const router = useRouter(); @@ -34,10 +37,13 @@ export default function () { const [linkModal, setLinkModal] = useState(false); const [editCollectionModal, setEditCollectionModal] = useState(false); const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); + const [sortDropdown, setSortDropdown] = useState(false); + const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [activeCollection, setActiveCollection] = useState(); - const [linksByCollection, setLinksByCollection] = - useState(links); + + const [sortedLinks, setSortedLinks] = useState(links); const toggleLinkModal = () => { setLinkModal(!linkModal); @@ -51,98 +57,197 @@ export default function () { setDeleteCollectionModal(!deleteCollectionModal); }; - useEffect(() => { - setLinksByCollection( - links.filter((e) => e.collection.id === Number(router.query.id)) - ); + const handleSortChange = (event: ChangeEvent) => { + setSortBy(event.target.value); + }; + useEffect(() => { setActiveCollection( collections.find((e) => e.id === Number(router.query.id)) ); - }, [links, router, collections]); + + // Sorting logic + + const linksArray = [ + ...links.filter((e) => e.collection.id === Number(router.query.id)), + ]; + + if (sortBy === "Name (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); + else if (sortBy === "Title (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); + else if (sortBy === "Name (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); + else if (sortBy === "Title (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); + else if (sortBy === "Date (Newest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + ); + else if (sortBy === "Date (Oldest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + ) + ); + }, [links, router, collections, sortBy]); return (
-
-
- -

{activeCollection?.name}

+
+
+
+ +

{activeCollection?.name}

+
+
+
setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ {expandDropdown ? ( + , + onClick: () => { + toggleLinkModal(); + setExpandDropdown(false); + }, + }, + { + name: "Edit Collection", + icon: , + onClick: () => { + toggleEditCollectionModal(); + setExpandDropdown(false); + }, + }, + { + name: "Delete Collection", + icon: , + onClick: () => { + toggleDeleteCollectionModal(); + setExpandDropdown(false); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setExpandDropdown(false); + }} + className="absolute top-8 left-0 z-10 w-44" + /> + ) : null} + + {linkModal ? ( + + + + ) : null} + + {editCollectionModal && activeCollection ? ( + + + + ) : null} + + {deleteCollectionModal && activeCollection ? ( + + + + ) : null} +
+
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + onClick={() => setSortDropdown(!sortDropdown)} + id="sort-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" >
- {expandDropdown ? ( - , - onClick: () => { - toggleLinkModal(); - setExpandDropdown(false); - }, - }, - { - name: "Edit Collection", - icon: , - onClick: () => { - toggleEditCollectionModal(); - setExpandDropdown(false); - }, - }, - { - name: "Delete Collection", - icon: , - onClick: () => { - toggleDeleteCollectionModal(); - setExpandDropdown(false); - }, - }, - ]} + + {sortDropdown ? ( + { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); + if (target.id !== "sort-dropdown") setSortDropdown(false); }} - className="absolute top-8 left-0 z-10 w-44" - /> - ) : null} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" + > +

+ Sort by +

+
+ - {linkModal ? ( - - - - ) : null} + - {editCollectionModal && activeCollection ? ( - - - - ) : null} + - {deleteCollectionModal && activeCollection ? ( - - - + + + + + +
+
) : null}
- {linksByCollection.map((e, i) => { + {sortedLinks.map((e, i) => { return ; })}
diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index a04b76e..b6bd6fc 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -14,18 +14,19 @@ import { import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import CollectionCard from "@/components/CollectionCard"; import Dropdown from "@/components/Dropdown"; -import { ChangeEvent, useState } from "react"; +import { ChangeEvent, useEffect, useState } from "react"; import Modal from "@/components/Modal"; import AddCollection from "@/components/Modal/AddCollection"; import MainLayout from "@/layouts/MainLayout"; import ClickAwayHandler from "@/components/ClickAwayHandler"; -import { faCircle, faCircleCheck } from "@fortawesome/free-regular-svg-icons"; import RadioButton from "@/components/RadioButton"; export default function () { const { collections } = useCollectionStore(); const [expandDropdown, setExpandDropdown] = useState(false); const [sortDropdown, setSortDropdown] = useState(false); + const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortedCollections, setSortedCollections] = useState(collections); const [collectionModal, setCollectionModal] = useState(false); @@ -33,12 +34,49 @@ export default function () { setCollectionModal(!collectionModal); }; - const [sortBy, setSortBy] = useState("Name"); - const handleSortChange = (event: ChangeEvent) => { setSortBy(event.target.value); }; + useEffect(() => { + const collectionsArray = [...collections]; + + if (sortBy === "Name (A-Z)") + setSortedCollections( + collectionsArray.sort((a, b) => a.name.localeCompare(b.name)) + ); + else if (sortBy === "Description (A-Z)") + setSortedCollections( + collectionsArray.sort((a, b) => + a.description.localeCompare(b.description) + ) + ); + else if (sortBy === "Name (Z-A)") + setSortedCollections( + collectionsArray.sort((a, b) => b.name.localeCompare(a.name)) + ); + else if (sortBy === "Description (Z-A)") + setSortedCollections( + collectionsArray.sort((a, b) => + b.description.localeCompare(a.description) + ) + ); + else if (sortBy === "Date (Newest First)") + setSortedCollections( + collectionsArray.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + ); + else if (sortBy === "Date (Oldest First)") + setSortedCollections( + collectionsArray.sort( + (a, b) => + new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + ) + ); + }, [collections, sortBy]); + return ( // ml-80 @@ -103,27 +141,45 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "sort-dropdown") setSortDropdown(false); }} - className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-36" + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" >

Sort by

+ + + + + +
@@ -133,7 +189,7 @@ export default function () {
- {collections.map((e, i) => { + {sortedCollections.map((e, i) => { return ; })} diff --git a/pages/links.tsx b/pages/links.tsx index 68ad350..fa13629 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -3,19 +3,57 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . +import ClickAwayHandler from "@/components/ClickAwayHandler"; import LinkList from "@/components/LinkList"; +import RadioButton from "@/components/RadioButton"; import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; -import { faBookmark } from "@fortawesome/free-solid-svg-icons"; +import { faBookmark, faSort } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { ChangeEvent, useEffect, useState } from "react"; export default function Links() { const { links } = useLinkStore(); + const [sortDropdown, setSortDropdown] = useState(false); + const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortedLinks, setSortedLinks] = useState(links); + + const handleSortChange = (event: ChangeEvent) => { + setSortBy(event.target.value); + }; + + useEffect(() => { + const linksArray = [...links]; + + if (sortBy === "Name (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); + else if (sortBy === "Title (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); + else if (sortBy === "Name (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); + else if (sortBy === "Title (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); + else if (sortBy === "Date (Newest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + ); + else if (sortBy === "Date (Oldest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + ) + ); + }, [links, sortBy]); + return (
-
+

All Links

+ +
+
setSortDropdown(!sortDropdown)} + id="sort-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ + {sortDropdown ? ( + { + const target = e.target as HTMLInputElement; + if (target.id !== "sort-dropdown") setSortDropdown(false); + }} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" + > +

+ Sort by +

+
+ + + + + + + + + + + +
+
+ ) : null} +
- {links.map((e, i) => { + {sortedLinks.map((e, i) => { return ; })}
diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index 70d0f87..f1e14af 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -3,17 +3,156 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import MainLayout from "@/layouts/MainLayout"; +import LinkList from "@/components/LinkList"; +import useLinkStore from "@/store/links"; +import { faHashtag, faSort } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; +import { ChangeEvent, useEffect, useState } from "react"; +import MainLayout from "@/layouts/MainLayout"; +import RadioButton from "@/components/RadioButton"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; +import { Tag } from "@prisma/client"; +import useTagStore from "@/store/tags"; export default function () { const router = useRouter(); - const tagId = Number(router.query.id); + const { links } = useLinkStore(); + const { tags } = useTagStore(); + + const [linkModal, setLinkModal] = useState(false); + const [editCollectionModal, setEditCollectionModal] = useState(false); + const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); + const [sortDropdown, setSortDropdown] = useState(false); + const [sortBy, setSortBy] = useState("Name (A-Z)"); + + const [activeTag, setActiveTag] = useState(); + + const [sortedLinks, setSortedLinks] = useState(links); + + const handleSortChange = (event: ChangeEvent) => { + setSortBy(event.target.value); + }; + + useEffect(() => { + setActiveTag(tags.find((e) => e.id === Number(router.query.id))); + + // Sorting logic + + const linksArray = [ + ...links.filter((e) => + e.tags.some((e) => e.id === Number(router.query.id)) + ), + ]; + + if (sortBy === "Name (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); + else if (sortBy === "Title (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); + else if (sortBy === "Name (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); + else if (sortBy === "Title (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); + else if (sortBy === "Date (Newest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + ); + else if (sortBy === "Date (Oldest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + ) + ); + }, [links, router, tags, sortBy]); return ( -
{"HI"}
+
+
+
+
+ +

{activeTag?.name}

+
+
+ +
+
setSortDropdown(!sortDropdown)} + id="sort-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ + {sortDropdown ? ( + { + const target = e.target as HTMLInputElement; + if (target.id !== "sort-dropdown") setSortDropdown(false); + }} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" + > +

+ Sort by +

+
+ + + + + + + + + + + +
+
+ ) : null} +
+
+ {sortedLinks.map((e, i) => { + return ; + })} +
); } From c04c8e9a2e8addbf97b769704b74086f1a4e6283 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 16 May 2023 05:43:59 +0330 Subject: [PATCH 049/144] changes to the searchbox --- components/Search.tsx | 97 ++++++++------------ pages/search.tsx | 203 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 218 insertions(+), 82 deletions(-) diff --git a/components/Search.tsx b/components/Search.tsx index 3c5d3d9..a5dcac9 100644 --- a/components/Search.tsx +++ b/components/Search.tsx @@ -1,10 +1,13 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + import { faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useEffect, useState } from "react"; -import ClickAwayHandler from "./ClickAwayHandler"; import useSearchSettingsStore from "@/store/search"; import { useRouter } from "next/router"; -import Checkbox from "./Checkbox"; export default function Search() { const router = useRouter(); @@ -13,69 +16,47 @@ export default function Search() { false || router.pathname == "/search" ); - const { searchSettings, toggleCheckbox, setSearchQuery } = + const { searchSettings, setSearchSettings, setSearchQuery } = useSearchSettingsStore(); useEffect(() => { - if (router.pathname !== "/search") setSearchQuery(""); + if (router.pathname !== "/search") + setSearchSettings({ + query: "", + filter: { + name: true, + url: true, + title: true, + collection: true, + tags: true, + }, + }); }, [router]); return ( - setSearchBox(false)}> -
setSearchBox(true)} +
setSearchBox(true)} + > + - setSearchQuery(e.target.value)} - onFocus={() => router.push("/search")} - autoFocus={searchBox} - className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1" - /> - {searchBox ? ( -
-
-

Filter by

- toggleCheckbox("name")} - /> - toggleCheckbox("url")} - /> - toggleCheckbox("title")} - /> - toggleCheckbox("collection")} - /> - toggleCheckbox("tags")} - /> -
-
- ) : null} -
- + { + setSearchQuery(e.target.value); + router.push("/search"); + }} + autoFocus={searchBox} + className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1" + /> +
); } diff --git a/pages/search.tsx b/pages/search.tsx index 8bb25cb..2d448e1 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -3,53 +3,208 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . +import Checkbox from "@/components/Checkbox"; +import ClickAwayHandler from "@/components/ClickAwayHandler"; import LinkList from "@/components/LinkList"; +import RadioButton from "@/components/RadioButton"; import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; import useSearchSettingsStore from "@/store/search"; -import { ExtendedLink } from "@/types/global"; -import { faSearch } from "@fortawesome/free-solid-svg-icons"; +import { faFilter, faSearch, faSort } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { useEffect, useState } from "react"; +import { ChangeEvent, useEffect, useState } from "react"; export default function Links() { const { links } = useLinkStore(); - const [filteredLinks, setFilteredLinks] = useState([]); + const [filterDropdown, setFilterDropdown] = useState(false); + const [sortDropdown, setSortDropdown] = useState(false); + const [sortBy, setSortBy] = useState("Name (A-Z)"); + const [sortedLinks, setSortedLinks] = useState(links); + const { searchSettings, toggleCheckbox, setSearchSettings, setSearchQuery } = + useSearchSettingsStore(); - const { searchSettings } = useSearchSettingsStore(); + const handleSortChange = (event: ChangeEvent) => { + setSortBy(event.target.value); + }; + + const { name, url, title, collection, tags } = searchSettings.filter; useEffect(() => { - const { name, url, title, collection, tags } = searchSettings.filter; + const linksArray = [ + ...links.filter((link) => { + const query = searchSettings.query.toLowerCase(); - const filter = links.filter((link) => { - const query = searchSettings.query.toLowerCase(); + if ( + (name && link.name.toLowerCase().includes(query)) || + (url && link.url.toLowerCase().includes(query)) || + (title && link.title.toLowerCase().includes(query)) || + (collection && link.collection.name.toLowerCase().includes(query)) || + (tags && + link.tags.some((tag) => tag.name.toLowerCase().includes(query))) + ) + return true; + }), + ]; - if ( - (name && link.name.toLowerCase().includes(query)) || - (url && link.url.toLowerCase().includes(query)) || - (title && link.title.toLowerCase().includes(query)) || - (collection && link.collection.name.toLowerCase().includes(query)) || - (tags && - link.tags.some((tag) => tag.name.toLowerCase().includes(query))) - ) - return true; - }); - - setFilteredLinks(filter); - }, [searchSettings, links]); + if (sortBy === "Name (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.name.localeCompare(b.name))); + else if (sortBy === "Title (A-Z)") + setSortedLinks(linksArray.sort((a, b) => a.title.localeCompare(b.title))); + else if (sortBy === "Name (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.name.localeCompare(a.name))); + else if (sortBy === "Title (Z-A)") + setSortedLinks(linksArray.sort((a, b) => b.title.localeCompare(a.title))); + else if (sortBy === "Date (Newest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + ); + else if (sortBy === "Date (Oldest First)") + setSortedLinks( + linksArray.sort( + (a, b) => + new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + ) + ); + }, [searchSettings, links, sortBy]); return (
-
+

Search Results

+ +
+
+
setFilterDropdown(!filterDropdown)} + id="filter-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ + {filterDropdown ? ( + { + const target = e.target as HTMLInputElement; + if (target.id !== "filter-dropdown") + setFilterDropdown(false); + }} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-20 border border-sky-100 w-40" + > +

+ Filter by +

+
+ toggleCheckbox("name")} + /> + toggleCheckbox("url")} + /> + toggleCheckbox("title")} + /> + toggleCheckbox("collection")} + /> + toggleCheckbox("tags")} + /> +
+
+ ) : null} +
+ +
+
setSortDropdown(!sortDropdown)} + id="sort-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ + {sortDropdown ? ( + { + const target = e.target as HTMLInputElement; + if (target.id !== "sort-dropdown") setSortDropdown(false); + }} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" + > +

+ Sort by +

+
+ + + + + + + + + + + +
+
+ ) : null} +
+
- {filteredLinks[0] ? ( - filteredLinks.map((e, i) => { + {sortedLinks[0] ? ( + sortedLinks.map((e, i) => { return ; }) ) : ( From 54553b61b8599d0f92a60e3aac0682d6e921bf9d Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 16 May 2023 05:46:04 +0330 Subject: [PATCH 050/144] minor fix --- pages/dashboard.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index c66b89e..0bc6083 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -114,15 +114,6 @@ export default function () {

Top Tags

- -
- View All - -
-
{tags.slice(0, 19).map((e, i) => ( From f43398d28885742b8a3c711fcdf5b66c40f63f4a Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 16 May 2023 20:38:28 +0330 Subject: [PATCH 051/144] layout redesign for the modals --- components/Dashboard/CollectionItem.tsx | 5 +- components/InputSelect/styles.ts | 1 - components/Modal/AddCollection.tsx | 143 +++++++++++----------- components/Modal/AddLink.tsx | 94 ++++++++------- components/Modal/EditCollection.tsx | 152 ++++++++++++------------ components/Modal/EditLink.tsx | 75 ++++++------ components/Modal/UserSettings.tsx | 55 +++++++++ components/Navbar.tsx | 28 ++++- lib/api/controllers/links/updateLink.ts | 6 - lib/api/controllers/tags/getTags.ts | 23 ++-- pages/register.tsx | 2 +- pages/tags/[id].tsx | 3 - store/tags.ts | 1 + 13 files changed, 330 insertions(+), 258 deletions(-) create mode 100644 components/Modal/UserSettings.tsx diff --git a/components/Dashboard/CollectionItem.tsx b/components/Dashboard/CollectionItem.tsx index eca3e5d..5afd8a5 100644 --- a/components/Dashboard/CollectionItem.tsx +++ b/components/Dashboard/CollectionItem.tsx @@ -18,7 +18,10 @@ export default function ({ collection }: { collection: ExtendedCollection }) { }); return ( - +
diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts index c24357f..c32a5de 100644 --- a/components/InputSelect/styles.ts +++ b/components/InputSelect/styles.ts @@ -26,7 +26,6 @@ export const styles: StylesConfig = { }), container: (styles) => ({ ...styles, - width: "15rem", border: "1px solid #e0f2fe", borderRadius: "0.375rem", lineHeight: "1.25rem", diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index 5459845..8b23e68 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -46,88 +46,91 @@ export default function AddCollection({ toggleCollectionModal }: Props) { return (
-

New Collection

+

New Collection

-
-

- Name - -

- - setNewCollection({ ...newCollection, name: e.target.value }) - } - type="text" - placeholder="e.g. Example Collection" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
+
+
+

+ Name + +

+ + setNewCollection({ ...newCollection, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Collection" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
-
-

Description

- - setNewCollection({ ...newCollection, description: e.target.value }) - } - type="text" - placeholder="Collection description" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> +
+

Description

+ + setNewCollection({ + ...newCollection, + description: e.target.value, + }) + } + type="text" + placeholder="Collection description" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +

-
-

Members

- { - setMemberEmail(e.target.value); - }} - onKeyDown={async (e) => { - const checkIfMemberAlreadyExists = newCollection.members.find( - (e) => e.email === memberEmail - ); +

Members

+ { + setMemberEmail(e.target.value); + }} + onKeyDown={async (e) => { + const checkIfMemberAlreadyExists = newCollection.members.find( + (e) => e.email === memberEmail + ); - const ownerEmail = session.data?.user.email; + const ownerEmail = session.data?.user.email; - if ( - e.key === "Enter" && - // no duplicate members - !checkIfMemberAlreadyExists && - // member can't be empty - memberEmail.trim() !== "" && - // member can't be the owner - memberEmail.trim() !== ownerEmail - ) { - // Lookup, get data/err, list ... - const user = await getUserByEmail(memberEmail.trim()); + if ( + e.key === "Enter" && + // no duplicate members + !checkIfMemberAlreadyExists && + // member can't be empty + memberEmail.trim() !== "" && + // member can't be the owner + memberEmail.trim() !== ownerEmail + ) { + // Lookup, get data/err, list ... + const user = await getUserByEmail(memberEmail.trim()); - if (user.email) { - const newMember = { - name: user.name, - email: user.email, - canCreate: false, - canUpdate: false, - canDelete: false, - }; + if (user.email) { + const newMember = { + name: user.name, + email: user.email, + canCreate: false, + canUpdate: false, + canDelete: false, + }; - setNewCollection({ - ...newCollection, - members: [...newCollection.members, newMember], - }); + setNewCollection({ + ...newCollection, + members: [...newCollection.members, newMember], + }); - setMemberEmail(""); - } + setMemberEmail(""); } - }} - type="text" - placeholder="Email" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
+ } + }} + type="text" + placeholder="Email" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> {newCollection.members[0] ? (

diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index ccdfc77..e5f8bbc 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -75,56 +75,62 @@ export default function AddLink({ toggleLinkModal }: Props) { if (response) toggleLinkModal(); }; + return ( -

+

New Link

-
-

- Name - -

- setNewLink({ ...newLink, name: e.target.value })} - type="text" - placeholder="e.g. Example Link" - className="w-60 rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
+
+
+

+ Name + +

+ setNewLink({ ...newLink, name: e.target.value })} + type="text" + placeholder="e.g. Example Link" + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
-
-

- URL - -

- setNewLink({ ...newLink, url: e.target.value })} - type="text" - placeholder="e.g. http://example.com/" - className="w-60 rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
+
+

+ URL + +

+ setNewLink({ ...newLink, url: e.target.value })} + type="text" + placeholder="e.g. http://example.com/" + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
-
-

- Collection - -

- -
+
+

+ Collection + +

+ +
-
-

Tags

- +
+

Tags

+ +

Edit Collection

-
-

- Name - -

- - setActiveCollection({ ...activeCollection, name: e.target.value }) - } - type="text" - placeholder="e.g. Example Collection" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
+
+
+

+ Name + +

+ + setActiveCollection({ ...activeCollection, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Collection" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
-
-

Description

- - setActiveCollection({ - ...activeCollection, - description: e.target.value, - }) - } - type="text" - placeholder="Collection description" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> +
+

Description

+ + setActiveCollection({ + ...activeCollection, + description: e.target.value, + }) + } + type="text" + placeholder="Collection description" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +

-
-

Members

- { - setMemberEmail(e.target.value); - }} - onKeyDown={async (e) => { - const checkIfMemberAlreadyExists = activeCollection.members.find( - (e) => e.user.email === memberEmail - ); +

Members

+ { + setMemberEmail(e.target.value); + }} + onKeyDown={async (e) => { + const checkIfMemberAlreadyExists = activeCollection.members.find( + (e) => e.user.email === memberEmail + ); - const ownerEmail = session.data?.user.email; + const ownerEmail = session.data?.user.email; - if ( - e.key === "Enter" && - // no duplicate members - !checkIfMemberAlreadyExists && - // member can't be empty - memberEmail.trim() !== "" && - // member can't be the owner - memberEmail.trim() !== ownerEmail - ) { - // Lookup, get data/err, list ... - const user = await getPublicUserDataByEmail(memberEmail.trim()); + if ( + e.key === "Enter" && + // no duplicate members + !checkIfMemberAlreadyExists && + // member can't be empty + memberEmail.trim() !== "" && + // member can't be the owner + memberEmail.trim() !== ownerEmail + ) { + // Lookup, get data/err, list ... + const user = await getPublicUserDataByEmail(memberEmail.trim()); - if (user.email) { - const newMember = { - collectionId: activeCollection.id, - userId: user.id, - canCreate: false, - canUpdate: false, - canDelete: false, - user: { - name: user.name, - email: user.email, - }, - }; + if (user.email) { + const newMember = { + collectionId: activeCollection.id, + userId: user.id, + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: user.name, + email: user.email, + }, + }; - setActiveCollection({ - ...activeCollection, - members: [...activeCollection.members, newMember], - }); + setActiveCollection({ + ...activeCollection, + members: [...activeCollection.members, newMember], + }); - setMemberEmail(""); - } + setMemberEmail(""); } - }} - type="text" - placeholder="Email" - className="w-56 sm:w-96 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
+ } + }} + type="text" + placeholder="Email" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> {activeCollection.members[0] ? (

diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx index c085900..e35d42d 100644 --- a/components/Modal/EditLink.tsx +++ b/components/Modal/EditLink.tsx @@ -53,44 +53,47 @@ export default function EditLink({ toggleLinkModal, link }: Props) {

{shortendURL} | {link.title}

-
-

- Name - -

- - setCurrentLink({ ...currentLink, name: e.target.value }) - } - type="text" - placeholder="e.g. Example Link" - className="w-60 rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
-
-

- Collection - -

- -
+
+
+

+ Name + +

+ + setCurrentLink({ ...currentLink, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Link" + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
-
-

Tags

- { - return { label: e.name, value: e.id }; - })} - /> +
+

+ Collection + +

+ +
+ +
+

Tags

+ { + return { label: e.name, value: e.id }; + })} + /> +
diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx new file mode 100644 index 0000000..b61055b --- /dev/null +++ b/components/Modal/UserSettings.tsx @@ -0,0 +1,55 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import { NewLink } from "@/types/global"; +import useLinkStore from "@/store/links"; +import RequiredBadge from "../RequiredBadge"; + +type Props = { + toggleSettingsModal: Function; +}; + +export default function UserSettings({ toggleSettingsModal }: Props) { + const [newLink, setNewLink] = useState(); + + const { addLink } = useLinkStore(); + + const submit = async () => { + console.log(newLink); + + const response = await addLink(newLink as NewLink); + + if (response) toggleSettingsModal(); + }; + + return ( +
+

Settings

+ +
+

+ Name + +

+ +
+ +
+ + Apply Settings +
+
+ ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index c04858e..0049278 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -22,6 +22,7 @@ import ClickAwayHandler from "@/components/ClickAwayHandler"; import Sidebar from "@/components/Sidebar"; import { useRouter } from "next/router"; import Search from "@/components/Search"; +import UserSettings from "./Modal/UserSettings"; export default function () { const { data: session } = useSession(); @@ -31,6 +32,7 @@ export default function () { const user = session?.user; const [linkModal, setLinkModal] = useState(false); + const [settingsModal, setSettingsModal] = useState(false); const [sidebar, setSidebar] = useState(false); const router = useRouter(); @@ -49,6 +51,10 @@ export default function () { setLinkModal(!linkModal); }; + const toggleSettingsModal = () => { + setSettingsModal(!settingsModal); + }; + return (
- {linkModal ? ( - - - - ) : null} -
, + onClick: () => { + toggleSettingsModal(); + setProfileDropdown(!profileDropdown); + }, }, { name: "Logout", @@ -114,6 +118,18 @@ export default function () { /> ) : null} + {linkModal ? ( + + + + ) : null} + + {settingsModal ? ( + + + + ) : null} + {sidebar ? (
diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts index f30860b..2854ed2 100644 --- a/lib/api/controllers/links/updateLink.ts +++ b/lib/api/controllers/links/updateLink.ts @@ -11,12 +11,6 @@ import getPermission from "@/lib/api/getPermission"; export default async function (link: ExtendedLink, userId: number) { if (!link) return { response: "Please choose a valid link.", status: 401 }; - const collectionIsAccessible = await getPermission(userId, link.collectionId); - - const memberHasAccess = collectionIsAccessible?.members.some( - (e: UsersAndCollections) => e.userId === userId && e.canUpdate - ); - if (link.collection.ownerId) { const collectionIsAccessible = await getPermission( userId, diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 07bf3bb..92dd3b2 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -17,27 +17,22 @@ export default async function (userId: number) { const tags = await prisma.tag.findMany({ where: { - ownerId: userId, - owner: { - OR: [ - { - id: userId, - }, - { - collections: { - some: { + OR: [ + { ownerId: userId }, // Tags owned by the user + { + links: { + some: { + collection: { members: { some: { - user: { - id: userId, - }, + userId, // Tags from collections where the user is a member }, }, }, }, }, - ], - }, + }, + ], }, orderBy: { links: { diff --git a/pages/register.tsx b/pages/register.tsx index e9fae86..29e939b 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -58,7 +58,7 @@ export default function () {

Linkwarden

setForm({ ...form, name: e.target.value })} className="border border-gray-700 rounded-md block m-2 mx-auto p-2" diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index f1e14af..c9c8a89 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -21,9 +21,6 @@ export default function () { const { links } = useLinkStore(); const { tags } = useTagStore(); - const [linkModal, setLinkModal] = useState(false); - const [editCollectionModal, setEditCollectionModal] = useState(false); - const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); const [sortDropdown, setSortDropdown] = useState(false); const [sortBy, setSortBy] = useState("Name (A-Z)"); diff --git a/store/tags.ts b/store/tags.ts index e4d364f..b2a22c4 100644 --- a/store/tags.ts +++ b/store/tags.ts @@ -5,6 +5,7 @@ import { create } from "zustand"; import { Tag } from "@prisma/client"; +import tags from "@/pages/api/routes/tags"; type TagStore = { tags: Tag[]; From a5d0d08c9356410cd502310468a4662333abe37d Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 May 2023 21:32:05 +0330 Subject: [PATCH 052/144] added settings modal UI --- components/Modal/UserSettings.tsx | 139 +++++++++++++++++++++++++----- 1 file changed, 116 insertions(+), 23 deletions(-) diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index b61055b..4dfe16f 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -5,49 +5,142 @@ import { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faPlus } from "@fortawesome/free-solid-svg-icons"; -import { NewLink } from "@/types/global"; -import useLinkStore from "@/store/links"; -import RequiredBadge from "../RequiredBadge"; +import { faCircleUser, faClose } from "@fortawesome/free-solid-svg-icons"; +import Checkbox from "../Checkbox"; +import useAccountStore from "@/store/account"; type Props = { toggleSettingsModal: Function; }; export default function UserSettings({ toggleSettingsModal }: Props) { - const [newLink, setNewLink] = useState(); + const { account } = useAccountStore(); + const [collectionProtection, setCollectionProtection] = useState(false); - const { addLink } = useLinkStore(); + const [name, setName] = useState(account.name); + const [email, setEmail] = useState(account.email); + const [selectedFile, setSelectedFile] = useState(null); + + const handleFileChange = async (e) => { + const file = e.target.files[0]; + setSelectedFile(file); + }; const submit = async () => { - console.log(newLink); - - const response = await addLink(newLink as NewLink); - - if (response) toggleSettingsModal(); + // const response = await addLink(newLink as NewLink); + // if (response) toggleSettingsModal(); }; return (
-

Settings

+

Settings

-
-

- Name - -

- +

Profile Settings

+ +
+
+
+

Display Name

+ setName(e.target.value)} + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Email

+ setEmail(e.target.value)} + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Password

+ +
+
+ Change Password +
+
+
+
+ +
+

+ Profile Photo +

+
+ {/* Image goes here */} + +
+ +
+
+ +
+
+
+
+ +
+ +

Data Settings

+ +
+
+ Export Data +
+
+ +
+ +

Privacy Settings

+ + setCollectionProtection(!collectionProtection)} + /> + +
+
+ Manage Allowed Users +
- Apply Settings
From e3862188de214551c09f79ae551bc1c86d9d93fa Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 May 2023 21:32:17 +0330 Subject: [PATCH 053/144] added settings modal UI --- components/Checkbox.tsx | 7 +++-- components/Modal/AddCollection.tsx | 2 +- components/Modal/AddLink.tsx | 2 +- components/Modal/DeleteCollection.tsx | 8 +++--- components/Modal/EditCollection.tsx | 4 +-- components/Modal/EditLink.tsx | 2 +- components/Navbar.tsx | 1 + lib/api/controllers/users/getUsers.ts | 25 ++++++++++------- lib/client/getInitialData.ts | 5 +++- pages/api/routes/users/index.ts | 5 +++- pages/collections/[id].tsx | 2 +- .../migration.sql | 4 +++ prisma/schema.prisma | 3 +++ store/account.ts | 27 +++++++++++++++++++ store/tags.ts | 1 - 15 files changed, 74 insertions(+), 24 deletions(-) create mode 100644 prisma/migrations/20230518175141_updated_user_model/migration.sql create mode 100644 store/account.ts diff --git a/components/Checkbox.tsx b/components/Checkbox.tsx index 4294d7c..b9a7321 100644 --- a/components/Checkbox.tsx +++ b/components/Checkbox.tsx @@ -5,12 +5,15 @@ import { ChangeEventHandler } from "react"; type Props = { label: string; state: boolean; + className?: string; onClick: ChangeEventHandler; }; -export default function Checkbox({ label, state, onClick }: Props) { +export default function Checkbox({ label, state, className, onClick }: Props) { return ( -
+ + {user.newPassword && user.oldPassword ? ( +

+ Password modified. Please click{" "} + "Apply Settings" to + apply the changes.. +

+ ) : null}
@@ -204,23 +232,33 @@ export default function UserSettings({ toggleSettingsModal }: Props) {

Privacy Settings

- setUser({ ...user, collectionProtection: !user.collectionProtection }) - } + onClick={() => setUser({ ...user, isPrivate: !user.isPrivate })} /> - {user.collectionProtection ? ( +

+ This will limit who can find and add you to other Collections. +

+ + {user.isPrivate ? (
+

+ Whitelisted Users +

- Please enter the email addresses of the users who are allowed to add - you to additional collections in the box below, separated by spaces. + Please provide the Email addresses of the users you wish to grant + visibility to your profile. Separate the addresses with a comma. + Users not included will be unable to view your profile.

) : null} diff --git a/lib/api/controllers/users/getUsers.ts b/lib/api/controllers/users/getUsers.ts index 4237b18..582fdfd 100644 --- a/lib/api/controllers/users/getUsers.ts +++ b/lib/api/controllers/users/getUsers.ts @@ -5,14 +5,26 @@ import { prisma } from "@/lib/api/db"; -export default async function (lookupEmail: string, isSelf: boolean) { +export default async function ( + lookupEmail: string, + isSelf: boolean, + userEmail: string +) { const user = await prisma.user.findUnique({ where: { email: lookupEmail, }, }); - if (!user) return { response: "User not found." || null, status: 404 }; + if (!user) return { response: "User not found.", status: 404 }; + + if ( + !isSelf && + user?.isPrivate && + !user.whitelistedUsers.includes(userEmail) + ) { + return { response: "This profile is private.", status: 401 }; + } const { password, ...unsensitiveInfo } = user; diff --git a/lib/api/controllers/users/updateUser.ts b/lib/api/controllers/users/updateUser.ts index 203cb70..2630867 100644 --- a/lib/api/controllers/users/updateUser.ts +++ b/lib/api/controllers/users/updateUser.ts @@ -44,7 +44,7 @@ export default async function (user: AccountSettings, userId: number) { data: { name: user.name, email: user.email, - collectionProtection: user.collectionProtection, + isPrivate: user.isPrivate, whitelistedUsers: user.whitelistedUsers, }, }); diff --git a/lib/client/getPublicUserDataByEmail.ts b/lib/client/getPublicUserDataByEmail.ts index a91fa07..d386918 100644 --- a/lib/client/getPublicUserDataByEmail.ts +++ b/lib/client/getPublicUserDataByEmail.ts @@ -8,5 +8,7 @@ export default async function (email: string) { const data = await response.json(); + console.log(data); + return data.response; } diff --git a/pages/api/avatar/[id].ts b/pages/api/avatar/[id].ts index ae85c21..cd3aa87 100644 --- a/pages/api/avatar/[id].ts +++ b/pages/api/avatar/[id].ts @@ -6,23 +6,41 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; +import { prisma } from "@/lib/api/db"; import path from "path"; import fs from "fs"; export default async function (req: NextApiRequest, res: NextApiResponse) { - if (!req.query.id) - return res.status(401).json({ response: "Invalid parameters." }); - const session = await getServerSession(req, res, authOptions); - if (!session?.user?.email) + const userId = session?.user.id; + const userEmail = session?.user.email; + const queryId = Number(req.query.id); + + if (!queryId) + return res.status(401).json({ response: "Invalid parameters." }); + + if (!userId || !userEmail) return res.status(401).json({ response: "You must be logged in." }); - // TODO: If profile is private, hide it to other users... + if (userId !== queryId) { + const targetUser = await prisma.user.findUnique({ + where: { + id: queryId, + }, + }); + + if ( + targetUser?.isPrivate && + !targetUser.whitelistedUsers.includes(userEmail) + ) { + return res.status(401).json({ response: "This profile is private." }); + } + } const filePath = path.join( process.cwd(), - `data/uploads/avatar/${req.query.id}.jpg` + `data/uploads/avatar/${queryId}.jpg` ); console.log(filePath); diff --git a/pages/api/routes/users/index.ts b/pages/api/routes/users/index.ts index 75ca851..4af3e19 100644 --- a/pages/api/routes/users/index.ts +++ b/pages/api/routes/users/index.ts @@ -20,7 +20,7 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { const isSelf = session.user.email === lookupEmail ? true : false; if (req.method === "GET") { - const users = await getUsers(lookupEmail, isSelf); + const users = await getUsers(lookupEmail, isSelf, session.user.email); return res.status(users.status).json({ response: users.response }); } else if (req.method === "PUT" && !req.body.password) { const updated = await updateUser(req.body, session.user.id); diff --git a/prisma/migrations/20230522122002_init/migration.sql b/prisma/migrations/20230523040650_init/migration.sql similarity index 98% rename from prisma/migrations/20230522122002_init/migration.sql rename to prisma/migrations/20230523040650_init/migration.sql index 770d6a9..351f017 100644 --- a/prisma/migrations/20230522122002_init/migration.sql +++ b/prisma/migrations/20230523040650_init/migration.sql @@ -4,7 +4,7 @@ CREATE TABLE "User" ( "name" TEXT NOT NULL, "email" TEXT NOT NULL, "password" TEXT NOT NULL, - "collectionProtection" BOOLEAN NOT NULL DEFAULT false, + "isPrivate" BOOLEAN NOT NULL DEFAULT false, "whitelistedUsers" TEXT[] DEFAULT ARRAY[]::TEXT[], "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5930434..f80505e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -20,7 +20,7 @@ model User { collections Collection[] tags Tag[] collectionsJoined UsersAndCollections[] - collectionProtection Boolean @default(false) + isPrivate Boolean @default(false) whitelistedUsers String[] @default([]) createdAt DateTime @default(now()) } From 52159d8cde1c751d06651e922244595ddab45c09 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 23 May 2023 08:45:24 +0330 Subject: [PATCH 060/144] small change --- lib/client/getInitialData.ts | 2 +- store/account.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts index 15fd355..a0acd6e 100644 --- a/lib/client/getInitialData.ts +++ b/lib/client/getInitialData.ts @@ -22,7 +22,7 @@ export default function () { setCollections(); setTags(); setLinks(); - setAccount(data.user.email as string, data.user.id); + setAccount(data.user.email as string); } }, [status]); } diff --git a/store/account.ts b/store/account.ts index 3358ce6..dce5dde 100644 --- a/store/account.ts +++ b/store/account.ts @@ -9,13 +9,13 @@ import { AccountSettings } from "@/types/global"; type AccountStore = { account: User; - setAccount: (email: string, id: number) => void; + setAccount: (email: string) => void; updateAccount: (user: AccountSettings) => Promise; }; const useAccountStore = create()((set) => ({ account: {} as User, - setAccount: async (email, id) => { + setAccount: async (email) => { const response = await fetch(`/api/routes/users?email=${email}`); const data = await response.json(); From 7178287028a3a6e1999c9ebb8ca97133425ddb7a Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 24 May 2023 02:37:26 +0330 Subject: [PATCH 061/144] many visual changes + some code cleanup --- components/Modal/AddCollection.tsx | 99 +++++++++++++-------------- components/Modal/EditCollection.tsx | 101 +++++++++++++--------------- components/Modal/UserSettings.tsx | 25 +++---- components/Navbar.tsx | 44 +++++++----- components/Search.tsx | 6 +- lib/client/addMemberToCollection.ts | 55 +++++++++++++++ lib/client/avatarExists.ts | 4 ++ lib/client/fileExists.ts | 9 --- pages/api/avatar/[id].ts | 20 ++++-- store/account.ts | 22 ++++-- store/localSettings.ts | 28 ++++++++ 11 files changed, 254 insertions(+), 159 deletions(-) create mode 100644 lib/client/addMemberToCollection.ts create mode 100644 lib/client/avatarExists.ts delete mode 100644 lib/client/fileExists.ts create mode 100644 store/localSettings.ts diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index dba8e7a..8ae3354 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -7,10 +7,10 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, faPlus } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; -import { NewCollection } from "@/types/global"; +import { ExtendedCollection, NewCollection } from "@/types/global"; import { useSession } from "next-auth/react"; import RequiredBadge from "../RequiredBadge"; -import getPublicUserDataByEmail from "@/lib/client/getPublicUserDataByEmail"; +import addMemberToCollection from "@/lib/client/addMemberToCollection"; type Props = { toggleCollectionModal: Function; @@ -37,6 +37,15 @@ export default function AddCollection({ toggleCollectionModal }: Props) { if (response) toggleCollectionModal(); }; + const setMemberState = (newMember: any) => { + setNewCollection({ + ...newCollection, + members: [...newCollection.members, newMember], + }); + + setMemberEmail(""); + }; + return (

New Collection

@@ -78,56 +87,36 @@ export default function AddCollection({ toggleCollectionModal }: Props) {

Members

- { - setMemberEmail(e.target.value); - }} - onKeyDown={async (e) => { - const checkIfMemberAlreadyExists = newCollection.members.find( - (e) => e.email === memberEmail - ); +
+ { + setMemberEmail(e.target.value); + }} + type="text" + placeholder="Email" + className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> - const ownerEmail = session.data?.user.email; - - if ( - e.key === "Enter" && - // no duplicate members - !checkIfMemberAlreadyExists && - // member can't be empty - memberEmail.trim() !== "" && - // member can't be the owner - memberEmail.trim() !== ownerEmail - ) { - // Lookup, get data/err, list ... - const user = await getPublicUserDataByEmail(memberEmail.trim()); - - if (user.email) { - const newMember = { - name: user.name, - email: user.email, - canCreate: false, - canUpdate: false, - canDelete: false, - }; - - setNewCollection({ - ...newCollection, - members: [...newCollection.members, newMember], - }); - - setMemberEmail(""); - } +
+ addMemberToCollection( + session.data?.user.email as string, + memberEmail, + newCollection as unknown as ExtendedCollection, + setMemberState, + "ADD" + ) } - }} - type="text" - placeholder="Email" - className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> + className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" + > + +
+
{newCollection.members[0] ? ( -

- (All Members will have Read access to this collection.) +

+ (All Members have Read access to this collection.)

) : null} @@ -153,9 +142,17 @@ export default function AddCollection({ toggleCollectionModal }: Props) { }); }} /> -
-

{e.name}

-

{e.email}

+
+ +
+

{e.name}

+

{e.email}

+
diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index 0cd138b..a254db7 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -8,15 +8,16 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, faPenToSquare, + faPlus, faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { ExtendedCollection } from "@/types/global"; import { useSession } from "next-auth/react"; -import getPublicUserDataByEmail from "@/lib/client/getPublicUserDataByEmail"; import Modal from "@/components/Modal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import RequiredBadge from "../RequiredBadge"; +import addMemberToCollection from "@/lib/client/addMemberToCollection"; type Props = { toggleCollectionModal: Function; @@ -42,6 +43,15 @@ export default function EditCollection({ const session = useSession(); + const setMemberState = (newMember: any) => { + setActiveCollection({ + ...activeCollection, + members: [...activeCollection.members, newMember], + }); + + setMemberEmail(""); + }; + const submit = async () => { console.log(activeCollection); @@ -93,59 +103,34 @@ export default function EditCollection({

Members

- { - setMemberEmail(e.target.value); - }} - onKeyDown={async (e) => { - const checkIfMemberAlreadyExists = activeCollection.members.find( - (e) => e.user.email === memberEmail - ); +
+ { + setMemberEmail(e.target.value); + }} + type="text" + placeholder="Email" + className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> - const ownerEmail = session.data?.user.email; - - if ( - e.key === "Enter" && - // no duplicate members - !checkIfMemberAlreadyExists && - // member can't be empty - memberEmail.trim() !== "" && - // member can't be the owner - memberEmail.trim() !== ownerEmail - ) { - // Lookup, get data/err, list ... - const user = await getPublicUserDataByEmail(memberEmail.trim()); - - if (user.email) { - const newMember = { - collectionId: activeCollection.id, - userId: user.id, - canCreate: false, - canUpdate: false, - canDelete: false, - user: { - name: user.name, - email: user.email, - }, - }; - - setActiveCollection({ - ...activeCollection, - members: [...activeCollection.members, newMember], - }); - - setMemberEmail(""); - } +
+ addMemberToCollection( + session.data?.user.email as string, + memberEmail, + activeCollection, + setMemberState, + "UPDATE" + ) } - }} - type="text" - placeholder="Email" - className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> - + className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" + > + +
+
{activeCollection.members[0] ? ( -

+

(All Members will have Read access to this collection.)

) : null} @@ -172,9 +157,17 @@ export default function EditCollection({ }); }} /> -
-

{e.user.name}

-

{e.user.email}

+
+ +
+

{e.user.name}

+

{e.user.email}

+
diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index 45fe518..201a6d9 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -11,7 +11,6 @@ import useAccountStore from "@/store/account"; import { AccountSettings } from "@/types/global"; import { useSession } from "next-auth/react"; import { resizeImage } from "@/lib/client/resizeImage"; -import fileExists from "@/lib/client/fileExists"; import Modal from "."; import ChangePassword from "./ChangePassword"; import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; @@ -26,7 +25,7 @@ export default function UserSettings({ toggleSettingsModal }: Props) { const [user, setUser] = useState({ ...account, - profilePic: null, + // profilePic: null, }); const [whitelistedUsersTextbox, setWhiteListedUsersTextbox] = useState( @@ -42,15 +41,15 @@ export default function UserSettings({ toggleSettingsModal }: Props) { setUser({ ...user, oldPassword, newPassword }); }; - useEffect(() => { - const determineProfilePicSource = async () => { - const path = `/api/avatar/${account.id}`; - const imageExists = await fileExists(path).catch((e) => console.log(e)); - if (imageExists) setUser({ ...user, profilePic: path }); - }; + // useEffect(() => { + // const determineProfilePicSource = async () => { + // const path = `/api/avatar/${account.id}`; + // const imageExists = await avatarExists(path).catch((e) => console.log(e)); + // if (imageExists) setUser({ ...user, profilePic: path }); + // }; - determineProfilePicSource(); - }, []); + // determineProfilePicSource(); + // }, []); useEffect(() => { setUser({ @@ -99,12 +98,10 @@ export default function UserSettings({ toggleSettingsModal }: Props) { await updateAccount({ ...user, - profilePic: - user.profilePic === `/api/avatar/${account.id}` - ? null - : user.profilePic, }); + console.log(account); + setPasswordForm(undefined, undefined); if (user.email !== account.email || user.name !== account.name) diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 0787e58..b3dce51 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -55,38 +55,48 @@ export default function () { return ( // lg:ml-64 xl:ml-80 -
+
- +
- + + New Link
setProfileDropdown(!profileDropdown)} id="profile-dropdown" > - -
-

- {account.name} -

- + {account.profilePic ? ( + + ) : ( + + )} +
+
+

+ {account.name} +

+ +
{profileDropdown ? ( @@ -113,7 +123,7 @@ export default function () { const target = e.target as HTMLInputElement; if (target.id !== "profile-dropdown") setProfileDropdown(false); }} - className="absolute top-9 right-0 z-20 w-36" + className="absolute top-11 right-0 z-20 w-36" /> ) : null} diff --git a/components/Search.tsx b/components/Search.tsx index a5dcac9..b51c800 100644 --- a/components/Search.tsx +++ b/components/Search.tsx @@ -35,12 +35,12 @@ export default function Search() { return (
setSearchBox(true)} > @@ -55,7 +55,7 @@ export default function Search() { router.push("/search"); }} autoFocus={searchBox} - className="border border-sky-100 rounded-md pr-6 w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-1" + className="border border-sky-100 rounded-md pr-10 w-44 sm:w-60 focus:border-sky-500 sm:focus:w-80 hover:border-sky-500 duration-100 outline-none p-2" />
); diff --git a/lib/client/addMemberToCollection.ts b/lib/client/addMemberToCollection.ts new file mode 100644 index 0000000..dd8002f --- /dev/null +++ b/lib/client/addMemberToCollection.ts @@ -0,0 +1,55 @@ +import { ExtendedCollection, NewCollection } from "@/types/global"; +import getPublicUserDataByEmail from "./getPublicUserDataByEmail"; + +const addMemberToCollection = async ( + ownerEmail: string, + memberEmail: string, + collection: ExtendedCollection, + setMemberState: Function, + collectionMethod: "ADD" | "UPDATE" +) => { + const checkIfMemberAlreadyExists = collection.members.find((e: any) => { + const email = collectionMethod === "ADD" ? e.email : e.user.email; + return email === memberEmail; + }); + + if ( + // no duplicate members + !checkIfMemberAlreadyExists && + // member can't be empty + memberEmail.trim() !== "" && + // member can't be the owner + memberEmail.trim() !== ownerEmail + ) { + // Lookup, get data/err, list ... + const user = await getPublicUserDataByEmail(memberEmail.trim()); + + if (user.email) { + const newMember = + collectionMethod === "ADD" + ? { + id: user.id, + name: user.name, + email: user.email, + canCreate: false, + canUpdate: false, + canDelete: false, + } + : { + collectionId: collection.id, + userId: user.id, + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: user.name, + email: user.email, + }, + }; + + setMemberState(newMember); + } + } +}; + +export default addMemberToCollection; diff --git a/lib/client/avatarExists.ts b/lib/client/avatarExists.ts new file mode 100644 index 0000000..7490f3b --- /dev/null +++ b/lib/client/avatarExists.ts @@ -0,0 +1,4 @@ +export default async function avatarExists(fileUrl: string): Promise { + const response = await fetch(fileUrl, { method: "HEAD" }); + return !(response.headers.get("content-type") === "text/plain"); +} diff --git a/lib/client/fileExists.ts b/lib/client/fileExists.ts deleted file mode 100644 index db145d3..0000000 --- a/lib/client/fileExists.ts +++ /dev/null @@ -1,9 +0,0 @@ -export default async function fileExists(fileUrl: string): Promise { - try { - const response = await fetch(fileUrl, { method: "HEAD" }); - return response.ok; - } catch (error) { - console.error("Error checking file existence:", error); - return false; - } -} diff --git a/pages/api/avatar/[id].ts b/pages/api/avatar/[id].ts index cd3aa87..4a1dfff 100644 --- a/pages/api/avatar/[id].ts +++ b/pages/api/avatar/[id].ts @@ -18,10 +18,16 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { const queryId = Number(req.query.id); if (!queryId) - return res.status(401).json({ response: "Invalid parameters." }); + return res + .setHeader("Content-Type", "text/plain") + .status(401) + .send("Invalid parameters."); if (!userId || !userEmail) - return res.status(401).json({ response: "You must be logged in." }); + return res + .setHeader("Content-Type", "text/plain") + .status(401) + .send("You must be logged in."); if (userId !== queryId) { const targetUser = await prisma.user.findUnique({ @@ -34,7 +40,10 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { targetUser?.isPrivate && !targetUser.whitelistedUsers.includes(userEmail) ) { - return res.status(401).json({ response: "This profile is private." }); + return res + .setHeader("Content-Type", "text/plain") + .status(401) + .send("This profile is private."); } } @@ -48,9 +57,8 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { ? fs.readFileSync(filePath) : "File not found."; - if (!fs.existsSync(filePath)) - res.setHeader("Content-Type", "text/plain").status(404); - else res.setHeader("Content-Type", "image/jpeg").status(200); + if (!fs.existsSync(filePath)) res.setHeader("Content-Type", "text/plain"); + else res.setHeader("Content-Type", "image/jpeg"); return res.send(file); } diff --git a/store/account.ts b/store/account.ts index dce5dde..bda6a15 100644 --- a/store/account.ts +++ b/store/account.ts @@ -6,23 +6,33 @@ import { create } from "zustand"; import { User } from "@prisma/client"; import { AccountSettings } from "@/types/global"; +import avatarExists from "@/lib/client/avatarExists"; type AccountStore = { - account: User; + account: AccountSettings; setAccount: (email: string) => void; updateAccount: (user: AccountSettings) => Promise; }; +const determineProfilePicSource = async (data: any) => { + const path = `/api/avatar/${data.response.id}`; + const imageExists = await avatarExists(path); + if (imageExists) return path + "?" + Date.now(); + else return null; +}; + const useAccountStore = create()((set) => ({ - account: {} as User, + account: {} as AccountSettings, setAccount: async (email) => { const response = await fetch(`/api/routes/users?email=${email}`); const data = await response.json(); - console.log(data); + const profilePic = await determineProfilePicSource(data); - if (response.ok) set({ account: { ...data.response } }); + console.log({ ...data.response, profilePic }); + + if (response.ok) set({ account: { ...data.response, profilePic } }); }, updateAccount: async (user) => { const response = await fetch("/api/routes/users", { @@ -37,7 +47,9 @@ const useAccountStore = create()((set) => ({ console.log(data); - if (response.ok) set({ account: data.response }); + const profilePic = await determineProfilePicSource(data); + + if (response.ok) set({ account: { ...data.response, profilePic } }); return response.ok; }, diff --git a/store/localSettings.ts b/store/localSettings.ts new file mode 100644 index 0000000..e8537bf --- /dev/null +++ b/store/localSettings.ts @@ -0,0 +1,28 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { create } from "zustand"; + +type LocalSettings = { + darkMode: boolean; +}; + +type LocalSettingsStore = { + settings: LocalSettings; + updateSettings: (settings: LocalSettings) => void; +}; + +const useLocalSettingsStore = create((set) => ({ + settings: { + darkMode: false, + }, + updateSettings: async (newSettings) => { + set((state) => ({ settings: { ...state.settings, ...newSettings } })); + }, +})); + +export default useLocalSettingsStore; + +// TODO: Add Dark mode. From 682575c836196739298b09707f92defcf5c24c5a Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 00:03:41 +0330 Subject: [PATCH 062/144] visual improvements --- components/LinkList.tsx | 8 ++++---- components/Modal/AddCollection.tsx | 2 +- components/Modal/EditCollection.tsx | 2 +- components/Modal/UserSettings.tsx | 2 +- components/Navbar.tsx | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 1445a5c..499bc9e 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -46,7 +46,7 @@ export default function ({ }; return ( -
+
{editModal ? ( @@ -55,10 +55,10 @@ export default function ({ { const target = e.target as HTMLElement; diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index 8ae3354..d33f653 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -146,7 +146,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) {
diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index a254db7..097e48e 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -161,7 +161,7 @@ export default function EditCollection({
diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index 201a6d9..aef239e 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -171,7 +171,7 @@ export default function UserSettings({ toggleSettingsModal }: Props) {
Profile Photo
) : ( From fb811d1456137e30573ebf264b51fc0c0ed61b5b Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 00:06:05 +0330 Subject: [PATCH 063/144] minor change --- components/Modal/EditCollection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index 097e48e..e93fb99 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -131,7 +131,7 @@ export default function EditCollection({
{activeCollection.members[0] ? (

- (All Members will have Read access to this collection.) + (All Members have Read access to this collection.)

) : null} From 160658793190f4d46579dce1bd01c19ba0f766a0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 04:21:29 +0330 Subject: [PATCH 064/144] more visual improvements --- components/Dashboard/LinkItem.tsx | 124 ++++++++++++++++++++++-------- components/LinkList.tsx | 27 ++----- pages/links.tsx | 8 +- 3 files changed, 104 insertions(+), 55 deletions(-) diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index ec606b5..4945ea0 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -7,12 +7,19 @@ import { ExtendedLink } from "@/types/global"; import { faFolder, faArrowUpRightFromSquare, + faEllipsis, + faPenToSquare, + faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; import Image from "next/image"; +import useLinkStore from "@/store/links"; +import EditLink from "../Modal/EditLink"; import Link from "next/link"; +import Dropdown from "../Dropdown"; +import Modal from "../Modal"; export default function ({ link, @@ -21,6 +28,11 @@ export default function ({ link: ExtendedLink; count: number; }) { + const [expandDropdown, setExpandDropdown] = useState(false); + const [editModal, setEditModal] = useState(false); + + const { removeLink } = useLinkStore(); + const url = new URL(link.url); const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { year: "numeric", @@ -28,14 +40,24 @@ export default function ({ day: "numeric", }); + const toggleEditModal = () => { + setEditModal(!editModal); + }; + return ( -
+
+ {editModal ? ( + + + + ) : null} + { const target = e.target as HTMLElement; @@ -47,15 +69,15 @@ export default function ({ width={80} height={80} alt="" - className="blur-sm absolute left-2 opacity-40 select-none hidden lg:block" + className="blur-sm absolute left-2 opacity-40 select-none hidden sm:block" draggable="false" onError={(e) => { const target = e.target as HTMLElement; target.style.opacity = "0"; }} /> -
-
+
+

{count + 1}.

{link.name}

@@ -94,34 +116,74 @@ export default function ({
- setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" > - - - + + + {expandDropdown ? ( + , + onClick: () => { + setEditModal(true); + setExpandDropdown(false); + }, + }, + { + name: "Delete", + icon: , + onClick: () => { + removeLink(link); + setExpandDropdown(false); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setExpandDropdown(false); + }} + className="absolute top-8 right-0 w-36" /> - - + ) : null}
diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 499bc9e..193c2e7 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -30,7 +30,6 @@ export default function ({ }) { const [expandDropdown, setExpandDropdown] = useState(false); const [editModal, setEditModal] = useState(false); - const [archiveLabel, setArchiveLabel] = useState("Archived Formats"); const { removeLink } = useLinkStore(); @@ -77,8 +76,8 @@ export default function ({ target.style.opacity = "0"; }} /> -
-
+
+

{count + 1}.

{link.name}

@@ -129,26 +128,18 @@ export default function ({ id="edit-dropdown" />
-
-

- {archiveLabel} -

- -
setArchiveLabel("Archived Formats")} - > + diff --git a/pages/links.tsx b/pages/links.tsx index fa13629..c48f144 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -127,9 +127,11 @@ export default function Links() { ) : null}
- {sortedLinks.map((e, i) => { - return ; - })} +
+ {sortedLinks.map((e, i) => { + return ; + })} +
); From b473716237eca5a98ae2708b72e104af91011567 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 05:17:18 +0330 Subject: [PATCH 065/144] even more visual improvements --- components/CollectionCard.tsx | 48 +++--- components/Modal/AddCollection.tsx | 244 +++++++++++++-------------- components/Modal/EditCollection.tsx | 246 ++++++++++++++-------------- components/Navbar.tsx | 2 +- pages/collections/index.tsx | 4 +- 5 files changed, 281 insertions(+), 263 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 4c7370b..2052f13 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -19,7 +19,7 @@ export default function ({ collection }: { collection: ExtendedCollection }) { return ( -
+

{collection.name}

@@ -30,25 +30,33 @@ export default function ({ collection }: { collection: ExtendedCollection }) {

{collection.description}

-
-

Members:

- {collection.members.map((e, i) => { - return ( -

- {e.user.name} -

- ); - })} -
-
-

{formattedDate}

-

- {links.filter((e) => e.collectionId === collection.id).length} Links -

+
+
+ {collection.members + .map((e, i) => { + return ( + + ); + }) + .reverse() + .slice(0, 3)} + {collection.members.length - 3 > 0 ? ( +
+ +{collection.members.length - 3} +
+ ) : null} +
+
+

+ {links.filter((e) => e.collectionId === collection.id).length}{" "} + Links +

+

{formattedDate}

+
diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index d33f653..a6e8b3c 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -120,129 +120,133 @@ export default function AddCollection({ toggleCollectionModal }: Props) {

) : null} - {newCollection.members.map((e, i) => { - return ( -
- { - const updatedMembers = newCollection.members.filter( - (member) => { - return member.email !== e.email; - } - ); - setNewCollection({ - ...newCollection, - members: updatedMembers, - }); - }} - /> -
- + {newCollection.members.map((e, i) => { + return ( +
+ { + const updatedMembers = newCollection.members.filter( + (member) => { + return member.email !== e.email; + } + ); + setNewCollection({ + ...newCollection, + members: updatedMembers, + }); + }} /> -
-

{e.name}

-

{e.email}

+
+ +
+

{e.name}

+

{e.email}

+
+
+
+
+

Permissions

+

+ (Click to toggle.) +

+
+ +
+ + + + + +
-
-
-

Permissions

-

(Click to toggle.)

-
- -
- - - - - -
-
-
- ); - })} + ); + })} +
) : null} - {activeCollection.members.map((e, i) => { - return ( -
- { - const updatedMembers = activeCollection.members.filter( - (member) => { - return member.user.email !== e.user.email; - } - ); - setActiveCollection({ - ...activeCollection, - members: updatedMembers, - }); - }} - /> -
- + {activeCollection.members.map((e, i) => { + return ( +
+ { + const updatedMembers = activeCollection.members.filter( + (member) => { + return member.user.email !== e.user.email; + } + ); + setActiveCollection({ + ...activeCollection, + members: updatedMembers, + }); + }} /> -
-

{e.user.name}

-

{e.user.email}

+
+ +
+

+ {e.user.name} +

+

{e.user.email}

+
+
+
+
+

Permissions

+

+ (Click to toggle.) +

+
+ +
+ + + + + +
-
-
-

Permissions

-

(Click to toggle.)

-
- -
- - - - - -
-
-
- ); - })} + ); + })} +
) : ( diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index b6bd6fc..4a7feb3 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -188,13 +188,13 @@ export default function () {
-
+
{sortedCollections.map((e, i) => { return ; })}

New Collection

From d5d052b9b2b89aa9c1a7707bd1b0299cd5ef43b0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 17:47:20 +0330 Subject: [PATCH 066/144] many more improvements --- components/CollectionCard.tsx | 89 ++++++++++++++++------------- components/ImageWithFallback.tsx | 27 +++++++++ components/LinkList.tsx | 4 +- components/Modal/AddCollection.tsx | 13 +++-- components/Modal/EditCollection.tsx | 13 +++-- components/Sidebar/SidebarItem.tsx | 5 +- components/Sidebar/index.tsx | 1 + pages/collections/[id].tsx | 8 ++- pages/collections/index.tsx | 11 +++- pages/tags/[id].tsx | 8 ++- 10 files changed, 118 insertions(+), 61 deletions(-) create mode 100644 components/ImageWithFallback.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 2052f13..92f57d1 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -4,10 +4,11 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; +import { faChevronRight, faUser } from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; import { ExtendedCollection } from "@/types/global"; import useLinkStore from "@/store/links"; +import ImageWithFallback from "./ImageWithFallback"; export default function ({ collection }: { collection: ExtendedCollection }) { const { links } = useLinkStore(); @@ -18,47 +19,55 @@ export default function ({ collection }: { collection: ExtendedCollection }) { }); return ( - -
-
-
-

{collection.name}

- +
+ +
+
+
+

+ {collection.name} +

+ +
+

{collection.description}

-

{collection.description}

-
-
-
- {collection.members - .map((e, i) => { - return ( - - ); - }) - .reverse() - .slice(0, 3)} - {collection.members.length - 3 > 0 ? ( -
- +{collection.members.length - 3} -
- ) : null} -
-
-

- {links.filter((e) => e.collectionId === collection.id).length}{" "} - Links -

-

{formattedDate}

+
+
+ {collection.members + .map((e, i) => { + return ( + +
+ +
+
+ ); + }) + .reverse() + .slice(0, 3)} + {collection.members.length - 3 > 0 ? ( +
+ +{collection.members.length - 3} +
+ ) : null} +
+
+

+ {links.filter((e) => e.collectionId === collection.id).length}{" "} + Links +

+

{formattedDate}

+
-
- + +
); } diff --git a/components/ImageWithFallback.tsx b/components/ImageWithFallback.tsx new file mode 100644 index 0000000..f125216 --- /dev/null +++ b/components/ImageWithFallback.tsx @@ -0,0 +1,27 @@ +import { ElementType, ReactElement, ReactNode, useState } from "react"; + +type Props = { + src: string; + className: string; + children: ReactNode; +}; + +const ImageWithFallback = ({ src, className, children, ...rest }: Props) => { + const [error, setError] = useState(false); + + return error ? ( + <>{children} + ) : ( + { + setError(true); + }} + /> + ); +}; + +export default ImageWithFallback; diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 193c2e7..6ec06f1 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -45,7 +45,7 @@ export default function ({ }; return ( -
+
{editModal ? ( @@ -57,7 +57,7 @@ export default function ({ width={42} height={42} alt="" - className="select-none mt-3 z-10 rounded-full border-[3px] border-sky-100" + className="select-none mt-3 z-10 rounded-full shadow border-[3px] border-sky-100" draggable="false" onError={(e) => { const target = e.target as HTMLElement; diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index a6e8b3c..b287d51 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -5,12 +5,13 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faClose, faPlus } from "@fortawesome/free-solid-svg-icons"; +import { faClose, faPlus, faUser } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { ExtendedCollection, NewCollection } from "@/types/global"; import { useSession } from "next-auth/react"; import RequiredBadge from "../RequiredBadge"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; +import ImageWithFallback from "../ImageWithFallback"; type Props = { toggleCollectionModal: Function; @@ -144,12 +145,16 @@ export default function AddCollection({ toggleCollectionModal }: Props) { }} />
- + > +
+ +
+

{e.name}

{e.email}

diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index 4340d80..a30c8cb 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -10,6 +10,7 @@ import { faPenToSquare, faPlus, faTrashCan, + faUser, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { ExtendedCollection } from "@/types/global"; @@ -18,6 +19,7 @@ import Modal from "@/components/Modal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import RequiredBadge from "../RequiredBadge"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; +import ImageWithFallback from "../ImageWithFallback"; type Props = { toggleCollectionModal: Function; @@ -159,12 +161,15 @@ export default function EditCollection({ }} />
- + > +
+ +
+

{e.user.name} diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index be17ecd..45bf85a 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -11,9 +11,10 @@ interface SidebarItemProps { text: string; icon: ReactElement; path: string; + className?: string; } -export default function ({ text, icon, path }: SidebarItemProps) { +export default function ({ text, icon, path, className }: SidebarItemProps) { const router = useRouter(); const [active, setActive] = useState(false); @@ -27,7 +28,7 @@ export default function ({ text, icon, path }: SidebarItemProps) {

{React.cloneElement(icon, { className: `w-4 ${active ? "text-white" : "text-sky-300"}`, diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index fe225fc..4851204 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -119,6 +119,7 @@ export default function ({ className }: { className?: string }) { text={e.name} icon={} path={`/collections/${e.id}`} + className="capitalize" /> ); })} diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 9e919f6..9c10006 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -247,9 +247,11 @@ export default function () { ) : null}
- {sortedLinks.map((e, i) => { - return ; - })} +
+ {sortedLinks.map((e, i) => { + return ; + })} +
); diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 4a7feb3..ebd5adf 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -194,11 +194,16 @@ export default function () { })}
-

New Collection

- +

+ New Collection +

+
diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index c9c8a89..9d7dbfc 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -146,9 +146,11 @@ export default function () { ) : null}
- {sortedLinks.map((e, i) => { - return ; - })} +
+ {sortedLinks.map((e, i) => { + return ; + })} +
); From 0f5f93eaff671d6ed9e703b198cf96d2bac41af3 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 17:52:27 +0330 Subject: [PATCH 067/144] slighter gradient --- components/CollectionCard.tsx | 2 +- pages/collections/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 92f57d1..9d871f2 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -19,7 +19,7 @@ export default function ({ collection }: { collection: ExtendedCollection }) { }); return ( -
+
diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index ebd5adf..e2960cf 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -194,7 +194,7 @@ export default function () { })}

From 824f7c27898d5a90bd9fa007593f2a38bd3f1197 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 22:14:08 +0330 Subject: [PATCH 068/144] much improved collections listing page --- components/CollectionCard.tsx | 106 ++++++++++-- components/LinkList.tsx | 4 +- components/Navbar.tsx | 2 +- components/Sidebar/index.tsx | 24 +-- pages/collections/[id].tsx | 317 +++++++++++++++++++--------------- store/collections.ts | 4 +- 6 files changed, 287 insertions(+), 170 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 9d871f2..05cefc1 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -4,11 +4,21 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faChevronRight, faUser } from "@fortawesome/free-solid-svg-icons"; +import { + faUser, + faPenToSquare, + faTrashCan, + faEllipsis, +} from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; import { ExtendedCollection } from "@/types/global"; import useLinkStore from "@/store/links"; import ImageWithFallback from "./ImageWithFallback"; +import Dropdown from "./Dropdown"; +import { useState } from "react"; +import Modal from "@/components/Modal"; +import EditCollection from "@/components/Modal/EditCollection"; +import DeleteCollection from "@/components/Modal/DeleteCollection"; export default function ({ collection }: { collection: ExtendedCollection }) { const { links } = useLinkStore(); @@ -18,25 +28,42 @@ export default function ({ collection }: { collection: ExtendedCollection }) { day: "numeric", }); + const [expandDropdown, setExpandDropdown] = useState(false); + const [editCollectionModal, setEditCollectionModal] = useState(false); + const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); + + const toggleEditCollectionModal = () => { + setEditCollectionModal(!editCollectionModal); + }; + + const toggleDeleteCollectionModal = () => { + setDeleteCollectionModal(!deleteCollectionModal); + }; + return ( -

+
+
setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="inline-flex absolute top-5 right-5 rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
-
+
-
-

- {collection.name} -

- -
-

{collection.description}

+

+ {collection.name} +

{collection.members + .sort((a, b) => a.userId - b.userId) .map((e, i) => { return ( ); }) - .reverse() - .slice(0, 3)} - {collection.members.length - 3 > 0 ? ( + .slice(0, 4)} + {collection.members.length - 4 > 0 ? (
+{collection.members.length - 3}
) : null}
-
+

{links.filter((e) => e.collectionId === collection.id).length}{" "} Links @@ -68,6 +94,52 @@ export default function ({ collection }: { collection: ExtendedCollection }) {

+ + {expandDropdown ? ( + , + onClick: () => { + toggleEditCollectionModal(); + setExpandDropdown(false); + }, + }, + { + name: "Delete Collection", + icon: , + onClick: () => { + toggleDeleteCollectionModal(); + setExpandDropdown(false); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") setExpandDropdown(false); + }} + className="absolute top-[3.2rem] right-5 z-10 w-44" + /> + ) : null} + + {editCollectionModal ? ( + + + + ) : null} + + {deleteCollectionModal ? ( + + + + ) : null}
); } diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 6ec06f1..3c649fa 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -45,7 +45,7 @@ export default function ({ }; return ( -
+
{editModal ? ( @@ -124,7 +124,7 @@ export default function ({
diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 9542a52..39efd3c 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -66,7 +66,7 @@ export default function () {
New Link diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 4851204..b392a95 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -112,17 +112,19 @@ export default function ({ className }: { className?: string }) {

Collections

- {collections.map((e, i) => { - return ( - } - path={`/collections/${e.id}`} - className="capitalize" - /> - ); - })} + {collections + .sort((a, b) => a.name.localeCompare(b.name)) + .map((e, i) => { + return ( + } + path={`/collections/${e.id}`} + className="capitalize" + /> + ); + })}

Tags

diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 9c10006..2b29068 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -19,6 +19,7 @@ import { faPenToSquare, faSort, faTrashCan, + faUser, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; @@ -26,6 +27,7 @@ import { ChangeEvent, useEffect, useState } from "react"; import MainLayout from "@/layouts/MainLayout"; import RadioButton from "@/components/RadioButton"; import ClickAwayHandler from "@/components/ClickAwayHandler"; +import ImageWithFallback from "@/components/ImageWithFallback"; export default function () { const router = useRouter(); @@ -99,152 +101,193 @@ export default function () { return (
-
-
-
- -

{activeCollection?.name}

-
-
-
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" - className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" - > +
+
+
+
+

+ {activeCollection?.name} +

- {expandDropdown ? ( - , - onClick: () => { - toggleLinkModal(); - setExpandDropdown(false); - }, - }, - { - name: "Edit Collection", - icon: , - onClick: () => { - toggleEditCollectionModal(); - setExpandDropdown(false); - }, - }, - { - name: "Delete Collection", - icon: , - onClick: () => { - toggleDeleteCollectionModal(); - setExpandDropdown(false); - }, - }, - ]} - onClickOutside={(e: Event) => { - const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); - }} - className="absolute top-8 left-0 z-10 w-44" - /> - ) : null} +
- {linkModal ? ( - - - - ) : null} - - {editCollectionModal && activeCollection ? ( - - - - ) : null} - - {deleteCollectionModal && activeCollection ? ( - - - - ) : null} +
+
+
+ View Team +
+ {activeCollection?.members + .sort((a, b) => a.userId - b.userId) + .map((e, i) => { + return ( + +
+ +
+
+ ); + }) + .slice(0, 4)} + {activeCollection?.members.length && + activeCollection.members.length - 4 > 0 ? ( +
+ +{activeCollection?.members?.length - 3} +
+ ) : null} +
-
-
setSortDropdown(!sortDropdown)} - id="sort-dropdown" - className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" - > - -
- - {sortDropdown ? ( - { - const target = e.target as HTMLInputElement; - if (target.id !== "sort-dropdown") setSortDropdown(false); - }} - className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" - > -

- Sort by -

-
- - - - - - - - - - - +

{activeCollection?.description}

+
+
+
setSortDropdown(!sortDropdown)} + id="sort-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > +
- - ) : null} + + {sortDropdown ? ( + { + const target = e.target as HTMLInputElement; + if (target.id !== "sort-dropdown") setSortDropdown(false); + }} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" + > +

+ Sort by +

+
+ + + + + + + + + + + +
+
+ ) : null} +
+
+
setExpandDropdown(!expandDropdown)} + id="edit-dropdown" + className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + > + +
+ {expandDropdown ? ( + , + onClick: () => { + toggleLinkModal(); + setExpandDropdown(false); + }, + }, + { + name: "Edit Collection", + icon: , + onClick: () => { + toggleEditCollectionModal(); + setExpandDropdown(false); + }, + }, + { + name: "Delete Collection", + icon: , + onClick: () => { + toggleDeleteCollectionModal(); + setExpandDropdown(false); + }, + }, + ]} + onClickOutside={(e: Event) => { + const target = e.target as HTMLInputElement; + if (target.id !== "edit-dropdown") + setExpandDropdown(false); + }} + className="absolute top-8 right-0 z-10 w-44" + /> + ) : null} + + {linkModal ? ( + + + + ) : null} + + {editCollectionModal && activeCollection ? ( + + + + ) : null} + + {deleteCollectionModal && activeCollection ? ( + + + + ) : null} +
+
diff --git a/store/collections.ts b/store/collections.ts index 67fb8e4..6a2f9e2 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -23,6 +23,8 @@ const useCollectionStore = create()((set) => ({ const data = await response.json(); + console.log(data); + if (response.ok) set({ collections: data.response }); }, addCollection: async (body) => { @@ -36,8 +38,6 @@ const useCollectionStore = create()((set) => ({ const data = await response.json(); - console.log(data); - if (response.ok) set((state) => ({ collections: [...state.collections, data.response], From a53b8aa4eb62e28d433cf563a4f5bccedc9d49ba Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 25 May 2023 22:15:54 +0330 Subject: [PATCH 069/144] minor bug fixed --- pages/collections/[id].tsx | 59 +++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 2b29068..46d8c7d 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -115,35 +115,40 @@ export default function () {
-
-
-
- View Team -
- {activeCollection?.members - .sort((a, b) => a.userId - b.userId) - .map((e, i) => { - return ( - -
- -
-
- ); - }) - .slice(0, 4)} - {activeCollection?.members.length && - activeCollection.members.length - 4 > 0 ? ( -
- +{activeCollection?.members?.length - 3} + {activeCollection?.members[0] ? ( +
+
+
+ View Team
- ) : null} + {activeCollection?.members + .sort((a, b) => a.userId - b.userId) + .map((e, i) => { + return ( + +
+ +
+
+ ); + }) + .slice(0, 4)} + {activeCollection?.members.length && + activeCollection.members.length - 4 > 0 ? ( +
+ +{activeCollection?.members?.length - 3} +
+ ) : null} +
-
+ ) : null}
From 2717e45253c8caee02933a04a4adf687d87c9c2c Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 26 May 2023 05:48:02 +0330 Subject: [PATCH 070/144] minor fix --- components/CollectionCard.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 05cefc1..7a12785 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -55,11 +55,9 @@ export default function ({ collection }: { collection: ExtendedCollection }) {
-
-

- {collection.name} -

-
+

+ {collection.name} +

{collection.members From ffecdf21a0428aeab983b3f4c1e5d326608f2ccc Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 26 May 2023 05:51:35 +0330 Subject: [PATCH 071/144] minor change --- components/Sidebar/index.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index b392a95..a335eaa 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -130,16 +130,18 @@ export default function ({ className }: { className?: string }) {

Tags

- {tags.map((e, i) => { - return ( - } - path={`/tags/${e.id}`} - /> - ); - })} + {tags + .sort((a, b) => a.name.localeCompare(b.name)) + .map((e, i) => { + return ( + } + path={`/tags/${e.id}`} + /> + ); + })}
); From 7f3d93517d9a269764bf79284041a56670644daa Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 26 May 2023 23:22:18 +0330 Subject: [PATCH 072/144] changes/fixes + some WIP --- components/CollectionCard.tsx | 4 +- components/Dropdown.tsx | 2 +- components/Modal/AddCollection.tsx | 9 +- components/Modal/EditCollection.tsx | 26 ++- components/Modal/Team.tsx | 265 ++++++++++++++++++++++++ components/Modal/UserSettings.tsx | 10 - components/Sidebar/SidebarItem.tsx | 6 +- lib/api/controllers/users/updateUser.ts | 2 +- pages/collections/[id].tsx | 16 +- 9 files changed, 314 insertions(+), 26 deletions(-) create mode 100644 components/Modal/Team.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 7a12785..38a554e 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -41,7 +41,7 @@ export default function ({ collection }: { collection: ExtendedCollection }) { }; return ( -
+
setExpandDropdown(!expandDropdown)} id="edit-dropdown" @@ -54,7 +54,7 @@ export default function ({ collection }: { collection: ExtendedCollection }) { />
-
+

{collection.name}

diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index 2542cd1..1eff26f 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -24,7 +24,7 @@ export default function ({ onClickOutside, className, items }: Props) { return ( {items.map((e, i) => { const inner = ( diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index b287d51..e949c28 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -5,7 +5,12 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faClose, faPlus, faUser } from "@fortawesome/free-solid-svg-icons"; +import { + faClose, + faPlus, + faUser, + faUserPlus, +} from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { ExtendedCollection, NewCollection } from "@/types/global"; import { useSession } from "next-auth/react"; @@ -111,7 +116,7 @@ export default function AddCollection({ toggleCollectionModal }: Props) { } className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" > - +
diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index a30c8cb..46359ac 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -11,6 +11,7 @@ import { faPlus, faTrashCan, faUser, + faUserPlus, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { ExtendedCollection } from "@/types/global"; @@ -20,6 +21,7 @@ import DeleteCollection from "@/components/Modal/DeleteCollection"; import RequiredBadge from "../RequiredBadge"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; import ImageWithFallback from "../ImageWithFallback"; +import Checkbox from "../Checkbox"; type Props = { toggleCollectionModal: Function; @@ -102,9 +104,27 @@ export default function EditCollection({
-
+
+ + {/*

Sharing & Collaboration Settings

+ +

Collaboration

+ +
+
+ Manage Team +
+
+ + console.log("Clicked!")} + /> +

+ This will let anyone to access this collection. +

*/} -

Members

- +
{activeCollection.members[0] ? ( diff --git a/components/Modal/Team.tsx b/components/Modal/Team.tsx new file mode 100644 index 0000000..b287d51 --- /dev/null +++ b/components/Modal/Team.tsx @@ -0,0 +1,265 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import React, { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faClose, faPlus, faUser } from "@fortawesome/free-solid-svg-icons"; +import useCollectionStore from "@/store/collections"; +import { ExtendedCollection, NewCollection } from "@/types/global"; +import { useSession } from "next-auth/react"; +import RequiredBadge from "../RequiredBadge"; +import addMemberToCollection from "@/lib/client/addMemberToCollection"; +import ImageWithFallback from "../ImageWithFallback"; + +type Props = { + toggleCollectionModal: Function; +}; + +export default function AddCollection({ toggleCollectionModal }: Props) { + const [newCollection, setNewCollection] = useState({ + name: "", + description: "", + members: [], + }); + + const [memberEmail, setMemberEmail] = useState(""); + + const { addCollection } = useCollectionStore(); + + const session = useSession(); + + const submit = async () => { + console.log(newCollection); + + const response = await addCollection(newCollection as NewCollection); + + if (response) toggleCollectionModal(); + }; + + const setMemberState = (newMember: any) => { + setNewCollection({ + ...newCollection, + members: [...newCollection.members, newMember], + }); + + setMemberEmail(""); + }; + + return ( +
+

New Collection

+ +
+
+

+ Name + +

+ + setNewCollection({ ...newCollection, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Collection" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Description

+ + setNewCollection({ + ...newCollection, + description: e.target.value, + }) + } + type="text" + placeholder="Collection description" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+
+ +
+ +

Members

+
+ { + setMemberEmail(e.target.value); + }} + type="text" + placeholder="Email" + className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> + +
+ addMemberToCollection( + session.data?.user.email as string, + memberEmail, + newCollection as unknown as ExtendedCollection, + setMemberState, + "ADD" + ) + } + className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" + > + +
+
+ + {newCollection.members[0] ? ( +

+ (All Members have Read access to this collection.) +

+ ) : null} + +
+ {newCollection.members.map((e, i) => { + return ( +
+ { + const updatedMembers = newCollection.members.filter( + (member) => { + return member.email !== e.email; + } + ); + setNewCollection({ + ...newCollection, + members: updatedMembers, + }); + }} + /> +
+ +
+ +
+
+
+

{e.name}

+

{e.email}

+
+
+
+
+

Permissions

+

+ (Click to toggle.) +

+
+ +
+ + + + + +
+
+
+ ); + })} +
+ +
+ + Add Collection +
+
+ ); +} diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index aef239e..3c1b308 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -41,16 +41,6 @@ export default function UserSettings({ toggleSettingsModal }: Props) { setUser({ ...user, oldPassword, newPassword }); }; - // useEffect(() => { - // const determineProfilePicSource = async () => { - // const path = `/api/avatar/${account.id}`; - // const imageExists = await avatarExists(path).catch((e) => console.log(e)); - // if (imageExists) setUser({ ...user, profilePic: path }); - // }; - - // determineProfilePicSource(); - // }, []); - useEffect(() => { setUser({ ...user, diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index 45bf85a..c104d35 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -28,12 +28,14 @@ export default function ({ text, icon, path, className }: SidebarItemProps) {
{React.cloneElement(icon, { className: `w-4 ${active ? "text-white" : "text-sky-300"}`, })} -

{text}

+

+ {text} +

); diff --git a/lib/api/controllers/users/updateUser.ts b/lib/api/controllers/users/updateUser.ts index 2630867..5ca5b06 100644 --- a/lib/api/controllers/users/updateUser.ts +++ b/lib/api/controllers/users/updateUser.ts @@ -12,7 +12,7 @@ import bcrypt from "bcrypt"; export default async function (user: AccountSettings, userId: number) { const profilePic = user.profilePic; - if (profilePic && profilePic !== "DELETE") { + if (profilePic?.startsWith("data:image/jpeg;base64")) { if ((user?.profilePic?.length as number) < 1572864) { try { const filePath = path.join( diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 46d8c7d..48d7856 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -28,6 +28,7 @@ import MainLayout from "@/layouts/MainLayout"; import RadioButton from "@/components/RadioButton"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import ImageWithFallback from "@/components/ImageWithFallback"; +import { useSession } from "next-auth/react"; export default function () { const router = useRouter(); @@ -35,6 +36,8 @@ export default function () { const { links } = useLinkStore(); const { collections } = useCollectionStore(); + const { data } = useSession(); + const [expandDropdown, setExpandDropdown] = useState(false); const [linkModal, setLinkModal] = useState(false); const [editCollectionModal, setEditCollectionModal] = useState(false); @@ -102,7 +105,7 @@ export default function () {
-
+
-
-
- View Team +
+
+ {activeCollection.ownerId === data?.user.id + ? "Manage" + : "View"}{" "} + Team
{activeCollection?.members .sort((a, b) => a.userId - b.userId) @@ -143,7 +149,7 @@ export default function () { {activeCollection?.members.length && activeCollection.members.length - 4 > 0 ? (
- +{activeCollection?.members?.length - 3} + +{activeCollection?.members?.length - 4}
) : null}
From f26ffa7323fd7801088cf06016d1ba52bde81add Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 07:41:29 +0330 Subject: [PATCH 073/144] improved typesafety --- components/CollectionCard.tsx | 16 +- components/Dashboard/CollectionItem.tsx | 14 +- components/Modal/AddCollection.tsx | 332 ++++++++++-------- components/Modal/DeleteCollection.tsx | 6 +- components/Modal/EditCollection.tsx | 107 +++--- components/Modal/Team.tsx | 265 -------------- .../controllers/collections/postCollection.ts | 9 +- .../collections/updateCollection.ts | 9 +- lib/client/addMemberToCollection.ts | 48 +-- pages/collections/[id].tsx | 10 +- store/collections.ts | 10 +- types/global.ts | 30 +- 12 files changed, 321 insertions(+), 535 deletions(-) delete mode 100644 components/Modal/Team.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 38a554e..ffde8ee 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -11,7 +11,7 @@ import { faEllipsis, } from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; -import { ExtendedCollection } from "@/types/global"; +import { CollectionIncludingMembers } from "@/types/global"; import useLinkStore from "@/store/links"; import ImageWithFallback from "./ImageWithFallback"; import Dropdown from "./Dropdown"; @@ -20,9 +20,15 @@ import Modal from "@/components/Modal"; import EditCollection from "@/components/Modal/EditCollection"; import DeleteCollection from "@/components/Modal/DeleteCollection"; -export default function ({ collection }: { collection: ExtendedCollection }) { +export default function ({ + collection, +}: { + collection: CollectionIncludingMembers; +}) { const { links } = useLinkStore(); - const formattedDate = new Date(collection.createdAt).toLocaleString("en-US", { + const formattedDate = new Date( + collection.createdAt as unknown as string + ).toLocaleString("en-US", { year: "numeric", month: "short", day: "numeric", @@ -61,7 +67,7 @@ export default function ({ collection }: { collection: ExtendedCollection }) {
{collection.members - .sort((a, b) => a.userId - b.userId) + .sort((a, b) => (a.user.id as number) - (b.user.id as number)) .map((e, i) => { return ( ) : null} diff --git a/components/Dashboard/CollectionItem.tsx b/components/Dashboard/CollectionItem.tsx index 5afd8a5..6053f69 100644 --- a/components/Dashboard/CollectionItem.tsx +++ b/components/Dashboard/CollectionItem.tsx @@ -6,16 +6,15 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; -import { ExtendedCollection } from "@/types/global"; +import { CollectionIncludingMembers } from "@/types/global"; import useLinkStore from "@/store/links"; -export default function ({ collection }: { collection: ExtendedCollection }) { +export default function ({ + collection, +}: { + collection: CollectionIncludingMembers; +}) { const { links } = useLinkStore(); - const formattedDate = new Date(collection.createdAt).toLocaleString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - }); return (
-

{formattedDate}

{links.filter((e) => e.collectionId === collection.id).length} Links

diff --git a/components/Modal/AddCollection.tsx b/components/Modal/AddCollection.tsx index e949c28..00157c5 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/AddCollection.tsx @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, @@ -12,7 +12,7 @@ import { faUserPlus, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; -import { ExtendedCollection, NewCollection } from "@/types/global"; +import { CollectionIncludingMembers, Member } from "@/types/global"; import { useSession } from "next-auth/react"; import RequiredBadge from "../RequiredBadge"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; @@ -23,33 +23,52 @@ type Props = { }; export default function AddCollection({ toggleCollectionModal }: Props) { - const [newCollection, setNewCollection] = useState({ + const session = useSession(); + + const [collection, setCollection] = useState({ name: "", description: "", + ownerId: session.data?.user.id as number, members: [], }); - const [memberEmail, setMemberEmail] = useState(""); + const [member, setMember] = useState({ + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: "", + email: "", + }, + }); const { addCollection } = useCollectionStore(); - const session = useSession(); - const submit = async () => { - console.log(newCollection); + if (!collection) return null; - const response = await addCollection(newCollection as NewCollection); + const response = await addCollection(collection); if (response) toggleCollectionModal(); }; - const setMemberState = (newMember: any) => { - setNewCollection({ - ...newCollection, - members: [...newCollection.members, newMember], + const setMemberState = (newMember: Member) => { + if (!collection) return null; + + setCollection({ + ...collection, + members: [...collection.members, newMember], }); - setMemberEmail(""); + setMember({ + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: "", + email: "", + }, + }); }; return ( @@ -63,9 +82,9 @@ export default function AddCollection({ toggleCollectionModal }: Props) {

- setNewCollection({ ...newCollection, name: e.target.value }) + setCollection({ ...collection, name: e.target.value }) } type="text" placeholder="e.g. Example Collection" @@ -76,10 +95,10 @@ export default function AddCollection({ toggleCollectionModal }: Props) {

Description

- setNewCollection({ - ...newCollection, + setCollection({ + ...collection, description: e.target.value, }) } @@ -95,9 +114,12 @@ export default function AddCollection({ toggleCollectionModal }: Props) {

Members

{ - setMemberEmail(e.target.value); + setMember({ + ...member, + user: { ...member.user, email: e.target.value }, + }); }} type="text" placeholder="Email" @@ -108,10 +130,9 @@ export default function AddCollection({ toggleCollectionModal }: Props) { onClick={() => addMemberToCollection( session.data?.user.email as string, - memberEmail, - newCollection as unknown as ExtendedCollection, - setMemberState, - "ADD" + member.user.email as string, + collection, + setMemberState ) } className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" @@ -120,143 +141,148 @@ export default function AddCollection({ toggleCollectionModal }: Props) {
- {newCollection.members[0] ? ( -

- (All Members have Read access to this collection.) -

- ) : null} + {collection?.members[0]?.user ? ( + <> +

+ (All Members have Read access to this collection.) +

-
- {newCollection.members.map((e, i) => { - return ( -
- { - const updatedMembers = newCollection.members.filter( - (member) => { - return member.email !== e.email; - } - ); - setNewCollection({ - ...newCollection, - members: updatedMembers, - }); - }} - /> -
- + {collection.members.map((e, i) => { + return ( +
-
- + { + const updatedMembers = collection.members.filter( + (member) => { + return member.user.email !== e.user.email; + } + ); + setCollection({ + ...collection, + members: updatedMembers, + }); + }} + /> +
+ +
+ +
+
+
+

+ {e.user.name} +

+

{e.user.email}

+
- -
-

{e.name}

-

{e.email}

-
-
-
-
-

Permissions

-

- (Click to toggle.) -

-
+
+
+

+ Permissions +

+

+ (Click to toggle.) +

+
-
- +
+ - + - + +
+
-
-
- ); - })} -
+ ); + })} +
+ + ) : null}
{ + if (!collection.id) return null; + const response = await removeCollection(collection.id); if (response) { toggleDeleteCollectionModal(); diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx index 46359ac..96e02bd 100644 --- a/components/Modal/EditCollection.tsx +++ b/components/Modal/EditCollection.tsx @@ -8,13 +8,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, faPenToSquare, - faPlus, faTrashCan, faUser, faUserPlus, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; -import { ExtendedCollection } from "@/types/global"; +import { CollectionIncludingMembers, Member } from "@/types/global"; import { useSession } from "next-auth/react"; import Modal from "@/components/Modal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; @@ -25,17 +24,25 @@ import Checkbox from "../Checkbox"; type Props = { toggleCollectionModal: Function; - collection: ExtendedCollection; + activeCollection: CollectionIncludingMembers; }; export default function EditCollection({ toggleCollectionModal, - collection, + activeCollection, }: Props) { - const [activeCollection, setActiveCollection] = - useState(collection); + const [collection, setCollection] = + useState(activeCollection); - const [memberEmail, setMemberEmail] = useState(""); + const [member, setMember] = useState({ + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: "", + email: "", + }, + }); const { updateCollection } = useCollectionStore(); @@ -47,21 +54,29 @@ export default function EditCollection({ const session = useSession(); - const setMemberState = (newMember: any) => { - setActiveCollection({ - ...activeCollection, - members: [...activeCollection.members, newMember], + const setMemberState = (newMember: Member) => { + if (!collection) return null; + + setCollection({ + ...collection, + members: [...collection.members, newMember], }); - setMemberEmail(""); + setMember({ + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: "", + email: "", + }, + }); }; const submit = async () => { - console.log(activeCollection); + if (!collection) return null; - const response = await updateCollection( - activeCollection as ExtendedCollection - ); + const response = await updateCollection(collection); if (response) toggleCollectionModal(); }; @@ -77,9 +92,9 @@ export default function EditCollection({

- setActiveCollection({ ...activeCollection, name: e.target.value }) + setCollection({ ...collection, name: e.target.value }) } type="text" placeholder="e.g. Example Collection" @@ -90,10 +105,10 @@ export default function EditCollection({

Description

- setActiveCollection({ - ...activeCollection, + setCollection({ + ...collection, description: e.target.value, }) } @@ -127,9 +142,12 @@ export default function EditCollection({
{ - setMemberEmail(e.target.value); + setMember({ + ...member, + user: { ...member.user, email: e.target.value }, + }); }} type="text" placeholder="Email" @@ -140,10 +158,9 @@ export default function EditCollection({ onClick={() => addMemberToCollection( session.data?.user.email as string, - memberEmail, - activeCollection, - setMemberState, - "UPDATE" + member.user.email, + collection, + setMemberState ) } className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" @@ -151,14 +168,14 @@ export default function EditCollection({
- {activeCollection.members[0] ? ( + {collection.members[0] ? (

(All Members have Read access to this collection.)

) : null}
- {activeCollection.members.map((e, i) => { + {collection.members.map((e, i) => { return (
{ - const updatedMembers = activeCollection.members.filter( - (member) => { - return member.user.email !== e.user.email; - } - ); - setActiveCollection({ - ...activeCollection, + const updatedMembers = collection.members.filter((member) => { + return member.user.email !== e.user.email; + }); + setCollection({ + ...collection, members: updatedMembers, }); }} @@ -213,7 +228,7 @@ export default function EditCollection({ className="peer sr-only" checked={e.canCreate} onChange={() => { - const updatedMembers = activeCollection.members.map( + const updatedMembers = collection.members.map( (member) => { if (member.user.email === e.user.email) { return { ...member, canCreate: !e.canCreate }; @@ -221,8 +236,8 @@ export default function EditCollection({ return member; } ); - setActiveCollection({ - ...activeCollection, + setCollection({ + ...collection, members: updatedMembers, }); }} @@ -239,7 +254,7 @@ export default function EditCollection({ className="peer sr-only" checked={e.canUpdate} onChange={() => { - const updatedMembers = activeCollection.members.map( + const updatedMembers = collection.members.map( (member) => { if (member.user.email === e.user.email) { return { ...member, canUpdate: !e.canUpdate }; @@ -247,8 +262,8 @@ export default function EditCollection({ return member; } ); - setActiveCollection({ - ...activeCollection, + setCollection({ + ...collection, members: updatedMembers, }); }} @@ -265,7 +280,7 @@ export default function EditCollection({ className="peer sr-only" checked={e.canDelete} onChange={() => { - const updatedMembers = activeCollection.members.map( + const updatedMembers = collection.members.map( (member) => { if (member.user.email === e.user.email) { return { ...member, canDelete: !e.canDelete }; @@ -273,8 +288,8 @@ export default function EditCollection({ return member; } ); - setActiveCollection({ - ...activeCollection, + setCollection({ + ...collection, members: updatedMembers, }); }} @@ -320,7 +335,7 @@ export default function EditCollection({ {deleteCollectionModal ? ( diff --git a/components/Modal/Team.tsx b/components/Modal/Team.tsx deleted file mode 100644 index b287d51..0000000 --- a/components/Modal/Team.tsx +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - -import React, { useState } from "react"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faClose, faPlus, faUser } from "@fortawesome/free-solid-svg-icons"; -import useCollectionStore from "@/store/collections"; -import { ExtendedCollection, NewCollection } from "@/types/global"; -import { useSession } from "next-auth/react"; -import RequiredBadge from "../RequiredBadge"; -import addMemberToCollection from "@/lib/client/addMemberToCollection"; -import ImageWithFallback from "../ImageWithFallback"; - -type Props = { - toggleCollectionModal: Function; -}; - -export default function AddCollection({ toggleCollectionModal }: Props) { - const [newCollection, setNewCollection] = useState({ - name: "", - description: "", - members: [], - }); - - const [memberEmail, setMemberEmail] = useState(""); - - const { addCollection } = useCollectionStore(); - - const session = useSession(); - - const submit = async () => { - console.log(newCollection); - - const response = await addCollection(newCollection as NewCollection); - - if (response) toggleCollectionModal(); - }; - - const setMemberState = (newMember: any) => { - setNewCollection({ - ...newCollection, - members: [...newCollection.members, newMember], - }); - - setMemberEmail(""); - }; - - return ( -
-

New Collection

- -
-
-

- Name - -

- - setNewCollection({ ...newCollection, name: e.target.value }) - } - type="text" - placeholder="e.g. Example Collection" - className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
- -
-

Description

- - setNewCollection({ - ...newCollection, - description: e.target.value, - }) - } - type="text" - placeholder="Collection description" - className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
-
- -
- -

Members

-
- { - setMemberEmail(e.target.value); - }} - type="text" - placeholder="Email" - className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> - -
- addMemberToCollection( - session.data?.user.email as string, - memberEmail, - newCollection as unknown as ExtendedCollection, - setMemberState, - "ADD" - ) - } - className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" - > - -
-
- - {newCollection.members[0] ? ( -

- (All Members have Read access to this collection.) -

- ) : null} - -
- {newCollection.members.map((e, i) => { - return ( -
- { - const updatedMembers = newCollection.members.filter( - (member) => { - return member.email !== e.email; - } - ); - setNewCollection({ - ...newCollection, - members: updatedMembers, - }); - }} - /> -
- -
- -
-
-
-

{e.name}

-

{e.email}

-
-
-
-
-

Permissions

-

- (Click to toggle.) -

-
- -
- - - - - -
-
-
- ); - })} -
- -
- - Add Collection -
-
- ); -} diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index 3de0478..5957b95 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -4,10 +4,13 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { prisma } from "@/lib/api/db"; -import { NewCollection } from "@/types/global"; +import { CollectionIncludingMembers } from "@/types/global"; import { existsSync, mkdirSync } from "fs"; -export default async function (collection: NewCollection, userId: number) { +export default async function ( + collection: CollectionIncludingMembers, + userId: number +) { if (!collection || collection.name.trim() === "") return { response: "Please enter a valid collection.", @@ -43,7 +46,7 @@ export default async function (collection: NewCollection, userId: number) { description: collection.description, members: { create: collection.members.map((e) => ({ - user: { connect: { email: e.email } }, + user: { connect: { email: e.user.email } }, canCreate: e.canCreate, canUpdate: e.canUpdate, canDelete: e.canDelete, diff --git a/lib/api/controllers/collections/updateCollection.ts b/lib/api/controllers/collections/updateCollection.ts index 4815fe4..ff172f5 100644 --- a/lib/api/controllers/collections/updateCollection.ts +++ b/lib/api/controllers/collections/updateCollection.ts @@ -4,11 +4,14 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { prisma } from "@/lib/api/db"; -import { ExtendedCollection } from "@/types/global"; +import { CollectionIncludingMembers } from "@/types/global"; import getPermission from "@/lib/api/getPermission"; -export default async function (collection: ExtendedCollection, userId: number) { - if (!collection) +export default async function ( + collection: CollectionIncludingMembers, + userId: number +) { + if (!collection.id) return { response: "Please choose a valid collection.", status: 401 }; const collectionIsAccessible = await getPermission(userId, collection.id); diff --git a/lib/client/addMemberToCollection.ts b/lib/client/addMemberToCollection.ts index dd8002f..6c64610 100644 --- a/lib/client/addMemberToCollection.ts +++ b/lib/client/addMemberToCollection.ts @@ -1,15 +1,15 @@ -import { ExtendedCollection, NewCollection } from "@/types/global"; +import { CollectionIncludingMembers, Member } from "@/types/global"; import getPublicUserDataByEmail from "./getPublicUserDataByEmail"; const addMemberToCollection = async ( ownerEmail: string, memberEmail: string, - collection: ExtendedCollection, - setMemberState: Function, - collectionMethod: "ADD" | "UPDATE" + collection: CollectionIncludingMembers, + setMember: (newMember: Member) => null | undefined ) => { - const checkIfMemberAlreadyExists = collection.members.find((e: any) => { - const email = collectionMethod === "ADD" ? e.email : e.user.email; + console.log(collection.members); + const checkIfMemberAlreadyExists = collection.members.find((e) => { + const email = e.user.email; return email === memberEmail; }); @@ -24,30 +24,20 @@ const addMemberToCollection = async ( // Lookup, get data/err, list ... const user = await getPublicUserDataByEmail(memberEmail.trim()); - if (user.email) { - const newMember = - collectionMethod === "ADD" - ? { - id: user.id, - name: user.name, - email: user.email, - canCreate: false, - canUpdate: false, - canDelete: false, - } - : { - collectionId: collection.id, - userId: user.id, - canCreate: false, - canUpdate: false, - canDelete: false, - user: { - name: user.name, - email: user.email, - }, - }; + console.log(collection); - setMemberState(newMember); + if (user.email) { + setMember({ + collectionId: collection.id, + userId: user.id, + canCreate: false, + canUpdate: false, + canDelete: false, + user: { + name: user.name, + email: user.email, + }, + }); } } }; diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 48d7856..59b2d17 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -11,7 +11,7 @@ import EditCollection from "@/components/Modal/EditCollection"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; -import { ExtendedCollection } from "@/types/global"; +import { CollectionIncludingMembers } from "@/types/global"; import { faAdd, faEllipsis, @@ -46,7 +46,7 @@ export default function () { const [sortBy, setSortBy] = useState("Name (A-Z)"); const [activeCollection, setActiveCollection] = - useState(); + useState(); const [sortedLinks, setSortedLinks] = useState(links); @@ -128,7 +128,9 @@ export default function () { Team
{activeCollection?.members - .sort((a, b) => a.userId - b.userId) + .sort( + (a, b) => (a.user.id as number) - (b.user.id as number) + ) .map((e, i) => { return ( ) : null} diff --git a/store/collections.ts b/store/collections.ts index 6a2f9e2..05d7efe 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -4,15 +4,17 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { create } from "zustand"; -import { ExtendedCollection, NewCollection } from "@/types/global"; +import { CollectionIncludingMembers } from "@/types/global"; import useTagStore from "./tags"; import useLinkStore from "./links"; type CollectionStore = { - collections: ExtendedCollection[]; + collections: CollectionIncludingMembers[]; setCollections: () => void; - addCollection: (body: NewCollection) => Promise; - updateCollection: (collection: ExtendedCollection) => Promise; + addCollection: (body: CollectionIncludingMembers) => Promise; + updateCollection: ( + collection: CollectionIncludingMembers + ) => Promise; removeCollection: (collectionId: number) => Promise; }; diff --git a/types/global.ts b/types/global.ts index 107cbab..61e1f65 100644 --- a/types/global.ts +++ b/types/global.ts @@ -4,7 +4,9 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { Collection, Link, Tag, User } from "@prisma/client"; -import { SetStateAction } from "react"; + +type OptionalExcluding = Partial & + Pick; export interface ExtendedLink extends Link { tags: Tag[]; @@ -34,18 +36,20 @@ export interface NewCollection { }[]; } -export interface ExtendedCollection extends Collection { - members: { - collectionId: number; - userId: number; - canCreate: boolean; - canUpdate: boolean; - canDelete: boolean; - user: { - name: string; - email: string; - }; - }[]; +export interface Member { + collectionId?: number; + userId?: number; + canCreate: boolean; + canUpdate: boolean; + canDelete: boolean; + user: OptionalExcluding; +} + +export interface CollectionIncludingMembers + extends Omit { + id?: number; + createdAt?: Date; + members: Member[]; } export type SearchSettings = { From 8af9a36dfaa070276224342490918e192baebe6c Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 07:59:45 +0330 Subject: [PATCH 074/144] cleaner code --- components/CollectionCard.tsx | 20 +- components/Modal/ChangePassword.tsx | 2 +- ...{AddCollection.tsx => CollectionModal.tsx} | 119 ++++-- components/Modal/DeleteCollection.tsx | 4 +- components/Modal/EditCollection.tsx | 345 ------------------ pages/collections/[id].tsx | 5 +- pages/collections/index.tsx | 22 +- types/global.ts | 2 +- 8 files changed, 127 insertions(+), 392 deletions(-) rename components/Modal/{AddCollection.tsx => CollectionModal.tsx} (77%) delete mode 100644 components/Modal/EditCollection.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index ffde8ee..34c8cd0 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -17,7 +17,7 @@ import ImageWithFallback from "./ImageWithFallback"; import Dropdown from "./Dropdown"; import { useState } from "react"; import Modal from "@/components/Modal"; -import EditCollection from "@/components/Modal/EditCollection"; +import CollectionModal from "@/components/Modal/CollectionModal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; export default function ({ @@ -26,13 +26,14 @@ export default function ({ collection: CollectionIncludingMembers; }) { const { links } = useLinkStore(); - const formattedDate = new Date( - collection.createdAt as unknown as string - ).toLocaleString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - }); + const formattedDate = new Date(collection.createdAt as string).toLocaleString( + "en-US", + { + year: "numeric", + month: "short", + day: "numeric", + } + ); const [expandDropdown, setExpandDropdown] = useState(false); const [editCollectionModal, setEditCollectionModal] = useState(false); @@ -129,9 +130,10 @@ export default function ({ {editCollectionModal ? ( - ) : null} diff --git a/components/Modal/ChangePassword.tsx b/components/Modal/ChangePassword.tsx index 110315e..a719f74 100644 --- a/components/Modal/ChangePassword.tsx +++ b/components/Modal/ChangePassword.tsx @@ -12,7 +12,7 @@ type Props = { setPasswordForm: Function; }; -export default function AddCollection({ +export default function ChangePassword({ togglePasswordFormModal, user, setPasswordForm, diff --git a/components/Modal/AddCollection.tsx b/components/Modal/CollectionModal.tsx similarity index 77% rename from components/Modal/AddCollection.tsx rename to components/Modal/CollectionModal.tsx index 00157c5..989ea72 100644 --- a/components/Modal/AddCollection.tsx +++ b/components/Modal/CollectionModal.tsx @@ -3,34 +3,38 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, - faPlus, + faPenToSquare, + faTrashCan, faUser, faUserPlus, } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; import { CollectionIncludingMembers, Member } from "@/types/global"; import { useSession } from "next-auth/react"; +import Modal from "@/components/Modal"; +import DeleteCollection from "@/components/Modal/DeleteCollection"; import RequiredBadge from "../RequiredBadge"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; import ImageWithFallback from "../ImageWithFallback"; +import Checkbox from "../Checkbox"; type Props = { toggleCollectionModal: Function; + activeCollection: CollectionIncludingMembers; + method: "CREATE" | "UPDATE"; }; -export default function AddCollection({ toggleCollectionModal }: Props) { - const session = useSession(); - - const [collection, setCollection] = useState({ - name: "", - description: "", - ownerId: session.data?.user.id as number, - members: [], - }); +export default function CollectionModal({ + toggleCollectionModal, + activeCollection, + method, +}: Props) { + const [collection, setCollection] = + useState(activeCollection); const [member, setMember] = useState({ canCreate: false, @@ -42,16 +46,16 @@ export default function AddCollection({ toggleCollectionModal }: Props) { }, }); - const { addCollection } = useCollectionStore(); + const { updateCollection, addCollection } = useCollectionStore(); - const submit = async () => { - if (!collection) return null; + const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); - const response = await addCollection(collection); - - if (response) toggleCollectionModal(); + const toggleDeleteCollectionModal = () => { + setDeleteCollectionModal(!deleteCollectionModal); }; + const session = useSession(); + const setMemberState = (newMember: Member) => { if (!collection) return null; @@ -71,9 +75,23 @@ export default function AddCollection({ toggleCollectionModal }: Props) { }); }; + const submit = async () => { + if (!collection) return null; + + let response = null; + + if (method === "CREATE") response = await updateCollection(collection); + else if (method === "UPDATE") response = await addCollection(collection); + else console.log("Unknown method."); + + if (response) toggleCollectionModal(); + }; + return (
-

New Collection

+

+ {method === "CREATE" ? "Add" : "Edit"} Collection +

@@ -109,9 +127,27 @@ export default function AddCollection({ toggleCollectionModal }: Props) {
-
+
+ + {/*

Sharing & Collaboration Settings

+ +

Collaboration

+ +
+
+ Manage Team +
+
+ + console.log("Clicked!")} + /> +

+ This will let anyone to access this collection. +

*/} -

Members

addMemberToCollection( session.data?.user.email as string, - member.user.email as string, + member.user.email, collection, setMemberState ) @@ -140,7 +176,6 @@ export default function AddCollection({ toggleCollectionModal }: Props) {
- {collection?.members[0]?.user ? ( <>

@@ -284,13 +319,41 @@ export default function AddCollection({ toggleCollectionModal }: Props) { ) : null} -

- - Add Collection +
+
+ + Edit Collection +
+ +
+
+ +

OR

+ +
+
+ +
{ + toggleDeleteCollectionModal(); + }} + className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" + > + +
+ + {deleteCollectionModal ? ( + + + + ) : null}
); } diff --git a/components/Modal/DeleteCollection.tsx b/components/Modal/DeleteCollection.tsx index 0cd8dde..a658f21 100644 --- a/components/Modal/DeleteCollection.tsx +++ b/components/Modal/DeleteCollection.tsx @@ -5,7 +5,7 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faPlus, faTrashCan } from "@fortawesome/free-solid-svg-icons"; +import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; import { CollectionIncludingMembers } from "@/types/global"; import useCollectionStore from "@/store/collections"; import { useRouter } from "next/router"; @@ -15,7 +15,7 @@ type Props = { collection: CollectionIncludingMembers; }; -export default function AddCollection({ +export default function DeleteCollection({ toggleDeleteCollectionModal, collection, }: Props) { diff --git a/components/Modal/EditCollection.tsx b/components/Modal/EditCollection.tsx deleted file mode 100644 index 96e02bd..0000000 --- a/components/Modal/EditCollection.tsx +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - -import React, { useState } from "react"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { - faClose, - faPenToSquare, - faTrashCan, - faUser, - faUserPlus, -} from "@fortawesome/free-solid-svg-icons"; -import useCollectionStore from "@/store/collections"; -import { CollectionIncludingMembers, Member } from "@/types/global"; -import { useSession } from "next-auth/react"; -import Modal from "@/components/Modal"; -import DeleteCollection from "@/components/Modal/DeleteCollection"; -import RequiredBadge from "../RequiredBadge"; -import addMemberToCollection from "@/lib/client/addMemberToCollection"; -import ImageWithFallback from "../ImageWithFallback"; -import Checkbox from "../Checkbox"; - -type Props = { - toggleCollectionModal: Function; - activeCollection: CollectionIncludingMembers; -}; - -export default function EditCollection({ - toggleCollectionModal, - activeCollection, -}: Props) { - const [collection, setCollection] = - useState(activeCollection); - - const [member, setMember] = useState({ - canCreate: false, - canUpdate: false, - canDelete: false, - user: { - name: "", - email: "", - }, - }); - - const { updateCollection } = useCollectionStore(); - - const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); - - const toggleDeleteCollectionModal = () => { - setDeleteCollectionModal(!deleteCollectionModal); - }; - - const session = useSession(); - - const setMemberState = (newMember: Member) => { - if (!collection) return null; - - setCollection({ - ...collection, - members: [...collection.members, newMember], - }); - - setMember({ - canCreate: false, - canUpdate: false, - canDelete: false, - user: { - name: "", - email: "", - }, - }); - }; - - const submit = async () => { - if (!collection) return null; - - const response = await updateCollection(collection); - - if (response) toggleCollectionModal(); - }; - - return ( -
-

Edit Collection

- -
-
-

- Name - -

- - setCollection({ ...collection, name: e.target.value }) - } - type="text" - placeholder="e.g. Example Collection" - className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
- -
-

Description

- - setCollection({ - ...collection, - description: e.target.value, - }) - } - type="text" - placeholder="Collection description" - className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
-
- -
- - {/*

Sharing & Collaboration Settings

- -

Collaboration

- -
-
- Manage Team -
-
- - console.log("Clicked!")} - /> -

- This will let anyone to access this collection. -

*/} - -
- { - setMember({ - ...member, - user: { ...member.user, email: e.target.value }, - }); - }} - type="text" - placeholder="Email" - className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> - -
- addMemberToCollection( - session.data?.user.email as string, - member.user.email, - collection, - setMemberState - ) - } - className="absolute flex items-center justify-center right-2 top-2 bottom-2 bg-sky-500 hover:bg-sky-400 duration-100 text-white w-9 rounded-md cursor-pointer" - > - -
-
- {collection.members[0] ? ( -

- (All Members have Read access to this collection.) -

- ) : null} - -
- {collection.members.map((e, i) => { - return ( -
- { - const updatedMembers = collection.members.filter((member) => { - return member.user.email !== e.user.email; - }); - setCollection({ - ...collection, - members: updatedMembers, - }); - }} - /> -
- -
- -
-
-
-

- {e.user.name} -

-

{e.user.email}

-
-
-
-
-

Permissions

-

- (Click to toggle.) -

-
- -
- - - - - -
-
-
- ); - })} -
- -
-
- - Edit Collection -
- -
-
- -

OR

- -
-
- -
{ - toggleDeleteCollectionModal(); - }} - className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" - > - -
-
- - {deleteCollectionModal ? ( - - - - ) : null} -
- ); -} diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 59b2d17..ae27ef6 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -7,7 +7,7 @@ import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; import Modal from "@/components/Modal"; import AddLink from "@/components/Modal/AddLink"; -import EditCollection from "@/components/Modal/EditCollection"; +import CollectionModal from "@/components/Modal/CollectionModal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; @@ -284,9 +284,10 @@ export default function () { {editCollectionModal && activeCollection ? ( - ) : null} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index e2960cf..29a19f4 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -16,10 +16,11 @@ import CollectionCard from "@/components/CollectionCard"; import Dropdown from "@/components/Dropdown"; import { ChangeEvent, useEffect, useState } from "react"; import Modal from "@/components/Modal"; -import AddCollection from "@/components/Modal/AddCollection"; import MainLayout from "@/layouts/MainLayout"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import RadioButton from "@/components/RadioButton"; +import CollectionModal from "@/components/Modal/CollectionModal"; +import { useSession } from "next-auth/react"; export default function () { const { collections } = useCollectionStore(); @@ -30,6 +31,8 @@ export default function () { const [collectionModal, setCollectionModal] = useState(false); + const session = useSession(); + const toggleCollectionModal = () => { setCollectionModal(!collectionModal); }; @@ -65,14 +68,16 @@ export default function () { setSortedCollections( collectionsArray.sort( (a, b) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + new Date(b.createdAt as string).getTime() - + new Date(a.createdAt as string).getTime() ) ); else if (sortBy === "Date (Oldest First)") setSortedCollections( collectionsArray.sort( (a, b) => - new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + new Date(a.createdAt as string).getTime() - + new Date(b.createdAt as string).getTime() ) ); }, [collections, sortBy]); @@ -210,7 +215,16 @@ export default function () { {collectionModal ? ( - + ) : null} diff --git a/types/global.ts b/types/global.ts index 61e1f65..77822e8 100644 --- a/types/global.ts +++ b/types/global.ts @@ -48,7 +48,7 @@ export interface Member { export interface CollectionIncludingMembers extends Omit { id?: number; - createdAt?: Date; + createdAt?: string; members: Member[]; } From a0a7ccc9526057f148fecebee9b85936c3636136 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 18:37:30 +0330 Subject: [PATCH 075/144] bug fixed --- components/CollectionCard.tsx | 2 +- components/Modal/CollectionModal.tsx | 45 +++++++++++++++++----------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 34c8cd0..edbd678 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -85,7 +85,7 @@ export default function ({ .slice(0, 4)} {collection.members.length - 4 > 0 ? (
- +{collection.members.length - 3} + +{collection.members.length - 4}
) : null}
diff --git a/components/Modal/CollectionModal.tsx b/components/Modal/CollectionModal.tsx index 989ea72..4938c52 100644 --- a/components/Modal/CollectionModal.tsx +++ b/components/Modal/CollectionModal.tsx @@ -8,6 +8,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faClose, faPenToSquare, + faPlus, faTrashCan, faUser, faUserPlus, @@ -80,8 +81,8 @@ export default function CollectionModal({ let response = null; - if (method === "CREATE") response = await updateCollection(collection); - else if (method === "UPDATE") response = await addCollection(collection); + if (method === "CREATE") response = await addCollection(collection); + else if (method === "UPDATE") response = await updateCollection(collection); else console.log("Unknown method."); if (response) toggleCollectionModal(); @@ -324,26 +325,36 @@ export default function CollectionModal({ className="bg-sky-500 text-white flex items-center gap-2 py-2 px-5 rounded-md select-none font-bold cursor-pointer duration-100 hover:bg-sky-400" onClick={submit} > - - Edit Collection + + {method === "CREATE" ? "Add Collection" : "Edit Collection"}
-
-
+ {method === "UPDATE" ? ( + <> +
+
-

OR

+

OR

-
-
+
+
-
{ - toggleDeleteCollectionModal(); - }} - className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" - > - -
+
{ + toggleDeleteCollectionModal(); + }} + className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" + > + +
+ + ) : null}
{deleteCollectionModal ? ( From 36778810c5710ea0dff4649f79a20b20b7e268a5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 19:59:39 +0330 Subject: [PATCH 076/144] improved typesafety --- components/Dashboard/LinkItem.tsx | 17 +++--- .../InputSelect/CollectionSelection.tsx | 2 +- components/InputSelect/types.ts | 2 +- components/LinkList.tsx | 17 +++--- components/Modal/AddLink.tsx | 52 ++++++++++--------- components/Modal/EditLink.tsx | 7 +-- lib/api/controllers/links/deleteLink.ts | 10 ++-- lib/api/controllers/links/postLink.ts | 15 +++--- lib/api/controllers/links/updateLink.ts | 11 ++-- store/links.ts | 10 ++-- types/global.ts | 33 +++--------- 11 files changed, 87 insertions(+), 89 deletions(-) diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index 4945ea0..e93516e 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import { ExtendedLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import { faFolder, faArrowUpRightFromSquare, @@ -25,7 +25,7 @@ export default function ({ link, count, }: { - link: ExtendedLink; + link: LinkIncludingCollectionAndTags; count: number; }) { const [expandDropdown, setExpandDropdown] = useState(false); @@ -34,11 +34,14 @@ export default function ({ const { removeLink } = useLinkStore(); const url = new URL(link.url); - const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - }); + const formattedDate = new Date(link.createdAt as string).toLocaleString( + "en-US", + { + year: "numeric", + month: "short", + day: "numeric", + } + ); const toggleEditModal = () => { setEditModal(!editModal); diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index e202d6e..f86be56 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -14,8 +14,8 @@ type Props = { onChange: any; defaultValue: | { - value: number; label: string; + value?: number; } | undefined; }; diff --git a/components/InputSelect/types.ts b/components/InputSelect/types.ts index e32f849..ff1a571 100644 --- a/components/InputSelect/types.ts +++ b/components/InputSelect/types.ts @@ -4,6 +4,6 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . export interface Options { - value: string | number; label: string; + value?: string | number; } diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 3c649fa..772812a 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -3,7 +3,7 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. If not, see . -import { ExtendedLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import { faFolder, faArrowUpRightFromSquare, @@ -25,7 +25,7 @@ export default function ({ link, count, }: { - link: ExtendedLink; + link: LinkIncludingCollectionAndTags; count: number; }) { const [expandDropdown, setExpandDropdown] = useState(false); @@ -34,11 +34,14 @@ export default function ({ const { removeLink } = useLinkStore(); const url = new URL(link.url); - const formattedDate = new Date(link.createdAt).toLocaleString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - }); + const formattedDate = new Date(link.createdAt as string).toLocaleString( + "en-US", + { + year: "numeric", + month: "short", + day: "numeric", + } + ); const toggleEditModal = () => { setEditModal(!editModal); diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx index 1b0309e..2988db9 100644 --- a/components/Modal/AddLink.tsx +++ b/components/Modal/AddLink.tsx @@ -8,7 +8,7 @@ import CollectionSelection from "@/components/InputSelect/CollectionSelection"; import TagSelection from "@/components/InputSelect/TagSelection"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; -import { ExtendedLink, NewLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import useLinkStore from "@/store/links"; import { useRouter } from "next/router"; import useCollectionStore from "@/store/collections"; @@ -20,14 +20,17 @@ type Props = { export default function AddLink({ toggleLinkModal }: Props) { const router = useRouter(); - const [newLink, setNewLink] = useState({ + const [link, setLink] = useState({ name: "", url: "", + title: "", + screenshotPath: "", + pdfPath: "", tags: [], collection: { - id: undefined, name: "", - ownerId: undefined, + description: "", + ownerId: 1, }, }); @@ -40,14 +43,15 @@ export default function AddLink({ toggleLinkModal }: Props) { (e) => e.id == Number(router.query.id) ); - setNewLink({ - ...newLink, - collection: { - id: currentCollection?.id, - name: currentCollection?.name, - ownerId: currentCollection?.ownerId, - }, - }); + if (currentCollection) + setLink({ + ...link, + collection: { + id: currentCollection?.id, + name: currentCollection?.name, + ownerId: currentCollection?.ownerId, + }, + }); } }, []); @@ -56,22 +60,22 @@ export default function AddLink({ toggleLinkModal }: Props) { return { name: e.label }; }); - setNewLink({ ...newLink, tags: tagNames }); + setLink({ ...link, tags: tagNames }); }; const setCollection = (e: any) => { if (e?.__isNew__) e.value = null; - setNewLink({ - ...newLink, + setLink({ + ...link, collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId }, }); }; const submit = async () => { - console.log(newLink); + console.log(link); - const response = await addLink(newLink as NewLink); + const response = await addLink(link); if (response) toggleLinkModal(); }; @@ -87,8 +91,8 @@ export default function AddLink({ toggleLinkModal }: Props) {

setNewLink({ ...newLink, name: e.target.value })} + value={link.name} + onChange={(e) => setLink({ ...link, name: e.target.value })} type="text" placeholder="e.g. Example Link" className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" @@ -101,8 +105,8 @@ export default function AddLink({ toggleLinkModal }: Props) {

setNewLink({ ...newLink, url: e.target.value })} + value={link.url} + onChange={(e) => setLink({ ...link, url: e.target.value })} type="text" placeholder="e.g. http://example.com/" className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" @@ -116,10 +120,10 @@ export default function AddLink({ toggleLinkModal }: Props) {

(link); + const [currentLink, setCurrentLink] = + useState(link); const { updateLink, removeLink } = useLinkStore(); diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index 12342b5..308fa84 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -4,13 +4,17 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { prisma } from "@/lib/api/db"; -import { ExtendedLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import fs from "fs"; import { Link, UsersAndCollections } from "@prisma/client"; import getPermission from "@/lib/api/getPermission"; -export default async function (link: ExtendedLink, userId: number) { - if (!link) return { response: "Please choose a valid link.", status: 401 }; +export default async function ( + link: LinkIncludingCollectionAndTags, + userId: number +) { + if (!link || !link.collectionId) + return { response: "Please choose a valid link.", status: 401 }; const collectionIsAccessible = await getPermission(userId, link.collectionId); diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index 331ddac..f678a49 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -4,7 +4,7 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { prisma } from "@/lib/api/db"; -import { ExtendedLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import getTitle from "../../getTitle"; import archive from "../../archive"; import { Link, UsersAndCollections } from "@prisma/client"; @@ -12,7 +12,10 @@ import AES from "crypto-js/aes"; import getPermission from "@/lib/api/getPermission"; import { existsSync, mkdirSync } from "fs"; -export default async function (link: ExtendedLink, userId: number) { +export default async function ( + link: LinkIncludingCollectionAndTags, + userId: number +) { link.collection.name = link.collection.name.trim(); if (!link.name) { @@ -21,7 +24,7 @@ export default async function (link: ExtendedLink, userId: number) { return { response: "Please enter a valid collection name.", status: 401 }; } - if (link.collection.ownerId) { + if (link.collection.id) { const collectionIsAccessible = await getPermission( userId, link.collection.id @@ -81,8 +84,6 @@ export default async function (link: ExtendedLink, userId: number) { }, }); - console.log(newLink); - const AES_SECRET = process.env.AES_SECRET as string; const screenshotHashedPath = AES.encrypt( @@ -95,7 +96,7 @@ export default async function (link: ExtendedLink, userId: number) { AES_SECRET ).toString(); - const updatedLink: ExtendedLink = await prisma.link.update({ + const updatedLink = await prisma.link.update({ where: { id: newLink.id }, data: { screenshotPath: screenshotHashedPath, pdfPath: pdfHashedPath }, include: { tags: true, collection: true }, @@ -105,8 +106,6 @@ export default async function (link: ExtendedLink, userId: number) { if (!existsSync(collectionPath)) mkdirSync(collectionPath, { recursive: true }); - console.log(updatedLink); - archive(updatedLink.url, updatedLink.collectionId, updatedLink.id); return { response: updatedLink, status: 200 }; diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts index 2854ed2..8e73f23 100644 --- a/lib/api/controllers/links/updateLink.ts +++ b/lib/api/controllers/links/updateLink.ts @@ -4,14 +4,17 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { prisma } from "@/lib/api/db"; -import { ExtendedLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import { UsersAndCollections } from "@prisma/client"; import getPermission from "@/lib/api/getPermission"; -export default async function (link: ExtendedLink, userId: number) { +export default async function ( + link: LinkIncludingCollectionAndTags, + userId: number +) { if (!link) return { response: "Please choose a valid link.", status: 401 }; - if (link.collection.ownerId) { + if (link.collection.id) { const collectionIsAccessible = await getPermission( userId, link.collection.id @@ -27,7 +30,7 @@ export default async function (link: ExtendedLink, userId: number) { link.collection.ownerId = userId; } - const updatedLink: ExtendedLink = await prisma.link.update({ + const updatedLink = await prisma.link.update({ where: { id: link.id, }, diff --git a/store/links.ts b/store/links.ts index 819a51d..0dc3f69 100644 --- a/store/links.ts +++ b/store/links.ts @@ -4,16 +4,16 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { create } from "zustand"; -import { ExtendedLink, NewLink } from "@/types/global"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; import useTagStore from "./tags"; import useCollectionStore from "./collections"; type LinkStore = { - links: ExtendedLink[]; + links: LinkIncludingCollectionAndTags[]; setLinks: () => void; - addLink: (body: NewLink) => Promise; - updateLink: (link: ExtendedLink) => void; - removeLink: (link: ExtendedLink) => void; + addLink: (body: LinkIncludingCollectionAndTags) => Promise; + updateLink: (link: LinkIncludingCollectionAndTags) => void; + removeLink: (link: LinkIncludingCollectionAndTags) => void; }; const useLinkStore = create()((set) => ({ diff --git a/types/global.ts b/types/global.ts index 77822e8..b789c32 100644 --- a/types/global.ts +++ b/types/global.ts @@ -5,35 +5,16 @@ import { Collection, Link, Tag, User } from "@prisma/client"; -type OptionalExcluding = Partial & +export type OptionalExcluding = Partial & Pick; -export interface ExtendedLink extends Link { +export interface LinkIncludingCollectionAndTags + extends Omit { + id?: number; + createdAt?: string; + collectionId?: number; tags: Tag[]; - collection: Collection; -} - -export interface NewLink { - name: string; - url: string; - tags: Tag[]; - collection: { - id: number | undefined; - name: string | undefined; - ownerId: number | undefined; - }; -} - -export interface NewCollection { - name: string; - description: string; - members: { - name: string; - email: string; - canCreate: boolean; - canUpdate: boolean; - canDelete: boolean; - }[]; + collection: OptionalExcluding; } export interface Member { From 632548e54add730a799f5dd33db883a2e6e39429 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 20:23:02 +0330 Subject: [PATCH 077/144] fixes + improvements --- components/Dashboard/LinkItem.tsx | 9 ++++----- components/LinkList.tsx | 9 ++++----- pages/collections/[id].tsx | 6 ++++-- types/global.ts | 14 +++++++------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index e93516e..3e95990 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -21,13 +21,12 @@ import Link from "next/link"; import Dropdown from "../Dropdown"; import Modal from "../Modal"; -export default function ({ - link, - count, -}: { +type Props = { link: LinkIncludingCollectionAndTags; count: number; -}) { +}; + +export default function ({ link, count }: Props) { const [expandDropdown, setExpandDropdown] = useState(false); const [editModal, setEditModal] = useState(false); diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 772812a..fea8cff 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -21,13 +21,12 @@ import Modal from "./Modal"; import EditLink from "./Modal/EditLink"; import Link from "next/link"; -export default function ({ - link, - count, -}: { +type Props = { link: LinkIncludingCollectionAndTags; count: number; -}) { +}; + +export default function ({ link, count }: Props) { const [expandDropdown, setExpandDropdown] = useState(false); const [editModal, setEditModal] = useState(false); diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index ae27ef6..f75c3ef 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -89,14 +89,16 @@ export default function () { setSortedLinks( linksArray.sort( (a, b) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + new Date(b.createdAt as string).getTime() - + new Date(a.createdAt as string).getTime() ) ); else if (sortBy === "Date (Oldest First)") setSortedLinks( linksArray.sort( (a, b) => - new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + new Date(a.createdAt as string).getTime() - + new Date(b.createdAt as string).getTime() ) ); }, [links, router, collections, sortBy]); diff --git a/types/global.ts b/types/global.ts index b789c32..df4e632 100644 --- a/types/global.ts +++ b/types/global.ts @@ -5,7 +5,7 @@ import { Collection, Link, Tag, User } from "@prisma/client"; -export type OptionalExcluding = Partial & +type OptionalExcluding = Partial & Pick; export interface LinkIncludingCollectionAndTags @@ -33,6 +33,12 @@ export interface CollectionIncludingMembers members: Member[]; } +export interface AccountSettings extends User { + profilePic: string | null; + oldPassword?: string; + newPassword?: string; +} + export type SearchSettings = { query: string; filter: { @@ -43,9 +49,3 @@ export type SearchSettings = { tags: boolean; }; }; - -export interface AccountSettings extends User { - profilePic: string | null; - oldPassword?: string; - newPassword?: string; -} From aef0a90f43225f29c9e352094299e871fbea70c2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 21:19:09 +0330 Subject: [PATCH 078/144] cleaner code --- components/Dashboard/LinkItem.tsx | 8 +- components/LinkList.tsx | 8 +- components/Modal/AddLink.tsx | 149 -------------------- components/Modal/EditLink.tsx | 129 ----------------- components/Modal/LinkModal.tsx | 223 ++++++++++++++++++++++++++++++ components/Navbar.tsx | 4 +- pages/collections/[id].tsx | 7 +- store/links.ts | 6 +- 8 files changed, 246 insertions(+), 288 deletions(-) delete mode 100644 components/Modal/AddLink.tsx delete mode 100644 components/Modal/EditLink.tsx create mode 100644 components/Modal/LinkModal.tsx diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index 3e95990..0ebdec4 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -16,7 +16,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; import Image from "next/image"; import useLinkStore from "@/store/links"; -import EditLink from "../Modal/EditLink"; +import LinkModal from "../Modal/LinkModal"; import Link from "next/link"; import Dropdown from "../Dropdown"; import Modal from "../Modal"; @@ -50,7 +50,11 @@ export default function ({ link, count }: Props) {
{editModal ? ( - + ) : null} diff --git a/components/LinkList.tsx b/components/LinkList.tsx index fea8cff..733ea9f 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -18,7 +18,7 @@ import Image from "next/image"; import Dropdown from "./Dropdown"; import useLinkStore from "@/store/links"; import Modal from "./Modal"; -import EditLink from "./Modal/EditLink"; +import LinkModal from "./Modal/LinkModal"; import Link from "next/link"; type Props = { @@ -50,7 +50,11 @@ export default function ({ link, count }: Props) {
{editModal ? ( - + ) : null} diff --git a/components/Modal/AddLink.tsx b/components/Modal/AddLink.tsx deleted file mode 100644 index 2988db9..0000000 --- a/components/Modal/AddLink.tsx +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - -import React, { useEffect, useState } from "react"; -import CollectionSelection from "@/components/InputSelect/CollectionSelection"; -import TagSelection from "@/components/InputSelect/TagSelection"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faPlus } from "@fortawesome/free-solid-svg-icons"; -import { LinkIncludingCollectionAndTags } from "@/types/global"; -import useLinkStore from "@/store/links"; -import { useRouter } from "next/router"; -import useCollectionStore from "@/store/collections"; -import RequiredBadge from "../RequiredBadge"; - -type Props = { - toggleLinkModal: Function; -}; - -export default function AddLink({ toggleLinkModal }: Props) { - const router = useRouter(); - const [link, setLink] = useState({ - name: "", - url: "", - title: "", - screenshotPath: "", - pdfPath: "", - tags: [], - collection: { - name: "", - description: "", - ownerId: 1, - }, - }); - - const { addLink } = useLinkStore(); - const { collections } = useCollectionStore(); - - useEffect(() => { - if (router.query.id) { - const currentCollection = collections.find( - (e) => e.id == Number(router.query.id) - ); - - if (currentCollection) - setLink({ - ...link, - collection: { - id: currentCollection?.id, - name: currentCollection?.name, - ownerId: currentCollection?.ownerId, - }, - }); - } - }, []); - - const setTags = (e: any) => { - const tagNames = e.map((e: any) => { - return { name: e.label }; - }); - - setLink({ ...link, tags: tagNames }); - }; - - const setCollection = (e: any) => { - if (e?.__isNew__) e.value = null; - - setLink({ - ...link, - collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId }, - }); - }; - - const submit = async () => { - console.log(link); - - const response = await addLink(link); - - if (response) toggleLinkModal(); - }; - - return ( -
-

New Link

- -
-
-

- Name - -

- setLink({ ...link, name: e.target.value })} - type="text" - placeholder="e.g. Example Link" - className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
- -
-

- URL - -

- setLink({ ...link, url: e.target.value })} - type="text" - placeholder="e.g. http://example.com/" - className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
- -
-

- Collection - -

- -
- -
-

Tags

- -
-
- -
- - Add Link -
-
- ); -} diff --git a/components/Modal/EditLink.tsx b/components/Modal/EditLink.tsx deleted file mode 100644 index 00c049d..0000000 --- a/components/Modal/EditLink.tsx +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - -import React, { useState } from "react"; -import CollectionSelection from "@/components/InputSelect/CollectionSelection"; -import TagSelection from "@/components/InputSelect/TagSelection"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { LinkIncludingCollectionAndTags } from "@/types/global"; -import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; -import useLinkStore from "@/store/links"; -import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; -import RequiredBadge from "../RequiredBadge"; - -type Props = { - toggleLinkModal: Function; - link: LinkIncludingCollectionAndTags; -}; - -export default function EditLink({ toggleLinkModal, link }: Props) { - const [currentLink, setCurrentLink] = - useState(link); - - const { updateLink, removeLink } = useLinkStore(); - - const shortendURL = new URL(link.url).host.toLowerCase(); - - const setTags = (e: any) => { - const tagNames = e.map((e: any) => { - return { name: e.label }; - }); - - setCurrentLink({ ...currentLink, tags: tagNames }); - }; - - const setCollection = (e: any) => { - if (e?.__isNew__) e.value = null; - - setCurrentLink({ - ...currentLink, - collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId } as any, - }); - }; - - const submit = async () => { - updateLink(currentLink); - toggleLinkModal(); - }; - - return ( -
-

Edit Link

-

- {shortendURL} | {link.title} -

- -
-
-

- Name - -

- - setCurrentLink({ ...currentLink, name: e.target.value }) - } - type="text" - placeholder="e.g. Example Link" - className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" - /> -
- -
-

- Collection - -

- -
- -
-

Tags

- { - return { label: e.name, value: e.id }; - })} - /> -
-
- -
-
- - Edit Link -
- -
-
- -

OR

- -
-
- -
{ - removeLink(link); - toggleLinkModal(); - }} - className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" - > - -
-
-
- ); -} diff --git a/components/Modal/LinkModal.tsx b/components/Modal/LinkModal.tsx new file mode 100644 index 0000000..30e7ab8 --- /dev/null +++ b/components/Modal/LinkModal.tsx @@ -0,0 +1,223 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import React, { useEffect, useState } from "react"; +import CollectionSelection from "@/components/InputSelect/CollectionSelection"; +import TagSelection from "@/components/InputSelect/TagSelection"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { LinkIncludingCollectionAndTags } from "@/types/global"; +import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; +import useLinkStore from "@/store/links"; +import { faPlus, faTrashCan } from "@fortawesome/free-solid-svg-icons"; +import RequiredBadge from "../RequiredBadge"; +import { useSession } from "next-auth/react"; +import useCollectionStore from "@/store/collections"; +import { useRouter } from "next/router"; + +type Props = + | { + toggleLinkModal: Function; + method: "CREATE"; + activeLink?: LinkIncludingCollectionAndTags; + } + | { + toggleLinkModal: Function; + method: "UPDATE"; + activeLink: LinkIncludingCollectionAndTags; + }; + +export default function EditLink({ + toggleLinkModal, + method, + activeLink, +}: Props) { + const { data } = useSession(); + + const [link, setLink] = useState( + method === "UPDATE" + ? activeLink + : { + name: "", + url: "", + title: "", + screenshotPath: "", + pdfPath: "", + tags: [], + collection: { + name: "", + ownerId: data?.user.id as number, + }, + } + ); + + const { updateLink, removeLink, addLink } = useLinkStore(); + + const router = useRouter(); + + const { collections } = useCollectionStore(); + + useEffect(() => { + if (router.query.id) { + const currentCollection = collections.find( + (e) => e.id == Number(router.query.id) + ); + + if (currentCollection) + setLink({ + ...link, + collection: { + id: currentCollection.id, + name: currentCollection.name, + ownerId: currentCollection.ownerId, + }, + }); + } + }, []); + + const shortendURL = + method === "UPDATE" ? new URL(link.url).host.toLowerCase() : undefined; + + const setTags = (e: any) => { + const tagNames = e.map((e: any) => { + return { name: e.label }; + }); + + setLink({ ...link, tags: tagNames }); + }; + + const setCollection = (e: any) => { + if (e?.__isNew__) e.value = null; + + setLink({ + ...link, + collection: { id: e?.value, name: e?.label, ownerId: e?.ownerId }, + }); + }; + + const submit = async () => { + let response; + + if (method === "UPDATE") response = await updateLink(link); + else if (method === "CREATE") response = await addLink(link); + + toggleLinkModal(); + }; + + return ( +
+

+ {method === "UPDATE" ? "Edit" : "New"} Link +

+ + {method === "UPDATE" ? ( +

+ {shortendURL} | {link.title} +

+ ) : null} + +
+
+

+ Name + +

+ setLink({ ...link, name: e.target.value })} + type="text" + placeholder="e.g. Example Link" + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ + {method === "CREATE" ? ( +
+

+ URL + +

+ setLink({ ...link, url: e.target.value })} + type="text" + placeholder="e.g. http://example.com/" + className="w-full rounded-md p-2 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ ) : null} + +
+

+ Collection + +

+ +
+ +
+

Tags

+ { + return { label: e.name, value: e.id }; + })} + /> +
+
+ +
+
+ + {method === "CREATE" ? "Add Link" : "Edit Link"} +
+ + {method === "UPDATE" ? ( + <> +
+
+ +

OR

+ +
+
+ +
{ + removeLink(link); + toggleLinkModal(); + }} + className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" + > + +
+ + ) : null} +
+
+ ); +} diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 39efd3c..c1e0723 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -16,7 +16,7 @@ import { import { useEffect, useState } from "react"; import Dropdown from "@/components/Dropdown"; import Modal from "@/components/Modal"; -import AddLink from "@/components/Modal/AddLink"; +import LinkModal from "@/components/Modal/LinkModal"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import Sidebar from "@/components/Sidebar"; import { useRouter } from "next/router"; @@ -129,7 +129,7 @@ export default function () { {linkModal ? ( - + ) : null} diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index f75c3ef..fa39d42 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -6,7 +6,7 @@ import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; import Modal from "@/components/Modal"; -import AddLink from "@/components/Modal/AddLink"; +import LinkModal from "@/components/Modal/LinkModal"; import CollectionModal from "@/components/Modal/CollectionModal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; import useCollectionStore from "@/store/collections"; @@ -280,7 +280,10 @@ export default function () { {linkModal ? ( - + ) : null} diff --git a/store/links.ts b/store/links.ts index 0dc3f69..7976317 100644 --- a/store/links.ts +++ b/store/links.ts @@ -12,8 +12,8 @@ type LinkStore = { links: LinkIncludingCollectionAndTags[]; setLinks: () => void; addLink: (body: LinkIncludingCollectionAndTags) => Promise; - updateLink: (link: LinkIncludingCollectionAndTags) => void; - removeLink: (link: LinkIncludingCollectionAndTags) => void; + updateLink: (link: LinkIncludingCollectionAndTags) => Promise; + removeLink: (link: LinkIncludingCollectionAndTags) => Promise; }; const useLinkStore = create()((set) => ({ @@ -70,6 +70,8 @@ const useLinkStore = create()((set) => ({ useTagStore.getState().setTags(); useCollectionStore.getState().setCollections(); } + + return response.ok; }, removeLink: async (link) => { const response = await fetch("/api/routes/links", { From 10727937b5b57a201922850db8460b21dd5492c8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 21:30:48 +0330 Subject: [PATCH 079/144] small improvements --- components/Modal/UserSettings.tsx | 15 +++------------ store/account.ts | 1 - 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index 3c1b308..31213d2 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -84,18 +84,16 @@ export default function UserSettings({ toggleSettingsModal }: Props) { }; const submit = async () => { - console.log(user); - - await updateAccount({ + const response = await updateAccount({ ...user, }); - console.log(account); - setPasswordForm(undefined, undefined); if (user.email !== account.email || user.name !== account.name) update({ email: user.email, name: user.name }); + + if (response) toggleSettingsModal(); }; return ( @@ -104,13 +102,6 @@ export default function UserSettings({ toggleSettingsModal }: Props) {

Profile Settings

- {user.email !== account.email || user.name !== account.name ? ( -

- Note: The page will be refreshed to apply the changes of "Email" or - "Display Name". -

- ) : null} -
diff --git a/store/account.ts b/store/account.ts index bda6a15..ddd13a4 100644 --- a/store/account.ts +++ b/store/account.ts @@ -4,7 +4,6 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { create } from "zustand"; -import { User } from "@prisma/client"; import { AccountSettings } from "@/types/global"; import avatarExists from "@/lib/client/avatarExists"; From 1adb58c6d9f3991f257a34c13f2b68b4f9cca97c Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 May 2023 22:35:07 +0330 Subject: [PATCH 080/144] some visual changes + improvements --- components/CollectionCard.tsx | 13 ++++------ components/ImageWithFallback.tsx | 2 +- components/Modal/UserSettings.tsx | 1 - components/ProfilePhoto.tsx | 24 +++++++++++++++++++ lib/api/controllers/users/updateUser.ts | 4 ++-- pages/collections/[id].tsx | 32 ++++++++++++------------- 6 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 components/ProfilePhoto.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index edbd678..89651db 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -5,7 +5,6 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { - faUser, faPenToSquare, faTrashCan, faEllipsis, @@ -13,12 +12,12 @@ import { import Link from "next/link"; import { CollectionIncludingMembers } from "@/types/global"; import useLinkStore from "@/store/links"; -import ImageWithFallback from "./ImageWithFallback"; import Dropdown from "./Dropdown"; import { useState } from "react"; import Modal from "@/components/Modal"; import CollectionModal from "@/components/Modal/CollectionModal"; import DeleteCollection from "@/components/Modal/DeleteCollection"; +import ProfilePhoto from "./ProfilePhoto"; export default function ({ collection, @@ -71,15 +70,11 @@ export default function ({ .sort((a, b) => (a.user.id as number) - (b.user.id as number)) .map((e, i) => { return ( - -
- -
-
+ className="-mr-3" + /> ); }) .slice(0, 4)} diff --git a/components/ImageWithFallback.tsx b/components/ImageWithFallback.tsx index f125216..44c6f81 100644 --- a/components/ImageWithFallback.tsx +++ b/components/ImageWithFallback.tsx @@ -1,4 +1,4 @@ -import { ElementType, ReactElement, ReactNode, useState } from "react"; +import { ReactNode, useState } from "react"; type Props = { src: string; diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index 31213d2..6c6f151 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -25,7 +25,6 @@ export default function UserSettings({ toggleSettingsModal }: Props) { const [user, setUser] = useState({ ...account, - // profilePic: null, }); const [whitelistedUsersTextbox, setWhiteListedUsersTextbox] = useState( diff --git a/components/ProfilePhoto.tsx b/components/ProfilePhoto.tsx new file mode 100644 index 0000000..9330f98 --- /dev/null +++ b/components/ProfilePhoto.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import ImageWithFallback from "./ImageWithFallback"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faUser } from "@fortawesome/free-solid-svg-icons"; + +type Props = { + src: string; + className?: string; +}; + +export default function ProfilePhoto({ src, className }: Props) { + return ( + +
+ +
+
+ ); +} diff --git a/lib/api/controllers/users/updateUser.ts b/lib/api/controllers/users/updateUser.ts index 5ca5b06..9e0e864 100644 --- a/lib/api/controllers/users/updateUser.ts +++ b/lib/api/controllers/users/updateUser.ts @@ -74,7 +74,7 @@ export default async function (user: AccountSettings, userId: number) { } } - const { password, ...unsensitiveInfo } = updatedUser; + const { password, ...userInfo } = updatedUser; - return { response: unsensitiveInfo, status: 200 }; + return { response: userInfo, status: 200 }; } diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index fa39d42..22dbebb 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -19,7 +19,6 @@ import { faPenToSquare, faSort, faTrashCan, - faUser, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; @@ -27,8 +26,8 @@ import { ChangeEvent, useEffect, useState } from "react"; import MainLayout from "@/layouts/MainLayout"; import RadioButton from "@/components/RadioButton"; import ClickAwayHandler from "@/components/ClickAwayHandler"; -import ImageWithFallback from "@/components/ImageWithFallback"; import { useSession } from "next-auth/react"; +import ProfilePhoto from "@/components/ProfilePhoto"; export default function () { const router = useRouter(); @@ -120,10 +119,18 @@ export default function () {
- {activeCollection?.members[0] ? ( -
-
-
+ {activeCollection ? ( +
+
+
{activeCollection.ownerId === data?.user.id ? "Manage" : "View"}{" "} @@ -135,18 +142,11 @@ export default function () { ) .map((e, i) => { return ( - -
- -
-
+ className="-mr-3 group-hover:brightness-125 bg-white duration-100" + /> ); }) .slice(0, 4)} From d2051a67ab88f5f940319b7701ce05d342583658 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 05:47:19 +0330 Subject: [PATCH 081/144] minor change --- pages/collections/[id].tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 22dbebb..1f6a615 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -145,7 +145,7 @@ export default function () { ); }) From 577b279108da50139c3ee7c11d0560e1bbcd9d3a Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 06:51:35 +0330 Subject: [PATCH 082/144] better looking dropdown component --- components/CollectionCard.tsx | 17 ++++++---------- components/Dashboard/LinkItem.tsx | 10 +++------- components/Dropdown.tsx | 32 ++++++++++++++++--------------- components/LinkList.tsx | 13 +++++-------- components/Navbar.tsx | 4 ---- pages/collections/[id].tsx | 25 ++++++++++++++---------- pages/collections/index.tsx | 11 +++++------ 7 files changed, 51 insertions(+), 61 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 89651db..60b1288 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -4,11 +4,7 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { - faPenToSquare, - faTrashCan, - faEllipsis, -} from "@fortawesome/free-solid-svg-icons"; +import { faEllipsis } from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; import { CollectionIncludingMembers } from "@/types/global"; import useLinkStore from "@/store/links"; @@ -50,12 +46,12 @@ export default function ({
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + id={"expand-dropdown" + collection.id} className="inline-flex absolute top-5 right-5 rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" >
@@ -100,7 +96,6 @@ export default function ({ items={[ { name: "Edit Collection", - icon: , onClick: () => { toggleEditCollectionModal(); setExpandDropdown(false); @@ -108,7 +103,6 @@ export default function ({ }, { name: "Delete Collection", - icon: , onClick: () => { toggleDeleteCollectionModal(); setExpandDropdown(false); @@ -117,9 +111,10 @@ export default function ({ ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); + if (target.id !== "expand-dropdown" + collection.id) + setExpandDropdown(false); }} - className="absolute top-[3.2rem] right-5 z-10 w-44" + className="absolute top-[3.2rem] right-5 z-10 w-36" /> ) : null} diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index 0ebdec4..cbc94d0 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -8,8 +8,6 @@ import { faFolder, faArrowUpRightFromSquare, faEllipsis, - faPenToSquare, - faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -124,14 +122,14 @@ export default function ({ link, count }: Props) {
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + id="expand-dropdown" className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" >
@@ -168,7 +166,6 @@ export default function ({ link, count }: Props) { items={[ { name: "Edit", - icon: , onClick: () => { setEditModal(true); setExpandDropdown(false); @@ -176,7 +173,6 @@ export default function ({ link, count }: Props) { }, { name: "Delete", - icon: , onClick: () => { removeLink(link); setExpandDropdown(false); @@ -185,7 +181,7 @@ export default function ({ link, count }: Props) { ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); + if (target.id !== "expand-dropdown") setExpandDropdown(false); }} className="absolute top-8 right-0 w-36" /> diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index 1eff26f..993388d 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -4,15 +4,20 @@ // You should have received a copy of the GNU General Public License along with this program. If not, see . import Link from "next/link"; -import React, { MouseEventHandler, ReactElement } from "react"; +import React, { MouseEventHandler } from "react"; import ClickAwayHandler from "./ClickAwayHandler"; -type MenuItem = { - name: string; - icon: ReactElement; - onClick?: MouseEventHandler; - href?: string; -}; +type MenuItem = + | { + name: string; + onClick: MouseEventHandler; + href?: string; + } + | { + name: string; + onClick?: MouseEventHandler; + href: string; + }; type Props = { onClickOutside: Function; @@ -20,20 +25,17 @@ type Props = { items: MenuItem[]; }; -export default function ({ onClickOutside, className, items }: Props) { +export default function Dropdown({ onClickOutside, className, items }: Props) { return ( {items.map((e, i) => { const inner = ( -
-
- {React.cloneElement(e.icon, { - className: "text-sky-500 w-5 h-5", - })} -

{e.name}

+
+
+

{e.name}

); diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 733ea9f..2823fcf 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -8,8 +8,6 @@ import { faFolder, faArrowUpRightFromSquare, faEllipsis, - faPenToSquare, - faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { faFileImage, faFilePdf } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -124,14 +122,14 @@ export default function ({ link, count }: Props) {
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + id={"expand-dropdown" + link.id} className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" >
@@ -168,7 +166,6 @@ export default function ({ link, count }: Props) { items={[ { name: "Edit", - icon: , onClick: () => { setEditModal(true); setExpandDropdown(false); @@ -176,7 +173,6 @@ export default function ({ link, count }: Props) { }, { name: "Delete", - icon: , onClick: () => { removeLink(link); setExpandDropdown(false); @@ -185,9 +181,10 @@ export default function ({ link, count }: Props) { ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); + if (target.id !== "expand-dropdown" + link.id) + setExpandDropdown(false); }} - className="absolute top-8 right-0 w-36" + className="absolute top-7 right-0 w-36" /> ) : null}
diff --git a/components/Navbar.tsx b/components/Navbar.tsx index c1e0723..792d300 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -8,8 +8,6 @@ import { signOut } from "next-auth/react"; import { faPlus, faCircleUser, - faSliders, - faArrowRightFromBracket, faChevronDown, faBars, } from "@fortawesome/free-solid-svg-icons"; @@ -104,7 +102,6 @@ export default function () { items={[ { name: "Settings", - icon: , onClick: () => { toggleSettingsModal(); setProfileDropdown(!profileDropdown); @@ -112,7 +109,6 @@ export default function () { }, { name: "Logout", - icon: , onClick: () => { signOut(); setProfileDropdown(!profileDropdown); diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 1f6a615..3ccffa4 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -13,12 +13,9 @@ import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; import { CollectionIncludingMembers } from "@/types/global"; import { - faAdd, faEllipsis, faFolder, - faPenToSquare, faSort, - faTrashCan, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; @@ -231,12 +228,12 @@ export default function () {
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + id="expand-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" > @@ -246,7 +243,6 @@ export default function () { items={[ { name: "Add Link Here", - icon: , onClick: () => { toggleLinkModal(); setExpandDropdown(false); @@ -254,7 +250,17 @@ export default function () { }, { name: "Edit Collection", - icon: , + onClick: () => { + toggleEditCollectionModal(); + setExpandDropdown(false); + }, + }, + { + name: `${ + activeCollection?.ownerId === data?.user.id + ? "Manage" + : "View" + } Team`, onClick: () => { toggleEditCollectionModal(); setExpandDropdown(false); @@ -262,7 +268,6 @@ export default function () { }, { name: "Delete Collection", - icon: , onClick: () => { toggleDeleteCollectionModal(); setExpandDropdown(false); @@ -271,10 +276,10 @@ export default function () { ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") + if (target.id !== "expand-dropdown") setExpandDropdown(false); }} - className="absolute top-8 right-0 z-10 w-44" + className="absolute top-8 right-0 z-10 w-36" /> ) : null} diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 29a19f4..38c9508 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -5,7 +5,6 @@ import useCollectionStore from "@/store/collections"; import { - faAdd, faBox, faEllipsis, faPlus, @@ -95,12 +94,12 @@ export default function () {
setExpandDropdown(!expandDropdown)} - id="edit-dropdown" + id="expand-dropdown" className="inline-flex rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" >
@@ -109,8 +108,7 @@ export default function () { , + name: "New Collection", onClick: () => { toggleCollectionModal(); setExpandDropdown(false); @@ -119,7 +117,8 @@ export default function () { ]} onClickOutside={(e: Event) => { const target = e.target as HTMLInputElement; - if (target.id !== "edit-dropdown") setExpandDropdown(false); + if (target.id !== "expand-dropdown") + setExpandDropdown(false); }} className="absolute top-8 left-0 w-36" /> From 19b848ee7308defa266e39d932b296dcad19feef Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 06:55:26 +0330 Subject: [PATCH 083/144] minor change --- pages/api/avatar/[id].ts | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/api/avatar/[id].ts b/pages/api/avatar/[id].ts index 4a1dfff..f5cc69d 100644 --- a/pages/api/avatar/[id].ts +++ b/pages/api/avatar/[id].ts @@ -42,7 +42,6 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { ) { return res .setHeader("Content-Type", "text/plain") - .status(401) .send("This profile is private."); } } From dc19638f2cbbf6a2d48b9750651b99d69a2dad9c Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 09:25:49 +0330 Subject: [PATCH 084/144] many improvements + added public page --- components/CollectionCard.tsx | 8 +- .../Modal/Collection/CollectionInfo.tsx | 107 ++++++++++++ .../{ => Collection}/DeleteCollection.tsx | 0 .../TeamManagement.tsx} | 163 ++++++------------ components/Modal/UserSettings.tsx | 2 +- layouts/AuthRedirect.tsx | 36 ++-- .../collections/updateCollection.ts | 1 + pages/collections/[id].tsx | 56 +++--- pages/collections/index.tsx | 4 +- pages/links.tsx | 6 +- pages/public/collections/[id].tsx | 5 + 11 files changed, 229 insertions(+), 159 deletions(-) create mode 100644 components/Modal/Collection/CollectionInfo.tsx rename components/Modal/{ => Collection}/DeleteCollection.tsx (100%) rename components/Modal/{CollectionModal.tsx => Collection/TeamManagement.tsx} (71%) create mode 100644 pages/public/collections/[id].tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 60b1288..7bb0528 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -11,8 +11,8 @@ import useLinkStore from "@/store/links"; import Dropdown from "./Dropdown"; import { useState } from "react"; import Modal from "@/components/Modal"; -import CollectionModal from "@/components/Modal/CollectionModal"; -import DeleteCollection from "@/components/Modal/DeleteCollection"; +import CollectionInfo from "@/components/Modal/Collection/CollectionInfo"; +import DeleteCollection from "@/components/Modal/Collection/DeleteCollection"; import ProfilePhoto from "./ProfilePhoto"; export default function ({ @@ -63,7 +63,7 @@ export default function ({
{collection.members - .sort((a, b) => (a.user.id as number) - (b.user.id as number)) + .sort((a, b) => (a.userId as number) - (b.userId as number)) .map((e, i) => { return ( - +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import React, { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { + faClose, + faPenToSquare, + faPlus, + faTrashCan, + faUser, + faUserPlus, +} from "@fortawesome/free-solid-svg-icons"; +import useCollectionStore from "@/store/collections"; +import { CollectionIncludingMembers, Member } from "@/types/global"; +import { useSession } from "next-auth/react"; +import Modal from "@/components/Modal"; +import DeleteCollection from "@/components/Modal/Collection/DeleteCollection"; +import RequiredBadge from "../../RequiredBadge"; +import addMemberToCollection from "@/lib/client/addMemberToCollection"; +import ImageWithFallback from "../../ImageWithFallback"; +import Checkbox from "../../Checkbox"; + +type Props = { + toggleCollectionModal: Function; + activeCollection: CollectionIncludingMembers; + method: "CREATE" | "UPDATE"; +}; + +export default function CollectionInfo({ + toggleCollectionModal, + activeCollection, + method, +}: Props) { + const [collection, setCollection] = + useState(activeCollection); + + const { updateCollection, addCollection } = useCollectionStore(); + + const submit = async () => { + if (!collection) return null; + + let response = null; + + if (method === "CREATE") response = await addCollection(collection); + else if (method === "UPDATE") response = await updateCollection(collection); + else console.log("Unknown method."); + + if (response) toggleCollectionModal(); + }; + + return ( +
+

+ {method === "CREATE" ? "Add" : "Edit"} Collection +

+ +
+
+

+ Name + +

+ + setCollection({ ...collection, name: e.target.value }) + } + type="text" + placeholder="e.g. Example Collection" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + /> +
+ +
+

Description

+ + />
) : null} diff --git a/layouts/AuthRedirect.tsx b/layouts/AuthRedirect.tsx index 132a2da..2f879c4 100644 --- a/layouts/AuthRedirect.tsx +++ b/layouts/AuthRedirect.tsx @@ -22,22 +22,26 @@ export default function ({ children }: Props) { getInitialData(); useEffect(() => { - if ( - status === "authenticated" && - (router.pathname === "/login" || router.pathname === "/register") - ) { - router.push("/").then(() => { - setRedirect(false); - }); - } else if ( - status === "unauthenticated" && - !(router.pathname === "/login" || router.pathname === "/register") - ) { - router.push("/login").then(() => { - setRedirect(false); - }); - } else if (status === "loading") setRedirect(true); - else setRedirect(false); + if (!router.pathname.startsWith("/public")) { + if ( + status === "authenticated" && + (router.pathname === "/login" || router.pathname === "/register") + ) { + router.push("/").then(() => { + setRedirect(false); + }); + } else if ( + status === "unauthenticated" && + !(router.pathname === "/login" || router.pathname === "/register") + ) { + router.push("/login").then(() => { + setRedirect(false); + }); + } else if (status === "loading") setRedirect(true); + else setRedirect(false); + } else { + setRedirect(false); + } }, [status]); if (status !== "loading" && !redirect) return <>{children}; diff --git a/lib/api/controllers/collections/updateCollection.ts b/lib/api/controllers/collections/updateCollection.ts index ff172f5..1e6f436 100644 --- a/lib/api/controllers/collections/updateCollection.ts +++ b/lib/api/controllers/collections/updateCollection.ts @@ -51,6 +51,7 @@ export default async function ( select: { email: true, name: true, + id: true, }, }, }, diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 3ccffa4..2e5e2c6 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -7,8 +7,8 @@ import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; import Modal from "@/components/Modal"; import LinkModal from "@/components/Modal/LinkModal"; -import CollectionModal from "@/components/Modal/CollectionModal"; -import DeleteCollection from "@/components/Modal/DeleteCollection"; +import CollectionInfo from "@/components/Modal/Collection/CollectionInfo"; +import DeleteCollection from "@/components/Modal/Collection/DeleteCollection"; import useCollectionStore from "@/store/collections"; import useLinkStore from "@/store/links"; import { CollectionIncludingMembers } from "@/types/global"; @@ -25,6 +25,7 @@ import RadioButton from "@/components/RadioButton"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useSession } from "next-auth/react"; import ProfilePhoto from "@/components/ProfilePhoto"; +import TeamManagement from "@/components/Modal/Collection/TeamManagement"; export default function () { const router = useRouter(); @@ -36,7 +37,8 @@ export default function () { const [expandDropdown, setExpandDropdown] = useState(false); const [linkModal, setLinkModal] = useState(false); - const [editCollectionModal, setEditCollectionModal] = useState(false); + const [collectionInfoModal, setCollectionInfoModal] = useState(false); + const [collectionMembersModal, setCollectionMembersModal] = useState(false); const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); const [sortDropdown, setSortDropdown] = useState(false); const [sortBy, setSortBy] = useState("Name (A-Z)"); @@ -50,8 +52,12 @@ export default function () { setLinkModal(!linkModal); }; - const toggleEditCollectionModal = () => { - setEditCollectionModal(!editCollectionModal); + const toggleCollectionInfoModal = () => { + setCollectionInfoModal(!collectionInfoModal); + }; + + const toggleCollectionMembersModal = () => { + setCollectionMembersModal(!collectionMembersModal); }; const toggleDeleteCollectionModal = () => { @@ -122,7 +128,10 @@ export default function () { activeCollection.members[0] && "mr-3" }`} > -
+
{activeCollection?.members - .sort( - (a, b) => (a.user.id as number) - (b.user.id as number) - ) + .sort((a, b) => (a.userId as number) - (b.userId as number)) .map((e, i) => { return ( { - toggleEditCollectionModal(); + toggleCollectionInfoModal(); setExpandDropdown(false); }, }, { - name: `${ - activeCollection?.ownerId === data?.user.id - ? "Manage" - : "View" - } Team`, + name: "Share/Collaborate", onClick: () => { - toggleEditCollectionModal(); + toggleCollectionMembersModal(); setExpandDropdown(false); }, }, @@ -279,7 +282,7 @@ export default function () { if (target.id !== "expand-dropdown") setExpandDropdown(false); }} - className="absolute top-8 right-0 z-10 w-36" + className="absolute top-8 right-0 z-10 w-40" /> ) : null} @@ -292,16 +295,25 @@ export default function () { ) : null} - {editCollectionModal && activeCollection ? ( - - + ) : null} + {collectionMembersModal && activeCollection ? ( + + + + ) : null} + {deleteCollectionModal && activeCollection ? ( - - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + new Date(b.createdAt as string).getTime() - + new Date(a.createdAt as string).getTime() ) ); else if (sortBy === "Date (Oldest First)") setSortedLinks( linksArray.sort( (a, b) => - new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + new Date(a.createdAt as string).getTime() - + new Date(b.createdAt as string).getTime() ) ); }, [links, sortBy]); diff --git a/pages/public/collections/[id].tsx b/pages/public/collections/[id].tsx new file mode 100644 index 0000000..6f6ae03 --- /dev/null +++ b/pages/public/collections/[id].tsx @@ -0,0 +1,5 @@ +import React from "react"; + +export default function PublicCollections() { + return
Hello
; +} From 287f7fa8706a7c7a98f737e1a3c85809db9551c8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 09:30:12 +0330 Subject: [PATCH 085/144] minor change --- components/Modal/Collection/DeleteCollection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Modal/Collection/DeleteCollection.tsx b/components/Modal/Collection/DeleteCollection.tsx index a658f21..4a2e3b9 100644 --- a/components/Modal/Collection/DeleteCollection.tsx +++ b/components/Modal/Collection/DeleteCollection.tsx @@ -36,7 +36,7 @@ export default function DeleteCollection({ }; return ( -
+

Delete Collection

From fcbecb5bc577120e6bd9b430c28474bfb7629e06 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 20:52:01 +0330 Subject: [PATCH 086/144] bug fixes --- .../Modal/Collection/TeamManagement.tsx | 284 +++++++++--------- components/ProfilePhoto.tsx | 2 +- pages/collections/[id].tsx | 2 +- tailwind.config.js | 4 + 4 files changed, 156 insertions(+), 136 deletions(-) diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx index 1253f1a..5d98ae9 100644 --- a/components/Modal/Collection/TeamManagement.tsx +++ b/components/Modal/Collection/TeamManagement.tsx @@ -99,11 +99,16 @@ export default function TeamManagement({

Public Link (Click to copy)

- navigator.clipboard - .writeText(publicCollectionURL) - .then(() => console.log("Copied!")) - } + onClick={() => { + try { + navigator.clipboard + .writeText(publicCollectionURL) + .then(() => console.log("Copied!")); + } catch (err) { + alert(err); + console.log(err); + } + }} className="w-full hide-scrollbar overflow-x-auto whitespace-nowrap rounded-md p-3 border-sky-100 border-solid border outline-none hover:border-sky-500 duration-100 cursor-text" > {publicCollectionURL} @@ -159,138 +164,149 @@ export default function TeamManagement({

- {collection.members.map((e, i) => { - return ( -
- { - const updatedMembers = collection.members.filter( - (member) => { - return member.user.email !== e.user.email; - } - ); - setCollection({ - ...collection, - members: updatedMembers, - }); - }} - /> -
- -
- + {collection.members + .sort((a, b) => (a.userId as number) - (b.userId as number)) + .map((e, i) => { + return ( +
+ { + const updatedMembers = collection.members.filter( + (member) => { + return member.user.email !== e.user.email; + } + ); + setCollection({ + ...collection, + members: updatedMembers, + }); + }} + /> +
+ +
+ +
+
+
+

+ {e.user.name} +

+

{e.user.email}

+
+
+
+
+

+ Permissions +

+

+ (Click to toggle.) +

+
+ +
+ + + + +
- -
-

- {e.user.name} -

-

{e.user.email}

-
-
-

- Permissions -

-

- (Click to toggle.) -

-
- -
- - - - - -
-
-
- ); - })} + ); + })}
) : null} diff --git a/components/ProfilePhoto.tsx b/components/ProfilePhoto.tsx index 9330f98..12f86cb 100644 --- a/components/ProfilePhoto.tsx +++ b/components/ProfilePhoto.tsx @@ -15,7 +15,7 @@ export default function ProfilePhoto({ src, className }: Props) { className={`h-10 w-10 shadow rounded-full border-[3px] border-sky-100 ${className}`} >
diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 2e5e2c6..9f0c767 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -149,7 +149,7 @@ export default function () { ); }) diff --git a/tailwind.config.js b/tailwind.config.js index 87aedba..eb74f32 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,9 +1,13 @@ /** @type {import('tailwindcss').Config} */ + module.exports = { content: [ "./app/**/*.{js,ts,jsx,tsx}", "./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}", + + // For the "layouts" directory + "./layouts/**/*.{js,ts,jsx,tsx}", ], theme: { extend: {}, From ba8dd7dd8f7f6cab9ecfec4e19a420c1be44ffc7 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 May 2023 21:10:50 +0330 Subject: [PATCH 087/144] minor change --- components/Modal/Collection/TeamManagement.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx index 5d98ae9..24b7f46 100644 --- a/components/Modal/Collection/TeamManagement.tsx +++ b/components/Modal/Collection/TeamManagement.tsx @@ -105,7 +105,6 @@ export default function TeamManagement({ .writeText(publicCollectionURL) .then(() => console.log("Copied!")); } catch (err) { - alert(err); console.log(err); } }} From 785ddb9a3f7d8f4c5f2a4ab2681b1e8883624ec3 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 May 2023 01:36:49 +0330 Subject: [PATCH 088/144] improved design --- components/CollectionCard.tsx | 22 +++++++++++++++ components/Dropdown.tsx | 2 +- components/InputSelect/styles.ts | 4 +-- components/LinkList.tsx | 4 +-- .../Modal/Collection/TeamManagement.tsx | 6 ++-- components/Sidebar/SidebarItem.tsx | 10 ++++--- components/Sidebar/index.tsx | 28 +++++++++---------- pages/dashboard.tsx | 4 +-- 8 files changed, 51 insertions(+), 29 deletions(-) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 7bb0528..6508cff 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -14,6 +14,7 @@ import Modal from "@/components/Modal"; import CollectionInfo from "@/components/Modal/Collection/CollectionInfo"; import DeleteCollection from "@/components/Modal/Collection/DeleteCollection"; import ProfilePhoto from "./ProfilePhoto"; +import TeamManagement from "./Modal/Collection/TeamManagement"; export default function ({ collection, @@ -32,12 +33,17 @@ export default function ({ const [expandDropdown, setExpandDropdown] = useState(false); const [editCollectionModal, setEditCollectionModal] = useState(false); + const [collectionMembersModal, setCollectionMembersModal] = useState(false); const [deleteCollectionModal, setDeleteCollectionModal] = useState(false); const toggleEditCollectionModal = () => { setEditCollectionModal(!editCollectionModal); }; + const toggleCollectionMembersModal = () => { + setCollectionMembersModal(!collectionMembersModal); + }; + const toggleDeleteCollectionModal = () => { setDeleteCollectionModal(!deleteCollectionModal); }; @@ -101,6 +107,13 @@ export default function ({ setExpandDropdown(false); }, }, + { + name: "Share/Collaborate", + onClick: () => { + toggleCollectionMembersModal(); + setExpandDropdown(false); + }, + }, { name: "Delete Collection", onClick: () => { @@ -128,6 +141,15 @@ export default function ({ ) : null} + {collectionMembersModal ? ( + + + + ) : null} + {deleteCollectionModal ? ( { const inner = (
-
+

{e.name}

diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts index c32a5de..f56833c 100644 --- a/components/InputSelect/styles.ts +++ b/components/InputSelect/styles.ts @@ -15,7 +15,7 @@ export const styles: StylesConfig = { cursor: "pointer", backgroundColor: state.isSelected ? "#0ea5e9" : "inherit", "&:hover": { - backgroundColor: state.isSelected ? "#0ea5e9" : "#bae6fd", + backgroundColor: state.isSelected ? "#0ea5e9" : "#e2e8f0", }, transition: "all 50ms", }), @@ -43,7 +43,7 @@ export const styles: StylesConfig = { }), clearIndicator: (styles) => ({ ...styles, - cursor: "pointer", + visibility: "hidden", }), placeholder: (styles) => ({ ...styles, diff --git a/components/LinkList.tsx b/components/LinkList.tsx index 2823fcf..3f05167 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -123,7 +123,7 @@ export default function ({ link, count }: Props) {
setExpandDropdown(!expandDropdown)} id={"expand-dropdown" + link.id} - className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white hover:outline outline-sky-100 outline-1 duration-100 p-1" + className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white outline outline-sky-100 hover:outline-sky-500 outline-1 duration-100 p-1" > ) : null}
diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx index 24b7f46..df399fa 100644 --- a/components/Modal/Collection/TeamManagement.tsx +++ b/components/Modal/Collection/TeamManagement.tsx @@ -239,7 +239,7 @@ export default function TeamManagement({ }); }} /> - + Create @@ -268,7 +268,7 @@ export default function TeamManagement({ }); }} /> - + Update @@ -297,7 +297,7 @@ export default function TeamManagement({ }); }} /> - + Delete diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index c104d35..caa401e 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -27,13 +27,15 @@ export default function ({ text, icon, path, className }: SidebarItemProps) {
{React.cloneElement(icon, { - className: `w-4 ${active ? "text-white" : "text-sky-300"}`, + className: `w-4 h-4 ${active ? "text-white" : "text-sky-300"}`, })} -

+

{text}

diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index a335eaa..835988c 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -32,9 +32,9 @@ export default function ({ className }: { className?: string }) { return (
-

+

Linkwarden

@@ -43,12 +43,12 @@ export default function ({ className }: { className?: string }) { className={`${ active === "/dashboard" ? "bg-sky-500" - : "hover:bg-gray-50 hover:outline bg-gray-100" - } outline-sky-100 outline-1 duration-100 rounded-md my-1 p-2 cursor-pointer flex items-center gap-2`} + : "hover:bg-slate-200 bg-gray-100" + } outline-sky-100 outline-1 duration-100 py-1 px-4 cursor-pointer flex items-center gap-2`} > @@ -67,12 +67,12 @@ export default function ({ className }: { className?: string }) { className={`${ active === "/links" ? "bg-sky-500" - : "hover:bg-gray-50 hover:outline bg-gray-100" - } outline-sky-100 outline-1 duration-100 rounded-md my-1 p-2 cursor-pointer flex items-center gap-2`} + : "hover:bg-slate-200 bg-gray-100" + } outline-sky-100 outline-1 duration-100 py-1 px-4 cursor-pointer flex items-center gap-2`} > @@ -87,14 +87,12 @@ export default function ({ className }: { className?: string }) {
@@ -109,7 +107,7 @@ export default function ({ className }: { className?: string }) {
-

Collections

+

Collections

{collections @@ -127,7 +125,7 @@ export default function ({ className }: { className?: string }) { })}
-

Tags

+

Tags

{tags diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 0bc6083..4287211 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -84,8 +84,8 @@ export default function () { {links .sort( (a, b) => - new Date(b.createdAt).getTime() - - new Date(a.createdAt).getTime() + new Date(b.createdAt as string).getTime() - + new Date(a.createdAt as string).getTime() ) .slice(0, 5) .map((e, i) => ( From 8f5dba6ed46228605a0f31c837150ff022ba293c Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 May 2023 02:10:28 +0330 Subject: [PATCH 089/144] some code cleanup --- components/SortLinkDropdown.tsx | 69 +++++++++++++++++++++++++++++++++ pages/collections/[id].tsx | 62 ++++------------------------- pages/links.tsx | 54 +++----------------------- pages/tags/[id].tsx | 60 +++++----------------------- 4 files changed, 92 insertions(+), 153 deletions(-) create mode 100644 components/SortLinkDropdown.tsx diff --git a/components/SortLinkDropdown.tsx b/components/SortLinkDropdown.tsx new file mode 100644 index 0000000..11d2db7 --- /dev/null +++ b/components/SortLinkDropdown.tsx @@ -0,0 +1,69 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import React, { ChangeEvent } from "react"; +import ClickAwayHandler from "./ClickAwayHandler"; +import RadioButton from "./RadioButton"; + +type Props = { + handleSortChange: (e: ChangeEvent) => void; + sortBy: string; + toggleSortDropdown: Function; +}; + +export default function SortLinkDropdown({ + handleSortChange, + sortBy, + toggleSortDropdown, +}: Props) { + return ( + { + const target = e.target as HTMLInputElement; + if (target.id !== "sort-dropdown") toggleSortDropdown(); + }} + className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" + > +

Sort by

+
+ + + + + + + + + + + +
+
+ ); +} diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 9f0c767..b123555 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -19,13 +19,12 @@ import { } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/router"; -import { ChangeEvent, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import MainLayout from "@/layouts/MainLayout"; -import RadioButton from "@/components/RadioButton"; -import ClickAwayHandler from "@/components/ClickAwayHandler"; import { useSession } from "next-auth/react"; import ProfilePhoto from "@/components/ProfilePhoto"; import TeamManagement from "@/components/Modal/Collection/TeamManagement"; +import SortLinkDropdown from "@/components/SortLinkDropdown"; export default function () { const router = useRouter(); @@ -64,10 +63,6 @@ export default function () { setDeleteCollectionModal(!deleteCollectionModal); }; - const handleSortChange = (event: ChangeEvent) => { - setSortBy(event.target.value); - }; - useEffect(() => { setActiveCollection( collections.find((e) => e.id === Number(router.query.id)) @@ -182,54 +177,11 @@ export default function () {
{sortDropdown ? ( - { - const target = e.target as HTMLInputElement; - if (target.id !== "sort-dropdown") setSortDropdown(false); - }} - className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" - > -

- Sort by -

-
- - - - - - - - - - - -
-
+ setSortBy(e.target.value)} + sortBy={sortBy} + toggleSortDropdown={() => setSortDropdown(!sortDropdown)} + /> ) : null}
diff --git a/pages/links.tsx b/pages/links.tsx index 3b7924e..903a9df 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -6,6 +6,7 @@ import ClickAwayHandler from "@/components/ClickAwayHandler"; import LinkList from "@/components/LinkList"; import RadioButton from "@/components/RadioButton"; +import SortLinkDropdown from "@/components/SortLinkDropdown"; import MainLayout from "@/layouts/MainLayout"; import useLinkStore from "@/store/links"; import { faBookmark, faSort } from "@fortawesome/free-solid-svg-icons"; @@ -78,54 +79,11 @@ export default function Links() {
{sortDropdown ? ( - { - const target = e.target as HTMLInputElement; - if (target.id !== "sort-dropdown") setSortDropdown(false); - }} - className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" - > -

- Sort by -

-
- - - - - - - - - - - -
-
+ setSortBy(e.target.value)} + sortBy={sortBy} + toggleSortDropdown={() => setSortDropdown(!sortDropdown)} + /> ) : null}
diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index 9d7dbfc..cce0372 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -14,6 +14,7 @@ import RadioButton from "@/components/RadioButton"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { Tag } from "@prisma/client"; import useTagStore from "@/store/tags"; +import SortLinkDropdown from "@/components/SortLinkDropdown"; export default function () { const router = useRouter(); @@ -55,14 +56,16 @@ export default function () { setSortedLinks( linksArray.sort( (a, b) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + new Date(b.createdAt as string).getTime() - + new Date(a.createdAt as string).getTime() ) ); else if (sortBy === "Date (Oldest First)") setSortedLinks( linksArray.sort( (a, b) => - new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime() + new Date(a.createdAt as string).getTime() - + new Date(b.createdAt as string).getTime() ) ); }, [links, router, tags, sortBy]); @@ -95,54 +98,11 @@ export default function () {
{sortDropdown ? ( - { - const target = e.target as HTMLInputElement; - if (target.id !== "sort-dropdown") setSortDropdown(false); - }} - className="absolute top-8 right-0 shadow-md bg-gray-50 rounded-md p-2 z-10 border border-sky-100 w-48" - > -

- Sort by -

-
- - - - - - - - - - - -
-
+ setSortBy(e.target.value)} + sortBy={sortBy} + toggleSortDropdown={() => setSortDropdown(!sortDropdown)} + /> ) : null}
From 271231120ce16b8852a27a74f7bc6b8cd2213769 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 May 2023 02:44:44 +0330 Subject: [PATCH 090/144] improvements --- components/CollectionCard.tsx | 4 ---- components/LinkList.tsx | 2 +- components/Modal/Collection/CollectionInfo.tsx | 17 ++--------------- components/Modal/Collection/TeamManagement.tsx | 10 +++++----- components/Navbar.tsx | 9 ++++----- .../controllers/collections/updateCollection.ts | 1 + .../migration.sql | 1 + prisma/schema.prisma | 1 + 8 files changed, 15 insertions(+), 30 deletions(-) rename prisma/migrations/{20230523040650_init => 20230528224940_init}/migration.sql (98%) diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 6508cff..5efac28 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -96,7 +96,6 @@ export default function ({
- {expandDropdown ? ( ) : null} - {editCollectionModal ? ( ) : null} - {collectionMembersModal ? ( ) : null} - {deleteCollectionModal ? ( { const target = e.target as HTMLElement; diff --git a/components/Modal/Collection/CollectionInfo.tsx b/components/Modal/Collection/CollectionInfo.tsx index 145517f..158e9a5 100644 --- a/components/Modal/Collection/CollectionInfo.tsx +++ b/components/Modal/Collection/CollectionInfo.tsx @@ -5,23 +5,10 @@ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { - faClose, - faPenToSquare, - faPlus, - faTrashCan, - faUser, - faUserPlus, -} from "@fortawesome/free-solid-svg-icons"; +import { faPenToSquare, faPlus } from "@fortawesome/free-solid-svg-icons"; import useCollectionStore from "@/store/collections"; -import { CollectionIncludingMembers, Member } from "@/types/global"; -import { useSession } from "next-auth/react"; -import Modal from "@/components/Modal"; -import DeleteCollection from "@/components/Modal/Collection/DeleteCollection"; +import { CollectionIncludingMembers } from "@/types/global"; import RequiredBadge from "../../RequiredBadge"; -import addMemberToCollection from "@/lib/client/addMemberToCollection"; -import ImageWithFallback from "../../ImageWithFallback"; -import Checkbox from "../../Checkbox"; type Props = { toggleCollectionModal: Function; diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx index df399fa..d370b57 100644 --- a/components/Modal/Collection/TeamManagement.tsx +++ b/components/Modal/Collection/TeamManagement.tsx @@ -30,8 +30,6 @@ export default function TeamManagement({ const [collection, setCollection] = useState(activeCollection); - const [isPublic, setIsPublic] = useState(false); - const currentURL = new URL(document.URL); const publicCollectionURL = `${currentURL.origin}/public/collections/${collection.id}`; @@ -87,15 +85,17 @@ export default function TeamManagement({ setIsPublic(!isPublic)} + state={collection.isPublic} + onClick={() => + setCollection({ ...collection, isPublic: !collection.isPublic }) + } />

This will let Anyone to view this collection.

- {isPublic ? ( + {collection.isPublic ? (

Public Link (Click to copy)

setProfileDropdown(!profileDropdown)} id="profile-dropdown" > {account.profilePic ? ( ) : ( )} -
+

{account.name} diff --git a/lib/api/controllers/collections/updateCollection.ts b/lib/api/controllers/collections/updateCollection.ts index 1e6f436..1d51130 100644 --- a/lib/api/controllers/collections/updateCollection.ts +++ b/lib/api/controllers/collections/updateCollection.ts @@ -35,6 +35,7 @@ export default async function ( data: { name: collection.name, description: collection.description, + isPublic: collection.isPublic, members: { create: collection.members.map((e) => ({ user: { connect: { email: e.user.email } }, diff --git a/prisma/migrations/20230523040650_init/migration.sql b/prisma/migrations/20230528224940_init/migration.sql similarity index 98% rename from prisma/migrations/20230523040650_init/migration.sql rename to prisma/migrations/20230528224940_init/migration.sql index 351f017..f317c9c 100644 --- a/prisma/migrations/20230523040650_init/migration.sql +++ b/prisma/migrations/20230528224940_init/migration.sql @@ -16,6 +16,7 @@ CREATE TABLE "Collection" ( "id" SERIAL NOT NULL, "name" TEXT NOT NULL, "description" TEXT NOT NULL DEFAULT '', + "isPublic" BOOLEAN NOT NULL DEFAULT false, "ownerId" INTEGER NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f80505e..10f14df 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -29,6 +29,7 @@ model Collection { id Int @id @default(autoincrement()) name String description String @default("") + isPublic Boolean @default(false) owner User @relation(fields: [ownerId], references: [id]) ownerId Int members UsersAndCollections[] From 7f9b0d8977a01da0ca8d7469e1bc0141aa0e3057 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 May 2023 23:10:23 +0330 Subject: [PATCH 091/144] created a route for public collections --- lib/api/controllers/public/getCollection.ts | 43 +++++++++++++++++++++ lib/client/getPublicCollectionData.ts | 18 +++++++++ pages/api/public/routes/collections.ts | 24 ++++++++++++ pages/public/collections/[id].tsx | 28 +++++++++++++- store/account.ts | 2 - store/collections.ts | 2 - types/global.ts | 6 +++ 7 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 lib/api/controllers/public/getCollection.ts create mode 100644 lib/client/getPublicCollectionData.ts create mode 100644 pages/api/public/routes/collections.ts diff --git a/lib/api/controllers/public/getCollection.ts b/lib/api/controllers/public/getCollection.ts new file mode 100644 index 0000000..c3860fd --- /dev/null +++ b/lib/api/controllers/public/getCollection.ts @@ -0,0 +1,43 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { prisma } from "@/lib/api/db"; + +export default async function (collectionId: number) { + let data; + + const collection = await prisma.collection.findFirst({ + where: { + id: collectionId, + isPublic: true, + }, + include: { + links: { + select: { + id: true, + name: true, + url: true, + title: true, + collectionId: true, + createdAt: true, + }, + }, + }, + }); + + if (collection) { + const user = await prisma.user.findUnique({ + where: { + id: collection.ownerId, + }, + }); + + data = { ownerName: user?.name, ...collection }; + + return { response: data, status: 200 }; + } else { + return { response: "Collection not found...", status: 400 }; + } +} diff --git a/lib/client/getPublicCollectionData.ts b/lib/client/getPublicCollectionData.ts new file mode 100644 index 0000000..942802d --- /dev/null +++ b/lib/client/getPublicCollectionData.ts @@ -0,0 +1,18 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +const getPublicCollectionData = async (collectionId: string) => { + const res = await fetch( + "/api/public/routes/collections/?collectionId=" + collectionId + ); + + const data = await res.json(); + + console.log(data); + + return data; +}; + +export default getPublicCollectionData; diff --git a/pages/api/public/routes/collections.ts b/pages/api/public/routes/collections.ts new file mode 100644 index 0000000..bc87cb6 --- /dev/null +++ b/pages/api/public/routes/collections.ts @@ -0,0 +1,24 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import getCollection from "@/lib/api/controllers/public/getCollection"; +import type { NextApiRequest, NextApiResponse } from "next"; + +export default async function (req: NextApiRequest, res: NextApiResponse) { + const collectionId = Number(req.query.collectionId); + + if (!collectionId) { + return res + .status(401) + .json({ response: "Please choose a valid collection." }); + } + + if (req.method === "GET") { + const collection = await getCollection(collectionId); + return res + .status(collection.status) + .json({ response: collection.response }); + } +} diff --git a/pages/public/collections/[id].tsx b/pages/public/collections/[id].tsx index 6f6ae03..5d1ee5a 100644 --- a/pages/public/collections/[id].tsx +++ b/pages/public/collections/[id].tsx @@ -1,5 +1,29 @@ -import React from "react"; +import getPublicCollectionData from "@/lib/client/getPublicCollectionData"; +import { PublicCollectionIncludingLinks } from "@/types/global"; +import { useRouter } from "next/router"; +import React, { useEffect, useState } from "react"; export default function PublicCollections() { - return

Hello
; + const router = useRouter(); + + const [data, setData] = useState(); + + useEffect(() => { + const init = async () => { + if (router.query.id) { + const data = await getPublicCollectionData(router.query.id as string); + + setData(data); + } + }; + + init(); + }, []); + + return ( +
+

Hello

+ {JSON.stringify(data)} +
+ ); } diff --git a/store/account.ts b/store/account.ts index ddd13a4..4b430d6 100644 --- a/store/account.ts +++ b/store/account.ts @@ -29,8 +29,6 @@ const useAccountStore = create()((set) => ({ const profilePic = await determineProfilePicSource(data); - console.log({ ...data.response, profilePic }); - if (response.ok) set({ account: { ...data.response, profilePic } }); }, updateAccount: async (user) => { diff --git a/store/collections.ts b/store/collections.ts index 05d7efe..907debf 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -25,8 +25,6 @@ const useCollectionStore = create()((set) => ({ const data = await response.json(); - console.log(data); - if (response.ok) set({ collections: data.response }); }, addCollection: async (body) => { diff --git a/types/global.ts b/types/global.ts index df4e632..78d695a 100644 --- a/types/global.ts +++ b/types/global.ts @@ -49,3 +49,9 @@ export type SearchSettings = { tags: boolean; }; }; + +export interface PublicCollectionIncludingLinks + extends Omit { + ownerName?: string; + links: Omit; +} From facbf096045294c7054ec6979391452148e63edd Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 31 May 2023 18:00:45 +0330 Subject: [PATCH 092/144] added public page + formatting fixes --- LICENSE.md => LICENSE | 143 ++++++++---------- components/ClickAwayHandler.tsx | 5 - components/CollectionCard.tsx | 7 +- components/Dashboard/CollectionItem.tsx | 5 - components/Dashboard/LinkItem.tsx | 5 - components/Dropdown.tsx | 5 - .../InputSelect/CollectionSelection.tsx | 5 - components/InputSelect/TagSelection.tsx | 5 - components/InputSelect/styles.ts | 5 - components/InputSelect/types.ts | 5 - components/LinkList.tsx | 9 +- components/Loader.tsx | 5 - components/Modal/ChangePassword.tsx | 5 - .../Modal/Collection/CollectionInfo.tsx | 5 - .../Modal/Collection/DeleteCollection.tsx | 5 - .../Modal/Collection/TeamManagement.tsx | 5 - components/Modal/LinkModal.tsx | 5 - components/Modal/UserSettings.tsx | 5 - components/Modal/index.tsx | 5 - components/Navbar.tsx | 5 - components/PublicPage/LinkList.tsx | 81 ++++++++++ components/RequiredBadge.tsx | 5 - components/Search.tsx | 5 - components/Sidebar/SidebarItem.tsx | 5 - components/Sidebar/index.tsx | 5 - components/SortLinkDropdown.tsx | 5 - hooks/useRedirect.tsx | 5 - layouts/AuthRedirect.tsx | 5 - layouts/MainLayout.tsx | 5 - lib/api/archive.ts | 5 - .../collections/deleteCollection.ts | 5 - .../controllers/collections/getCollections.ts | 5 - .../controllers/collections/postCollection.ts | 5 - .../collections/updateCollection.ts | 5 - lib/api/controllers/links/deleteLink.ts | 5 - lib/api/controllers/links/getLinks.ts | 5 - lib/api/controllers/links/postLink.ts | 5 - lib/api/controllers/links/updateLink.ts | 5 - lib/api/controllers/public/getCollection.ts | 5 - lib/api/controllers/tags/getTags.ts | 5 - lib/api/controllers/users/getUsers.ts | 5 - lib/api/controllers/users/updateUser.ts | 5 - lib/api/db.ts | 5 - lib/api/getPermission.ts | 5 - lib/api/getTitle.ts | 5 - lib/client/getInitialData.ts | 5 - lib/client/getPublicCollectionData.ts | 5 - lib/client/getPublicUserDataByEmail.ts | 5 - package.json | 2 +- pages/_app.tsx | 5 - pages/_document.tsx | 5 - pages/api/archives/[...params].ts | 5 - pages/api/auth/[...nextauth].ts | 5 - pages/api/auth/register.ts | 5 - pages/api/avatar/[id].ts | 5 - pages/api/hello.ts | 5 - pages/api/public/routes/collections.ts | 5 - pages/api/routes/collections/index.ts | 5 - pages/api/routes/links/index.ts | 5 - pages/api/routes/tags/index.ts | 5 - pages/api/routes/users/index.ts | 5 - pages/collections/[id].tsx | 7 +- pages/collections/index.tsx | 6 +- pages/dashboard.tsx | 5 - pages/index.tsx | 5 - pages/links.tsx | 5 - pages/login.tsx | 5 - pages/public/collections/[id].tsx | 47 +++++- pages/register.tsx | 5 - pages/search.tsx | 5 - pages/tags/[id].tsx | 5 - prisma/schema.prisma | 5 - store/account.ts | 5 - store/collections.ts | 5 - store/links.ts | 5 - store/localSettings.ts | 5 - store/search.ts | 5 - store/tags.ts | 5 - styles/globals.css | 15 ++ types/global.ts | 7 +- types/next-auth.d.ts | 5 - 81 files changed, 208 insertions(+), 471 deletions(-) rename LICENSE.md => LICENSE (86%) create mode 100644 components/PublicPage/LinkList.tsx diff --git a/LICENSE.md b/LICENSE similarity index 86% rename from LICENSE.md rename to LICENSE index a5eae15..162676c 100644 --- a/LICENSE.md +++ b/LICENSE @@ -1,5 +1,5 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies @@ -7,17 +7,15 @@ of this license document, but changing it is not allowed. Preamble -The GNU General Public License is a free, copyleft license for -software and other kinds of works. +The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to +our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. +software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you @@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. -To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. -For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. -Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. -For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - -Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. The precise terms and conditions for copying, distribution and modification follow. @@ -72,7 +60,7 @@ modification follow. 0. Definitions. -"This License" refers to version 3 of the GNU General Public License. +"This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. @@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. -13. Use with the GNU Affero General Public License. +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single +under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General +Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published +GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's +versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. @@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + GNU Affero General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. -If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see +For more information on this, and how to apply and follow the GNU AGPL, see . - -The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/components/ClickAwayHandler.tsx b/components/ClickAwayHandler.tsx index 2bddbd1..d577e2f 100644 --- a/components/ClickAwayHandler.tsx +++ b/components/ClickAwayHandler.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { useRef, useEffect, ReactNode, RefObject } from "react"; type Props = { diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 5efac28..b9c2c4b 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faEllipsis } from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; @@ -63,7 +58,7 @@ export default function ({
-

+

{collection.name}

diff --git a/components/Dashboard/CollectionItem.tsx b/components/Dashboard/CollectionItem.tsx index 6053f69..1827639 100644 --- a/components/Dashboard/CollectionItem.tsx +++ b/components/Dashboard/CollectionItem.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; import Link from "next/link"; diff --git a/components/Dashboard/LinkItem.tsx b/components/Dashboard/LinkItem.tsx index cbc94d0..cab9461 100644 --- a/components/Dashboard/LinkItem.tsx +++ b/components/Dashboard/LinkItem.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { LinkIncludingCollectionAndTags } from "@/types/global"; import { faFolder, diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx index b0cb8d3..7412b7c 100644 --- a/components/Dropdown.tsx +++ b/components/Dropdown.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import Link from "next/link"; import React, { MouseEventHandler } from "react"; import ClickAwayHandler from "./ClickAwayHandler"; diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx index f86be56..388270a 100644 --- a/components/InputSelect/CollectionSelection.tsx +++ b/components/InputSelect/CollectionSelection.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import useCollectionStore from "@/store/collections"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; diff --git a/components/InputSelect/TagSelection.tsx b/components/InputSelect/TagSelection.tsx index 9f277eb..62c5242 100644 --- a/components/InputSelect/TagSelection.tsx +++ b/components/InputSelect/TagSelection.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import useTagStore from "@/store/tags"; import { useEffect, useState } from "react"; import CreatableSelect from "react-select/creatable"; diff --git a/components/InputSelect/styles.ts b/components/InputSelect/styles.ts index f56833c..b86698a 100644 --- a/components/InputSelect/styles.ts +++ b/components/InputSelect/styles.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { StylesConfig } from "react-select"; const font = diff --git a/components/InputSelect/types.ts b/components/InputSelect/types.ts index ff1a571..dc8cd1f 100644 --- a/components/InputSelect/types.ts +++ b/components/InputSelect/types.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - export interface Options { label: string; value?: string | number; diff --git a/components/LinkList.tsx b/components/LinkList.tsx index ff174d0..b42154f 100644 --- a/components/LinkList.tsx +++ b/components/LinkList.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { LinkIncludingCollectionAndTags } from "@/types/global"; import { faFolder, @@ -45,7 +40,7 @@ export default function ({ link, count }: Props) { }; return ( -
+
{editModal ? (

{count + 1}.

-

{link.name}

+

{link.name}

{link.title}

diff --git a/components/Loader.tsx b/components/Loader.tsx index adfe021..88d12d8 100644 --- a/components/Loader.tsx +++ b/components/Loader.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - export default function () { return (
diff --git a/components/Modal/ChangePassword.tsx b/components/Modal/ChangePassword.tsx index a719f74..43356e0 100644 --- a/components/Modal/ChangePassword.tsx +++ b/components/Modal/ChangePassword.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { useState } from "react"; import { AccountSettings } from "@/types/global"; diff --git a/components/Modal/Collection/CollectionInfo.tsx b/components/Modal/Collection/CollectionInfo.tsx index 158e9a5..a22ec9c 100644 --- a/components/Modal/Collection/CollectionInfo.tsx +++ b/components/Modal/Collection/CollectionInfo.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPenToSquare, faPlus } from "@fortawesome/free-solid-svg-icons"; diff --git a/components/Modal/Collection/DeleteCollection.tsx b/components/Modal/Collection/DeleteCollection.tsx index 4a2e3b9..ef7c815 100644 --- a/components/Modal/Collection/DeleteCollection.tsx +++ b/components/Modal/Collection/DeleteCollection.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx index d370b57..75ef93f 100644 --- a/components/Modal/Collection/TeamManagement.tsx +++ b/components/Modal/Collection/TeamManagement.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { diff --git a/components/Modal/LinkModal.tsx b/components/Modal/LinkModal.tsx index 30e7ab8..3dbb12b 100644 --- a/components/Modal/LinkModal.tsx +++ b/components/Modal/LinkModal.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { useEffect, useState } from "react"; import CollectionSelection from "@/components/InputSelect/CollectionSelection"; import TagSelection from "@/components/InputSelect/TagSelection"; diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index 1b9aeb3..c7a2dc9 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { useEffect, useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faUser, faClose } from "@fortawesome/free-solid-svg-icons"; diff --git a/components/Modal/index.tsx b/components/Modal/index.tsx index b4938b0..e728f4c 100644 --- a/components/Modal/index.tsx +++ b/components/Modal/index.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { MouseEventHandler, ReactNode } from "react"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; diff --git a/components/Navbar.tsx b/components/Navbar.tsx index dc2b9b8..24d5781 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { signOut } from "next-auth/react"; import { diff --git a/components/PublicPage/LinkList.tsx b/components/PublicPage/LinkList.tsx new file mode 100644 index 0000000..0e71755 --- /dev/null +++ b/components/PublicPage/LinkList.tsx @@ -0,0 +1,81 @@ +import { + faArrowUpRightFromSquare, + faChevronRight, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Image from "next/image"; +import { Link as LinkType } from "@prisma/client"; + +type Props = { + link: Omit; + count: number; +}; + +export default function ({ link, count }: Props) { + const url = new URL(link.url); + const formattedDate = new Date( + link.createdAt as unknown as string + ).toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + + return ( + +
+ { + const target = e.target as HTMLElement; + target.style.opacity = "0"; + }} + /> + { + const target = e.target as HTMLElement; + target.style.opacity = "0"; + }} + /> +
+
+
+

{count + 1}.

+

{link.name}

+
+ +

{link.title}

+ +
+

{formattedDate}

+
+

{url.host}

+ +
+
+
+
+ +
+
+
+
+ ); +} diff --git a/components/RequiredBadge.tsx b/components/RequiredBadge.tsx index 40eb3e2..1f9a41b 100644 --- a/components/RequiredBadge.tsx +++ b/components/RequiredBadge.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - export default function RequiredBadge() { return ( diff --git a/components/Search.tsx b/components/Search.tsx index b51c800..5072fc2 100644 --- a/components/Search.tsx +++ b/components/Search.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useEffect, useState } from "react"; diff --git a/components/Sidebar/SidebarItem.tsx b/components/Sidebar/SidebarItem.tsx index caa401e..8fb8989 100644 --- a/components/Sidebar/SidebarItem.tsx +++ b/components/Sidebar/SidebarItem.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import Link from "next/link"; import React, { ReactElement, useEffect, useState } from "react"; import { useRouter } from "next/router"; diff --git a/components/Sidebar/index.tsx b/components/Sidebar/index.tsx index 835988c..70d931f 100644 --- a/components/Sidebar/index.tsx +++ b/components/Sidebar/index.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import useCollectionStore from "@/store/collections"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { diff --git a/components/SortLinkDropdown.tsx b/components/SortLinkDropdown.tsx index 11d2db7..7c90cfe 100644 --- a/components/SortLinkDropdown.tsx +++ b/components/SortLinkDropdown.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React, { ChangeEvent } from "react"; import ClickAwayHandler from "./ClickAwayHandler"; import RadioButton from "./RadioButton"; diff --git a/hooks/useRedirect.tsx b/hooks/useRedirect.tsx index 64219ee..51e3380 100644 --- a/hooks/useRedirect.tsx +++ b/hooks/useRedirect.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; diff --git a/layouts/AuthRedirect.tsx b/layouts/AuthRedirect.tsx index 2f879c4..cdc3ad5 100644 --- a/layouts/AuthRedirect.tsx +++ b/layouts/AuthRedirect.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { ReactNode } from "react"; import { useSession } from "next-auth/react"; import Loader from "../components/Loader"; diff --git a/layouts/MainLayout.tsx b/layouts/MainLayout.tsx index 2cfe01a..6a92aea 100644 --- a/layouts/MainLayout.tsx +++ b/layouts/MainLayout.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import Navbar from "@/components/Navbar"; import Sidebar from "@/components/Sidebar"; import { ReactNode } from "react"; diff --git a/lib/api/archive.ts b/lib/api/archive.ts index ef73807..496a464 100644 --- a/lib/api/archive.ts +++ b/lib/api/archive.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { Page } from "puppeteer"; import { prisma } from "@/lib/api/db"; import puppeteer from "puppeteer-extra"; diff --git a/lib/api/controllers/collections/deleteCollection.ts b/lib/api/controllers/collections/deleteCollection.ts index c94c69a..beefc7d 100644 --- a/lib/api/controllers/collections/deleteCollection.ts +++ b/lib/api/controllers/collections/deleteCollection.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import getPermission from "@/lib/api/getPermission"; import fs from "fs"; diff --git a/lib/api/controllers/collections/getCollections.ts b/lib/api/controllers/collections/getCollections.ts index 3e1ab30..88446bf 100644 --- a/lib/api/controllers/collections/getCollections.ts +++ b/lib/api/controllers/collections/getCollections.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; export default async function (userId: number) { diff --git a/lib/api/controllers/collections/postCollection.ts b/lib/api/controllers/collections/postCollection.ts index 5957b95..2aa5170 100644 --- a/lib/api/controllers/collections/postCollection.ts +++ b/lib/api/controllers/collections/postCollection.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import { CollectionIncludingMembers } from "@/types/global"; import { existsSync, mkdirSync } from "fs"; diff --git a/lib/api/controllers/collections/updateCollection.ts b/lib/api/controllers/collections/updateCollection.ts index 1d51130..6387bc8 100644 --- a/lib/api/controllers/collections/updateCollection.ts +++ b/lib/api/controllers/collections/updateCollection.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import { CollectionIncludingMembers } from "@/types/global"; import getPermission from "@/lib/api/getPermission"; diff --git a/lib/api/controllers/links/deleteLink.ts b/lib/api/controllers/links/deleteLink.ts index 308fa84..19f4861 100644 --- a/lib/api/controllers/links/deleteLink.ts +++ b/lib/api/controllers/links/deleteLink.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import { LinkIncludingCollectionAndTags } from "@/types/global"; import fs from "fs"; diff --git a/lib/api/controllers/links/getLinks.ts b/lib/api/controllers/links/getLinks.ts index 651f63a..12ee450 100644 --- a/lib/api/controllers/links/getLinks.ts +++ b/lib/api/controllers/links/getLinks.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; export default async function (userId: number) { const links = await prisma.link.findMany({ diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index f678a49..2d8076d 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import { LinkIncludingCollectionAndTags } from "@/types/global"; import getTitle from "../../getTitle"; diff --git a/lib/api/controllers/links/updateLink.ts b/lib/api/controllers/links/updateLink.ts index 8e73f23..f0684f8 100644 --- a/lib/api/controllers/links/updateLink.ts +++ b/lib/api/controllers/links/updateLink.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import { LinkIncludingCollectionAndTags } from "@/types/global"; import { UsersAndCollections } from "@prisma/client"; diff --git a/lib/api/controllers/public/getCollection.ts b/lib/api/controllers/public/getCollection.ts index c3860fd..d05bb6a 100644 --- a/lib/api/controllers/public/getCollection.ts +++ b/lib/api/controllers/public/getCollection.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; export default async function (collectionId: number) { diff --git a/lib/api/controllers/tags/getTags.ts b/lib/api/controllers/tags/getTags.ts index 92dd3b2..b3bf070 100644 --- a/lib/api/controllers/tags/getTags.ts +++ b/lib/api/controllers/tags/getTags.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; export default async function (userId: number) { diff --git a/lib/api/controllers/users/getUsers.ts b/lib/api/controllers/users/getUsers.ts index 582fdfd..f7efa9f 100644 --- a/lib/api/controllers/users/getUsers.ts +++ b/lib/api/controllers/users/getUsers.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; export default async function ( diff --git a/lib/api/controllers/users/updateUser.ts b/lib/api/controllers/users/updateUser.ts index 9e0e864..1e4201a 100644 --- a/lib/api/controllers/users/updateUser.ts +++ b/lib/api/controllers/users/updateUser.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import { AccountSettings } from "@/types/global"; import fs from "fs"; diff --git a/lib/api/db.ts b/lib/api/db.ts index 66fa5fe..8919c42 100644 --- a/lib/api/db.ts +++ b/lib/api/db.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { PrismaClient } from "@prisma/client"; const globalForPrisma = global as unknown as { prisma: PrismaClient }; diff --git a/lib/api/getPermission.ts b/lib/api/getPermission.ts index a4a07b2..49bbc04 100644 --- a/lib/api/getPermission.ts +++ b/lib/api/getPermission.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; export default async (userId: number, collectionId: number) => { diff --git a/lib/api/getTitle.ts b/lib/api/getTitle.ts index 6fcc53b..07187ee 100644 --- a/lib/api/getTitle.ts +++ b/lib/api/getTitle.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - export default async (url: string) => { const response = await fetch(url); const text = await response.text(); diff --git a/lib/client/getInitialData.ts b/lib/client/getInitialData.ts index a0acd6e..46d9f82 100644 --- a/lib/client/getInitialData.ts +++ b/lib/client/getInitialData.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import useCollectionStore from "@/store/collections"; import { useEffect } from "react"; import { useSession } from "next-auth/react"; diff --git a/lib/client/getPublicCollectionData.ts b/lib/client/getPublicCollectionData.ts index 942802d..d12ad3a 100644 --- a/lib/client/getPublicCollectionData.ts +++ b/lib/client/getPublicCollectionData.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - const getPublicCollectionData = async (collectionId: string) => { const res = await fetch( "/api/public/routes/collections/?collectionId=" + collectionId diff --git a/lib/client/getPublicUserDataByEmail.ts b/lib/client/getPublicUserDataByEmail.ts index d386918..42c097c 100644 --- a/lib/client/getPublicUserDataByEmail.ts +++ b/lib/client/getPublicUserDataByEmail.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - export default async function (email: string) { const response = await fetch(`/api/routes/users?email=${email}`); diff --git a/package.json b/package.json index f5a8016..c633a23 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "index.js", "repository": "https://github.com/Daniel31x13/link-warden.git", "author": "Daniel31X13 ", - "license": "GPL-3.0", + "license": "AGPL-3.0", "private": true, "scripts": { "dev": "next dev", diff --git a/pages/_app.tsx b/pages/_app.tsx index 9b28aac..cfd49fb 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import React from "react"; import "@/styles/globals.css"; import { SessionProvider } from "next-auth/react"; diff --git a/pages/_document.tsx b/pages/_document.tsx index 8fe71a1..b2fff8b 100644 --- a/pages/_document.tsx +++ b/pages/_document.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { Html, Head, Main, NextScript } from "next/document"; export default function Document() { diff --git a/pages/api/archives/[...params].ts b/pages/api/archives/[...params].ts index 317a05f..57797d1 100644 --- a/pages/api/archives/[...params].ts +++ b/pages/api/archives/[...params].ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 4fa11f7..0f6bf16 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import NextAuth from "next-auth/next"; import CredentialsProvider from "next-auth/providers/credentials"; diff --git a/pages/api/auth/register.ts b/pages/api/auth/register.ts index 1f57328..d0d2006 100644 --- a/pages/api/auth/register.ts +++ b/pages/api/auth/register.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { prisma } from "@/lib/api/db"; import type { NextApiRequest, NextApiResponse } from "next"; import bcrypt from "bcrypt"; diff --git a/pages/api/avatar/[id].ts b/pages/api/avatar/[id].ts index f5cc69d..1ff93aa 100644 --- a/pages/api/avatar/[id].ts +++ b/pages/api/avatar/[id].ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/hello.ts b/pages/api/hello.ts index 0225841..b170c05 100644 --- a/pages/api/hello.ts +++ b/pages/api/hello.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/public/routes/collections.ts b/pages/api/public/routes/collections.ts index bc87cb6..a687d93 100644 --- a/pages/api/public/routes/collections.ts +++ b/pages/api/public/routes/collections.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import getCollection from "@/lib/api/controllers/public/getCollection"; import type { NextApiRequest, NextApiResponse } from "next"; diff --git a/pages/api/routes/collections/index.ts b/pages/api/routes/collections/index.ts index 096e7e7..f05edce 100644 --- a/pages/api/routes/collections/index.ts +++ b/pages/api/routes/collections/index.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/routes/links/index.ts b/pages/api/routes/links/index.ts index 979b308..9beb60d 100644 --- a/pages/api/routes/links/index.ts +++ b/pages/api/routes/links/index.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/routes/tags/index.ts b/pages/api/routes/tags/index.ts index c14d9c9..3373c5b 100644 --- a/pages/api/routes/tags/index.ts +++ b/pages/api/routes/tags/index.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/api/routes/users/index.ts b/pages/api/routes/users/index.ts index 4af3e19..8479985 100644 --- a/pages/api/routes/users/index.ts +++ b/pages/api/routes/users/index.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import type { NextApiRequest, NextApiResponse } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "pages/api/auth/[...nextauth]"; diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index b123555..8f1f378 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import Dropdown from "@/components/Dropdown"; import LinkList from "@/components/LinkList"; import Modal from "@/components/Modal"; @@ -111,7 +106,7 @@ export default function () { icon={faFolder} className="sm:w-8 sm:h-8 w-6 h-6 mt-2 text-sky-300" /> -

+

{activeCollection?.name}

diff --git a/pages/collections/index.tsx b/pages/collections/index.tsx index 2e576fa..ef02d81 100644 --- a/pages/collections/index.tsx +++ b/pages/collections/index.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import useCollectionStore from "@/store/collections"; import { faBox, @@ -218,6 +213,7 @@ export default function () { activeCollection={{ name: "", description: "", + isPublic: false, ownerId: session.data?.user.id as number, members: [], }} diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 4287211..2727539 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import useCollectionStore from "@/store/collections"; import { faArrowRight, faChartSimple } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; diff --git a/pages/index.tsx b/pages/index.tsx index bbfb791..7c4db0c 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { useRouter } from "next/router"; import { useEffect } from "react"; diff --git a/pages/links.tsx b/pages/links.tsx index 903a9df..e585c88 100644 --- a/pages/links.tsx +++ b/pages/links.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import ClickAwayHandler from "@/components/ClickAwayHandler"; import LinkList from "@/components/LinkList"; import RadioButton from "@/components/RadioButton"; diff --git a/pages/login.tsx b/pages/login.tsx index cc23739..f470586 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { signIn } from "next-auth/react"; import Link from "next/link"; import { useRouter } from "next/router"; diff --git a/pages/public/collections/[id].tsx b/pages/public/collections/[id].tsx index 5d1ee5a..2575c5e 100644 --- a/pages/public/collections/[id].tsx +++ b/pages/public/collections/[id].tsx @@ -1,3 +1,4 @@ +import LinkList from "@/components/PublicPage/LinkList"; import getPublicCollectionData from "@/lib/client/getPublicCollectionData"; import { PublicCollectionIncludingLinks } from "@/types/global"; import { useRouter } from "next/router"; @@ -9,21 +10,53 @@ export default function PublicCollections() { const [data, setData] = useState(); useEffect(() => { - const init = async () => { + const setState = async () => { if (router.query.id) { const data = await getPublicCollectionData(router.query.id as string); - setData(data); + setData(data.response); } }; - init(); + setState(); + + // document + // .querySelector("body") + // ?.classList.add( + // "bg-gradient-to-br", + // "from-slate-50", + // "to-sky-50", + // "min-h-screen" + // ); }, []); - return ( -
-

Hello

- {JSON.stringify(data)} + return data ? ( +
+
+

+ {data.name} +

+ + {data.ownerName && ( +

{"By " + data.ownerName}

+ )} + +
+ +

{data.description}

+
+ +
+ {data?.links.map((e, i) => { + return ; + })} +
+ +

+ List created with Linkwarden. +

+ ) : ( + <> ); } diff --git a/pages/register.tsx b/pages/register.tsx index 29e939b..9251555 100644 --- a/pages/register.tsx +++ b/pages/register.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import Link from "next/link"; import { useState } from "react"; import { useRouter } from "next/router"; diff --git a/pages/search.tsx b/pages/search.tsx index 2d448e1..6cb2474 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import Checkbox from "@/components/Checkbox"; import ClickAwayHandler from "@/components/ClickAwayHandler"; import LinkList from "@/components/LinkList"; diff --git a/pages/tags/[id].tsx b/pages/tags/[id].tsx index cce0372..1a4d1e5 100644 --- a/pages/tags/[id].tsx +++ b/pages/tags/[id].tsx @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import LinkList from "@/components/LinkList"; import useLinkStore from "@/store/links"; import { faHashtag, faSort } from "@fortawesome/free-solid-svg-icons"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 10f14df..425070b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - generator client { provider = "prisma-client-js" } diff --git a/store/account.ts b/store/account.ts index 4b430d6..f0f4e31 100644 --- a/store/account.ts +++ b/store/account.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { create } from "zustand"; import { AccountSettings } from "@/types/global"; import avatarExists from "@/lib/client/avatarExists"; diff --git a/store/collections.ts b/store/collections.ts index 907debf..707133a 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { create } from "zustand"; import { CollectionIncludingMembers } from "@/types/global"; import useTagStore from "./tags"; diff --git a/store/links.ts b/store/links.ts index 7976317..6c75303 100644 --- a/store/links.ts +++ b/store/links.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { create } from "zustand"; import { LinkIncludingCollectionAndTags } from "@/types/global"; import useTagStore from "./tags"; diff --git a/store/localSettings.ts b/store/localSettings.ts index e8537bf..8eebcef 100644 --- a/store/localSettings.ts +++ b/store/localSettings.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { create } from "zustand"; type LocalSettings = { diff --git a/store/search.ts b/store/search.ts index 62ef8b5..5c92637 100644 --- a/store/search.ts +++ b/store/search.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { SearchSettings } from "@/types/global"; import { create } from "zustand"; diff --git a/store/tags.ts b/store/tags.ts index e4d364f..17b5c52 100644 --- a/store/tags.ts +++ b/store/tags.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { create } from "zustand"; import { Tag } from "@prisma/client"; diff --git a/styles/globals.css b/styles/globals.css index 76cc6d6..b8f92d1 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -74,3 +74,18 @@ transform: translateX(0); } } + +.slide-right-with-fade { + animation: slide-right-animation 150ms; +} + +@keyframes slide-right-animation { + 0% { + transform: translateX(-50%); + opacity: 0; + } + 100% { + transform: translateX(0); + opacity: 1; + } +} diff --git a/types/global.ts b/types/global.ts index 78d695a..c9930bf 100644 --- a/types/global.ts +++ b/types/global.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import { Collection, Link, Tag, User } from "@prisma/client"; type OptionalExcluding = Partial & @@ -53,5 +48,5 @@ export type SearchSettings = { export interface PublicCollectionIncludingLinks extends Omit { ownerName?: string; - links: Omit; + links: Omit[]; } diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts index 47439a1..cb9674b 100644 --- a/types/next-auth.d.ts +++ b/types/next-auth.d.ts @@ -1,8 +1,3 @@ -// Copyright (C) 2022-present Daniel31x13 -// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. -// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along with this program. If not, see . - import NextAuth, { DefaultSession } from "next-auth"; declare module "next-auth" { From 6ef8e8f870a6745bc3e46f357b71ab41309e0261 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 31 May 2023 22:03:01 +0330 Subject: [PATCH 093/144] improved UI --- components/CollectionCard.tsx | 4 +- components/LinkList.tsx | 6 +-- .../Modal/Collection/CollectionInfo.tsx | 19 +++---- .../Modal/Collection/TeamManagement.tsx | 26 +++++----- components/Modal/LinkModal.tsx | 52 ++++--------------- components/Modal/UserSettings.tsx | 16 +++--- components/Modal/index.tsx | 6 +-- components/Navbar.tsx | 15 ++++-- components/Search.tsx | 4 +- components/SubmitButton.tsx | 27 ++++++++++ pages/collections/[id].tsx | 6 +-- pages/collections/index.tsx | 6 +-- pages/links.tsx | 2 +- pages/search.tsx | 10 ++-- pages/tags/[id].tsx | 2 +- 15 files changed, 99 insertions(+), 102 deletions(-) create mode 100644 components/SubmitButton.tsx diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index b9c2c4b..9abd8a2 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -44,11 +44,11 @@ export default function ({ }; return ( -
+
setExpandDropdown(!expandDropdown)} id={"expand-dropdown" + collection.id} - className="inline-flex absolute top-5 right-5 rounded-md cursor-pointer hover:bg-white hover:border-sky-500 border-sky-100 border duration-100 p-1" + className="inline-flex absolute top-5 right-5 rounded-md cursor-pointer hover:bg-slate-200 duration-100 p-1" > +
{editModal ? ( (

- # {e.name} + {e.name}

))} @@ -118,7 +118,7 @@ export default function ({ link, count }: Props) {
setExpandDropdown(!expandDropdown)} id={"expand-dropdown" + link.id} - className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-white outline outline-sky-100 hover:outline-sky-500 outline-1 duration-100 p-1" + className="text-gray-500 inline-flex rounded-md cursor-pointer hover:bg-slate-200 duration-100 p-1" >
-
-
- - {method === "CREATE" ? "Add Collection" : "Edit Collection"} -
-
+
); } diff --git a/components/Modal/Collection/TeamManagement.tsx b/components/Modal/Collection/TeamManagement.tsx index 75ef93f..6db720b 100644 --- a/components/Modal/Collection/TeamManagement.tsx +++ b/components/Modal/Collection/TeamManagement.tsx @@ -12,6 +12,7 @@ import { useSession } from "next-auth/react"; import addMemberToCollection from "@/lib/client/addMemberToCollection"; import ImageWithFallback from "../../ImageWithFallback"; import Checkbox from "../../Checkbox"; +import SubmitButton from "@/components/SubmitButton"; type Props = { toggleCollectionModal: Function; @@ -73,7 +74,7 @@ export default function TeamManagement({ return (

- Sharing & Collaboration Settings + Sharing & Collaboration

Make Public

@@ -114,7 +115,7 @@ export default function TeamManagement({

Member Management

-
+
{ @@ -134,7 +135,7 @@ export default function TeamManagement({ } type="text" placeholder="Email" - className="w-full rounded-md p-3 pr-12 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" + className="w-full rounded-md p-3 border-sky-100 border-solid border outline-none focus:border-sky-500 duration-100" />
- +
{collection?.members[0]?.user ? ( @@ -305,15 +306,12 @@ export default function TeamManagement({ ) : null} -
-
- - Edit Collection -
-
+
); } diff --git a/components/Modal/LinkModal.tsx b/components/Modal/LinkModal.tsx index 3dbb12b..36e83b9 100644 --- a/components/Modal/LinkModal.tsx +++ b/components/Modal/LinkModal.tsx @@ -5,11 +5,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { LinkIncludingCollectionAndTags } from "@/types/global"; import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; import useLinkStore from "@/store/links"; -import { faPlus, faTrashCan } from "@fortawesome/free-solid-svg-icons"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; import RequiredBadge from "../RequiredBadge"; import { useSession } from "next-auth/react"; import useCollectionStore from "@/store/collections"; import { useRouter } from "next/router"; +import SubmitButton from "../SubmitButton"; type Props = | { @@ -47,7 +48,7 @@ export default function EditLink({ } ); - const { updateLink, removeLink, addLink } = useLinkStore(); + const { updateLink, addLink } = useLinkStore(); const router = useRouter(); @@ -97,7 +98,7 @@ export default function EditLink({ if (method === "UPDATE") response = await updateLink(link); else if (method === "CREATE") response = await addLink(link); - toggleLinkModal(); + response && toggleLinkModal(); }; return ( @@ -107,7 +108,7 @@ export default function EditLink({

{method === "UPDATE" ? ( -

+

{shortendURL} | {link.title}

) : null} @@ -176,43 +177,12 @@ export default function EditLink({
-
-
- - {method === "CREATE" ? "Add Link" : "Edit Link"} -
- - {method === "UPDATE" ? ( - <> -
-
- -

OR

- -
-
- -
{ - removeLink(link); - toggleLinkModal(); - }} - className="w-fit inline-flex rounded-md cursor-pointer bg-red-500 hover:bg-red-400 duration-100 p-2" - > - -
- - ) : null} -
+
); } diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index c7a2dc9..13e576e 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -9,6 +9,7 @@ import { resizeImage } from "@/lib/client/resizeImage"; import Modal from "."; import ChangePassword from "./ChangePassword"; import { faPenToSquare } from "@fortawesome/free-regular-svg-icons"; +import SubmitButton from "../SubmitButton"; type Props = { toggleSettingsModal: Function; @@ -221,8 +222,8 @@ export default function UserSettings({ toggleSettingsModal }: Props) {

Please provide the Email addresses of the users you wish to grant - visibility to your profile. Separate the addresses with a comma. - Users not included will be unable to view your profile. + visibility to your profile. Separate by comma. Users not included + will be unable to view your profile.