Update frontend and fix more bugs

Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar>
Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar>
This commit is contained in:
Santiago Lo Coco 2022-12-19 20:24:44 -03:00
parent 0a04060527
commit 9928a20677
46 changed files with 5627 additions and 8 deletions

2
.gitignore vendored
View File

@ -71,3 +71,5 @@ cython_debug/
*_data *_data
data/ data/
test.py test.py
.next
node_modules

View File

@ -13,9 +13,14 @@ router = APIRouter()
@router.post("") @router.post("")
def create(aux: Document): def create(aux: Document, user: tuple = Depends(get_current_user)):
mongo.create_document(json.loads(json.dumps(aux.__dict__))) doc_id = mongo.create_document({
return JSONResponse(content={"detail": "Document created"}, status_code=201) "name": aux.name,
"owner": user[0],
"data": aux.data if aux.data is not None else ""
})
postgres.give_access_doc(user[0], doc_id, 1)
return JSONResponse(content={"detail": "Document created", "id": doc_id}, status_code=201)
@router.get("") @router.get("")
@ -42,6 +47,11 @@ def edit_data(aux: DocumentUpdate, id: str):
@router.get("/{id}/access") @router.get("/{id}/access")
def get_doc_access(id: str):
return postgres.access_to_doc(id)
@router.get("/{id}/access/me")
def get_access(id: str, user: tuple = Depends(get_current_user)): def get_access(id: str, user: tuple = Depends(get_current_user)):
return postgres.has_access_doc(user[0], id) return postgres.has_access_doc(user[0], id)

View File

@ -4,9 +4,7 @@ from pydantic.types import Optional
class Document(BaseModel): class Document(BaseModel):
name: str name: str
access: list data: Optional[str]
data: str
owner: str
class DocumentUpdate(BaseModel): class DocumentUpdate(BaseModel):

View File

@ -26,7 +26,13 @@ def search(index, query, user_id):
hits = [] hits = []
for hit in resp["hits"]["hits"]: for hit in resp["hits"]["hits"]:
hits.append( hits.append(
str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"] # str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"]
# str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"]
{
"id": hit['_id'],
"name": hit['_source']["name"],
"highlight": str(hit["highlight"]["data"])
}
) )
print(hit['_id'], hit['_source']) print(hit['_id'], hit['_source'])

View File

@ -33,6 +33,7 @@ def create_document(document):
doc = document.copy() doc = document.copy()
docs_coll.insert_one(document) docs_coll.insert_one(document)
elastic.add_document("test-index", document["_id"], doc) elastic.add_document("test-index", document["_id"], doc)
return ObjectId(document["_id"]).__str__()
def get_document_by_id(id): def get_document_by_id(id):

View File

@ -101,6 +101,19 @@ def has_access(user_id, id, destination):
return list(cur.fetchall()) return list(cur.fetchall())
def access_to_doc(id):
conn = get_connection()
cur = conn.cursor()
cur.execute(
sql.SQL(
"SELECT user_id, username, access_type FROM doc_access JOIN users ON user_id = users.id WHERE doc_id = {id}"
).format(
id=sql.Literal(id),
)
)
return list(cur.fetchall())
def is_public(doc_id): def is_public(doc_id):
conn = get_connection() conn = get_connection()
cur = conn.cursor() cur = conn.cursor()

@ -1 +0,0 @@
Subproject commit fbe106a1878ccefb909a994cb16507bbf2a2d6ac

31
bsition/frontend/nextjs/.gitignore vendored Normal file
View File

@ -0,0 +1,31 @@
# 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*
.pnpm-debug.log*
# local env files
.env*.local
# vercel
.vercel

5
bsition/frontend/nextjs/next-env.d.ts vendored Executable file
View File

@ -0,0 +1,5 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.

3021
bsition/frontend/nextjs/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,27 @@
{
"name": "nextjs-tailwindcss-typescript-starter",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
},
"dependencies": {
"classnames": "^2.3.1",
"next": "12.1.0",
"react": "17.0.2",
"react-dom": "17.0.2",
"socket.io": "^4.5.1",
"socket.io-client": "^4.5.1"
},
"devDependencies": {
"@types/node": "^17.0.21",
"@types/react": "^17.0.39",
"autoprefixer": "^10.4.2",
"postcss": "^8.4.7",
"postcss-import": "^14.0.2",
"tailwindcss": "^3.0.23",
"typescript": "^4.6.2"
}
}

View File

@ -0,0 +1,6 @@
module.exports = {
plugins: [
'tailwindcss',
'autoprefixer',
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,128 @@
import io from "socket.io-client";
import { useState, useEffect } from "react";
let socket;
export default function Document() {
const [username, setUsername] = useState("");
const [chosenUsername, setChosenUsername] = useState("");
const [text, setText] = useState("");
const [token, setToken] = useState("");
useEffect(() => {
socketInitializer();
}, [chosenUsername]);
useEffect(() => {
const data = new URLSearchParams();
data.append("username", "user")
data.append("password", "passtest")
const fetchData = async (data) => {
const res = await fetch("http://localhost:8000/api/token", { method: 'POST', body: data})
const json = await res.json();
setToken(() => json["access_token"])
}
fetchData(data)
}, [])
useEffect(() => {
if (token) {
const fetchData = async () => {
const res = await fetch("http://localhost:8000/api/documents/63866c991b4175934db26981", {
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
const json = await res.json();
setText(() => json["data"])
}
fetchData()
}
}, [token])
useEffect(() => {
const interval = setInterval(() => {
fetch("http://localhost:8000/api/documents/63866c991b4175934db26981", {
method: 'PUT',
body: `{"data": "${text}"}`,
headers: {
'Content-type': 'application/json',
'Authorization': `Bearer ${token}`
}
})
}, 500);
return () => clearInterval(interval);
}, [token, text])
const socketInitializer = async () => {
await fetch("/api/socket");
socket = io();
socket.emit('create', chosenUsername);
console.log(chosenUsername)
socket.on("newIncomingText", (text) => {
setText(() => text);
console.log('text' + text);
});
};
const sendText = async () => {
socket.emit("createdText", text, chosenUsername);
setText(() => text);
};
const handleKey = () => {
if (text) {
sendText();
}
};
return (
<div className="flex items-center p-4 mx-auto min-h-screen justify-center bg-purple-500">
<main className="gap-4 flex flex-col items-center justify-center w-full h-full">
{!chosenUsername ? (
<>
<h3 className="font-bold text-white text-xl">
doc_id?
</h3>
<input
type="text"
placeholder="Identity..."
value={username}
className="p-3 rounded-md outline-none"
onChange={(e) => setUsername(e.target.value)}
/>
<button
onClick={() => {
setChosenUsername(username);
}}
className="bg-white rounded-md px-4 py-2 text-xl"
>
Go!
</button>
</>
) : (
<>
<p className="font-bold text-white text-xl">
Your username: {username}
</p>
<textarea
placeholder="Type..."
onKeyUp={handleKey}
value={text}
onChange={(e) => setText(e.target.value)}
/>
</>
)}
</main>
</div>
);
}

View File

@ -0,0 +1,16 @@
import React from "react";
import Sidebar from "./Sidebar";
const Layout = ({ children }) => {
return (
<div className="h-screen flex flex-row justify-start">
<Sidebar />
<div
className="bg-primary flex-1 p-4 text-white justify-center align-center h-full">
{children}
</div>
</div>
);
};
export default Layout;

View File

@ -0,0 +1,195 @@
import classNames from "classnames";
import Link from "next/link";
import { useRouter } from "next/router";
import React, {useState, useMemo, useEffect} from "react";
import {
ArticleIcon,
CollapsIcon,
LogoIcon,
LogoutIcon,
SearchIcon,
HomeIcon,
CreateIcon
} from "./icons";
const Sidebar = () => {
const [toggleCollapse, setToggleCollapse] = useState(false);
const [isCollapsible, setIsCollapsible] = useState(false);
const [menuItems, setMenuItems] = useState([
{ id: 1, label: "Home", icon: HomeIcon, link: "/" },
{ id: 2, label: "Search", icon: SearchIcon, link: "/search" },
{ id: 3, label: "Create document", icon: CreateIcon, link: "/create-document" }
]);
const [token, setToken] = useState("");
useEffect(() => {
setToken(() => localStorage.getItem("token"))
}, [])
useEffect(() => {
if (token) {
const fetchData = async () => {
const res = await fetch("http://localhost:8000/api/documents", {
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
let json = await res.json();
let list = [
{ id: 1, label: "Home", icon: HomeIcon, link: "/" },
{ id: 2, label: "Search", icon: SearchIcon, link: "/search" },
{ id: 3, label: "Create document", icon: CreateIcon, link: "/create-document" }
]
json.forEach((doc) => {
list.push({
id: doc["id"],
label: doc["name"],
icon: ArticleIcon,
link: `/documents/${doc["id"]}`
})
})
setMenuItems(() => list)
}
fetchData()
}
}, [token])
const router = useRouter();
const activeMenu = useMemo(
() => menuItems.find((menu) => {
if (!router.query.id || router.query.id === 'undefined') {
return menu.link === router.pathname
} else if (!(menu.id === 1 || menu.id === 2 || menu.id === 3)) {
return menu.id.toString() === router.query.id
}
return true
}),
[menuItems, router.query.id, router.pathname]
);
const wrapperClasses = classNames(
"h-screen px-4 pt-8 pb-4 bg-light flex justify-between flex-col",
{
["w-80"]: !toggleCollapse,
["w-20"]: toggleCollapse,
}
);
const collapseIconClasses = classNames(
"p-4 rounded bg-light-lighter absolute right-0",
{
"rotate-180": toggleCollapse,
}
);
const getNavItemClasses = (menu) => {
return classNames(
"flex items-center cursor-pointer hover:bg-light-lighter rounded w-full overflow-hidden whitespace-nowrap",
{
["bg-light-lighter"]: activeMenu.id === menu.id,
}
);
};
const onMouseOver = () => {
setIsCollapsible(!isCollapsible);
};
const handleSidebarToggle = () => {
setToggleCollapse(!toggleCollapse);
};
const handleSubmit = async (event) => {
event.preventDefault()
const res = await fetch("http://localhost:8000/api/token", {
method: "DELETE",
headers: {
'Authorization': `Bearer ${token}`
}
});
localStorage.removeItem("token")
router.push("/")
}
return (
<div
className={wrapperClasses}
onMouseEnter={onMouseOver}
onMouseLeave={onMouseOver}
style={{ transition: "width 300ms cubic-bezier(0.2, 0, 0, 1) 0s" }}
>
<div className="flex flex-col">
<div className="flex items-center justify-between relative">
<div className="flex items-center pl-1 gap-4">
<LogoIcon />
<span
className={classNames("mt-2 text-lg font-medium text-text", {
hidden: toggleCollapse,
})}
>
BSition
</span>
</div>
{isCollapsible && (
<button
className={collapseIconClasses}
onClick={handleSidebarToggle}
>
<CollapsIcon />
</button>
)}
</div>
<div className="flex flex-col items-start mt-24">
{menuItems.map(({ icon: Icon, ...menu }) => {
const classes = getNavItemClasses(menu);
return (
<div className={classes} key={menu.id}>
<Link href={menu.link}>
<a className="flex py-4 px-3 items-center w-full h-full">
<div style={{ width: "2.5rem" }}>
<Icon />
</div>
{!toggleCollapse && (
<span
className={classNames(
"text-md font-medium text-text-light"
)}
>
{menu.label}
</span>
)}
</a>
</Link>
</div>
);
})}
</div>
</div>
<div className={`${getNavItemClasses({})} px-3 py-4`}>
<div style={{ width: "2.5rem" }}>
<LogoutIcon />
</div>
{!toggleCollapse && (
<form onSubmit={handleSubmit}>
<button name="Logout" value="logout">
<span className={classNames("text-md font-medium text-text-light")}>
Logout
</span>
</button>
</form>
)}
</div>
</div>
);
};
export default Sidebar;

View File

@ -0,0 +1,22 @@
import * as React from "react";
function ArticleIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M19 5v14H5V5h14zm0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
fill={fill}
/>
<path d="M14 17H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z" fill={fill} />
</svg>
);
}
export default ArticleIcon;

View File

@ -0,0 +1,24 @@
import * as React from "react";
function CollapsIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={16}
height={15}
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M8.901 1.768L7.134 0 0 7.134l7.134 7.133L8.9 12.5 3.535 7.134l5.366-5.367z"
fill={fill}
/>
<path
d="M13.384 0L6.25 7.134l7.134 7.133L15.15 12.5 9.785 7.134l5.366-5.367L13.384 0z"
fill={fill}
/>
</svg>
);
}
export default CollapsIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function CreateIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"
fill={fill}
/>
</svg>
);
}
export default CreateIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function DeleteIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M7 4a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v2h4a1 1 0 1 1 0 2h-1.069l-.867 12.142A2 2 0 0 1 17.069 22H6.93a2 2 0 0 1-1.995-1.858L4.07 8H3a1 1 0 0 1 0-2h4V4zm2 2h6V4H9v2zM6.074 8l.857 12H17.07l.857-12H6.074z"
fill={fill}
/>
</svg>
);
}
export default DeleteIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function HomeIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M3 13h1v7c0 1.103.897 2 2 2h12c1.103 0 2-.897 2-2v-7h1a1.001 1.001 0 00.707-1.707l-9-9a1 1 0 00-1.414 0l-9 9A1 1 0 003 13zm7 7v-5h4v5h-4zm2-15.586l6 6V15l.001 5H16v-5c0-1.103-.897-2-2-2h-4c-1.103 0-2 .897-2 2v5H6v-9.586l6-6z"
fill={fill}
/>
</svg>
);
}
export default HomeIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function LockIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="-2.5 -2.5 21.5 21.5"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z"
fill={fill}
/>
</svg>
);
}
export default LockIcon;

View File

@ -0,0 +1,41 @@
import * as React from "react";
function Logo({ fill = "#3B81F6", ...rest }) {
return (
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="40.000000pt" height="40.000000pt" viewBox="0 0 500.000000 500.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,500.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M3020 4444 c-138 -12 -603 -47 -855 -64 -159 -11 -371 -27 -470 -35
-99 -8 -283 -21 -410 -30 -500 -33 -538 -40 -595 -98 -71 -71 -65 49 -65
-1387 l0 -1295 42 -80 c24 -44 85 -134 136 -200 51 -66 182 -235 291 -375 223
-288 253 -315 357 -330 35 -5 96 -7 134 -4 39 2 295 18 570 34 748 45 1638 98
1833 110 258 16 330 45 379 155 17 38 18 115 21 1400 2 748 0 1385 -3 1415 -6
50 -12 60 -58 105 -29 28 -84 71 -122 98 -39 26 -95 65 -125 86 -356 253 -618
431 -673 460 -68 35 -70 36 -205 37 -76 1 -157 0 -182 -2z m318 -237 c32 -13
143 -85 250 -162 106 -77 206 -148 222 -158 27 -17 48 -52 37 -63 -2 -2 -157
-13 -343 -24 -339 -19 -558 -32 -1504 -91 -278 -17 -529 -29 -558 -26 -29 3
-72 16 -96 30 -78 44 -396 299 -396 318 0 35 40 48 185 59 77 6 196 15 265 20
69 6 251 19 405 30 398 27 940 67 1145 84 218 18 312 14 388 -17z m744 -658
c9 -5 24 -28 32 -51 15 -39 16 -158 14 -1233 -3 -1116 -4 -1192 -21 -1222 -23
-44 -62 -62 -144 -68 -81 -7 -822 -50 -1108 -65 -110 -6 -342 -19 -515 -30
-820 -50 -853 -50 -900 -5 -17 16 -35 45 -41 65 -6 23 -9 431 -7 1217 3 1181
3 1182 24 1210 11 15 32 33 46 40 13 7 108 17 214 23 104 6 374 22 599 35 226
14 457 27 515 30 58 3 290 17 515 31 757 46 734 45 777 23z"/>
<path d="M1950 3121 l0 -140 88 -3 87 -3 3 -766 c2 -759 2 -766 -18 -792 -23
-30 -74 -47 -137 -47 l-43 0 0 -130 0 -130 503 0 c622 0 729 11 901 94 204 99
310 264 323 503 15 278 -97 443 -376 550 -22 8 -19 11 42 51 151 98 227 240
227 422 -1 270 -146 439 -434 502 -83 18 -139 21 -628 25 l-538 5 0 -141z
m1030 -185 c63 -24 116 -62 142 -105 20 -31 23 -49 23 -141 0 -98 -2 -109 -30
-160 -65 -119 -182 -159 -467 -160 l-128 0 0 296 0 296 208 -4 c161 -4 217 -9
252 -22z m-7 -861 c165 -35 250 -124 272 -285 8 -56 -10 -161 -35 -211 -28
-54 -102 -114 -173 -140 -56 -20 -85 -23 -289 -27 l-228 -4 0 341 0 341 193 0
c128 0 215 -5 260 -15z"/>
</g>
</svg>
);
}
export default Logo;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function LogoutIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={16}
height={19}
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M8 19c4.411 0 8-3.589 8-8 0-3.35-2.072-6.22-5-7.41v2.222A6 6 0 0114 11c0 3.31-2.691 6-6 6s-6-2.69-6-6a5.999 5.999 0 013-5.188V3.59C2.072 4.78 0 7.65 0 11c0 4.411 3.589 8 8 8z"
fill={fill}
/>
<path d="M7 0h2v10H7V0z" fill={fill} />
</svg>
);
}
export default LogoutIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function ManageIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="-2.5 -2.5 21.5 21.5"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M.102 2.223A3.004 3.004 0 0 0 3.78 5.897l6.341 6.252A3.003 3.003 0 0 0 13 16a3 3 0 1 0-.851-5.878L5.897 3.781A3.004 3.004 0 0 0 2.223.1l2.141 2.142L4 4l-1.757.364L.102 2.223zm13.37 9.019.528.026.287.445.445.287.026.529L15 13l-.242.471-.026.529-.445.287-.287.445-.529.026L13 15l-.471-.242-.529-.026-.287-.445-.445-.287-.026-.529L11 13l.242-.471.026-.529.445-.287.287-.445.529-.026L13 11l.471.242z"
fill={fill}
/>
</svg>
);
}
export default ManageIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function OptionsIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="-2.5 -2.5 21.5 21.5"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"
fill={fill}
/>
</svg>
);
}
export default OptionsIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function PublicIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M221.6,173.3A102.9,102.9,0,0,0,232,128,104.2,104.2,0,0,0,154.8,27.5h-.5A103.8,103.8,0,0,0,60.4,49l-1.3,1.2A103.9,103.9,0,0,0,128,232h2.4A104.3,104.3,0,0,0,221,174.6h0ZM216,128a89.3,89.3,0,0,1-5.5,30.7l-46.4-28.5a16,16,0,0,0-6.3-2.3l-22.8-3a16.1,16.1,0,0,0-15.3,6.8h-8.6l-3.8-7.9a16.2,16.2,0,0,0-11-8.7l-6.6-1.4,2.5-5.9a8.1,8.1,0,0,1,7.4-4.9h16.1a16.1,16.1,0,0,0,7.7-2l12.2-6.8a16.1,16.1,0,0,0,3-2.1l26.9-24.4A15.7,15.7,0,0,0,170,50.7,88,88,0,0,1,216,128ZM40,128a87.1,87.1,0,0,1,9.5-39.7l10.4,27.9a16.1,16.1,0,0,0,11.6,10l5.5,1.2h.1l12,2.6a7.8,7.8,0,0,1,5.5,4.3l2.1,4.4a16.1,16.1,0,0,0,14.4,9h1.2l-7.7,17.2a15.9,15.9,0,0,0,2.8,17.4l16.1,17.4a8.3,8.3,0,0,1,2,6.9l-1.8,9.3A88.1,88.1,0,0,1,40,128Z"
fill={fill}
/>
</svg>
);
}
export default PublicIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function SearchIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="-2 -2 22 22"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"
fill={fill}
/>
</svg>
);
}
export default SearchIcon;

View File

@ -0,0 +1,21 @@
import * as React from "react";
function ShareIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="-2.5 -2.5 21.5 21.5"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M11 2.5a2.5 2.5 0 1 1 .603 1.628l-6.718 3.12a2.499 2.499 0 0 1 0 1.504l6.718 3.12a2.5 2.5 0 1 1-.488.876l-6.718-3.12a2.5 2.5 0 1 1 0-3.256l6.718-3.12A2.5 2.5 0 0 1 11 2.5z"
fill={fill}
/>
</svg>
);
}
export default ShareIcon;

View File

@ -0,0 +1,24 @@
import * as React from "react";
function UsersIcon({ stroke = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path
d="M12 4.354a4 4 0 110 5.292V4.354zM15 21H3v-1a6 6 0 1112 0v1zm0 0h6v-1a6 6 0 00-9-5.197L15 21zM13 7a4 4 0 11-8 0 4 4 0 018 0v0z"
stroke={stroke}
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
export default UsersIcon;

View File

@ -0,0 +1,22 @@
import * as React from "react";
function VideosIcon({ fill = "#6C7281", ...rest }) {
return (
<svg
width={24}
height={24}
fill="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...rest}
>
<path d="M4 8H2v12a2 2 0 002 2h12v-2H4V8z" fill={fill} />
<path
d="M20 2H8a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V4a2 2 0 00-2-2zm-9 12V6l7 4-7 4z"
fill={fill}
/>
</svg>
);
}
export default VideosIcon;

View File

@ -0,0 +1,16 @@
export { default as ArticleIcon } from "./ArticleIcon";
export { default as HomeIcon } from "./HomeIcon";
export { default as UsersIcon } from "./UsersIcon";
export { default as VideosIcon } from "./VideosIcon";
export { default as CollapsIcon } from "./CollapsIcon";
export { default as LogoIcon } from "./Logo";
export { default as LogoutIcon } from "./LogoutIcon";
export { default as SearchIcon } from "./SearchIcon";
export { default as ShareIcon } from "./ShareIcon";
export { default as LockIcon } from "./LockIcon";
export { default as PublicIcon } from "./PublicIcon";
export { default as DeleteIcon } from "./DeleteIcon";
export { default as OptionsIcon } from "./OptionsIcon";
export { default as ManageIcon } from "./ManageIcon";
export { default as CreateIcon } from "./CreateIcon";

View File

@ -0,0 +1,17 @@
import Head from 'next/head'
import {AppProps} from 'next/app'
import '../styles/index.css'
function MyApp({Component, pageProps}: AppProps) {
return (
<>
<Head>
<title>BSition</title>
<meta name="viewport" content="initial-scale=1.0, width=device-width"/>
</Head>
<Component {...pageProps} />
</>
)
}
export default MyApp

View File

@ -0,0 +1,22 @@
import { Server } from "socket.io";
import messageHandler from "../../utils/sockets/messageHandler";
export default function SocketHandler(req, res) {
if (res.socket.server.io) {
console.log("Already set up");
res.end();
return;
}
const io = new Server(res.socket.server);
res.socket.server.io = io;
const onConnection = (socket) => {
messageHandler(io, socket);
};
io.on("connection", onConnection);
console.log("Setting up socket");
res.end();
}

View File

@ -0,0 +1,53 @@
import React, {useEffect, useState} from "react";
import {useRouter} from "next/router";
import Layout from "../components/Layout";
import Link from "next/link";
import classNames from "classnames";
export default function CreateDocument() {
const router = useRouter();
const [token, setToken] = useState("");
const [user, setUser] = useState("");
useEffect(() => {
setToken(() => localStorage.getItem("token"))
setUser(() => localStorage.getItem("user"))
}, [])
const handleSubmit = async (event) => {
event.preventDefault()
let data = {
name: event.target.name.value,
}
const JSONdata = JSON.stringify(data)
const res = await fetch("http://localhost:8000/api/documents", {
method: "POST",
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSONdata
})
let json = await res.json();
router.push(`/documents/${json["id"]}`)
}
return (
<Layout>
<div className="flex items-center justify-center w-full h-full">
<form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>
<div>
<input type="text" id="name" name="name" required placeholder="name"
style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
</div>
<button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Create</button>
</form>
</div>
</Layout>
);
}

View File

@ -0,0 +1,134 @@
import io from "socket.io-client";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
import Layout from "../../components/Layout";
import {
OptionsIcon,
DeleteIcon,
LockIcon,
PublicIcon,
ShareIcon,
ManageIcon
} from "../../components/icons";
import Link from "next/link";
let socket;
export default function Document() {
const router = useRouter();
const [text, setText] = useState("");
const [token, setToken] = useState("");
const [title, setTitle] = useState("");
useEffect(() => {
socketInitializer();
}, [router.query.id]);
useEffect(() => {
setToken(() => localStorage.getItem("token"))
}, [])
useEffect(() => {
if (token && router.query.id) {
const fetchData = async () => {
const res = await fetch(`http://localhost:8000/api/documents/${router.query.id}`, {
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
const json = await res.json();
setText(() => json["data"])
setTitle(() => json["name"])
}
fetchData()
}
}, [token, router.query.id])
useEffect(() => {
if (token && router.query.id) {
const interval = setInterval(() => {
fetch(`http://localhost:8000/api/documents/${router.query.id}`, {
method: 'PUT',
body: `{"data": "${text}"}`,
headers: {
'Content-type': 'application/json',
'Authorization': `Bearer ${token}`
}
})
}, 500);
return () => clearInterval(interval);
}
}, [token, text, router.query.id])
const socketInitializer = async () => {
await fetch("/api/socket");
socket = io();
socket.emit('create', router.query.id);
socket.on("newIncomingText", (text) => {
setText(() => text);
console.log('text' + text);
});
};
const sendText = async () => {
socket.emit("createdText", text, router.query.id);
setText(() => text);
};
const handleKey = () => {
if (text) {
sendText();
}
};
let access = router.query.id + "/access"
return (
<Layout>
<div style={{height: "50px", justifyContent: "space-between"}}
className="align-center flex">
<span className="docTitle">
{title}
</span>
<div className="dropdown">
<OptionsIcon onClick={(e) => {
document.getElementById("myDropdown").classList.toggle("show");
window.onclick = function(event) {
if (!event.target.matches('.dropbtn')) {
var dropdowns = document.getElementsByClassName("dropdown-content");
var i;
for (i = 0; i < dropdowns.length; i++) {
var openDropdown = dropdowns[i];
if (openDropdown.classList.contains('show')) {
openDropdown.classList.remove('show');
}
}
}}}} className="dropbtn"></OptionsIcon>
<div id="myDropdown" className="dropdown-content">
<Link href={access}>
<div className="flex flex-row items-center justify-start align-center menu-opt"><ManageIcon/><span>Manage access</span></div>
</Link>
<a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><ShareIcon/><span>Share</span></div></a>
<a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><LockIcon/><span>Public/private</span></div></a>
<a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><DeleteIcon/><span>Delete document</span></div></a>
</div>
</div>
</div>
<textarea
className="document_area"
placeholder="Type..."
onKeyUp={handleKey}
value={text}
onChange={(e) => setText(e.target.value)}
/>
</Layout>
);
}

View File

@ -0,0 +1,133 @@
import React, { useState, useEffect } from "react";
import { useRouter } from "next/router";
import Layout from "../../../components/Layout";
import {
OptionsIcon,
DeleteIcon,
LockIcon,
PublicIcon,
ShareIcon,
ManageIcon
} from "../../../components/icons";
import Link from "next/link";
import classNames from "classnames";
let socket;
export default function Document() {
const router = useRouter();
const [text, setText] = useState("");
const [token, setToken] = useState("");
const [users, setUsers] = useState([]);
useEffect(() => {
setToken(() => localStorage.getItem("token"))
}, [])
useEffect(() => {
if (token && router.query.id) {
const fetchData = async () => {
const res = await fetch(`http://localhost:8000/api/documents/${router.query.id}/access`, {
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
const json = await res.json();
console.log(json)
let list = []
json.forEach((user) => {
list.push({
id: user[0],
username: user[1],
access: user[2]
})
})
setUsers(() => list)
}
fetchData()
}
}, [token, router.query.id])
useEffect(() => {
if (token && router.query.id) {
const interval = setInterval(() => {
fetch(`http://localhost:8000/api/documents/${router.query.id}`, {
method: 'PUT',
body: `{"data": "${text}"}`,
headers: {
'Content-type': 'application/json',
'Authorization': `Bearer ${token}`
}
})
}, 500);
return () => clearInterval(interval);
}
}, [token, text, router.query.id])
const handleSubmit = async (event) => {
event.preventDefault()
let data = {
name: event.target.name.value,
}
const JSONdata = JSON.stringify(data)
const res = await fetch("http://localhost:8000/api/documents", {
method: "POST",
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSONdata
})
let json = await res.json();
}
return (
<Layout>
<div style={{height: "50px", justifyContent: "space-between"}}
className="align-center flex">
<table>
<tr>
<th>Username</th>
<th>Access</th>
</tr>
{users.map(({ icon: Icon, ...user }) => {
return (
<>
<tr style={{color: "black"}}>
<td>{user.username}</td>
<td>
<select style={{padding: "4px"}} value={user.access} onChange={handleSubmit}>
<option value={1} label="Full-access"></option>
<option value={2} label="Edit"></option>
<option value={3} label="Read-only"></option>
</select>
</td>
</tr>
<div className="flex items-center justify-center w-full h-full">
{/*<form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>*/}
<div>
<input type="text" id="name" name="name" required placeholder="name"
style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
</div>
<button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Create</button>
{/*</form>*/}
</div>
</>
);
})}
</table>
</div>
</Layout>
);
}

View File

@ -0,0 +1,36 @@
import Layout from "../components/Layout";
import {useRouter} from "next/router";
import {useEffect, useState} from "react";
export default function Home() {
const router = useRouter();
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
const token = localStorage.getItem("token");
if (router.pathname !== "/login" && (!token || token === "undefined")) {
router.push("/login");
} else {
setIsLoading(false)
}
}, []);
if (isLoading) {
return <></>
}
return <Layout>
<div className="flex flex-col justify-center h-full w-full align-center items-center">
<div style={{width: "fit-content"}}>
<h1 style={{fontSize: "xxx-large"}}>BSition</h1>
<h3 style={{margin: "0"}}>Created by:</h3>
<h2 style={{margin: "0"}}>Bottler</h2>
<ul style={{margin: "0"}}>
<li>Barmasch, Juan Martín</li>
<li>Bellver, Ezequiel</li>
<li>Lo Coco, Santiago</li>
</ul>
</div>
</div>
</Layout>;
}

View File

@ -0,0 +1,55 @@
import React, {useState} from "react";
import {useRouter} from "next/router";
import {Input} from "postcss";
export default function Login() {
const router = useRouter();
const handleSubmit = async (event) => {
event.preventDefault()
let formData = new FormData();
formData.append("username", event.target.username.value)
formData.append("password", event.target.password.value)
const res = await fetch("http://localhost:8000/api/token", {method: 'POST', body: formData})
const json = await res.json();
if (res.status == 202) {
localStorage.setItem("token", json["access_token"])
const res = await fetch("http://localhost:8000/api/users/me", {
method: 'GET',
headers: {
'Authorization': `Bearer ${json["access_token"]}`
}
})
const aux = await res.json();
if (res.status == 200) {
console.log(aux)
localStorage.setItem("user", aux[0])
}
router.push("/")
} else {
alert('Fail')
}
}
return (
<div className="flex items-center justify-center w-full h-full" style={{marginTop: "30%"}}>
<form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>
<div>
<input type="text" id="username" name="username" required placeholder="username"
style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
</div>
<div>
<input type="password" id="password" name="password" required placeholder="password"
style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
</div>
<button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Log in</button>
</form>
</div>
);
}

View File

@ -0,0 +1,98 @@
import React, {useEffect, useState} from "react";
import {useRouter} from "next/router";
import Layout from "../components/Layout";
import Link from "next/link";
import classNames from "classnames";
export default function Search() {
const router = useRouter();
const [token, setToken] = useState("");
const [search, setSearch] = useState("");
const [menuItems, setMenuItems] = useState([{id: 1, label: "", link: "/"}]);
useEffect(() => {
setToken(() => localStorage.getItem("token"))
}, [])
const handleSubmit = async (event) => {
event.preventDefault()
const res = await fetch("http://localhost:8000/api/documents?" + new URLSearchParams(
{query: "*" + event.target.search.value + "*"}
), {
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
let json = await res.json();
let list = []
json.forEach((doc) => {
let highlight = doc["highlight"].replaceAll('\'', '').replaceAll('[', '').replaceAll(']', '')
let initial = highlight.indexOf('<em>')
let end = highlight.indexOf('</em>')
let first_str, second_str
if (highlight.length < end + 15) {
second_str = highlight.substring(end, highlight.length)
} else {
second_str = highlight.substring(end, end + 15)
}
if (initial - 10 < 0) {
first_str = highlight.substring(0, initial)
} else {
first_str = highlight.substring(0, initial - 10)
}
highlight = highlight.substring(initial + 4, end)
list.push({
id: doc["id"],
label: doc["name"],
first: first_str.replace('<em>', ''),
bold: highlight,
second: second_str.replace('</em>', ''),
link: `/documents/${doc["id"]}`
})
})
setMenuItems(() => list)
}
return (
<Layout>
<form onSubmit={handleSubmit}>
<input type="text" id="search" name="search" required style={{color: "black", padding: "2px 4px"}}/>
<button type="submit">Search</button>
</form>
{menuItems && (
<div className="flex flex-col items-start mt-24">
{menuItems.map(({...menu}) => {
return (
<div key={menu.id}>
<span>
<Link href={menu.link}>
<a className="flex py-4 px-3 items-center w-full h-full">
<div style={{width: "2.5rem"}}>
</div>
<span
className={classNames(
"text-md font-medium text-text-light"
)}
>
{menu.label}
</span>
</a>
</Link>
<p>{menu.first}<b>{menu.bold}</b>{menu.second}</p>
</span>
</div>
);
})}
</div>
)}
</Layout>
);
}

View File

@ -0,0 +1,116 @@
.container {
padding: 0 2rem;
}
.main {
min-height: 100vh;
padding: 4rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.footer {
display: flex;
flex: 1;
padding: 2rem 0;
border-top: 1px solid #eaeaea;
justify-content: center;
align-items: center;
}
.footer a {
display: flex;
justify-content: center;
align-items: center;
flex-grow: 1;
}
.title a {
color: #0070f3;
text-decoration: none;
}
.title a:hover,
.title a:focus,
.title a:active {
text-decoration: underline;
}
.title {
margin: 0;
line-height: 1.15;
font-size: 4rem;
}
.title,
.description {
text-align: center;
}
.description {
margin: 4rem 0;
line-height: 1.5;
font-size: 1.5rem;
}
.code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Courier New, monospace;
}
.grid {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
max-width: 800px;
}
.card {
margin: 1rem;
padding: 1.5rem;
text-align: left;
color: inherit;
text-decoration: none;
border: 1px solid #eaeaea;
border-radius: 10px;
transition: color 0.15s ease, border-color 0.15s ease;
max-width: 300px;
}
.card:hover,
.card:focus,
.card:active {
color: #0070f3;
border-color: #0070f3;
}
.card h2 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
}
.card p {
margin: 0;
font-size: 1.25rem;
line-height: 1.5;
}
.logo {
height: 1em;
margin-left: 0.5rem;
}
@media (max-width: 600px) {
.grid {
width: 100%;
flex-direction: column;
}
}

View File

@ -0,0 +1,103 @@
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
/* Your own custom component styles */
.document_area {
width: 100%;
height: calc(100% - 50px);
/*margin: 40px;*/
border: none;
outline: none;
resize: none;
color: black;
padding: 10px;
}
.docTitle {
color: black;
font-size: large;
font-weight: bold;
}
.dropbtn {
width: 40px;
height: 40px;
border-radius: 100%;
padding: 3px;
border: none;
stroke: #404040;
cursor: pointer;
}
.dropbtn:hover, .dropbtn:focus {
border-radius: 100%;
background-color: #419de8;
}
.dropdown {
float: right;
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: white;
min-width: 220px;
overflow: auto;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
right: 0;
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown a:hover {background-color: #ddd;}
.show {display: block;}
svg {
display: inline;
}
.login-form div {
margin: 10px;
}
.menu-opt span {
margin-left: 4px;
}
h1 {
all: revert;
}
h2 {
all: revert;
}
h3 {
all: revert;
}
ul {
all: revert;
}
li {
all: revert;
}
table {
all: revert
}

View File

@ -0,0 +1,13 @@
export default (io, socket) => {
const createdText = (text, room) => {
console.log(room);
console.log(text);
socket.to(room).emit("newIncomingText", text);
};
socket.on('create', function(room) {
socket.join(room);
});
socket.on("createdText", createdText);
};

View File

@ -0,0 +1,28 @@
const defaultTheme = require('tailwindcss/defaultConfig');
module.exports = {
content: [
'./src/components/**/*.{ts,tsx,js,jsx}',
'./src/pages/**/*.{ts,tsx,js,jsx}',
'./src/pages/login.tsx'
],
theme: {
...defaultTheme,
colors: {
...defaultTheme.colors,
primary: "#71aaff",
white: '#ffffff',
text: {
DEFAULT: "#1F2937",
light: "#6C7281",
},
light: {
DEFAULT: "#FAFBFC",
lighter: "#F3F4F6",
},
},
extend: {},
},
variants: {},
plugins: [],
}

View File

@ -0,0 +1,30 @@
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true
},
"exclude": [
"node_modules"
],
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx"
]
}

View File

@ -0,0 +1,964 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/code-frame@^7.0.0":
"integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw=="
"resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz"
"version" "7.12.11"
dependencies:
"@babel/highlight" "^7.10.4"
"@babel/helper-validator-identifier@^7.15.7":
"integrity" "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
"resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz"
"version" "7.15.7"
"@babel/highlight@^7.10.4":
"integrity" "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g=="
"resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz"
"version" "7.16.0"
dependencies:
"@babel/helper-validator-identifier" "^7.15.7"
"chalk" "^2.0.0"
"js-tokens" "^4.0.0"
"@next/env@12.1.0":
"integrity" "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
"resolved" "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz"
"version" "12.1.0"
"@next/swc-linux-x64-gnu@12.1.0":
"integrity" "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A=="
"resolved" "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz"
"version" "12.1.0"
"@next/swc-linux-x64-musl@12.1.0":
"integrity" "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw=="
"resolved" "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz"
"version" "12.1.0"
"@nodelib/fs.scandir@2.1.5":
"integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="
"resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
"version" "2.1.5"
dependencies:
"@nodelib/fs.stat" "2.0.5"
"run-parallel" "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
"resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
"version" "2.0.5"
"@nodelib/fs.walk@^1.2.3":
"integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="
"resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
"version" "1.2.8"
dependencies:
"@nodelib/fs.scandir" "2.1.5"
"fastq" "^1.6.0"
"@socket.io/component-emitter@~3.1.0":
"integrity" "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
"resolved" "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz"
"version" "3.1.0"
"@types/cookie@^0.4.1":
"integrity" "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
"resolved" "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz"
"version" "0.4.1"
"@types/cors@^2.8.12":
"integrity" "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA=="
"resolved" "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz"
"version" "2.8.13"
dependencies:
"@types/node" "*"
"@types/node@*", "@types/node@^17.0.21", "@types/node@>=10.0.0":
"integrity" "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
"resolved" "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz"
"version" "17.0.21"
"@types/parse-json@^4.0.0":
"integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
"resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
"version" "4.0.0"
"@types/prop-types@*":
"integrity" "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
"resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz"
"version" "15.7.3"
"@types/react@^17.0.39":
"integrity" "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug=="
"resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz"
"version" "17.0.39"
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
"csstype" "^3.0.2"
"@types/scheduler@*":
"integrity" "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA=="
"resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz"
"version" "0.16.1"
"accepts@~1.3.4":
"integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="
"resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
"version" "1.3.8"
dependencies:
"mime-types" "~2.1.34"
"negotiator" "0.6.3"
"acorn-node@^1.6.1":
"integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A=="
"resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz"
"version" "1.8.2"
dependencies:
"acorn" "^7.0.0"
"acorn-walk" "^7.0.0"
"xtend" "^4.0.2"
"acorn-walk@^7.0.0":
"integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
"resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
"version" "7.2.0"
"acorn@^7.0.0":
"integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
"resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
"version" "7.4.1"
"ansi-styles@^3.2.1":
"integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
"resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
"version" "3.2.1"
dependencies:
"color-convert" "^1.9.0"
"ansi-styles@^4.1.0":
"integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
"resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
"version" "4.3.0"
dependencies:
"color-convert" "^2.0.1"
"anymatch@~3.1.2":
"integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg=="
"resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz"
"version" "3.1.2"
dependencies:
"normalize-path" "^3.0.0"
"picomatch" "^2.0.4"
"arg@^5.0.1":
"integrity" "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
"resolved" "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz"
"version" "5.0.1"
"autoprefixer@^10.0.2", "autoprefixer@^10.4.2":
"integrity" "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ=="
"resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz"
"version" "10.4.2"
dependencies:
"browserslist" "^4.19.1"
"caniuse-lite" "^1.0.30001297"
"fraction.js" "^4.1.2"
"normalize-range" "^0.1.2"
"picocolors" "^1.0.0"
"postcss-value-parser" "^4.2.0"
"base64id@~2.0.0", "base64id@2.0.0":
"integrity" "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
"resolved" "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz"
"version" "2.0.0"
"binary-extensions@^2.0.0":
"integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
"resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
"version" "2.2.0"
"braces@^3.0.1", "braces@~3.0.2":
"integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
"resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
"version" "3.0.2"
dependencies:
"fill-range" "^7.0.1"
"browserslist@^4.19.1":
"integrity" "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg=="
"resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz"
"version" "4.19.3"
dependencies:
"caniuse-lite" "^1.0.30001312"
"electron-to-chromium" "^1.4.71"
"escalade" "^3.1.1"
"node-releases" "^2.0.2"
"picocolors" "^1.0.0"
"callsites@^3.0.0":
"integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
"resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
"version" "3.1.0"
"camelcase-css@^2.0.1":
"integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
"resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
"version" "2.0.1"
"caniuse-lite@^1.0.30001283", "caniuse-lite@^1.0.30001297", "caniuse-lite@^1.0.30001312":
"integrity" "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ=="
"resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz"
"version" "1.0.30001312"
"chalk@^2.0.0":
"integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
"version" "2.4.2"
dependencies:
"ansi-styles" "^3.2.1"
"escape-string-regexp" "^1.0.5"
"supports-color" "^5.3.0"
"chalk@^4.1.2":
"integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
"version" "4.1.2"
dependencies:
"ansi-styles" "^4.1.0"
"supports-color" "^7.1.0"
"chokidar@^3.5.3":
"integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="
"resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
"version" "3.5.3"
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"
"classnames@^2.3.1":
"integrity" "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
"resolved" "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz"
"version" "2.3.2"
"color-convert@^1.9.0":
"integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
"resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
"version" "1.9.3"
dependencies:
"color-name" "1.1.3"
"color-convert@^2.0.1":
"integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
"resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
"version" "2.0.1"
dependencies:
"color-name" "~1.1.4"
"color-name@^1.1.4", "color-name@~1.1.4":
"integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
"resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
"version" "1.1.4"
"color-name@1.1.3":
"integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
"resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
"version" "1.1.3"
"cookie@~0.4.1":
"integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
"resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz"
"version" "0.4.2"
"cors@~2.8.5":
"integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="
"resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz"
"version" "2.8.5"
dependencies:
"object-assign" "^4"
"vary" "^1"
"cosmiconfig@^7.0.1":
"integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ=="
"resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz"
"version" "7.0.1"
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"
"cssesc@^3.0.0":
"integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
"resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
"version" "3.0.0"
"csstype@^3.0.2":
"integrity" "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ=="
"resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz"
"version" "3.0.5"
"debug@~4.3.1", "debug@~4.3.2":
"integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="
"resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
"version" "4.3.4"
dependencies:
"ms" "2.1.2"
"defined@^1.0.0":
"integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
"resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"
"version" "1.0.0"
"detective@^5.2.0":
"integrity" "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg=="
"resolved" "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz"
"version" "5.2.0"
dependencies:
"acorn-node" "^1.6.1"
"defined" "^1.0.0"
"minimist" "^1.1.1"
"didyoumean@^1.2.2":
"integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
"resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz"
"version" "1.2.2"
"dlv@^1.1.3":
"integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
"resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz"
"version" "1.1.3"
"electron-to-chromium@^1.4.71":
"integrity" "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q=="
"resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz"
"version" "1.4.75"
"engine.io-client@~6.2.3":
"integrity" "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw=="
"resolved" "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz"
"version" "6.2.3"
dependencies:
"@socket.io/component-emitter" "~3.1.0"
"debug" "~4.3.1"
"engine.io-parser" "~5.0.3"
"ws" "~8.2.3"
"xmlhttprequest-ssl" "~2.0.0"
"engine.io-parser@~5.0.3":
"integrity" "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
"resolved" "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz"
"version" "5.0.4"
"engine.io@~6.2.1":
"integrity" "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA=="
"resolved" "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz"
"version" "6.2.1"
dependencies:
"@types/cookie" "^0.4.1"
"@types/cors" "^2.8.12"
"@types/node" ">=10.0.0"
"accepts" "~1.3.4"
"base64id" "2.0.0"
"cookie" "~0.4.1"
"cors" "~2.8.5"
"debug" "~4.3.1"
"engine.io-parser" "~5.0.3"
"ws" "~8.2.3"
"error-ex@^1.3.1":
"integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
"resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
"version" "1.3.2"
dependencies:
"is-arrayish" "^0.2.1"
"escalade@^3.1.1":
"integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
"resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
"version" "3.1.1"
"escape-string-regexp@^1.0.5":
"integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
"resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
"version" "1.0.5"
"fast-glob@^3.2.11":
"integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew=="
"resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz"
"version" "3.2.11"
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"
"fastq@^1.6.0":
"integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw=="
"resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz"
"version" "1.13.0"
dependencies:
"reusify" "^1.0.4"
"fill-range@^7.0.1":
"integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
"resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
"version" "7.0.1"
dependencies:
"to-regex-range" "^5.0.1"
"fraction.js@^4.1.2":
"integrity" "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg=="
"resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz"
"version" "4.1.3"
"function-bind@^1.1.1":
"integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
"version" "1.1.1"
"glob-parent@^5.1.2", "glob-parent@~5.1.2":
"integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
"resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
"version" "5.1.2"
dependencies:
"is-glob" "^4.0.1"
"glob-parent@^6.0.2":
"integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="
"resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
"version" "6.0.2"
dependencies:
"is-glob" "^4.0.3"
"has-flag@^3.0.0":
"integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
"resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
"version" "3.0.0"
"has-flag@^4.0.0":
"integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
"resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
"version" "4.0.0"
"has@^1.0.3":
"integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
"resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
"version" "1.0.3"
dependencies:
"function-bind" "^1.1.1"
"import-cwd@^3.0.0":
"integrity" "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg=="
"resolved" "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz"
"version" "3.0.0"
dependencies:
"import-from" "^3.0.0"
"import-fresh@^3.2.1":
"integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
"resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
"version" "3.3.0"
dependencies:
"parent-module" "^1.0.0"
"resolve-from" "^4.0.0"
"import-from@^3.0.0":
"integrity" "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ=="
"resolved" "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz"
"version" "3.0.0"
dependencies:
"resolve-from" "^5.0.0"
"is-arrayish@^0.2.1":
"integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
"resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
"version" "0.2.1"
"is-binary-path@~2.1.0":
"integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="
"resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
"version" "2.1.0"
dependencies:
"binary-extensions" "^2.0.0"
"is-core-module@^2.8.1":
"integrity" "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA=="
"resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz"
"version" "2.8.1"
dependencies:
"has" "^1.0.3"
"is-extglob@^2.1.1":
"integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
"resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
"version" "2.1.1"
"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1":
"integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="
"resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
"version" "4.0.3"
dependencies:
"is-extglob" "^2.1.1"
"is-number@^7.0.0":
"integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
"resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
"version" "7.0.0"
"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
"integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
"resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
"version" "4.0.0"
"json-parse-even-better-errors@^2.3.0":
"integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
"resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
"version" "2.3.1"
"lilconfig@^2.0.3":
"integrity" "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg=="
"resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz"
"version" "2.0.3"
"lines-and-columns@^1.1.6":
"integrity" "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
"resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
"version" "1.1.6"
"loose-envify@^1.1.0":
"integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
"resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
"version" "1.4.0"
dependencies:
"js-tokens" "^3.0.0 || ^4.0.0"
"merge2@^1.3.0":
"integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
"resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
"version" "1.4.1"
"micromatch@^4.0.4":
"integrity" "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg=="
"resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz"
"version" "4.0.4"
dependencies:
"braces" "^3.0.1"
"picomatch" "^2.2.3"
"mime-db@1.52.0":
"integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
"resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
"version" "1.52.0"
"mime-types@~2.1.34":
"integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
"resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
"version" "2.1.35"
dependencies:
"mime-db" "1.52.0"
"minimist@^1.1.1":
"integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
"resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz"
"version" "1.2.7"
"ms@2.1.2":
"integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
"resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
"version" "2.1.2"
"nanoid@^3.1.30", "nanoid@^3.3.1":
"integrity" "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
"resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz"
"version" "3.3.1"
"negotiator@0.6.3":
"integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
"resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
"version" "0.6.3"
"next@12.1.0":
"integrity" "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q=="
"resolved" "https://registry.npmjs.org/next/-/next-12.1.0.tgz"
"version" "12.1.0"
dependencies:
"@next/env" "12.1.0"
"caniuse-lite" "^1.0.30001283"
"postcss" "8.4.5"
"styled-jsx" "5.0.0"
"use-subscription" "1.5.1"
optionalDependencies:
"@next/swc-android-arm64" "12.1.0"
"@next/swc-darwin-arm64" "12.1.0"
"@next/swc-darwin-x64" "12.1.0"
"@next/swc-linux-arm-gnueabihf" "12.1.0"
"@next/swc-linux-arm64-gnu" "12.1.0"
"@next/swc-linux-arm64-musl" "12.1.0"
"@next/swc-linux-x64-gnu" "12.1.0"
"@next/swc-linux-x64-musl" "12.1.0"
"@next/swc-win32-arm64-msvc" "12.1.0"
"@next/swc-win32-ia32-msvc" "12.1.0"
"@next/swc-win32-x64-msvc" "12.1.0"
"node-releases@^2.0.2":
"integrity" "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
"resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz"
"version" "2.0.2"
"normalize-path@^3.0.0", "normalize-path@~3.0.0":
"integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
"resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
"version" "3.0.0"
"normalize-range@^0.1.2":
"integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
"resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"
"version" "0.1.2"
"object-assign@^4", "object-assign@^4.1.1":
"integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
"resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
"version" "4.1.1"
"object-hash@^2.2.0":
"integrity" "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="
"resolved" "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz"
"version" "2.2.0"
"parent-module@^1.0.0":
"integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
"resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
"version" "1.0.1"
dependencies:
"callsites" "^3.0.0"
"parse-json@^5.0.0":
"integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="
"resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
"version" "5.2.0"
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-parse@^1.0.7":
"integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
"resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
"version" "1.0.7"
"path-type@^4.0.0":
"integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
"resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
"version" "4.0.0"
"picocolors@^1.0.0":
"integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
"resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
"version" "1.0.0"
"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.3":
"integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
"resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
"version" "2.3.1"
"pify@^2.3.0":
"integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
"resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
"version" "2.3.0"
"postcss-import@^14.0.2":
"integrity" "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g=="
"resolved" "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz"
"version" "14.0.2"
dependencies:
"postcss-value-parser" "^4.0.0"
"read-cache" "^1.0.0"
"resolve" "^1.1.7"
"postcss-js@^4.0.0":
"integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ=="
"resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz"
"version" "4.0.0"
dependencies:
"camelcase-css" "^2.0.1"
"postcss-load-config@^3.1.0":
"integrity" "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g=="
"resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz"
"version" "3.1.0"
dependencies:
"import-cwd" "^3.0.0"
"lilconfig" "^2.0.3"
"yaml" "^1.10.2"
"postcss-nested@5.0.6":
"integrity" "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA=="
"resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz"
"version" "5.0.6"
dependencies:
"postcss-selector-parser" "^6.0.6"
"postcss-selector-parser@^6.0.6", "postcss-selector-parser@^6.0.9":
"integrity" "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ=="
"resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz"
"version" "6.0.9"
dependencies:
"cssesc" "^3.0.0"
"util-deprecate" "^1.0.2"
"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.2.0":
"integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
"resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
"version" "4.2.0"
"postcss@^8.0.0", "postcss@^8.1.0", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.6", "postcss@^8.4.7":
"integrity" "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A=="
"resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz"
"version" "8.4.7"
dependencies:
"nanoid" "^3.3.1"
"picocolors" "^1.0.0"
"source-map-js" "^1.0.2"
"postcss@8.4.5":
"integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg=="
"resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz"
"version" "8.4.5"
dependencies:
"nanoid" "^3.1.30"
"picocolors" "^1.0.0"
"source-map-js" "^1.0.1"
"queue-microtask@^1.2.2":
"integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
"resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
"version" "1.2.3"
"quick-lru@^5.1.1":
"integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
"resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"
"version" "5.1.1"
"react-dom@^17.0.2 || ^18.0.0-0", "react-dom@17.0.2":
"integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
"resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
"version" "17.0.2"
dependencies:
"loose-envify" "^1.1.0"
"object-assign" "^4.1.1"
"scheduler" "^0.20.2"
"react@^17.0.2 || ^18.0.0-0", "react@>= 16.8.0 || 17.x.x || 18.x.x", "react@17.0.2":
"integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="
"resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
"version" "17.0.2"
dependencies:
"loose-envify" "^1.1.0"
"object-assign" "^4.1.1"
"read-cache@^1.0.0":
"integrity" "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q="
"resolved" "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz"
"version" "1.0.0"
dependencies:
"pify" "^2.3.0"
"readdirp@~3.6.0":
"integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="
"resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
"version" "3.6.0"
dependencies:
"picomatch" "^2.2.1"
"resolve-from@^4.0.0":
"integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
"resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
"version" "4.0.0"
"resolve-from@^5.0.0":
"integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
"resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
"version" "5.0.0"
"resolve@^1.1.7", "resolve@^1.22.0":
"integrity" "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw=="
"resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz"
"version" "1.22.0"
dependencies:
"is-core-module" "^2.8.1"
"path-parse" "^1.0.7"
"supports-preserve-symlinks-flag" "^1.0.0"
"reusify@^1.0.4":
"integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
"resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
"version" "1.0.4"
"run-parallel@^1.1.9":
"integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="
"resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
"version" "1.2.0"
dependencies:
"queue-microtask" "^1.2.2"
"scheduler@^0.20.2":
"integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="
"resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
"version" "0.20.2"
dependencies:
"loose-envify" "^1.1.0"
"object-assign" "^4.1.1"
"socket.io-adapter@~2.4.0":
"integrity" "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
"resolved" "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz"
"version" "2.4.0"
"socket.io-client@^4.5.1":
"integrity" "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g=="
"resolved" "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz"
"version" "4.5.4"
dependencies:
"@socket.io/component-emitter" "~3.1.0"
"debug" "~4.3.2"
"engine.io-client" "~6.2.3"
"socket.io-parser" "~4.2.1"
"socket.io-parser@~4.2.1":
"integrity" "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g=="
"resolved" "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz"
"version" "4.2.1"
dependencies:
"@socket.io/component-emitter" "~3.1.0"
"debug" "~4.3.1"
"socket.io@^4.5.1":
"integrity" "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ=="
"resolved" "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz"
"version" "4.5.4"
dependencies:
"accepts" "~1.3.4"
"base64id" "~2.0.0"
"debug" "~4.3.2"
"engine.io" "~6.2.1"
"socket.io-adapter" "~2.4.0"
"socket.io-parser" "~4.2.1"
"source-map-js@^1.0.1", "source-map-js@^1.0.2":
"integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
"resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
"version" "1.0.2"
"styled-jsx@5.0.0":
"integrity" "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA=="
"resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz"
"version" "5.0.0"
"supports-color@^5.3.0":
"integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
"resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
"version" "5.5.0"
dependencies:
"has-flag" "^3.0.0"
"supports-color@^7.1.0":
"integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
"resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
"version" "7.2.0"
dependencies:
"has-flag" "^4.0.0"
"supports-preserve-symlinks-flag@^1.0.0":
"integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
"resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
"version" "1.0.0"
"tailwindcss@^3.0.23":
"integrity" "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA=="
"resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz"
"version" "3.0.23"
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"
"to-regex-range@^5.0.1":
"integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
"resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
"version" "5.0.1"
dependencies:
"is-number" "^7.0.0"
"typescript@^4.6.2":
"integrity" "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg=="
"resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz"
"version" "4.6.2"
"use-subscription@1.5.1":
"integrity" "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA=="
"resolved" "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz"
"version" "1.5.1"
dependencies:
"object-assign" "^4.1.1"
"util-deprecate@^1.0.2":
"integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
"resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
"version" "1.0.2"
"vary@^1":
"integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
"resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
"version" "1.1.2"
"ws@~8.2.3":
"integrity" "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
"resolved" "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz"
"version" "8.2.3"
"xmlhttprequest-ssl@~2.0.0":
"integrity" "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
"resolved" "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz"
"version" "2.0.0"
"xtend@^4.0.2":
"integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
"resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
"version" "4.0.2"
"yaml@^1.10.0", "yaml@^1.10.2":
"integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
"resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
"version" "1.10.2"