From 3ef9a80a66862ed1a32a8ae82835eb28c5a3d471 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Mon, 21 Aug 2023 16:36:41 -0400 Subject: [PATCH 01/21] Updates to next.js 13, ably react --- app/global.css | 79 + app/history/page.tsx | 84 + app/layout.tsx | 23 + app/page.tsx | 93 + app/presence/page.tsx | 156 + app/pub-sub/page.tsx | 70 + components/layout.tsx | 58 - components/logger.tsx | 2 +- components/navbar.tsx | 48 + package-lock.json | 3553 ++++++++++++++--- package.json | 18 +- pages/_app.old | 7 + pages/_app.tsx | 6 - pages/api/authentication/token-auth.ts | 2 + pages/authentication.old | 63 + pages/authentication.tsx | 63 - pages/history.tsx | 90 - pages/index.tsx | 39 - pages/presence.tsx | 165 - pages/pub-sub.tsx | 79 - postcss.config.js | 6 + public/ably-logo-col-horiz-rgb.png | Bin 0 -> 19909 bytes public/ably-logo-col-horiz-rgb.svg | 23 + public/ably-logo-col-inv-horiz-rgb.svg | 23 + public/ably-motif-col-rgb.svg | 22 + .../Authentication.module.css | 0 {styles => styles-old}/Home.module.css | 0 {styles => styles-old}/Layout.module.css | 0 {styles => styles-old}/Presence.module.css | 0 {styles => styles-old}/PubSub.module.css | 0 {styles => styles-old}/globals.css | 0 tailwind.config.js | 18 + tsconfig.json | 24 +- 33 files changed, 3747 insertions(+), 1067 deletions(-) create mode 100644 app/global.css create mode 100644 app/history/page.tsx create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 app/presence/page.tsx create mode 100644 app/pub-sub/page.tsx delete mode 100644 components/layout.tsx create mode 100644 components/navbar.tsx create mode 100644 pages/_app.old delete mode 100644 pages/_app.tsx create mode 100644 pages/authentication.old delete mode 100644 pages/authentication.tsx delete mode 100644 pages/history.tsx delete mode 100644 pages/index.tsx delete mode 100644 pages/presence.tsx delete mode 100644 pages/pub-sub.tsx create mode 100644 postcss.config.js create mode 100644 public/ably-logo-col-horiz-rgb.png create mode 100644 public/ably-logo-col-horiz-rgb.svg create mode 100644 public/ably-logo-col-inv-horiz-rgb.svg create mode 100644 public/ably-motif-col-rgb.svg rename {styles => styles-old}/Authentication.module.css (100%) rename {styles => styles-old}/Home.module.css (100%) rename {styles => styles-old}/Layout.module.css (100%) rename {styles => styles-old}/Presence.module.css (100%) rename {styles => styles-old}/PubSub.module.css (100%) rename {styles => styles-old}/globals.css (100%) create mode 100644 tailwind.config.js diff --git a/app/global.css b/app/global.css new file mode 100644 index 0000000..0f368f1 --- /dev/null +++ b/app/global.css @@ -0,0 +1,79 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +/*********/ +/* +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} + +h2, h3 { + text-align: center; +} + +button, input { + font-size: 1em; + cursor: pointer; +} + +button { + border: 0; + border-radius: 15px; + padding: 4px 8px; + height: 30px; + line-height: 100%; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } + body { + color: white; + background: black; + } + .footer { + border-color: #222; + } + .logo img { + filter: invert(1); + } +} */ diff --git a/app/history/page.tsx b/app/history/page.tsx new file mode 100644 index 0000000..6f1aff2 --- /dev/null +++ b/app/history/page.tsx @@ -0,0 +1,84 @@ +'use client' + +import * as Ably from 'ably'; +import { AblyProvider, useChannel } from "@ably-labs/react-hooks" +import Logger, { LogEntry } from '../../components/logger'; +import { useEffect, useState } from 'react'; +import NavBar from '../../components/navbar'; + +export default function History() { + + const options = { + authUrl:'/api/authentication/token-auth' + } + + return ( + + + + ) +} + +function HistoryMessages() { + + const [realtimeLogs, setRealtimeLogs] = useState>([]) + const [historicalLogs, setHistoricalLogs] = useState>([]) + + const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { + console.log(message); + setRealtimeLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) + }); + + useEffect(() => { + const getHistory = async () => { + let history: Ably.Types.PaginatedResult = await channel.history() + do { + history.items.forEach(message => { + setHistoricalLogs(prev => [ + ...prev, + new LogEntry(`"${message.data.text}" sent at ${new Date(message.timestamp).toISOString()}`) + ]) + }) + history = await history.next() + } + while(history) + } + getHistory() + }, []) + + return ( +
+
+ +
+
+
+

+ Retrieve a history of messages that have been published to a channel. Publish messages via the Pub/Sub example Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app. +

+
+
+

History

+ { + historicalLogs.length > 0? + + : +

No historical messages found

+ } +
+
+

Realtime

+ { + realtimeLogs.length > 0? + + : +

No realtime messages received yet

+ } +
+
+
+
+
+ + ) +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..f979aa6 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,23 @@ +import './global.css' +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' +import { Roboto } from "next/font/google"; + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata: Metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..3a61ff3 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,93 @@ +import Image from 'next/image' +import NavBar from '../components/navbar' + +export default function Home() { + + return ( +
+
+ +
+
+
+
+
+ Ably logo +
+
+ Next.js logo +
+
+ +

Ably hearts Next.js

+

At Ably we are big fans of Next.js. This application demonstrates using some of the Ably fundamentals with Next.js. You can build features and use cases upon these fundamentals such as notifications, activity streams, chat, realtime visualisations and dashboards, and collaborative multiplayer experiences.

+ +
+ +
+ + + + +

Token Authentication

+
+

Token Authentication is the recommeded approach for auth with Ably.

+
+ +
+ + + + +

Pub/Sub

+
+

Pub/Sub (Publish/Subscribe) with Ably lets you publish messages on channels and subscribe to channels to receive messages.

+
+ +
+ + + + +

Presence

+
+

Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat.

+
+ +
+ + + + +

History

+
+

Retrieve a history of messages that have been published to a channel.

+
+
+
+
+ +
+ ) +} diff --git a/app/presence/page.tsx b/app/presence/page.tsx new file mode 100644 index 0000000..52da334 --- /dev/null +++ b/app/presence/page.tsx @@ -0,0 +1,156 @@ +'use client' + +import * as Ably from 'ably'; +import { AblyProvider, useChannel, usePresence } from "@ably-labs/react-hooks" +import Logger, { LogEntry } from '../../components/logger'; +import { MouseEvent, useState, FormEvent, ChangeEvent, useCallback } from 'react' +import NavBar from '../../components/navbar'; + + +const presenceActionIcon = new Map([ + ['enter', '🟢'], + ['leave', '🔴'] +]) + +export default function Presence() { + const options = { + authUrl:'/api/authentication/token-auth' + } + + return ( + + + + ) +} + +function PresenceMessages() { + const [logs, setLogs] = useState>([]) + const [username, setUsername] = useState('') + const [isUsernameValid, setIsUsernameValid] = useState(false) + const [onlineUsers, setOnlineUsers] = useState([]) + + const handlePresenceMessage = useCallback((message: Ably.Types.PresenceMessage) => { + console.log('handlePresenceMessage', message.action, message.clientId, new Date()); + + if(message.action === 'enter' || message.action === 'present') { + setOnlineUsers(prev => { + if(prev.includes(message.clientId) === false) { + return [...prev, message.clientId] + } + else { + return prev + } + }) + } + else { // user has left + setOnlineUsers(prev => prev.filter(username => { + const keep: boolean = username !== message.clientId + return keep + })) + } + + setLogs(prev => [...prev, new LogEntry(`action: ${message.action} clientId: ${message.clientId}`)]) + }, []) + + const { updateStatus } = usePresence("room", (presenceUpdate:Ably.Types.PresenceMessage) => { + console.log(presenceUpdate); + }); + +// useEffect(() => { +// // The first requirement is to have a valid username +// // to be used as the Ably clientId +// if(isUsernameValid === false) return + +// // If not already subscribed to a channel, subscribe +// if(channel === null) { + +// // Note: the 'present' event doesn't always seem to fire +// // so we use presence.get() later to get the initial list of users +// // _channel.presence.subscribe(['present', 'enter', 'leave'], handlePresenceMessage) +// _channel.presence.subscribe(['enter', 'leave'], handlePresenceMessage) + +// const getExistingMembers = async () => { +// const messages = await _channel.presence.get() +// messages.forEach(handlePresenceMessage) +// } +// getExistingMembers() + +// _channel.presence.enter() +// } +// }, [isUsernameValid, ably, channel, username, onlineUsers, handlePresenceMessage]) + + // Very basic validation + const validateUsername = (username: string) => { + if(username.length < 2) { + return false + } + return true + } + + const handleUsernameInputChange = (e: ChangeEvent) => { + setUsername(e.target.value) + } + + const handleFormSubmit = (e: FormEvent) => { + e.preventDefault() + + setIsUsernameValid(validateUsername(username)) + } + + const handleLeaveClick = async (_event: MouseEvent) => { + +// await channel?.presence.leave() +// channel?.presence.unsubscribe() +// channel?.unsubscribe() + +// // Clear the online users state +// // While subscribed to the channel, enter and leave events will update the state +// // But once unsubscribed we will not receive events to the state will become stale +// setOnlineUsers([]) + +// setChannel(null) + setIsUsernameValid(false) + } + + return ( +
+ +

+ Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. +

+

+ Open this page in another tab to see more users enter and leave the presence channel. +

+ { isUsernameValid === false? +
+
+ + + +
+
+ : +
+
    + {onlineUsers.map((username: string) => { + return
  • + {presenceActionIcon.get('enter')} {username} +
  • + })} +
+ +
+ } +
+ +
+
+ ) +} diff --git a/app/pub-sub/page.tsx b/app/pub-sub/page.tsx new file mode 100644 index 0000000..7e37489 --- /dev/null +++ b/app/pub-sub/page.tsx @@ -0,0 +1,70 @@ +'use client' + +import * as Ably from 'ably'; +import { AblyProvider, useChannel } from "@ably-labs/react-hooks" +import { MouseEventHandler, MouseEvent, useState } from 'react' + +import Logger, { LogEntry } from '../../components/logger'; +import NavBar from '../../components/navbar'; + +export default function PubSub() { + + const options = { + authUrl:'/api/authentication/token-auth' + } + + return ( + + + + ) +} + +function PubSubMessages() { + + const [logs, setLogs] = useState>([]) + const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { + setLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) + }); + const [messageText, setMessageText] = useState('A message') + + const publicFromClientHandler: MouseEventHandler = (_event: MouseEvent) => { + if(channel === null) return + channel.publish('update-from-client', {text: `${messageText} @ ${new Date().toISOString()}`}) + } + + const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { + fetch('/api/pub-sub/publish', { + 'method': 'POST', + 'headers': { + 'content-type': 'application/json', + }, + 'body': JSON.stringify({text: `${messageText} @ ${new Date().toISOString()}`}) + }) + } + + return ( +
+
+ +
+
+
+

+ Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function. +

+
+ Message text: + setMessageText(e.target.value)} /> + + +
+
+

Message Log

+ +
+
+
+
+ ) +} diff --git a/components/layout.tsx b/components/layout.tsx deleted file mode 100644 index 2c973c9..0000000 --- a/components/layout.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import Head from 'next/head' -import Image from 'next/image' -import Link from 'next/link' - -import styles from '../styles/Layout.module.css' - -type LayoutProps = { - children: React.ReactNode, - pageTitle?: string, - metaDescription: string, - showHomeLink?: boolean, -} - -export default function Layout({ children, pageTitle, metaDescription, showHomeLink = true }: LayoutProps) { - const headTitle = (pageTitle? `${pageTitle} - ` : '') + 'Ably and Next.js fundamentals starter kit' - return ( -
- - {headTitle} - - - -
- -

- Ably & Next.js fundamentals -

- { showHomeLink && ← Home } - - {pageTitle &&

{pageTitle}

} - - {children} -
- -
- ) -} diff --git a/components/logger.tsx b/components/logger.tsx index 6f26652..b2ade26 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -21,7 +21,7 @@ export default function Logger({ logEntries }: LoggingProps) { return b.timestamp.getTime() - a.timestamp.getTime() }).map((logEntry: LogEntry, index: number) => { return ( -
  • +
  • {logEntry.timestamp.toISOString()}: {logEntry.message}
  • )} diff --git a/components/navbar.tsx b/components/navbar.tsx new file mode 100644 index 0000000..25962fa --- /dev/null +++ b/components/navbar.tsx @@ -0,0 +1,48 @@ +import Head from 'next/head' +import Image from 'next/image' +import Link from 'next/link' + +type LayoutProps = { + children: React.ReactNode, + pageTitle?: string, + metaDescription: string, + showHomeLink?: boolean, +} + +export default function NavBar() { + + return ( + + ) +} diff --git a/package-lock.json b/package-lock.json index 58e430d..9ca1967 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,41 +1,67 @@ { - "name": "ably-next-template", + "name": "ably-nextjs-fundamentals-kit", "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "ably-next-template", + "name": "ably-nextjs-fundamentals-kit", "version": "0.1.0", "dependencies": { - "@ably-labs/react-hooks": "^2.0.9", + "@ably-labs/react-hooks": "file:../react-hooks", "@types/node": "18.11.9", "@types/react": "18.0.25", "@types/react-dom": "18.0.8", + "ably": "^1.2.43", "dotenv": "^16.0.3", "eslint": "8.27.0", - "eslint-config-next": "13.0.2", - "next": "13.0.2", - "react": "18.2.0", - "react-dom": "18.2.0", + "flowbite": "^1.8.1", + "flowbite-react": "^0.5.0", + "next": "^13.4.16", + "react": "^18.2.0", + "react-dom": "^18.2.0", "typescript": "4.8.4" }, "devDependencies": { - "eslint-plugin-react-hooks": "^4.6.0" + "autoprefixer": "^10.4.15", + "eslint-config-next": "^13.4.16", + "eslint-plugin-react-hooks": "^4.6.0", + "postcss": "^8.4.28", + "tailwindcss": "^3.3.3" } }, - "node_modules/@ably-labs/react-hooks": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@ably-labs/react-hooks/-/react-hooks-2.0.9.tgz", - "integrity": "sha512-mBTzQhzS4eybKwIC28Vgkikfny/K5pHNhgsyhuFIXUPT5Lv0dqaFG3sbpjlzGsZI+6vVpGp1AuloCP2BQu3zFQ==", + "../react-hooks": { + "name": "@ably-labs/react-hooks", + "version": "2.1.1", + "license": "ISC", "dependencies": { "ably": "^1.2.27" }, - "peerDependencies": { + "devDependencies": { + "@testing-library/react": "^13.3.0", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.4.0", + "@vitejs/plugin-react": "^1.3.2", + "eslint": "^8.45.0", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "jsdom": "^20.0.0", + "prettier": "^3.0.0", "react": ">=18.1.0", - "react-dom": ">=18.1.0" + "react-dom": ">=18.1.0", + "typescript": ">=4.4.4", + "vitest": "^0.18.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, + "node_modules/@ably-labs/react-hooks": { + "resolved": "../react-hooks", + "link": true + }, "node_modules/@ably/msgpack-js": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@ably/msgpack-js/-/msgpack-js-0.4.0.tgz", @@ -44,10 +70,22 @@ "bops": "^1.0.1" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/runtime": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.13.10" }, @@ -59,6 +97,7 @@ "version": "7.20.1", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", + "dev": true, "dependencies": { "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.10" @@ -67,6 +106,30 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -89,6 +152,54 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.24.8.tgz", + "integrity": "sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.1", + "aria-hidden": "^1.2.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "dependencies": { + "@floating-ui/dom": "^1.3.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -119,53 +230,67 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, - "node_modules/@next/env": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.2.tgz", - "integrity": "sha512-Qb6WPuRriGIQ19qd6NBxpcrFOfj8ziN7l9eZUfwff5gl4zLXluqtuZPddYZM/oWjN53ZYcuRXzL+oowKyJeYtA==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.2.tgz", - "integrity": "sha512-W+fIIIaFU7Kct7Okx91C7XDRGolv/w2RUenX2yZFeeNVcuVzDIKUcNmckrYbYcwrNQUSXmtwrs3g8xwast0YtA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { - "glob": "7.1.7" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@next/swc-android-arm-eabi": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.2.tgz", - "integrity": "sha512-X54UQCTFyOGnJP//Z71dPPlp4BCYcQL2ncikKXQcPzVpqPs4C3m+tKC8ivBNH6edAXkppwsLRz1/yQwgSZ9Swg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { - "node": ">= 10" + "node": ">=6.0.0" } }, - "node_modules/@next/swc-android-arm64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.2.tgz", - "integrity": "sha512-1P00Kv8uKaLubqo7JzPrTqgFAzSOmfb8iwqJrOb9in5IvTRtNGlkR4hU0sXzqbQNM/+SaYxze6Z5ry1IDyb/cQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { - "node": ">= 10" + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.16.tgz", + "integrity": "sha512-pCU0sJBqdfKP9mwDadxvZd+eLz3fZrTlmmDHY12Hdpl3DD0vy8ou5HWKVfG0zZS6tqhL4wnQqRbspdY5nqa7MA==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.16.tgz", + "integrity": "sha512-QuFtQl+oSEEQb0HMYBdvBoUaTiMxbY3go/MFkF3zOnfY0t84+IbAX78cw8ZCfr6cA6UcTq3nMIlCrHwDC/moxg==", + "dev": true, + "dependencies": { + "glob": "7.1.7" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.2.tgz", - "integrity": "sha512-1zGIOkInkOLRv0QQGZ+3wffYsyKI4vIy62LYTvDWUn7TAYqnmXwougp9NSLqDeagLwgsv2URrykyAFixA/YqxA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.16.tgz", + "integrity": "sha512-Rl6i1uUq0ciRa3VfEpw6GnWAJTSKo9oM2OrkGXPsm7rMxdd2FR5NkKc0C9xzFCI4+QtmBviWBdF2m3ur3Nqstw==", "cpu": [ "arm64" ], @@ -178,9 +303,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.2.tgz", - "integrity": "sha512-ECDAjoMP1Y90cARaelS6X+k6BQx+MikAYJ8f/eaJrLur44NIOYc9HA/dgcTp5jenguY4yT8V+HCquLjAVle6fA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.16.tgz", + "integrity": "sha512-o1vIKYbZORyDmTrPV1hApt9NLyWrS5vr2p5hhLGpOnkBY1cz6DAXjv8Lgan8t6X87+83F0EUDlu7klN8ieZ06A==", "cpu": [ "x64" ], @@ -192,40 +317,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-freebsd-x64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.2.tgz", - "integrity": "sha512-2DcL/ofQdBnQX3IoI9sjlIAyLCD1oZoUBuhrhWbejvBQjutWrI0JTEv9uG69WcxWhVMm3BCsjv8GK2/68OKp7A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.2.tgz", - "integrity": "sha512-Y3OQF1CSBSWW2vGkmvOIuOUNqOq8qX7f1ZpcKUVWP3/Uq++DZmVi9d18lgnSe1I3QFqc+nXWyun9ljsN83j0sw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.2.tgz", - "integrity": "sha512-mNyzwsFF6kwZYEjnGicx9ksDZYEZvyzEc1BtCu8vdZi/v8UeixQwCiAT6FyYX9uxMPEkzk8qiU0t0u9gvltsKw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.16.tgz", + "integrity": "sha512-JRyAl8lCfyTng4zoOmE6hNI2f1MFUr7JyTYCHl1RxX42H4a5LMwJhDVQ7a9tmDZ/yj+0hpBn+Aan+d6lA3v0UQ==", "cpu": [ "arm64" ], @@ -238,9 +333,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.2.tgz", - "integrity": "sha512-M6SdYjWgRrY3tJBxz0663zCRPTu5BRONmxlftKWWHv9LjAJ59neTLaGj4rp0A08DkJglZIoCkLOzLrzST6TGag==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.16.tgz", + "integrity": "sha512-9gqVqNzUMWbUDgDiND18xoUqhwSm2gmksqXgCU0qaOKt6oAjWz8cWYjgpPVD0WICKFylEY/gvPEP1fMZDVFZ/g==", "cpu": [ "arm64" ], @@ -253,9 +348,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.2.tgz", - "integrity": "sha512-pi63RoxvG4ES1KS06Zpm0MATVIXTs/TIbLbdckeLoM40u1d3mQl/+hSSrLRSxzc2OtyL8fh92sM4gkJrQXAMAw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.16.tgz", + "integrity": "sha512-KcQGwchAKmZVPa8i5PLTxvTs1/rcFnSltfpTm803Tr/BtBV3AxCkHLfhtoyVtVzx/kl/oue8oS+DSmbepQKwhw==", "cpu": [ "x64" ], @@ -268,9 +363,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.2.tgz", - "integrity": "sha512-9Pv91gfYnDONgjtRm78n64b/c54+azeHtlnqBLTnIFWSMBDRl1/WDkhKWIj3fBGPLimtK7Tko3ULR3og9RRUPw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.16.tgz", + "integrity": "sha512-2RbMZNxYnJmW8EPHVBsGZPq5zqWAyBOc/YFxq/jIQ/Yn3RMFZ1dZVCjtIcsiaKmgh7mjA/W0ApbumutHNxRqqQ==", "cpu": [ "x64" ], @@ -283,9 +378,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.2.tgz", - "integrity": "sha512-Nvewe6YZaizAkGHHprbMkYqQulBjZCHKBGKeFPwoPtOA+a2Qi4pZzc/qXFyC5/2A6Z0mr2U1zg9rd04WBYMwBw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.16.tgz", + "integrity": "sha512-thDcGonELN7edUKzjzlHrdoKkm7y8IAdItQpRvvMxNUXa4d9r0ElofhTZj5emR7AiXft17hpen+QAkcWpqG7Jg==", "cpu": [ "arm64" ], @@ -298,9 +393,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.2.tgz", - "integrity": "sha512-ZUBYGZw5G3QrqDpRq1EWi3aHmvPZM8ijK5TFL6UbH16cYQ0JpANmuG2P66KB93Qe/lWWzbeAZk/tj1XqwoCuPA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.16.tgz", + "integrity": "sha512-f7SE1Mo4JAchUWl0LQsbtySR9xCa+x55C0taetjUApKtcLR3AgAjASrrP+oE1inmLmw573qRnE1eZN8YJfEBQw==", "cpu": [ "ia32" ], @@ -313,9 +408,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.2.tgz", - "integrity": "sha512-fA9uW1dm7C0mEYGcKlbmLcVm2sKcye+1kPxh2cM4jVR+kQQMtHWsjIzeSpe2grQLSDan06z4n6hbr8b1c3hA8w==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.16.tgz", + "integrity": "sha512-WamDZm1M/OEM4QLce3lOmD1XdLEl37zYZwlmOLhmF7qYJ2G6oYm9+ejZVv+LakQIsIuXhSpVlOvrxIAHqwRkPQ==", "cpu": [ "x64" ], @@ -359,10 +454,20 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", - "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "dev": true }, "node_modules/@sindresorhus/is": { "version": "4.6.0", @@ -376,9 +481,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", - "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", "dependencies": { "tslib": "^2.4.0" } @@ -394,6 +499,34 @@ "node": ">=10" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "optional": true, + "peer": true + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -413,7 +546,8 @@ "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", @@ -468,6 +602,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.1.tgz", "integrity": "sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==", + "dev": true, "dependencies": { "@typescript-eslint/scope-manager": "5.42.1", "@typescript-eslint/types": "5.42.1", @@ -494,6 +629,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.1.tgz", "integrity": "sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.42.1", "@typescript-eslint/visitor-keys": "5.42.1" @@ -510,6 +646,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.1.tgz", "integrity": "sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -522,6 +659,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.1.tgz", "integrity": "sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.42.1", "@typescript-eslint/visitor-keys": "5.42.1", @@ -548,6 +686,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.1.tgz", "integrity": "sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.42.1", "eslint-visitor-keys": "^3.3.0" @@ -561,12 +700,12 @@ } }, "node_modules/ably": { - "version": "1.2.32", - "resolved": "https://registry.npmjs.org/ably/-/ably-1.2.32.tgz", - "integrity": "sha512-j3OEDBRcnLg3Bhp6Hwag9FVE9h9Q+9fUZRxpDdlXTgpV99pizREkPIvr7y0Dcy7shgkYD+r4W+VHtYp0RkYhwg==", + "version": "1.2.43", + "resolved": "https://registry.npmjs.org/ably/-/ably-1.2.43.tgz", + "integrity": "sha512-HZ99Nd98KzYToNUD4+ysHp4+vMp1NmYTi59yqGpejHo/VffTgg0pereoib0nRRAHYUhGUGys5HGwR5yHYESWDA==", "dependencies": { "@ably/msgpack-js": "^0.4.0", - "got": "^11.8.2", + "got": "^11.8.5", "ws": "^5.1" }, "engines": { @@ -592,6 +731,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -629,15 +778,49 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, "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/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "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==", + "dev": true, "dependencies": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" @@ -646,10 +829,24 @@ "node": ">=6.0" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -668,14 +865,35 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -693,6 +911,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -706,20 +925,91 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true }, "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "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/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axe-core": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==", + "dev": true, "engines": { "node": ">=4" } @@ -727,7 +1017,8 @@ "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==" + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true }, "node_modules/balanced-match": { "version": "1.0.2", @@ -742,6 +1033,14 @@ "node": ">= 0.4" } }, + "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/bops": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.1.tgz", @@ -771,6 +1070,49 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -780,9 +1122,9 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -800,6 +1142,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -816,10 +1159,18 @@ "node": ">=6" } }, + "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/caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", "funding": [ { "type": "opencollective", @@ -828,6 +1179,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -846,6 +1201,48 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "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/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -878,6 +1275,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -887,12 +1292,20 @@ "version": "3.26.0", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", + "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "optional": true, + "peer": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -906,6 +1319,17 @@ "node": ">= 8" } }, + "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/csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -914,7 +1338,13 @@ "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==" + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "node_modules/debug": { "version": "4.3.4", @@ -971,9 +1401,10 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -985,10 +1416,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "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==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -996,6 +1443,11 @@ "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/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1015,10 +1467,22 @@ "node": ">=12" } }, + "node_modules/easy-bem": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/easy-bem/-/easy-bem-1.1.1.tgz", + "integrity": "sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.496", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", + "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", + "dev": true + }, "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==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -1028,35 +1492,64 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "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-intrinsic": "^1.2.1", "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.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "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-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -1065,10 +1558,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, "dependencies": { "has": "^1.0.3" } @@ -1077,6 +1585,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -1089,6 +1598,15 @@ "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1156,19 +1674,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.2.tgz", - "integrity": "sha512-SrrHp+zBDYLjOFZdM5b9aW/pliK687Xxfa+qpDuL08Z04ReHhmz3L+maXaAqgrEVZHQximP7nh0El4yNDJW+CA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.16.tgz", + "integrity": "sha512-Of73d/FiaGf0GLCxxTGdh4rW8bRDvsqypylefkshE/uDDpQr8ifVQsD4UiB99rhegks7nJGkYtUnR3dC7kfFlw==", + "dev": true, "dependencies": { - "@next/eslint-plugin-next": "13.0.2", + "@next/eslint-plugin-next": "13.4.16", "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.21.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", + "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-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -1180,65 +1699,68 @@ } } }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "dev": true, + "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-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==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "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==", + "dev": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", + "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", + "dev": true, "dependencies": { "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*" } }, - "node_modules/eslint-import-resolver-typescript/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/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, "dependencies": { "debug": "^3.2.7" }, @@ -1255,28 +1777,35 @@ "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/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", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "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.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.12.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -1286,17 +1815,19 @@ } }, "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==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "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==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -1304,15 +1835,20 @@ "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "dev": true, "dependencies": { "@babel/runtime": "^7.18.9", "aria-query": "^4.2.2", @@ -1339,6 +1875,7 @@ "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" } @@ -1347,6 +1884,7 @@ "version": "7.31.10", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "dev": true, "dependencies": { "array-includes": "^3.1.5", "array.prototype.flatmap": "^1.3.0", @@ -1374,6 +1912,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, "engines": { "node": ">=10" }, @@ -1385,6 +1924,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -1396,6 +1936,7 @@ "version": "2.0.0-next.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -1412,6 +1953,7 @@ "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" } @@ -1521,9 +2063,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1618,11 +2160,72 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, + "node_modules/flowbite": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.8.1.tgz", + "integrity": "sha512-lXTcO8a6dRTPFpINyOLcATCN/pK1Of/jY4PryklPllAiqH64tSDUsOdQpar3TO59ZXWwugm2e92oaqwH6X90Xg==", + "dependencies": { + "@popperjs/core": "^2.9.3", + "mini-svg-data-uri": "^1.4.3" + } + }, + "node_modules/flowbite-react": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.5.0.tgz", + "integrity": "sha512-OoJ0Dbv0ZuunTkPwa802wL3kalUWQ7YBh1t4It5uVfAYs5KUvOqhXIygdlVMawnmq3+xkMPbUZkWh1sDxVb3nw==", + "dependencies": { + "@floating-ui/react": "^0.24.3", + "flowbite": "^1.6.6", + "react-icons": "^4.10.1", + "react-indiana-drag-scroll": "^2.2.0", + "tailwind-merge": "^1.13.2" + }, + "peerDependencies": { + "react": "^18", + "react-dom": "^18", + "tailwindcss": "^3" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "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", @@ -1632,6 +2235,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -1649,17 +2253,20 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -1684,6 +2291,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -1695,6 +2303,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -1725,6 +2345,11 @@ "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/globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -1739,10 +2364,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1758,10 +2399,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -1782,6 +2435,11 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -1802,6 +2460,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1818,6 +2477,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -1825,10 +2485,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -1840,6 +2513,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -1851,9 +2525,9 @@ } }, "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==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http2-wrapper": { "version": "1.0.3", @@ -1913,11 +2587,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -1925,10 +2600,25 @@ "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -1936,10 +2626,22 @@ "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==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -1955,6 +2657,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -1963,9 +2666,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dependencies": { "has": "^1.0.3" }, @@ -1977,6 +2680,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2010,6 +2714,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2029,6 +2734,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2051,6 +2757,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -2066,6 +2773,7 @@ "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==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -2077,6 +2785,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2091,6 +2800,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -2101,10 +2811,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -2112,11 +2838,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -2154,9 +2894,10 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -2168,6 +2909,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, "dependencies": { "array-includes": "^3.1.5", "object.assign": "^4.1.3" @@ -2177,9 +2919,9 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dependencies": { "json-buffer": "3.0.1" } @@ -2187,12 +2929,14 @@ "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true }, "node_modules/language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, "dependencies": { "language-subtag-registry": "~0.3.2" } @@ -2209,6 +2953,19 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "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/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2251,6 +3008,7 @@ "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" }, @@ -2258,6 +3016,13 @@ "node": ">=10" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true, + "peer": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2286,6 +3051,14 @@ "node": ">=4" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2298,9 +3071,10 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2310,10 +3084,26 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2327,50 +3117,44 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/next/-/next-13.0.2.tgz", - "integrity": "sha512-uQ5z5e4D9mOe8+upy6bQdYYjo/kk1v3jMW87kTy2TgAyAsEO+CkwRnMgyZ4JoHEnhPZLHwh7dk0XymRNLe1gFw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.16.tgz", + "integrity": "sha512-1xaA/5DrfpPu0eV31Iro7JfPeqO8uxQWb1zYNTe+KDKdzqkAGapLcDYHMLNKXKB7lHjZ7LfKUOf9dyuzcibrhA==", "dependencies": { - "@next/env": "13.0.2", - "@swc/helpers": "0.4.11", + "@next/env": "13.4.16", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", - "styled-jsx": "5.1.0", - "use-sync-external-store": "1.2.0" + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=14.6.0" + "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-android-arm-eabi": "13.0.2", - "@next/swc-android-arm64": "13.0.2", - "@next/swc-darwin-arm64": "13.0.2", - "@next/swc-darwin-x64": "13.0.2", - "@next/swc-freebsd-x64": "13.0.2", - "@next/swc-linux-arm-gnueabihf": "13.0.2", - "@next/swc-linux-arm64-gnu": "13.0.2", - "@next/swc-linux-arm64-musl": "13.0.2", - "@next/swc-linux-x64-gnu": "13.0.2", - "@next/swc-linux-x64-musl": "13.0.2", - "@next/swc-win32-arm64-msvc": "13.0.2", - "@next/swc-win32-ia32-msvc": "13.0.2", - "@next/swc-win32-x64-msvc": "13.0.2" + "@next/swc-darwin-arm64": "13.4.16", + "@next/swc-darwin-x64": "13.4.16", + "@next/swc-linux-arm64-gnu": "13.4.16", + "@next/swc-linux-arm64-musl": "13.4.16", + "@next/swc-linux-x64-gnu": "13.4.16", + "@next/swc-linux-x64-musl": "13.4.16", + "@next/swc-win32-arm64-msvc": "13.4.16", + "@next/swc-win32-ia32-msvc": "13.4.16", + "@next/swc-win32-x64-msvc": "13.4.16" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", + "@opentelemetry/api": "^1.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { + "@opentelemetry/api": { "optional": true }, "sass": { @@ -2378,6 +3162,52 @@ } } }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "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", @@ -2397,10 +3227,19 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2409,6 +3248,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -2417,6 +3257,7 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2434,6 +3275,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2447,6 +3289,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2459,10 +3302,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, "dependencies": { "define-properties": "^1.1.4", "es-abstract": "^1.20.4" @@ -2475,6 +3331,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2591,6 +3448,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -2611,10 +3469,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "funding": [ { "type": "opencollective", @@ -2623,10 +3497,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -2634,6 +3512,85 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "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-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "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", @@ -2646,6 +3603,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -2722,24 +3680,72 @@ "react": "^18.2.0" } }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-indiana-drag-scroll": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-indiana-drag-scroll/-/react-indiana-drag-scroll-2.2.0.tgz", + "integrity": "sha512-+W/3B2OQV0FrbdnsoIo4dww/xpH0MUQJz6ziQb7H+oBko3OCbXuzDFYnho6v6yhGrYDNWYPuFUewb89IONEl/A==", + "dependencies": { + "classnames": "^2.2.6", + "debounce": "^1.2.0", + "easy-bem": "^1.1.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "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==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "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/regenerator-runtime": { "version": "0.13.10", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -2760,11 +3766,11 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2788,6 +3794,15 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -2844,10 +3859,29 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -2869,6 +3903,7 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -2902,6 +3937,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -2915,6 +3951,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -2927,10 +3964,19 @@ "node": ">=0.10.0" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2945,10 +3991,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2962,6 +4026,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -2986,6 +4051,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { "node": ">=4" } @@ -3002,9 +4068,9 @@ } }, "node_modules/styled-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", - "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "dependencies": { "client-only": "0.0.1" }, @@ -3023,6 +4089,46 @@ } } }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3045,11 +4151,107 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwind-merge": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz", + "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3057,35 +4259,93 @@ "dependencies": { "is-number": "^7.0.0" }, - "engines": { - "node": ">=8.0" + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-utf8": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "integrity": "sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/to-utf8": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", - "integrity": "sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==" + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true, + "peer": true }, "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==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, "dependencies": { "tslib": "^1.8.1" }, @@ -3099,7 +4359,8 @@ "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==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/type-check": { "version": "0.4.0", @@ -3123,6 +4384,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", @@ -3139,6 +4465,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -3149,6 +4476,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3157,12 +4514,28 @@ "punycode": "^2.1.0" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "optional": true, + "peer": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/which": { @@ -3183,6 +4556,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -3194,6 +4568,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "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", @@ -3218,7 +4611,26 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } }, "node_modules/yocto-queue": { "version": "0.1.0", @@ -3230,15 +4642,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { "@ably-labs/react-hooks": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@ably-labs/react-hooks/-/react-hooks-2.0.9.tgz", - "integrity": "sha512-mBTzQhzS4eybKwIC28Vgkikfny/K5pHNhgsyhuFIXUPT5Lv0dqaFG3sbpjlzGsZI+6vVpGp1AuloCP2BQu3zFQ==", - "requires": { - "ably": "^1.2.27" + "version": "file:../react-hooks", + "requires": { + "@testing-library/react": "^13.3.0", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.4.0", + "@vitejs/plugin-react": "^1.3.2", + "ably": "^1.2.27", + "eslint": "^8.45.0", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "jsdom": "^20.0.0", + "prettier": "^3.0.0", + "react": ">=18.1.0", + "react-dom": ">=18.1.0", + "typescript": ">=4.4.4", + "vitest": "^0.18.0" } }, "@ably/msgpack-js": { @@ -3249,10 +4681,16 @@ "bops": "^1.0.1" } }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, "@babel/runtime": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dev": true, "requires": { "regenerator-runtime": "^0.13.10" } @@ -3261,11 +4699,35 @@ "version": "7.20.1", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", + "dev": true, "requires": { "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.10" } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "optional": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "optional": true, + "peer": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -3282,6 +4744,46 @@ "strip-json-comments": "^3.1.1" } }, + "@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "requires": { + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "requires": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/react": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.24.8.tgz", + "integrity": "sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA==", + "requires": { + "@floating-ui/react-dom": "^2.0.1", + "aria-hidden": "^1.2.3", + "tabbable": "^6.0.1" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "requires": { + "@floating-ui/dom": "^1.3.0" + } + }, + "@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, "@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -3302,95 +4804,106 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@next/env": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.2.tgz", - "integrity": "sha512-Qb6WPuRriGIQ19qd6NBxpcrFOfj8ziN7l9eZUfwff5gl4zLXluqtuZPddYZM/oWjN53ZYcuRXzL+oowKyJeYtA==" + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.16.tgz", + "integrity": "sha512-pCU0sJBqdfKP9mwDadxvZd+eLz3fZrTlmmDHY12Hdpl3DD0vy8ou5HWKVfG0zZS6tqhL4wnQqRbspdY5nqa7MA==" }, "@next/eslint-plugin-next": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.2.tgz", - "integrity": "sha512-W+fIIIaFU7Kct7Okx91C7XDRGolv/w2RUenX2yZFeeNVcuVzDIKUcNmckrYbYcwrNQUSXmtwrs3g8xwast0YtA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.16.tgz", + "integrity": "sha512-QuFtQl+oSEEQb0HMYBdvBoUaTiMxbY3go/MFkF3zOnfY0t84+IbAX78cw8ZCfr6cA6UcTq3nMIlCrHwDC/moxg==", + "dev": true, "requires": { "glob": "7.1.7" } }, - "@next/swc-android-arm-eabi": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.2.tgz", - "integrity": "sha512-X54UQCTFyOGnJP//Z71dPPlp4BCYcQL2ncikKXQcPzVpqPs4C3m+tKC8ivBNH6edAXkppwsLRz1/yQwgSZ9Swg==", - "optional": true - }, - "@next/swc-android-arm64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.2.tgz", - "integrity": "sha512-1P00Kv8uKaLubqo7JzPrTqgFAzSOmfb8iwqJrOb9in5IvTRtNGlkR4hU0sXzqbQNM/+SaYxze6Z5ry1IDyb/cQ==", - "optional": true - }, "@next/swc-darwin-arm64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.2.tgz", - "integrity": "sha512-1zGIOkInkOLRv0QQGZ+3wffYsyKI4vIy62LYTvDWUn7TAYqnmXwougp9NSLqDeagLwgsv2URrykyAFixA/YqxA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.16.tgz", + "integrity": "sha512-Rl6i1uUq0ciRa3VfEpw6GnWAJTSKo9oM2OrkGXPsm7rMxdd2FR5NkKc0C9xzFCI4+QtmBviWBdF2m3ur3Nqstw==", "optional": true }, "@next/swc-darwin-x64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.2.tgz", - "integrity": "sha512-ECDAjoMP1Y90cARaelS6X+k6BQx+MikAYJ8f/eaJrLur44NIOYc9HA/dgcTp5jenguY4yT8V+HCquLjAVle6fA==", - "optional": true - }, - "@next/swc-freebsd-x64": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.2.tgz", - "integrity": "sha512-2DcL/ofQdBnQX3IoI9sjlIAyLCD1oZoUBuhrhWbejvBQjutWrI0JTEv9uG69WcxWhVMm3BCsjv8GK2/68OKp7A==", - "optional": true - }, - "@next/swc-linux-arm-gnueabihf": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.2.tgz", - "integrity": "sha512-Y3OQF1CSBSWW2vGkmvOIuOUNqOq8qX7f1ZpcKUVWP3/Uq++DZmVi9d18lgnSe1I3QFqc+nXWyun9ljsN83j0sw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.16.tgz", + "integrity": "sha512-o1vIKYbZORyDmTrPV1hApt9NLyWrS5vr2p5hhLGpOnkBY1cz6DAXjv8Lgan8t6X87+83F0EUDlu7klN8ieZ06A==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.2.tgz", - "integrity": "sha512-mNyzwsFF6kwZYEjnGicx9ksDZYEZvyzEc1BtCu8vdZi/v8UeixQwCiAT6FyYX9uxMPEkzk8qiU0t0u9gvltsKw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.16.tgz", + "integrity": "sha512-JRyAl8lCfyTng4zoOmE6hNI2f1MFUr7JyTYCHl1RxX42H4a5LMwJhDVQ7a9tmDZ/yj+0hpBn+Aan+d6lA3v0UQ==", "optional": true }, "@next/swc-linux-arm64-musl": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.2.tgz", - "integrity": "sha512-M6SdYjWgRrY3tJBxz0663zCRPTu5BRONmxlftKWWHv9LjAJ59neTLaGj4rp0A08DkJglZIoCkLOzLrzST6TGag==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.16.tgz", + "integrity": "sha512-9gqVqNzUMWbUDgDiND18xoUqhwSm2gmksqXgCU0qaOKt6oAjWz8cWYjgpPVD0WICKFylEY/gvPEP1fMZDVFZ/g==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.2.tgz", - "integrity": "sha512-pi63RoxvG4ES1KS06Zpm0MATVIXTs/TIbLbdckeLoM40u1d3mQl/+hSSrLRSxzc2OtyL8fh92sM4gkJrQXAMAw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.16.tgz", + "integrity": "sha512-KcQGwchAKmZVPa8i5PLTxvTs1/rcFnSltfpTm803Tr/BtBV3AxCkHLfhtoyVtVzx/kl/oue8oS+DSmbepQKwhw==", "optional": true }, "@next/swc-linux-x64-musl": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.2.tgz", - "integrity": "sha512-9Pv91gfYnDONgjtRm78n64b/c54+azeHtlnqBLTnIFWSMBDRl1/WDkhKWIj3fBGPLimtK7Tko3ULR3og9RRUPw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.16.tgz", + "integrity": "sha512-2RbMZNxYnJmW8EPHVBsGZPq5zqWAyBOc/YFxq/jIQ/Yn3RMFZ1dZVCjtIcsiaKmgh7mjA/W0ApbumutHNxRqqQ==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.2.tgz", - "integrity": "sha512-Nvewe6YZaizAkGHHprbMkYqQulBjZCHKBGKeFPwoPtOA+a2Qi4pZzc/qXFyC5/2A6Z0mr2U1zg9rd04WBYMwBw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.16.tgz", + "integrity": "sha512-thDcGonELN7edUKzjzlHrdoKkm7y8IAdItQpRvvMxNUXa4d9r0ElofhTZj5emR7AiXft17hpen+QAkcWpqG7Jg==", "optional": true }, "@next/swc-win32-ia32-msvc": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.2.tgz", - "integrity": "sha512-ZUBYGZw5G3QrqDpRq1EWi3aHmvPZM8ijK5TFL6UbH16cYQ0JpANmuG2P66KB93Qe/lWWzbeAZk/tj1XqwoCuPA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.16.tgz", + "integrity": "sha512-f7SE1Mo4JAchUWl0LQsbtySR9xCa+x55C0taetjUApKtcLR3AgAjASrrP+oE1inmLmw573qRnE1eZN8YJfEBQw==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.2.tgz", - "integrity": "sha512-fA9uW1dm7C0mEYGcKlbmLcVm2sKcye+1kPxh2cM4jVR+kQQMtHWsjIzeSpe2grQLSDan06z4n6hbr8b1c3hA8w==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.16.tgz", + "integrity": "sha512-WamDZm1M/OEM4QLce3lOmD1XdLEl37zYZwlmOLhmF7qYJ2G6oYm9+ejZVv+LakQIsIuXhSpVlOvrxIAHqwRkPQ==", "optional": true }, "@nodelib/fs.scandir": { @@ -3416,10 +4929,16 @@ "fastq": "^1.6.0" } }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, "@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", - "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "dev": true }, "@sindresorhus/is": { "version": "4.6.0", @@ -3427,9 +4946,9 @@ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@swc/helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", - "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", "requires": { "tslib": "^2.4.0" } @@ -3442,6 +4961,34 @@ "defer-to-connect": "^2.0.0" } }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "optional": true, + "peer": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "optional": true, + "peer": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "optional": true, + "peer": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "optional": true, + "peer": true + }, "@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -3461,7 +5008,8 @@ "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "@types/keyv": { "version": "3.1.4", @@ -3516,6 +5064,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.1.tgz", "integrity": "sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==", + "dev": true, "requires": { "@typescript-eslint/scope-manager": "5.42.1", "@typescript-eslint/types": "5.42.1", @@ -3527,6 +5076,7 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.1.tgz", "integrity": "sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==", + "dev": true, "requires": { "@typescript-eslint/types": "5.42.1", "@typescript-eslint/visitor-keys": "5.42.1" @@ -3535,12 +5085,14 @@ "@typescript-eslint/types": { "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.1.tgz", - "integrity": "sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==" + "integrity": "sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==", + "dev": true }, "@typescript-eslint/typescript-estree": { "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.1.tgz", "integrity": "sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==", + "dev": true, "requires": { "@typescript-eslint/types": "5.42.1", "@typescript-eslint/visitor-keys": "5.42.1", @@ -3555,18 +5107,19 @@ "version": "5.42.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.1.tgz", "integrity": "sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==", + "dev": true, "requires": { "@typescript-eslint/types": "5.42.1", "eslint-visitor-keys": "^3.3.0" } }, "ably": { - "version": "1.2.32", - "resolved": "https://registry.npmjs.org/ably/-/ably-1.2.32.tgz", - "integrity": "sha512-j3OEDBRcnLg3Bhp6Hwag9FVE9h9Q+9fUZRxpDdlXTgpV99pizREkPIvr7y0Dcy7shgkYD+r4W+VHtYp0RkYhwg==", + "version": "1.2.43", + "resolved": "https://registry.npmjs.org/ably/-/ably-1.2.43.tgz", + "integrity": "sha512-HZ99Nd98KzYToNUD4+ysHp4+vMp1NmYTi59yqGpejHo/VffTgg0pereoib0nRRAHYUhGUGys5HGwR5yHYESWDA==", "requires": { "@ably/msgpack-js": "^0.4.0", - "got": "^11.8.2", + "got": "^11.8.5", "ws": "^5.1" } }, @@ -3581,6 +5134,13 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "optional": true, + "peer": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3605,24 +5165,63 @@ "color-convert": "^2.0.1" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "requires": { + "tslib": "^2.0.0" + } + }, "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==", + "dev": true, "requires": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" } }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -3634,12 +5233,27 @@ "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==" + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "requires": { + "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" + } }, "array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -3651,6 +5265,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -3658,25 +5273,62 @@ "es-shim-unscopables": "^1.0.0" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "requires": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axe-core": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.1.tgz", - "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==" + "integrity": "sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==", + "dev": true }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true }, "balanced-match": { "version": "1.0.2", @@ -3688,6 +5340,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.2.tgz", "integrity": "sha512-ZXBDPMt/v/8fsIqn+Z5VwrhdR6jVka0bYobHdGia0Nxi7BJ9i/Uvml3AocHIBtIIBhZjBw5MR0aR4ROs/8+SNg==" }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, "bops": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.1.tgz", @@ -3714,15 +5371,35 @@ "fill-range": "^7.0.1" } }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -3737,6 +5414,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3747,10 +5425,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, + "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==" + }, "caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==" + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==" }, "chalk": { "version": "4.1.2", @@ -3761,6 +5444,36 @@ "supports-color": "^7.1.0" } }, + "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" + } + } + } + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -3787,6 +5500,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3795,7 +5513,15 @@ "core-js-pure": { "version": "3.26.0", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", - "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==" + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "optional": true, + "peer": true }, "cross-spawn": { "version": "7.0.3", @@ -3807,6 +5533,11 @@ "which": "^2.0.1" } }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, "csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -3815,7 +5546,13 @@ "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==" + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "debug": { "version": "4.3.4", @@ -3851,22 +5588,41 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^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": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true, + "peer": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "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==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -3880,10 +5636,22 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" }, + "easy-bem": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/easy-bem/-/easy-bem-1.1.1.tgz", + "integrity": "sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==" + }, + "electron-to-chromium": { + "version": "1.4.496", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", + "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", + "dev": true + }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "end-of-stream": { "version": "1.4.4", @@ -3893,41 +5661,79 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "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-intrinsic": "^1.2.1", "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.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "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-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" } }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, "requires": { "has": "^1.0.3" } @@ -3936,12 +5742,19 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "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==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3994,34 +5807,47 @@ } }, "eslint-config-next": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.2.tgz", - "integrity": "sha512-SrrHp+zBDYLjOFZdM5b9aW/pliK687Xxfa+qpDuL08Z04ReHhmz3L+maXaAqgrEVZHQximP7nh0El4yNDJW+CA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.16.tgz", + "integrity": "sha512-Of73d/FiaGf0GLCxxTGdh4rW8bRDvsqypylefkshE/uDDpQr8ifVQsD4UiB99rhegks7nJGkYtUnR3dC7kfFlw==", + "dev": true, "requires": { - "@next/eslint-plugin-next": "13.0.2", + "@next/eslint-plugin-next": "13.4.16", "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.21.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", + "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-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705" + }, + "dependencies": { + "eslint-plugin-react-hooks": { + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "dev": true, + "requires": {} + } } }, "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==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "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" } @@ -4029,36 +5855,25 @@ } }, "eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", + "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", + "dev": true, "requires": { "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "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" - } - } + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, "requires": { "debug": "^3.2.7" }, @@ -4067,6 +5882,7 @@ "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" } @@ -4074,45 +5890,54 @@ } }, "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", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "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.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.12.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "requires": { "esutils": "^2.0.2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, @@ -4120,6 +5945,7 @@ "version": "6.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "dev": true, "requires": { "@babel/runtime": "^7.18.9", "aria-query": "^4.2.2", @@ -4139,7 +5965,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -4147,6 +5974,7 @@ "version": "7.31.10", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "dev": true, "requires": { "array-includes": "^3.1.5", "array.prototype.flatmap": "^1.3.0", @@ -4168,6 +5996,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "requires": { "esutils": "^2.0.2" } @@ -4176,6 +6005,7 @@ "version": "2.0.0-next.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -4185,7 +6015,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -4193,6 +6024,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, "requires": {} }, "eslint-scope": { @@ -4266,9 +6098,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4344,11 +6176,53 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, + "flowbite": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.8.1.tgz", + "integrity": "sha512-lXTcO8a6dRTPFpINyOLcATCN/pK1Of/jY4PryklPllAiqH64tSDUsOdQpar3TO59ZXWwugm2e92oaqwH6X90Xg==", + "requires": { + "@popperjs/core": "^2.9.3", + "mini-svg-data-uri": "^1.4.3" + } + }, + "flowbite-react": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.5.0.tgz", + "integrity": "sha512-OoJ0Dbv0ZuunTkPwa802wL3kalUWQ7YBh1t4It5uVfAYs5KUvOqhXIygdlVMawnmq3+xkMPbUZkWh1sDxVb3nw==", + "requires": { + "@floating-ui/react": "^0.24.3", + "flowbite": "^1.6.6", + "react-icons": "^4.10.1", + "react-indiana-drag-scroll": "^2.2.0", + "tailwind-merge": "^1.13.2" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "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", @@ -4358,6 +6232,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -4368,15 +6243,18 @@ "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -4392,11 +6270,21 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, + "get-tsconfig": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -4418,6 +6306,11 @@ "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==" + }, "globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -4426,10 +6319,20 @@ "type-fest": "^0.20.2" } }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -4439,10 +6342,19 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "requires": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -4457,6 +6369,11 @@ "responselike": "^2.0.0" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -4473,7 +6390,8 @@ "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -4484,27 +6402,36 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "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==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http2-wrapper": { "version": "1.0.3", @@ -4549,27 +6476,49 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "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==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4578,12 +6527,13 @@ "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "requires": { "has": "^1.0.3" } @@ -4592,6 +6542,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -4612,7 +6563,8 @@ "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==" + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true }, "is-number": { "version": "7.0.0", @@ -4623,6 +6575,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -4636,6 +6589,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4645,6 +6599,7 @@ "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==", + "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -4653,6 +6608,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -4661,23 +6617,45 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "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==", + "dev": true, "requires": { "call-bind": "^1.0.2" } }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==" + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -4712,9 +6690,10 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "requires": { "minimist": "^1.2.0" } @@ -4723,15 +6702,16 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, "requires": { "array-includes": "^3.1.5", "object.assign": "^4.1.3" } }, "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "requires": { "json-buffer": "3.0.1" } @@ -4739,12 +6719,14 @@ "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true }, "language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, "requires": { "language-subtag-registry": "~0.3.2" } @@ -4758,6 +6740,16 @@ "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "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==" + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4788,10 +6780,18 @@ "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-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true, + "peer": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4811,6 +6811,11 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, + "mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4820,19 +6825,30 @@ } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "natural-compare": { "version": "1.4.0", @@ -4840,31 +6856,58 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "next": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/next/-/next-13.0.2.tgz", - "integrity": "sha512-uQ5z5e4D9mOe8+upy6bQdYYjo/kk1v3jMW87kTy2TgAyAsEO+CkwRnMgyZ4JoHEnhPZLHwh7dk0XymRNLe1gFw==", - "requires": { - "@next/env": "13.0.2", - "@next/swc-android-arm-eabi": "13.0.2", - "@next/swc-android-arm64": "13.0.2", - "@next/swc-darwin-arm64": "13.0.2", - "@next/swc-darwin-x64": "13.0.2", - "@next/swc-freebsd-x64": "13.0.2", - "@next/swc-linux-arm-gnueabihf": "13.0.2", - "@next/swc-linux-arm64-gnu": "13.0.2", - "@next/swc-linux-arm64-musl": "13.0.2", - "@next/swc-linux-x64-gnu": "13.0.2", - "@next/swc-linux-x64-musl": "13.0.2", - "@next/swc-win32-arm64-msvc": "13.0.2", - "@next/swc-win32-ia32-msvc": "13.0.2", - "@next/swc-win32-x64-msvc": "13.0.2", - "@swc/helpers": "0.4.11", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.16.tgz", + "integrity": "sha512-1xaA/5DrfpPu0eV31Iro7JfPeqO8uxQWb1zYNTe+KDKdzqkAGapLcDYHMLNKXKB7lHjZ7LfKUOf9dyuzcibrhA==", + "requires": { + "@next/env": "13.4.16", + "@next/swc-darwin-arm64": "13.4.16", + "@next/swc-darwin-x64": "13.4.16", + "@next/swc-linux-arm64-gnu": "13.4.16", + "@next/swc-linux-arm64-musl": "13.4.16", + "@next/swc-linux-x64-gnu": "13.4.16", + "@next/swc-linux-x64-musl": "13.4.16", + "@next/swc-win32-arm64-msvc": "13.4.16", + "@next/swc-win32-ia32-msvc": "13.4.16", + "@next/swc-win32-x64-msvc": "13.4.16", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", - "styled-jsx": "5.1.0", - "use-sync-external-store": "1.2.0" + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" + }, + "dependencies": { + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } } }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, "normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -4875,20 +6918,28 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4900,6 +6951,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4910,16 +6962,30 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, + "object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, "object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, "requires": { "define-properties": "^1.1.4", "es-abstract": "^1.20.4" @@ -4929,6 +6995,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5008,7 +7075,8 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "picocolors": { "version": "1.0.0", @@ -5020,16 +7088,67 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" + }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "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", @@ -5039,6 +7158,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -5086,24 +7206,59 @@ "scheduler": "^0.23.0" } }, + "react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "requires": {} + }, + "react-indiana-drag-scroll": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-indiana-drag-scroll/-/react-indiana-drag-scroll-2.2.0.tgz", + "integrity": "sha512-+W/3B2OQV0FrbdnsoIo4dww/xpH0MUQJz6ziQb7H+oBko3OCbXuzDFYnho6v6yhGrYDNWYPuFUewb89IONEl/A==", + "requires": { + "classnames": "^2.2.6", + "debounce": "^1.2.0", + "easy-bem": "^1.1.1" + } + }, "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==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "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" + } }, "regenerator-runtime": { "version": "0.13.10", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "regexpp": { @@ -5112,11 +7267,11 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -5131,6 +7286,12 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, "responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -5160,10 +7321,23 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -5182,6 +7356,7 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -5203,6 +7378,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -5212,17 +7388,24 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "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==" }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, "string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5234,10 +7417,22 @@ "side-channel": "^1.0.4" } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5248,6 +7443,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5265,7 +7461,8 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true }, "strip-json-comments": { "version": "3.1.1", @@ -5273,13 +7470,42 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "styled-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", - "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "requires": { "client-only": "0.0.1" } }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5293,11 +7519,82 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "tailwind-merge": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz", + "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==" + }, + "tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5311,26 +7608,64 @@ "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", "integrity": "sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==" }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "optional": true, + "peer": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true, + "peer": true + } + } + }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, "requires": { "tslib": "^1.8.1" }, @@ -5338,7 +7673,8 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, @@ -5355,6 +7691,53 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", @@ -5364,6 +7747,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -5371,6 +7755,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5379,11 +7773,26 @@ "punycode": "^2.1.0" } }, - "use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "requires": {} + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "optional": true, + "peer": true + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } }, "which": { "version": "2.0.2", @@ -5397,6 +7806,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -5405,6 +7815,19 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "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" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -5426,12 +7849,30 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": true, + "peer": true }, "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==" + }, + "zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" } } } diff --git a/package.json b/package.json index 6b5ed49..017a55f 100644 --- a/package.json +++ b/package.json @@ -9,19 +9,25 @@ "lint": "next lint" }, "dependencies": { - "@ably-labs/react-hooks": "^2.0.9", + "@ably-labs/react-hooks": "file:../react-hooks", "@types/node": "18.11.9", "@types/react": "18.0.25", "@types/react-dom": "18.0.8", + "ably": "^1.2.43", "dotenv": "^16.0.3", "eslint": "8.27.0", - "eslint-config-next": "13.0.2", - "next": "13.0.2", - "react": "18.2.0", - "react-dom": "18.2.0", + "flowbite": "^1.8.1", + "flowbite-react": "^0.5.0", + "next": "^13.4.16", + "react": "^18.2.0", + "react-dom": "^18.2.0", "typescript": "4.8.4" }, "devDependencies": { - "eslint-plugin-react-hooks": "^4.6.0" + "autoprefixer": "^10.4.15", + "eslint-config-next": "^13.4.16", + "eslint-plugin-react-hooks": "^4.6.0", + "postcss": "^8.4.28", + "tailwindcss": "^3.3.3" } } diff --git a/pages/_app.old b/pages/_app.old new file mode 100644 index 0000000..1b2a4f6 --- /dev/null +++ b/pages/_app.old @@ -0,0 +1,7 @@ +// import '../styles/globals.css' +// import type { AppProps } from 'next/app' +// import { AblyProvider } from "@ably-labs/react-hooks" + +// export default function App({ Component, pageProps }: AppProps) { +// return +// } diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index c055f25..0000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import '../styles/globals.css' -import type { AppProps } from 'next/app' - -export default function App({ Component, pageProps }: AppProps) { - return -} diff --git a/pages/api/authentication/token-auth.ts b/pages/api/authentication/token-auth.ts index 766b6b4..2e58fd4 100644 --- a/pages/api/authentication/token-auth.ts +++ b/pages/api/authentication/token-auth.ts @@ -28,5 +28,7 @@ export default async function handler( const client = new Ably.Rest(process.env.ABLY_API_KEY); const tokenRequestData = await client.auth.createTokenRequest({ clientId: clientId }); + console.log(`ABLY TOKEN ${tokenRequestData}`) + return res.status(200).json(tokenRequestData) } diff --git a/pages/authentication.old b/pages/authentication.old new file mode 100644 index 0000000..ae3c10f --- /dev/null +++ b/pages/authentication.old @@ -0,0 +1,63 @@ +// import { MouseEventHandler, MouseEvent, useState, useEffect } from 'react' + +// import Layout from '../components/layout' +// import Logger, { LogEntry } from '../components/logger' + +// import * as Ably from 'ably/promises' +// import { assertConfiguration, configureAbly } from '@ably-labs/react-hooks' + +// import styles from '../styles/Home.module.css' +// import authStyles from '../styles/Authentication.module.css' + +// export default function Authentication() { + +// const [logs, setLogs] = useState>([]) +// const [connectionState, setConnectionState] = useState('unknown') + +// useEffect(() => { +// const handleConnectionStateChange = (stateChange: Ably.Types.ConnectionStateChange) => { +// setLogs(prev => [...prev, new LogEntry(`Connection state change: ${stateChange.previous} -> ${stateChange.current}`)]) + +// setConnectionState(stateChange.current) +// } + +// const ably: Ably.Types.RealtimePromise = configureAbly({ authUrl: '/api/authentication/token-auth' }) +// ably.connection.on(handleConnectionStateChange) + +// return () => { +// ably.connection.off() +// } +// }, []) // Only run the client + +// const connectionToggle: MouseEventHandler = (_event: MouseEvent) => { +// const ably = assertConfiguration() + +// if(connectionState === 'connected') { +// ably.connection.close() +// } +// else if(connectionState === 'closed') { +// ably.connection.connect() +// } +// } + +// return ( +// +//

    +// Authenticate and establish a persistent bi-direction connection to the Ably platform. +//

    + +//
    +//

    Connection status: {connectionState}

    + +//
    +// +//
    + +// +//
    +//
    +// ) +// } diff --git a/pages/authentication.tsx b/pages/authentication.tsx deleted file mode 100644 index f842725..0000000 --- a/pages/authentication.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { MouseEventHandler, MouseEvent, useState, useEffect } from 'react' - -import Layout from '../components/layout' -import Logger, { LogEntry } from '../components/logger' - -import * as Ably from 'ably/promises' -import { assertConfiguration, configureAbly } from '@ably-labs/react-hooks' - -import styles from '../styles/Home.module.css' -import authStyles from '../styles/Authentication.module.css' - -export default function Authentication() { - - const [logs, setLogs] = useState>([]) - const [connectionState, setConnectionState] = useState('unknown') - - useEffect(() => { - const handleConnectionStateChange = (stateChange: Ably.Types.ConnectionStateChange) => { - setLogs(prev => [...prev, new LogEntry(`Connection state change: ${stateChange.previous} -> ${stateChange.current}`)]) - - setConnectionState(stateChange.current) - } - - const ably: Ably.Types.RealtimePromise = configureAbly({ authUrl: '/api/authentication/token-auth' }) - ably.connection.on(handleConnectionStateChange) - - return () => { - ably.connection.off() - } - }, []) // Only run the client - - const connectionToggle: MouseEventHandler = (_event: MouseEvent) => { - const ably = assertConfiguration() - - if(connectionState === 'connected') { - ably.connection.close() - } - else if(connectionState === 'closed') { - ably.connection.connect() - } - } - - return ( - -

    - Authenticate and establish a persistent bi-direction connection to the Ably platform. -

    - -
    -

    Connection status: {connectionState}

    - -
    - -
    - - -
    -
    - ) -} diff --git a/pages/history.tsx b/pages/history.tsx deleted file mode 100644 index 1b4d942..0000000 --- a/pages/history.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { useState, useEffect } from 'react' - -import * as Ably from 'ably/promises' -import { configureAbly } from '@ably-labs/react-hooks' - -import Layout from '../components/layout' -import Logger, { LogEntry } from '../components/logger' - -import styles from '../styles/Home.module.css' - -type Message = { - timestamp: number, - data: { - text: string, - } -} - -export default function History() { - - const [realtimeLogs, setRealtimeLogs] = useState>([]) - const [historicalLogs, setHistoricalLogs] = useState>([]) - - useEffect(() => { - const ably: Ably.Types.RealtimePromise = configureAbly({ authUrl: '/api/authentication/token-auth' }) - - ably.connection.on((stateChange: Ably.Types.ConnectionStateChange) => { - console.log(stateChange) - }) - - const channel = ably.channels.get('status-updates') - channel.subscribe((message: Ably.Types.Message) => { - setRealtimeLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) - }) - - const getHistory = async () => { - let history: Ably.Types.PaginatedResult = await channel.history() - do { - history.items.forEach(message => { - setHistoricalLogs(prev => [ - ...prev, - new LogEntry(`"${message.data.text}" sent at ${new Date(message.timestamp).toISOString()}`) - ]) - }) - history = await history.next() - } - while(history) - } - getHistory() - - return () => { - channel.unsubscribe() - } - }, []) - - return ( - -

    - Retrieve a history of messages that have been published to a channel. -

    -

    - Publish messages via the Pub/Sub example -

    -

    - Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app. -

    -
    -

    History

    - { - historicalLogs.length > 0? - - : -

    No historical messages found

    - } -
    - -
    -

    Realtime

    - { - realtimeLogs.length > 0? - - : -

    No realtime messages received yet

    - } -
    -
    - ) -} diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index 7bb795b..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import Layout from '../components/layout'; -import styles from '../styles/Home.module.css' - -export default function Home() { - return ( - -

    - This application demonstrates using some of the Ably fundamentals with Next.js. You can build features and use cases upon these fundamentals such as notifications, activity streams, chat, realtime visualisations and dashboards, and collaborative multiplayer experiences. -

    - - -
    - ) -} diff --git a/pages/presence.tsx b/pages/presence.tsx deleted file mode 100644 index ede2ac5..0000000 --- a/pages/presence.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import { MouseEventHandler, MouseEvent, useEffect, useState, FormEvent, ChangeEvent, useCallback } from 'react' - -import * as Ably from 'ably/promises' -import { configureAbly } from '@ably-labs/react-hooks' - -import Layout from '../components/layout' -import Logger, { LogEntry } from '../components/logger' - -import homeStyles from '../styles/Home.module.css' -import styles from '../styles/Presence.module.css' - -const presenceActionIcon = new Map([ - ['enter', '🟢'], - ['leave', '🔴'] -]) - -export default function Presence() { - - const [logs, setLogs] = useState>([]) - const [username, setUsername] = useState('') - const [isUsernameValid, setIsUsernameValid] = useState(false) - const [onlineUsers, setOnlineUsers] = useState([]) - const [ably, setAbly] = useState(null) - const [channel, setChannel] = useState(null) - - const handlePresenceMessage = useCallback((message: Ably.Types.PresenceMessage) => { - console.log('handlePresenceMessage', message.action, message.clientId, new Date()); - - if(message.action === 'enter' || message.action === 'present') { - setOnlineUsers(prev => { - if(prev.includes(message.clientId) === false) { - return [...prev, message.clientId] - } - else { - return prev - } - }) - } - else { // user has left - setOnlineUsers(prev => prev.filter(username => { - const keep: boolean = username !== message.clientId - return keep - })) - } - - setLogs(prev => [...prev, new LogEntry(`action: ${message.action} clientId: ${message.clientId}`)]) - }, []) - - useEffect(() => { - // The first requirement is to have a valid username - // to be used as the Ably clientId - if(isUsernameValid === false) return - - // If not already connected to ably, connect - if(ably === null) { - const ably: Ably.Types.RealtimePromise = configureAbly({ - authUrl: '/api/authentication/token-auth', - authMethod: 'POST', - clientId: username, - }) - - ably.connection.on((stateChange: Ably.Types.ConnectionStateChange) => { - console.log(stateChange) - }) - - setAbly(ably) - } - - if(ably === null) return - - // If not already subscribed to a channel, subscribe - if(channel === null) { - const _channel: Ably.Types.RealtimeChannelPromise = ably.channels.get('room') - setChannel(_channel) - - // Note: the 'present' event doesn't always seem to fire - // so we use presence.get() later to get the initial list of users - // _channel.presence.subscribe(['present', 'enter', 'leave'], handlePresenceMessage) - _channel.presence.subscribe(['enter', 'leave'], handlePresenceMessage) - - const getExistingMembers = async () => { - const messages = await _channel.presence.get() - messages.forEach(handlePresenceMessage) - } - getExistingMembers() - - _channel.presence.enter() - } - }, [isUsernameValid, ably, channel, username, onlineUsers, handlePresenceMessage]) - - // Very basic validation - const validateUsername = (username: string) => { - if(username.length < 2) { - return false - } - return true - } - - const handleUsernameInputChange = (e: ChangeEvent) => { - setUsername(e.target.value) - } - - const handleFormSubmit = (e: FormEvent) => { - e.preventDefault() - - setIsUsernameValid(validateUsername(username)) - } - - const handleLeaveClick = async (_event: MouseEvent) => { - await channel?.presence.leave() - channel?.presence.unsubscribe() - channel?.unsubscribe() - - // Clear the online users state - // While subscribed to the channel, enter and leave events will update the state - // But once unsubscribed we will not receive events to the state will become stale - setOnlineUsers([]) - - setChannel(null) - setIsUsernameValid(false) - } - - return ( - -

    - Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. -

    -

    - Open this page in another tab to see more users enter and leave the presence channel. -

    - { isUsernameValid === false? -
    -
    - - - -
    -
    - : -
    -
      - {onlineUsers.map((username: string) => { - return
    • - {presenceActionIcon.get('enter')} {username} -
    • - })} -
    - -
    - } -
    - -
    -
    - ) -} diff --git a/pages/pub-sub.tsx b/pages/pub-sub.tsx deleted file mode 100644 index 793d23d..0000000 --- a/pages/pub-sub.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { MouseEventHandler, MouseEvent, useEffect, useState } from 'react' - -import * as Ably from 'ably/promises' -import { configureAbly } from '@ably-labs/react-hooks' - -import Layout from '../components/layout' -import Logger, { LogEntry } from '../components/logger' - -import homeStyles from '../styles/Home.module.css' -import styles from '../styles/PubSub.module.css' - -export default function PubSub() { - - const [logs, setLogs] = useState>([]) - const [channel, setChannel] = useState(null) - const [messageText, setMessageText] = useState('A message') - - useEffect(() => { - const ably: Ably.Types.RealtimePromise = configureAbly({ authUrl: '/api/authentication/token-auth' }) - - ably.connection.on((stateChange: Ably.Types.ConnectionStateChange) => { - console.log(stateChange) - }) - - const _channel = ably.channels.get('status-updates') - _channel.subscribe((message: Ably.Types.Message) => { - setLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) - }) - setChannel(_channel) - - return () => { - _channel.unsubscribe() - } - }, []) // Only run the client - - const publicFromClientHandler: MouseEventHandler = (_event: MouseEvent) => { - if(channel === null) return - - channel.publish('update-from-client', {text: `${messageText} @ ${new Date().toISOString()}`}) - } - - const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { - fetch('/api/pub-sub/publish', { - 'method': 'POST', - 'headers': { - 'content-type': 'application/json', - }, - 'body': JSON.stringify({text: `${messageText} @ ${new Date().toISOString()}`}) - }) - } - - return ( - -

    - Publish messages on channels and subscribe to channels to receive messages. Click the Public from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function. -

    - -
    -

    Publish

    -
    - - setMessageText(e.target.value)} /> -
    -
    - - -
    -
    - -
    -

    Subscribe

    - -
    -
    - ) -} 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/ably-logo-col-horiz-rgb.png b/public/ably-logo-col-horiz-rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..1230a9e7fa778c0f5040dbb3cd965810bf8f221c GIT binary patch literal 19909 zcmXV11z3~s*M7(7E@@g`4|R$gZpi06_b>y0XHPm!O?y zw>NCh{BQgB|8Xa`2mK!1?jLrEZ8kK~IK}v}aK}VqEVU!8^lKHDf%~E6qUT_I7!+nU z$pJ&2Q6ZPA#HCCK-3&+r2R$dPo~JV~sgLT!%_=0Bb3M&@Rv2I|JYp8;yU^dfZf^v> z_WpFQW>X#(VE@Ewc9ryj5_PPZ3TXKg1&bUfBEdq%SX`785 zuk;y?Cho;+gye}%ocHY*D0`Sk&F-zxMAQE@Hwg0rC_${(;L}_$2Ey4^@)+|kAR=!S z*(Sochv5=f{|z9(%F%dlcMomme6Wey&2(bLMFhFzQ@*WRJyIpNchmUEEq1yjBf3eyeglTrfg(@sH zu8d*<;VwX48&yVVzSlo6H}TRPkdZ7*_}>^8^_dXsE3d?hLM;s|LsqMlKlIl&f5Z|b z?Xls#s+Cu%Lu@J>C3&80=y^2XnSJzr!ogl4&b&+N(%oZ zT-6H5yO}aw6V>m_KD8Mgb(JY0`IADZIfHs6XW04JMf~1WTi#{ zqbB{j-lhoCn$LcJAEC^Pa*ed2NSDJ<pO%Z*D*|NRnC{qv|^Z|NTShcXNWQ+?|WC zFO)nksEbRttE1*m10f!Lcoj?!Q1_Q4mzwcbAijk0<0y|2OI~tkCTE64S^9q>AV&)J zq)v~=O7*00EfS%uSo*e0ZPJNb=ef$g z&H3(jRy65lZ6Vb7pK{uUi-Z6=7<}WnA$fC;NDO+Rm)F!FzjhK$K=^dAaiR>9FYDvU z2tOSgQ_5HMIQg=~brr1eQa8duh;pCYEn;q+WZTe*^2yEYs#kAR#6vv~qD~48nSpX> z_Y}+D6TR?SoCmOc>Z|UbtApH+7bMd@4W=_R^je7CQY;VwXs&(S0c)cOnI2a@2l=!VPB$bPOnIvSnGr^{%GfHfJZA7yqXAn~xF!T>lke4LW>2 zI^}c0e*dCp`tndzWmV$?DbO^6h%8dUB~Efpw(2HgM!ZpjwrVX5{0O~A=o4aM){jzp z|5SZg7zfCq8;dtm9<{fI3Dl4+x13AA+O_?`4&!P#3WW3avM#q?AIjzcb&sp3;S2dj zMYXz#Olm~L;J|yDv~zV-o>ihm_il{QM1`IZq5tXr__?O^0^&783*-)bS7Kt)O7sUG ze=r-0#L5&O>?*~{rG>nVzN_#E^hF(rt^;`~D-@BK2nxXdjmEoB2%s*+^>`^bPOq#h zic-*wqL5tCl$C{TyBv_0mxY_izB1RQ)L|on)9Y?3oE7 z;zsP0tN?-X@V+tLS7FJoZTKOtC;{Px{*QRTSF`Fb^qKgX274=@{ z$M;rcjqO3O8bDw#Ta-uW{OE{BL7H!9@-*fSQ+vX3%ofb#-xIGU=Oagyi*v5+@c(?H zI+*dPGYTX=-pO{Y-AnF*Bq4MX1L8D*V4c~0-aMPa7t~3Sg>?l~x<>zR!^$SkgfLay z)->ol2jhOaK^OeB2;&UlH>j8i-fZ_7bb#fWcm4X0Va%786pj@vRtA>~l02THeCH>H z&WJ_Eee2McYJeai!CbfOS|Iu1`1wox{MqOT;fnUmZ)xoU+$rTO{-;YL?0gxdPc1X` zjRGPpQ?lNTj1Lt_T+6y4e0HpprYb9IRBR{-z zyB&DPqGX=h`B%OJ%}C2I^oAhj?kX^xjHSCriNYU!`+P+AoxsG8r%yG%fe8%ThKm7o z>lbY}rvE$HG#hny1K>>x(WXd+EJqt42&K=UQT%w&!v_(<{A5wo<9&}hZB_lrBar&8 z4)4uMMlf0b!yDOm#$dfNZCECe1X;Y#rnX&c$uvJp&@Ifto8C`U-|D5aOOcN{NDZ~{ zCVdpjNEW{kOM(FP9vJm5*%__SgNV1k=s0ivYpRw-a|0NJ!`;E#LXBJv4*G1|{72lh zL*id8sGa-|XUfV{aZATxr@pGXw$5};*fSyad}P3$?pmaL)0t(dqwOv5dRJBJ6X9}t zZXW1=Qxbib0+I~fd?oH*^>{PeXN~FTno`tW>o2{KAN`u8=nkNy42`k}Lr`9-cdZC` z=n!8E(jpDEe1q)RN&g80gXUjgFw5z})I-H4cF9;V^C+F7NW*|&(bbj7X+SIXyvl*? zTIBSU5EJ6>_P#as(nItSETFw?9u#QWs@(x9FLea{*ASCtH&Ef;ozoJi&2L8;CNFTr znuZ*V96*sHyr@TwGU#5+$-9Rqo~2ojDSDDZ!rUdE2z4HV64({Kg13B&Yl$EJ1BE97 zNnn^ubBnku>uI!@7t>>SsgV9akMED)2_4@N{SRll&(>y3mp@h2f?>KW%dIb4+-W~C zLyp0V19O8g2qTQ#^>XRonvRI>I1~b$SNYtYHrBMg5yKkLGqU5I(Pg3c#aq;=6W!Z$ zmIz4=Bt{;=S`ETSr1)-~P+B!2Sz#91fYTlP)1~_(Y^DEP1k0gndP?B>*OZ^!l$x?9 z^&02SdphrBr-!-Rc8vl148F(E?60lsAY8}$yA(oEA81ndOsRV)VF!WSB9>wFifA7c zWz>Z~#QgsMFl*ULiV5+2EejLd)v`CcA zTC9bjwM%|}B(|#(SD9v$~ z`zf{IUtt1NtBt5!)PQjv@+~TRNu1d_)JWQQ17mdoEI(PbppA%1dnj80!l21Tzneg8Gecb-L=u<^=e2HOOk}j zkj-*0(o%ZX9L30Q&Y)q4|NmQ3p`{ly!tmtQb)(0+8wuOUMd2}(;&pIh#Ajw6eHo4@ zxH;#5&g0;l?c}~U|Es8J39?dQf1sgsLFFQ@j1tJgYnLD+`ww=ROw@=FVMeOBtYXHu z?goQI1)V9(2-w>=V-dW2b6z{NrLiqjokE7#A5y7Z35pYqx3Fi6 zA|?G_OMr(;*`?v8UrN`Z20dFeGxcnpcie zs92S@glP7gp*sJPbng8J5o9+@sv$Yr2M9TC<;le*Y7iy&*1- z*{1O&Dao5BEDZpE0@-x44|~Ia)Xyn~b5UB^=?rcE_9OP5Wnnp7@1x=^Ii}s8*W62;j@bZ@Fi`UnD>JKiw+4|Dtze`(r-u zYdM3-+F?-n(e)?dYF-?QN{jEfq)F{L*stq9Z46k2w7oS4<3XqL1o6XJq)#TmNLjL{&Irn zIo3TEjY(p00gWuzBKr%OYq0O&FC=>0zj)QyA&nJnOvLM)j^M>TCk7mw&;s-5l`Q12oh!b?r(aZ2YBms>u~PgMLhnqE~}N zNC4%`PbP4KR%i%AI|$i|85WaROlenMWz@jgCb1e5Mdjfv&&V195~Uw}-3!$K)v-g% z`ZEeG0}$aa8Lde*g2~*IM0OS?$SL9Cgl}}v|0{c9F!0}E;BQ*9IOtUUZv6ooiDvsw z{cf2u9x^!9&WWu_7QL1dxYtC}6-Er{ArK-q^vAPhwQYI1Ds%slre%u3|J<46f=hCk z5$noA{n6LiKh533E4pk;B0E$YLapQ58-8y$c)pvUmPQK7mWT@Q;)00cegnjxVV+sU zie<`=iGPtXao#+)xG_&50|N)$KP+<{F>rIW~_;D-m+ zk8$KDzGRz>$6|(+Q3GEg^e<`Px3r9+kjjd+dv#^}n|RKKDvrgHgH?ix3VmJ;RMic| z^q-xmcEv)^Fstm2wQt!^9gJ~y+naY9G2(k%!#7uGrAr9o;*F2d3j}kF8y|-b!kw!& zphDMKL2>dK@zrN|Zep+VB+d%ERe@kk$;|R<#6{5vB~Y>H_)fXX+~$MxtF*9HyxFEd zC#J!%1r*h$JKn(RGf=d#m4a0kc&Oe>6K=0N6I@`ygdcBE@-yvDd;DQ*E|_5ayzx_` z&O&MB;(%(xhNK^ZoZF!4`+Ed21wZgn&8%FeF?9ak{jl#-TWbS_UqhCpYAjV3&US_z z_u38;Q>98un1j@O{{VSogd7jYqCCD7@WR2K1`8BKaKWZGgfD;2#Tp%n;ENnfwD%wE zJ)W>)E34=kN%oM54a)C!*r@=+wxlr}ZMV`IRS#xZLxdf0EzWxkOe?os;iC4*?33Nl zY4&z5rQ8;Z<7k~+OF_~*JA(cZO(N8;T;i|)IMIrNXFtmSW4~NwxsNdtRWva%VLLNN#sd6Cx)gtBTnkQx zTDx+j^6ec>WB(jKpICarilgXFY?xoz{Q!o+KbLUBwH;KzceAm|OV8=Qk@O&nj9xv1 zR|cxyEaC-lY~AC1N}di}mYCJK#cg^%bJJ&B#7%A)-VR;ETrbzEV{qeINq;0UT{J?( zI+IG*?Jr_~%#t0+2?_KS%HUnxpw~lEQD(R62a|+ReFij#8?iob9z!e|UErijwT_MwqhSkw?ElNxJb>(xV)!o?S6$-JJ#om{S^Q#h zrf)x}dZ;zH*K>4({AsCrkBXa24WQ+uWU|CtEBXURC`wjcRMiW%AW&bD&h#Ki^Ua#o z<)h_Mdj>{)@JbCs-)s>hF~Z{Ox9fW+KMa!Ripx@ci~Neu&uMSznp{V<1D3HnV;tiD zwDoo-l?J2#y{-_~f_zZQ`RS;bW2b{Ai1fw|%{E8-zQ{2Z6Zymt$a6z29y zTv4!-0iMvAElf^>pI16ih9#(qx z`A|0v1H;`3k0R`;jI?8PHW@m7XLtHndSdC@&lyf2*Ro6LRs3PIyq)x$H6oWgFia(P zTu?6hg6)JzWKZ+bnj7M=DCFd^Qnn2e;1?xBG6R$Dad&?vfcS|8xIZZtEJRdL6Z7Ng zkPVt1J3CRPGdAbNFNcgSFrx*B{GtWrUNoVPerJhe%{)7K7>4=#9uSUFeR=vptNb4P zRtgR7AjE+UFgs!{&;KHTtN$0x$P(WXe^e#}#wv^(a3k^%U94rvq~rhD`Qn9&M2znTso)Q}Ew39|hmnhJm780JeVh*Y|VP;NlH4yI;* zC}LKGTa6xOLz@t%;R;WT_(Hj+3HI=7t3drjsb=Jk($4OvtJL>$x0azQTQ{C4#hXiB z#%oQnhRM!^;bka<|KMn*ljj>F@w{2xjc>kEc7Tj^N*5dfvF-Rw*$rANhudv)0B!0> z3`hDJOtq_h5KAxzYi%Ez8T7Jc1P_M<;XN6XGK?OKO-#M%;*uF5mt7Ng&qpOrC-U2C zyRgDax#RMb{am@l>h`##$1sS({;m0N=V1TZMnpPi(9ct6xWUUEP0N5fg-3FOk#xEAJwY0 z`V{-z!cf)#jbog^V!qs5!I9uDddhDRPm@6>rr=E%B~On9pl}$c z*gXo8%ROrai$t`zrPQ{bBAjQRMK`PJ^6EvoD~VvPGQY8;>+f3(2V81f5E^^3If7G) z2?8i&E~^jGsDt(OfVp7%j5!*)X5!o^8gSlB_zO7^E$68I%FE;SW2@&lF55_K|F)>} z54`7F0NMjrEVR@_uIK|5UvHv_PkI@*Ak-pv@RVaQa*pr;Fte z)Fg@UwF`=$nb(Z$M~Hh`_#d}DGRyE`D2RF zx|@V7bMdO2AXupUjIuWHvleKu3O=WYtBUS5#73nf90=l~C=oE<0-HI+Xblx|QLh?I z0CMAPAiI4%pipe9_aXquj7{TGc>ncTiO1VD*b4fjMEiPc#bfMA?m`u`Ic(UmdmCB~ zonjgr3%r(?)aDijGj&u|U24PUh={%l#CB>`HSSCd{uxHmJdsJ&CoknN6QL1ym|)FF z9~Nox`RoI{nBs7aoAntnP9D0ep#WScge%TGFQFmdiSUZU1vp`Rct%?uS96F=J>Vfe z!QK1QqU-<^$|Dq+3nmCMZjAw?w2qr_z%b$`$Xc5*X$hL@E-&sM%Z)kyimiMR{d?tW z0K4*eX>l`I_kO@}!ExbofXAYQ z2V-KRxge?oI9aOPDUid2lMHReQmI;-s<9fyAhjo^u>cG6vDdphk3o8&$F%n}( zJv%bA9__R)C}!03xoDW|u_$_R@?DA`ii8`xZZ$nI_qb)w7PKiXsPyQ195vpCR=WH0 zU_m5u{;3qeiK!Qqe6?;+qZhf$720JDWNK@sJB3i!?1OgG(KwS*-A0BsjX?~p7S4v+ z;?SGcE|TXSDVt{Gm^i(O)_shGilcJ=i++yK+fj1`UgBD-WSZnk7czBrPct_C@&hEA z=oV{KGiAU!-^4us*0N7ocEJY}`j`OrYY{HcVv)*+jFmHuV72*^k{Nr~x2{7~(Q4M^`ghSynZyX?FyUQFNjd{fJ&*!cDPocJI1tZ!Uk82F;&S zS*~Tw`{f%;GzkbYNSFvOJ3#aL6*Mu>zEUBe z@1v%r{qDQ3t#sD7Q8%}~SZr2LCE~Rw2|qB<)Oj0_U*;w5&+=odcxv+|$ZQW9_DIX7 z$%FeUGv&a+#Kt#pY8W)X!Gf9<`ncu(YjIjgbXPdll$`immIe#5yx$GhFZ?Kv8*5V= z2P)lt*#RmW<|xv4uzWi0m1_9{XF>K))pvQ`#e4<ziS-iKeykk1mB-GY@-i-S=4;(8u^qFV-0|h9 zjBdXP_@H5Yh(q|SHR>vhSZ4NG+P2-Q6Q1ZV1Q2J3v3!SD9Xj~zYT!zf=K*M= z{e{1K^>7Goe}mYe$kuBa3JPEZtB)qSqAj9BQDlD)iVRsGY&173^6;xaJO7fFc{(zR zqi|&ZI$={!8B1gO=k~=7cEn8RQ;$O3HJTt8qQbbGXst2xLh;u^7k|EkreQQv4Zpdwt>YwAt?YYJAszG)WamZ>Bj*1_X zNp!U+knju7Rj|)5{{$&1r9bg$CiUR?s!vRRh69Yldns-p{D(AfETP?JalQ1ThAp8Z z?rseTU+69|KK1cec=(eYg0Jp@u)QBK$P=doU!H}M0c|zJ zc@)TxLwHZ#ZYs%d*F88}h&qg%5}>U(gg@o(WT(rl3a;wwz+Z1+$Q%ZyOx_m7;h2tW zfO2PG_V7LTWvU2+7GiscDwXtCp)k#bY#qa?+>2uJ9}Bu+PwzKAFzGkIi&|5<2?#b`Y&Tmi!rSI0dx0FLfNHBFWGwT^WcbQy=wW6G`6dyT;`MX7`&wCZ_ESc_+x%Kd|}vIo~Y zf!3}5uYcv25&+bFW?d@uKGM88(GxS(_=E9pCLnagTkL4yn8QV$^C_!d{Q{`^V?6#; z1Ne3MfKqIlAvs!uTX&ESad`SvGMULwo*b3OO!1I;TeYdPl&R|PUgZ$ zrA^_(i8OAk75`;6e~YvoAt_4(VQ(FdM#|Iie2@o@S>L~*kK#w&33?HQ+&hcY0n%x$gw1--w93oOJx`C zE_IiNr-ta^tJzKGV_gT!r2eNKBO5t{R{p57Jol{y8IoK8~~Gx^n#12M^}No+!>@7#+eqgp36 z4QxwbqW4*LG=J&AAChJzho_Ct91^%YTJ#*Z>9VE79)}OLrzEkWT&YUP zeUq;~3cf2AsJ>z1{d?~b%38Zvems?caO(`md)xneJ~WqHnAj&MDy_?szraJp2Vp8s zQ3`|H1ni$hiBZ!ZAEDz9s^TPk&jYnfa2e)La*JBT{zZo&5Ed-b&i)DC3bi@g&k5>x zMJ4_p42fSRVKgVXzTfm#e$!j+(A84D;WMJA(pE%+Q^J5a<~=_=zqLp7Sw7Uwov;eP@8RQ{b%<*f4cj>ro+b9EEWe2ES6&u{a1H-tVDe zGvJJ%BZj_ZUI|+gijqa=mNNg;`l1(eW3viIf17sC$xNti8U7nfT|tzv67R1K5unJ~ z(83l+V5_NjdgKjZ} zx3my?j7&V??er{=N>zBi%%3Z#<&1qpo?1amoSk8@HEK~D9+CX2S>6}W(3f~zNmR&+ zp}#K4*lD2iFT*Td^zsvin7b^NOV@*#nH$+U^mNBSp4xEPzil?%J;`uapfLXZj+Ig# zN2jHNRb%5h(T>N33xVr;%V0XRg+Tq%H2JFSn@n;)0_~ikJP5`-SJfcU&0d2Y<5ydu z-}dgXDnA7jr8^%;w5tC;^8Hc^C{H;r8>x0X?Hzi4eWPbIChZGg)U#{gaNZytHU_CK z#DE*ci-Fc73%U_I;MADNKg&0`W`D?vn^7xW8YIBvLfW%66fc+Wq{NE5uQ#G3cbV1l z>ru~MVxve3sn-|~^CZpaBT=jdYx9+%o{lYRzcIQpC z(qb!9=w|D8p+Dih=~ea-*kNBA1Vd-EH4rC#7)U+ANmtz+TdjAqR7RZ;*WebqKo^`3 z1x`+k=q3a0f|)tIW?DF^kzZ}$e1fNzm;d3L161L#{YE>VD8?Ryw#;CfEc{j2a)ql> zxr2$VC9(Q-t`D>1JD<=k=75UGUaARJ)=g6{2j^3vYKg_mlA^9-OTokws9ny9qjcrh zQ4$wKqZT(I{IjxAO0;r+29XU112HBc^Fh9h++>rl{512XYqE=Jsv)^r9Now_DO23q zO~hT?0}O7m!|teC=ug{eUaWR|#n?Q)d^H0kD1<*}yJr2BA9m4oi77Wv>3$$7BE0@b zzxmHuWGP|wrJgS>ssuFYIGumHbjYLLf)Sah0`BQVR4fTOCbOfs!7*O90T#;k`&p;Y zi5VbAfc%f{yZJ0nR8D*n20bqQs=ivBxhKLs>1}U;xhk|Zz-ZOWf^vMy69(qkg1lEZ z^yMWhYZf+4uDrPoI&1eiz=Wo+olQaDaIuY6nhc4yH!Xr=G)pG@qTm+!n?X;`Z6I|v zQyj30=$?$rl!-em+FgARbJgre)hE8$zAE49o>0RN;}6OMZWv5WV%Xf*Ne)C+yjk)W z1B4;KH>)W6C%j<*Z}m269obv-0IgCR;+x~Eb~X-A{x4FL;);_gbyE(1zOw`W-Z+ zWgvM)B=MD)@F02b`v(qCO7N$*li@EUttGxbYyXsgS&cxwNhX0lUTxXMsL#bOrKChw zSff;27B%d)ceB*5dU|((L60ycoPwhg)B8@6Umqmm9I0-sMU4t_8s}to?7^jv+0B%} z;CraPQ+mWQKN(F6y^|PZNu0w?EefKp()0yhlvxhT^0}U|R6M1c$)H7@$$slT2)4wF zqs1)Do9_wSnI@**)_;<^`MJ`twP@uoG4(LGH%{Yo-H0%k2@tyjL&tfv<~o)Ao{-z( z3;L|2BE0xrBrh%c=S}ot>j$7;pGN6ZY$s5+#jg9iE|Jk;u2o;L(k^9?y^KAFU&#*q z`H7FIY-tk=JJB03W0rWzIlLa|v_C7jMSbo@zsxi?uyw0DJv`xR#am)8m)P{)%M!l_ zQA2ga?)PxQA7Ul{(3KPDy$qvfkL)E5Y=-%fNmE|K=E9pM9Zhwfm%Z28t)U_#pCG6- z+fHcN?LI%_m6GpWR%Uq%RR_tHyF^eA~UMYMSkgKmAu#VZiz zSnvS1xEhmL&2X74QN76nsM)wkH}X9x3fdy}p+93LPl~1Vjd*{ zm|MW#5>=n0jlKsFJ&!DVaYm4gW%qssN+Y@|2w_RfxnY~ciBRI#ocj;pJFhbq?2;sE znto&GG_m;2to)X(9*u=?3`f7aqEYK--Tk+tkjvR7TUo^q9G&i8*7CUn0Dl(9?-HoK zI`a|k;PsvBlO3;bhJ|5TC7wBSRj<$XwWCq2!B#wObevy4+t3pp zTWdBDKcvr#A|oKceIUG6Qy{?rO-j`_na&>5cV3dNnHDj&*!(B+#5fHjkBh#ryCdD)X60(N%cH_Yw+A`pTAN_O9R2TjVCY^%cy4+pj+)HfH zq_VUYdd6XSj5l_bjUBX*^3l#8mcdjZITF2*MW7r7?`-j$aHgFSQn=Ms$WMsDhgM!G z&~Rzb1XB+67I~^{OGd1pVWFf4FRGpxtKf@ALu&@RYTA`fWJh|feu_i`3Ey#cqYcStjO422O9IXcfk4DITA0$<4@G^Ob@KJbuC@L7!a7AZZ-{Y< z9o)2A#J2s=7ghTgHlq2GNn|7>a*mL`D?3lvh(C+Ih%zmgot z{^pa2{dTa|;ry8+%hODGxJ@iRLM}1)>ZRE-4{(T#U5SubEuG&2_-?;vCmb6j?CqUT zVudh=6M{kRAt3sSh<(2mRzzAAe0qkm_ZNy9{vfw-MUed2zTPKg++P)Ry~)nwl(^q?H2k2#cz z_0`+ww<){B)3-uK5KZt>9D_NZk-itYO+Kt%^;Qg)EsY7OXnjW}EZ>nn_ zqC{GZ1g< zs*@^SDbFDizh4G*$sB)k*71FSMdj79F~6=d_QdNXfVpm0vMh)NX9nwqjyWkT#+82( zx{ghjP%Gk%DfCy_s1`lhXfbf8%uJ7%TA0WZRLxxYNy84xW)Zq$9oxL?Fm4|@r+wUN zJd-~6y8Y?H9aNL>odXW=QU+3UVRkThfkZVe^SK6GA*9K0Qu+h&%Lg;?Nz}rn=S@WV zdCL*4*#NF{0=Gpe6AWZ`i#c&cUJ-fbM=J_!jqB&U@6kLJ9tl2ezQBB#q1BT#4_TN# zQ>(oGnl*e@+7&zj8K?@p0?B{&XirqY&D|jAS@!O&;(o|M*HU_Feo8(x#AW%cf4fi+ zZ?`oZ-Y}7MHK$*&_}lM^kNOBx+8VdaMsS^o0y+1`<41=zfJ4mC#i+TIK?_9`c$x--tr>&(F6E3sO@CFbw zX3r$Ox%0DbDeL^fY@Jdw_7Qe!Jq0b;`chl4A@^K6O^l?(B_#pU8%o*TgHl z8QZG8SK@iWj0HudOEojMa)Zf=c{YOxgXk9M?gSbM5!CKBY@Id#s2FXHQt#uJzEp!g z9k-;cUT)=w6C}UK(<`Zj{l2#0T3tbh(YoSmK=?fNq#-hRB1y^{RVS5>jOcBRuP#4ziOaBGT|6y-D)9R##8+dDa! zY~ga7i!vZ!0&F__?GEax#L%A^~8 zy469p$=QswFDb5i`kV2J@u!1de!c!Jp#74iu`Ufxde&cUXx6=3U5I&flOCk5o6k9Q zhbbT!!Tq-lZ}zq1exQ?6HM1~@%2|b}jUqeA^utR{CP@)pV=KbJ3v7!x_N*=aJo;gX zbt(%EG#hvz`)aqu+-QA9s1#W zSup|+TqE^m3PxrYu-G3;=<6*W{<-V-v=m2Q7d}P#o8`Y@uL9>FxHu$cKZ47cD?&+O z?NwXohw6lY0Kxi$`D0V8^Ga*+!ePswA0KO9R?Ms)>9XD0{|lE_SP(rvjg4yin*U7l zmbe2nY6wkn^^^B(ks1ZP3_-%P`S#Tl4=-M-Fhee8?*LFslS_ALoIUNXqoZKijX z`tGc&mt{mP|13O4p({rJP-V>EX!Bv|CSFTGEmY`gWBtrm@ti`0%UYIKD;wWxIE>kv zQ87#CdukPkcm^Rrm6-h84qD{@Zd9h0)bJL{gaMT6Gerz-1SU@hkjwgMG7ZbHRcm^PD%B|`U4?-77~jC-^cKKQA}EM&F9*Wa2PJDww|8IV9I=Em@`dqgzBOk{jo&D>J+bC2l`3|Os#BO z(nm1TEtfxy9MH*>C1jGJ3Ip@Wd+!~=)opm4yW#q3yiC9z3V$829!;{@?hf2(y2{Ye zmbin!UDZ4YrBt#)>4%7uE7Mi!8a(=U4CL+H1?x|zl5DVWA|1@Hnfk{wo2xUGd{?D< z;TQNN0>jvRzdBd{ry1?lb41n*Hyhs4%~4dDC9B{1RVLZL^?M6?{85J>_PRXxW8KyQ zLx$pHI;W0S_Kz3Asf77a;WRP1hWI({$X?42X(d7pt;)E%0 z4o{!8{3zfJ4dY*~I52n+VS-)L{KI*#>H5%87B2J|osV6gm)_nBtAL)kfF-@OiN3xNpVyv)^P7=)Q>i>k9CMOxr6#bH!*7p($^ms~vqF*?d!uCTZg^ZlND zfzkucM*ymaHip)c40q1R7?K<8Klw1A_{pFzRSh8SDI_h| z50p$K)GN4M={oT)j;5=GD1B$%kyhg@h6-0sQ*Q}RaiFBg0I&D&mquO7S?nX{3IbmS zbnm0%RAe47GQ71H*MS*lF#9B%j64qQx7&`fv7EL>J-dmq2K;VnFg$KweR*J%Soot^ z;AolcAoepgm1M=ow?3*k@dcbji1UIL3Cg@3C(LyiV zwAE+)u2xb?uswE~1RU@Jj`9;!zRxe^C_Ajrha%F~9(R?0`VTQz$I|?XF<@v*CoK#L zW@!KhGPYp?d^Bf}oCh%57sCSp^%QvjW67?e+hD+rr-|3bl&5c&>oHROkv8VgSZ{%8 zsD#n&xE5t;uQD(n{jUA-^%#Mm<9$iO;s=B|AJ0<`wEj`AnZ@_Mo&~Wy26uvdn9xR( zPA$+Af|zrez{~5AsxxzmBv;70bE~-H>t|i1G$W-P5yG6Q9}&B~fPrndir7c#+u$9G zP8@C}ljQL>e^xqT#{tmY#(TTE&;5-`T?3+HWW9K;ul_*;C8LNgboQssv0@**H$RX^ zi@N^wFo|9#_VsLQcDMM*MlWHLq3_d3D2%KVPl%j#e}iB|5NSli*Cv;1(Ng^)^5=He z7ZUO506|AymFt9^xIcI!^x%GjtDcwQU`tc%G@7Gmj7W{+hbtMsJkl-_lKj;!6Ea0C z$BOm{xn_AXmTY&AM?d@xIa_A~95?KD0FG0-CRL(iLM&>f#(n?um0j}lJPMje)fK-7 z|3Vi3i?P5y@j z{?(Q_X)8x!i2gXZQxt&Tc5x&;$6YUT?f#yqsrwk=i;0l`6dW&1lu83ljQ_iQf;=Xo zniMQponm4&L)io={M8ICeVdI5lV`>uu?i(@4-Ow!a zqrx|eGN3I>jQHdhcV%C=4xrMJDM_|1%cBEC`+eIB)Z^WXtuD!JqN9AE<$3uCU1}B=S)7lP4wnp z&K}M|X-~YY#KcMolDIDDuCs4^p4$@)Wo;*c!8O+})#n(78qhMZN6xXGATNjI3N!0f zI$nie11v)y%;2Ua4DS8ehfs3YoyG%$pVI0Ze!_293}TQBF}a-$&s8o+e5m2%o6|x7 zy8Z$tV{Gh&vwgz+Irm5Lv%Hy~7yB2nNvr9(E!|(&PQ@tpE#P5vqyjn}8(8A?qC)?i%+BdR0yk;G$j^(qET^1HwJY;))R3Q4=b+~Wi%O7D6$BqRlBazVcL~-QF zw@$v-zOQRrot#q{gODd(Z2^Dy@O4ru$8{NK1YmW;T1@(djwJu%e?bqhv zCNbyuEhg9fkG=vo|h z&uoJqx3za{{alqS4QY!u3;eajGj{4*4ZgKV^2?X3esslGF6hs#f3xG=(em_2XcX#V zCW<9I$2v@$Tv!Cy=NJfEe6J7tbqmm0j4OOwZK2{6&uO7KFOkkU?bcRL-BPr!lN#Lp zNxq!pCfauvUnQd-;gdgEcQtOoD`719SGd!*t!K0@4takdk@4m{B~21I4rmGNO6{TU zaEa)=hhY+|JIsxee8pN+Jk#?LyCKo))y0BSvpWhrCkj67ryj_DZ#5fzrXj=BFpyQ+ zeVx)y6tq*dbUhbP&{6#{LV4j!e_~B^k~xr?%vP%QL_bw@8_kLr@0Qlc)8O)}8E<*Q z9{luR@_!Km5o$$aGI~*0KvL)+kL#Y_G0d*@e+69`G@Bu#I9X|&SlS~X z3XDjtIZL@%{Shy}kRrZL#>G{02^M=zXrIlA!hXr(9rS1k>I+np=Iz!mJ5rYn@~Dk` z?C}92USai0@-#lcfiNu8$F>0J&gstBGOQTec6%loGgrrT$7MiE2aK5}|vcmLJW zv5`8AqeQd%@N<-IVu6T%;6bj>5`V=X6=yzN?V896l7RK%U&3vlV{h|MIP<|VGgb3M z6MrA(sTN%USkhqw~IFt-jSb{X9qV);VdQKfOt(9U>bh70!$vEG3@ z;>fVEd|t(`MM+=2LpW};_%vGmEC!k?Ml@%7oH!Gypkm~xev=OzY>JDs@=<=fvX+TE zX~|>{%>S#T*+3fHbD8$Mor}xzOz}584cH9x1S0m6@++u|N`4+CDScH!C|%7#p;W4X z8D=f3_}TnvS=_mfRUSK?Ka4i*y@*MCb&8OyZhD@N_lwJ5Vv8{{x)UhbD73jC>C6LM zW;}}*p$tL4ks~?-XNc}m-R_Li=Cqo`(rk~|$tspXK4CKOII8cTyT18}Ad0NE7T+%XCWi#9` z)|&+3H3!}nwVrpwRb}2;l5ZHk$StjFLMskc%+giQ@5p&?Q&t>VpXJs61xpOH^9?i` zu&s^e8~Pp%Llo^Vt!D#bo?k}tvKwF!2ts5G0Hm1EkEDoVUpxOgRQL|9!l4_Y;3IQi z(4~@+6o8#^V--Mh?;&~vej7-(VYXvoTLc#r6y!lwjn*M2<}ChWppE{kQ;#Dx&XH0h zT1H+bwy~H*1h^;<-~R9d90In)uU^^Ihq(qZnvY~cb1)+ETab59(#9{MTOq{=HJ-0z z19+e7_z(YLrUUu31=QEq9-iLPmtiB=OIsF5)QH?=lc3l;!0JJS>&IHVNqq&znE=Bu z+{79VMTObsK*kG4>?I|EAdcyMJ@LIU5UdZ4yMR)8vmmjK$rRS%p464PGbp@`%A>c+FT)nT)rupFDAh6|+hCdOA z@wr=kpfAD2Wi|c=rWRha0s3AUp&dv40KN<`M);BmaQS@_1NAt8U?R{9VoXZ31k4nK z_rgtDQMc$2rGlCT*mW#`*Me}eC#?>M-=FZ^5jQ_9N4ecP{kLbXKtVx4K?7BF&a{v2 zLngFA{KwFbZA}4(?tRpt+8anR0KClpjtiYoa2x-(51-q=*)|=*RYUo|E<<|=*4yW5 zIc`)F-amx-nAWxfjuR7XDcnQR{-UbFItBj1 zMuQ%We(W2-PK0+3yknQ9285G9*L6zZaHWE^GW{5S5%ve+Oazw7fJ9>|O1}%iAtYY+ zL?8DTP*6}%&_qpHgM&7R{}>8?_oJKoS$PqNAN)S_4ukn%N}q<(Dv;A?ZOub>q@Mc$ z>3hGlsVAo6;L9XPoR*2c3u(O;8KHnV}jo!eY9CdJ)f`Wp@hZ%GZa||HmFsEUE4}!J0`1VH+ zbOfZG0J`g!Q-}f+9Tmz{fU~eN;&Rx2R?{Do@2AV(ystMO1ThxxPaLU*1n+pmp(OH? z2j+cHYzG{Hg5TZ@U3wk=;G=~r@yi8UDmeVYXg3C)KF7pZvk`aK(=!9&UMOA$ylr$G zAW0{PhC;x72F{yrBPrN?<~jbekGG7*1f-*gFwS0~Q?EjdYnuPk-v#wb z5ck<@j&6j(RL}=O7?_j|PFm-e*Z%ty*To@;0e%D{ZJ-Y*6{KG|yROgUo%Flmzc|8Y zwa1IXK>vNkAyoAxeE3+Xev z2e1b?7(NE3&r>!4Vnqq z(!bxZ&Qr|Du%M4(iU4G3AOh#yc^P*djI2zWK9GVv6*L2v%xH!O=>qVd`WC@SI;bHA z1poe!EZ+j9oz!Cd3knLJf!uxn+a&&D;ImfJ_g>x9dHF$7GB+Oe`>Br9>aQ+L>iVZy zgX#%^n?MVjez2@DddN5;_rPlfP!Pg4lN9%@1eQ`QlBX! z{ISR%CNTj1fD=jt-H3#K_+ifk@hF8vH?W4W!I&%y0O~%ZLj{K~q+P`2hn7j8t9ERG zf`WpA=U_#heW)KDhwfGKJj`?0--Ce9+kh^8s}HKauea>Sg~A~SP5^A+?|gVS-PZ^x zR^Qg^_##Hi7a;B0_so+BPjg}95fgm^A3eT!qAB6;;qMofe=cZ8U{hb?O>pU&^I1w$IZSzD&~iPF?e@)IgH zSPTe>P!qk^5VmC((cb@Sq~QIrl)y@L1NaM)Q2+M#u0GBU9ra%>#=oGT;IOF7(DOOb zGVvedxefqBI{^bw^lMH`C+g`f(w4tE-+xU%(BA=5+6Cc3j)@^pXHXn$oRvU@k>n>~ zWP%m}_#JfgsB^sg7fXrXbb!Op@9FDoJX!Aq_&h#W1=##OrDc9$V4$D}Krs@bypIj% zLFfaV7NqZW0dI!$`6F|m>1I4Z*7@mtTfKJyfBf-nC@3f>I5bRiy2Tpy_aGeF0WiS- zT}RY)bx}W*|JNu0q#cg_ZHeFae(8>W#NUojZxPT3jXyz>x#x$x+)_??Eca0B?*)Ic zY|w9w*YWp%e*LJU4;CB^wp8$gr|0#3*mA}h!1oHkq>Er^41~TMkfNi;4uZLf3Suds zbQIjN(K-go-*;u40N6=N1@~9XdF;CHf^|5q<3Ii6B0g$YzOA63p#8|*_rHzeKL)}v zVO9Nv15+_z(ga~d!8ni)hSI*|eFAGBCMIH3sbe4$0kKRl?vrja1lYT*4S!Mj<8; z&^mmH*e{L^z#0H9`QtGHSPN214S_5R3>pL8kGJ#M04o^S*4vpXaH2f)BY{3hC_zw=8*9ezh2F7|ULVWlVa5I~GI+L6|e zx&WLY@|#ra52mxy{#AV*LnxRFY?T1Pef{$qG!6S$y+7{+kn{?exV$kRoQI^(z) z^gRIyVIdR55WB~PRZWNGHs1T_Vln>ng-HomU4W^}kMzA8qL)Q}lJ<{xSauMUcOFu4 zXZRk(o)960pqu z*|4I{-X@dE&IC8?Z#%_*jHx&P2DXD>H8LfEZ@PE#4nR=!PcZ&t2N5X&Q`+@AA8tWG zXP}coJ*ZFL(z6>W^)Chm3SIv^9aPJ1fxgs}SoDWmu(ChET__G{(Gg1&uvpzrBs7%!lf8h{D<09*DaU+eFH z$@PD_zXJsY1qB6JFm(sOz_9`KeK56^2@4Q6fu=*?v;*$~smlkAFj&wX(D~KZp|0-P zlt7vafHWQ8wIiYAkM2S}x>2J3f`WpAyqJjtz!+l#>_S=FAG`zee+%FK@H!MM44f{2 z-qx(nTA=^!3XpaF%nUpMs{TIy{OL9n6ciK`WXDV$00X-G>YIRSI|u}maz9G~JOML= zZ^`#BENn^ud`f^j0VK`&6eIwh? zzvOzC1U4m5`xe4AJ<<-rZ{fe+E9HF!1qB7m0K*2@frSc|62=LjZ@+Mjdc7VL6ciK` b%nbh#DC + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/ably-logo-col-inv-horiz-rgb.svg b/public/ably-logo-col-inv-horiz-rgb.svg new file mode 100644 index 0000000..bc86d63 --- /dev/null +++ b/public/ably-logo-col-inv-horiz-rgb.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/ably-motif-col-rgb.svg b/public/ably-motif-col-rgb.svg new file mode 100644 index 0000000..1227070 --- /dev/null +++ b/public/ably-motif-col-rgb.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/Authentication.module.css b/styles-old/Authentication.module.css similarity index 100% rename from styles/Authentication.module.css rename to styles-old/Authentication.module.css diff --git a/styles/Home.module.css b/styles-old/Home.module.css similarity index 100% rename from styles/Home.module.css rename to styles-old/Home.module.css diff --git a/styles/Layout.module.css b/styles-old/Layout.module.css similarity index 100% rename from styles/Layout.module.css rename to styles-old/Layout.module.css diff --git a/styles/Presence.module.css b/styles-old/Presence.module.css similarity index 100% rename from styles/Presence.module.css rename to styles-old/Presence.module.css diff --git a/styles/PubSub.module.css b/styles-old/PubSub.module.css similarity index 100% rename from styles/PubSub.module.css rename to styles-old/PubSub.module.css diff --git a/styles/globals.css b/styles-old/globals.css similarity index 100% rename from styles/globals.css rename to styles-old/globals.css diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..d6afd58 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,18 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./node_modules/flowbite-react/**/*.js", + + "./app/**/*.{js,ts,jsx,tsx,mdx}", + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + + // Or if using `src` directory: + "./src/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: {}, + }, + plugins: [require("flowbite/plugin")], +} + diff --git a/tsconfig.json b/tsconfig.json index 99710e8..fecd564 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -13,8 +17,20 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" +, "components/layout.tsx", "pages/pub-sub.old", "pages/index.old" ], + "exclude": [ + "node_modules" + ] } From e44e62a99c4351e5737ab8c658d0783d67a77b56 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Mon, 21 Aug 2023 21:24:11 -0400 Subject: [PATCH 02/21] Peesence example work --- app/presence/page.tsx | 139 +++++++++++++++++++++++++----------------- components/navbar.tsx | 2 +- 2 files changed, 83 insertions(+), 58 deletions(-) diff --git a/app/presence/page.tsx b/app/presence/page.tsx index 52da334..3d03c6a 100644 --- a/app/presence/page.tsx +++ b/app/presence/page.tsx @@ -1,9 +1,9 @@ 'use client' import * as Ably from 'ably'; -import { AblyProvider, useChannel, usePresence } from "@ably-labs/react-hooks" +import { AblyProvider, useAbly, useChannel, usePresence } from "@ably-labs/react-hooks" import Logger, { LogEntry } from '../../components/logger'; -import { MouseEvent, useState, FormEvent, ChangeEvent, useCallback } from 'react' +import { MouseEvent, useState, FormEvent, ChangeEvent, useCallback, useEffect } from 'react' import NavBar from '../../components/navbar'; @@ -14,7 +14,8 @@ const presenceActionIcon = new Map([ export default function Presence() { const options = { - authUrl:'/api/authentication/token-auth' + authUrl:'/api/authentication/token-auth', + autoConnect: false, } return ( @@ -30,20 +31,31 @@ function PresenceMessages() { const [isUsernameValid, setIsUsernameValid] = useState(false) const [onlineUsers, setOnlineUsers] = useState([]) - const handlePresenceMessage = useCallback((message: Ably.Types.PresenceMessage) => { - console.log('handlePresenceMessage', message.action, message.clientId, new Date()); - - if(message.action === 'enter' || message.action === 'present') { - setOnlineUsers(prev => { - if(prev.includes(message.clientId) === false) { - return [...prev, message.clientId] - } - else { - return prev - } - }) - } - else { // user has left + const client = useAbly(); + + useEffect(() =>{ + if (isUsernameValid === false) return; + client.auth.authorize( + { clientId: username }, + { authUrl:'/api/authentication/token-auth', authMethod: 'POST'} + ); + }); + + //this should only happen once we have a valid user name + const { presenceData, updateStatus } = usePresence("room", {'status':'available'}, (message) => { + console.log(message); + + if(message.action === 'enter' || message.action === 'present') { + setOnlineUsers(prev => { + if(prev.includes(message.clientId) === false) { + return [...prev, message.clientId] + } + else { + return prev + } + }) + } + else { setOnlineUsers(prev => prev.filter(username => { const keep: boolean = username !== message.clientId return keep @@ -51,11 +63,15 @@ function PresenceMessages() { } setLogs(prev => [...prev, new LogEntry(`action: ${message.action} clientId: ${message.clientId}`)]) - }, []) - - const { updateStatus } = usePresence("room", (presenceUpdate:Ably.Types.PresenceMessage) => { - console.log(presenceUpdate); }); + + + // const presentClients = presenceData.map((msg, index) => ( + //
  • + // {msg.clientId}: {JSON.stringify(msg.data)} + //
  • + // )); + // useEffect(() => { // // The first requirement is to have a valid username @@ -114,43 +130,52 @@ function PresenceMessages() { } return ( -
    + +
    +
    -

    - Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. -

    -

    - Open this page in another tab to see more users enter and leave the presence channel. -

    - { isUsernameValid === false? -
    -
    - - - -
    -
    - : -
    -
      - {onlineUsers.map((username: string) => { - return
    • - {presenceActionIcon.get('enter')} {username} -
    • - })} -
    - -
    - } -
    - -
    +
    +
    +
    +

    + Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. Open this page in another tab to see more users enter and leave the presence channel. +

    + + { isUsernameValid === false? +
    +
    + + + +
    +
    + : +
    +
      + {onlineUsers.map((username: string) => { + return
    • + {presenceActionIcon.get('enter')} {username} +
    • + })} +
    + +
    + } +
    + +
    +
    +
    +
    + + ) } diff --git a/components/navbar.tsx b/components/navbar.tsx index 25962fa..608f880 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -20,7 +20,7 @@ export default function NavBar() {
    - -

    Ably hearts Next.js

    + +

    Ably ♥s Next.js

    At Ably we are big fans of Next.js. This application demonstrates using some of the Ably fundamentals with Next.js. You can build features and use cases upon these fundamentals such as notifications, activity streams, chat, realtime visualisations and dashboards, and collaborative multiplayer experiences.

    diff --git a/app/presence/page.tsx b/app/presence/page.tsx index be22145..ef6d310 100644 --- a/app/presence/page.tsx +++ b/app/presence/page.tsx @@ -10,11 +10,6 @@ import Logger, { LogEntry } from '../../components/logger'; import NavBar from '../../components/navbar'; export default function Presence() { - const options = { - authUrl:'/api/authentication/token-auth', - autoConnect: false, - } - const [randomName, setRandomName] = useState(''); const [isUsernameValid, setIsUsernameValid] = useState(false) @@ -39,7 +34,7 @@ export default function Presence() { : - + } diff --git a/app/pub-sub/page.tsx b/app/pub-sub/page.tsx index 766a92e..16ccb39 100644 --- a/app/pub-sub/page.tsx +++ b/app/pub-sub/page.tsx @@ -9,10 +9,6 @@ import NavBar from '../../components/navbar'; export default function PubSub() { - const options = { - authUrl:'/api/authentication/token-auth' - } - return (
    @@ -23,7 +19,7 @@ export default function PubSub() {

    Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function.

    - +
    From d47e083b71578429f8dcb67e80af9fb675a5c743 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Thu, 24 Aug 2023 13:54:05 -0400 Subject: [PATCH 06/21] Removed home images --- app/page.tsx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 03a8b95..21e5940 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -25,9 +25,9 @@ export default function Home() {
    - + {/* - + */}

    Token Authentication

    @@ -35,9 +35,9 @@ export default function Home() {
    - + {/* - + */}

    Pub/Sub

    @@ -45,9 +45,9 @@ export default function Home() {
    - + {/* - + */}

    Presence

    @@ -55,9 +55,9 @@ export default function Home() {
    - + {/* - + */}

    History

    @@ -67,14 +67,14 @@ export default function Home() {
    ) From 3f8014626d7d168fa1646a81a060c03dd33b8fa1 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Thu, 24 Aug 2023 14:02:39 -0400 Subject: [PATCH 07/21] Update dependancy to canary. --- package-lock.json | 35 ++++++++++++++++------------------- package.json | 2 +- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19c2e86..406c7bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "ably-nextjs-fundamentals-kit", "version": "0.1.0", "dependencies": { - "@ably-labs/react-hooks": "file:../react-hooks", + "@ably-labs/react-hooks": "^3.0.0-canary.1", "@types/node": "18.11.9", "@types/react": "18.0.25", "@types/react-dom": "18.0.8", @@ -34,6 +34,7 @@ "../react-hooks": { "name": "@ably-labs/react-hooks", "version": "2.1.1", + "extraneous": true, "license": "ISC", "dependencies": { "ably": "^1.2.27" @@ -60,8 +61,16 @@ } }, "node_modules/@ably-labs/react-hooks": { - "resolved": "../react-hooks", - "link": true + "version": "3.0.0-canary.1", + "resolved": "https://registry.npmjs.org/@ably-labs/react-hooks/-/react-hooks-3.0.0-canary.1.tgz", + "integrity": "sha512-ln2XHNwiZof3xU0jZBd1tb4wzsntmbfonqX9M40V2nlNKW7OkzSSW0e2CbAyy8LtsZPEm6vsHZHVgTcdrBxKBg==", + "dependencies": { + "ably": "^1.2.27" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } }, "node_modules/@ably/msgpack-js": { "version": "0.4.0", @@ -4682,23 +4691,11 @@ }, "dependencies": { "@ably-labs/react-hooks": { - "version": "file:../react-hooks", + "version": "3.0.0-canary.1", + "resolved": "https://registry.npmjs.org/@ably-labs/react-hooks/-/react-hooks-3.0.0-canary.1.tgz", + "integrity": "sha512-ln2XHNwiZof3xU0jZBd1tb4wzsntmbfonqX9M40V2nlNKW7OkzSSW0e2CbAyy8LtsZPEm6vsHZHVgTcdrBxKBg==", "requires": { - "@testing-library/react": "^13.3.0", - "@typescript-eslint/eslint-plugin": "^6.1.0", - "@typescript-eslint/parser": "^6.4.0", - "@vitejs/plugin-react": "^1.3.2", - "ably": "^1.2.27", - "eslint": "^8.45.0", - "eslint-plugin-import": "^2.28.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "jsdom": "^20.0.0", - "prettier": "^3.0.0", - "react": ">=18.1.0", - "react-dom": ">=18.1.0", - "typescript": ">=4.4.4", - "vitest": "^0.18.0" + "ably": "^1.2.27" } }, "@ably/msgpack-js": { diff --git a/package.json b/package.json index e17d223..bfaf4b2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@ably-labs/react-hooks": "file:../react-hooks", + "@ably-labs/react-hooks": "^3.0.0-canary.1", "@types/node": "18.11.9", "@types/react": "18.0.25", "@types/react-dom": "18.0.8", From b42091893c500353f39687ae90ee8d07c272dd6e Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 29 Aug 2023 09:04:38 -0400 Subject: [PATCH 08/21] Restructure to use dynamic import --- app/authentication/authentication-client.tsx | 66 ++++++++++++++ app/authentication/page.tsx | 68 +------------- app/history/history-client.tsx | 79 ++++++++++++++++ app/history/page.tsx | 82 +---------------- app/presence/page.tsx | 96 +------------------- app/presence/presence-client.tsx | 93 +++++++++++++++++++ app/pub-sub/page.tsx | 72 +-------------- app/pub-sub/pubsub-client.tsx | 70 ++++++++++++++ pages/_app.old | 7 -- pages/authentication.old | 63 ------------- 10 files changed, 328 insertions(+), 368 deletions(-) create mode 100644 app/authentication/authentication-client.tsx create mode 100644 app/history/history-client.tsx create mode 100644 app/presence/presence-client.tsx create mode 100644 app/pub-sub/pubsub-client.tsx delete mode 100644 pages/_app.old delete mode 100644 pages/authentication.old diff --git a/app/authentication/authentication-client.tsx b/app/authentication/authentication-client.tsx new file mode 100644 index 0000000..f9f9b25 --- /dev/null +++ b/app/authentication/authentication-client.tsx @@ -0,0 +1,66 @@ + +'use client' + +import { MouseEventHandler, MouseEvent, useState, useEffect } from 'react' + +import * as Ably from 'ably/promises' +import Logger, { LogEntry } from '../../components/logger' +import NavBar from '../../components/navbar' +import { AblyProvider, useAbly, useConnectionStateListener } from '@ably-labs/react-hooks' + +export default function Authentication() { + return ( +
    +
    + +
    +
    +
    +

    + Authenticate and establish a persistent bi-direction connection to the Ably platform. +

    + + + +
    +
    +
    + ) +} + +const ConnectionStatus = () => { + + const ably = useAbly(); + + const [logs, setLogs] = useState>([]) + const [connectionState, setConnectionState] = useState('unknown') + + + useConnectionStateListener((stateChange) => { + setConnectionState(stateChange.current) + setLogs(prev => [...prev, new LogEntry(`Connection state change: ${stateChange.previous} -> ${stateChange.current}`)]) + }) + + const connectionToggle: MouseEventHandler = (_event: MouseEvent) => { + if(connectionState === 'connected') { + ably.connection.close() + } + else if(connectionState === 'closed') { + ably.connection.connect() + } + } + + return ( + <> +
    +

    Connection status: {connectionState}

    + +
    + +
    + + +
    + + ) +} \ No newline at end of file diff --git a/app/authentication/page.tsx b/app/authentication/page.tsx index b236885..c5980e5 100644 --- a/app/authentication/page.tsx +++ b/app/authentication/page.tsx @@ -1,65 +1,7 @@ -'use client' +import dynamic from 'next/dynamic'; -import { MouseEventHandler, MouseEvent, useState, useEffect } from 'react' +const AuthenticationClient = dynamic(() => import('./authentication-client'), { + ssr: false, +}) -import * as Ably from 'ably/promises' -import Logger, { LogEntry } from '../../components/logger' -import NavBar from '../../components/navbar' -import { AblyProvider, useAbly, useConnectionStateListener } from '@ably-labs/react-hooks' - -export default function Authentication() { - return ( -
    -
    - -
    -
    -
    -

    - Authenticate and establish a persistent bi-direction connection to the Ably platform. -

    - - - -
    -
    -
    - ) -} - -const ConnectionStatus = () => { - - const ably = useAbly(); - - const [logs, setLogs] = useState>([]) - const [connectionState, setConnectionState] = useState('unknown') - - - useConnectionStateListener((stateChange) => { - setConnectionState(stateChange.current) - setLogs(prev => [...prev, new LogEntry(`Connection state change: ${stateChange.previous} -> ${stateChange.current}`)]) - }) - - const connectionToggle: MouseEventHandler = (_event: MouseEvent) => { - if(connectionState === 'connected') { - ably.connection.close() - } - else if(connectionState === 'closed') { - ably.connection.connect() - } - } - - return ( - <> -
    -

    Connection status: {connectionState}

    - -
    - -
    - - -
    - - ) -} \ No newline at end of file +export default AuthenticationClient; \ No newline at end of file diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx new file mode 100644 index 0000000..9f08ceb --- /dev/null +++ b/app/history/history-client.tsx @@ -0,0 +1,79 @@ +'use client' + +import * as Ably from 'ably'; +import { AblyProvider, useChannel } from "@ably-labs/react-hooks" +import Logger, { LogEntry } from '../../components/logger'; +import { useEffect, useState } from 'react'; +import NavBar from '../../components/navbar'; + +export default function History() { + + return ( +
    +
    + +
    +
    +
    +

    + Retrieve a history of messages that have been published to a channel. Publish messages via the Pub/Sub example Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app. +

    + + + +
    +
    +
    + ) +} + +function HistoryMessages() { + + const [realtimeLogs, setRealtimeLogs] = useState>([]) + const [historicalLogs, setHistoricalLogs] = useState>([]) + + const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { + console.log(message); + setRealtimeLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) + }); + + useEffect(() => { + const getHistory = async () => { + let history: Ably.Types.PaginatedResult = await channel.history() + do { + history.items.forEach(message => { + setHistoricalLogs(prev => [ + ...prev, + new LogEntry(`"${message.data.text}" sent at ${new Date(message.timestamp).toISOString()}`) + ]) + }) + history = await history.next() + } + while(history) + } + getHistory() + }, []) + + return ( +
    +
    +

    History

    + { + historicalLogs.length > 0? + + : +

    No historical messages found

    + } +
    +
    +

    Realtime

    + { + realtimeLogs.length > 0? + + : +

    No realtime messages received yet

    + } +
    +
    + ) +} diff --git a/app/history/page.tsx b/app/history/page.tsx index 9f08ceb..7f5036f 100644 --- a/app/history/page.tsx +++ b/app/history/page.tsx @@ -1,79 +1,7 @@ -'use client' +import dynamic from 'next/dynamic'; -import * as Ably from 'ably'; -import { AblyProvider, useChannel } from "@ably-labs/react-hooks" -import Logger, { LogEntry } from '../../components/logger'; -import { useEffect, useState } from 'react'; -import NavBar from '../../components/navbar'; +const HistoryClient = dynamic(() => import('./history-client'), { + ssr: false, +}) -export default function History() { - - return ( -
    -
    - -
    -
    -
    -

    - Retrieve a history of messages that have been published to a channel. Publish messages via the Pub/Sub example Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app. -

    - - - -
    -
    -
    - ) -} - -function HistoryMessages() { - - const [realtimeLogs, setRealtimeLogs] = useState>([]) - const [historicalLogs, setHistoricalLogs] = useState>([]) - - const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { - console.log(message); - setRealtimeLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) - }); - - useEffect(() => { - const getHistory = async () => { - let history: Ably.Types.PaginatedResult = await channel.history() - do { - history.items.forEach(message => { - setHistoricalLogs(prev => [ - ...prev, - new LogEntry(`"${message.data.text}" sent at ${new Date(message.timestamp).toISOString()}`) - ]) - }) - history = await history.next() - } - while(history) - } - getHistory() - }, []) - - return ( -
    -
    -

    History

    - { - historicalLogs.length > 0? - - : -

    No historical messages found

    - } -
    -
    -

    Realtime

    - { - realtimeLogs.length > 0? - - : -

    No realtime messages received yet

    - } -
    -
    - ) -} +export default HistoryClient; \ No newline at end of file diff --git a/app/presence/page.tsx b/app/presence/page.tsx index ef6d310..f77da73 100644 --- a/app/presence/page.tsx +++ b/app/presence/page.tsx @@ -1,93 +1,7 @@ -'use client' +import dynamic from 'next/dynamic'; -import * as Ably from 'ably'; -import names from 'random-names-generator' +const PresenceClient = dynamic(() => import('./presence-client'), { + ssr: false, +}) -import { AblyProvider, useAbly, usePresence } from "@ably-labs/react-hooks" -import { MouseEvent, useState, useEffect, ReactElement, FC, SetStateAction, Dispatch } from 'react' - -import Logger, { LogEntry } from '../../components/logger'; -import NavBar from '../../components/navbar'; - -export default function Presence() { - const [randomName, setRandomName] = useState(''); - const [isUsernameValid, setIsUsernameValid] = useState(false) - - useEffect(() => { - let name = names.random(); - setRandomName(name) - }, []) - - return ( -
    -
    - -
    -
    -
    -

    - Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. Open this page in another tab to see more users enter and leave the presence channel. -

    -

    Hello {randomName}

    - { isUsernameValid === false? -
    - -
    - : - - - - } -
    -
    -
    - ) -} - -type PresenceMessageProps = { - clientId: string, - stateChanger:Dispatch> -} - -const PresenceMessages: FC = ({ clientId, stateChanger }): ReactElement => { - - const [logs, setLogs] = useState>([]) - const client = useAbly(); - - useEffect(() =>{ - if (clientId === null) return; - client.auth.authorize( - { clientId: clientId }, - { authUrl:'/api/authentication/token-auth', authMethod: 'POST' } - ); - return () => { - console.log(`Unmounting Functional Component`) - } - }, []); - - //this should only happen once we have a valid user name - const { presenceData, updateStatus } = usePresence("room", {'status':'available'}, (member) => { - setLogs(prev => [...prev, new LogEntry(`action: ${member.action} clientId: ${member.clientId}`)]) - return ( -
  • {member.clientId}
  • - ) - }); - - return ( - <> -
    -
      - {presenceData.map((member) => { - //setLogs(prev => [...prev, new LogEntry(`action: ${member.action} clientId: ${member.clientId}`)]) - return (
    • {member.clientId}
    • ) - })} -
    -
    - - -
    - -
    - - ) -} +export default PresenceClient; \ No newline at end of file diff --git a/app/presence/presence-client.tsx b/app/presence/presence-client.tsx new file mode 100644 index 0000000..ef6d310 --- /dev/null +++ b/app/presence/presence-client.tsx @@ -0,0 +1,93 @@ +'use client' + +import * as Ably from 'ably'; +import names from 'random-names-generator' + +import { AblyProvider, useAbly, usePresence } from "@ably-labs/react-hooks" +import { MouseEvent, useState, useEffect, ReactElement, FC, SetStateAction, Dispatch } from 'react' + +import Logger, { LogEntry } from '../../components/logger'; +import NavBar from '../../components/navbar'; + +export default function Presence() { + const [randomName, setRandomName] = useState(''); + const [isUsernameValid, setIsUsernameValid] = useState(false) + + useEffect(() => { + let name = names.random(); + setRandomName(name) + }, []) + + return ( +
    +
    + +
    +
    +
    +

    + Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. Open this page in another tab to see more users enter and leave the presence channel. +

    +

    Hello {randomName}

    + { isUsernameValid === false? +
    + +
    + : + + + + } +
    +
    +
    + ) +} + +type PresenceMessageProps = { + clientId: string, + stateChanger:Dispatch> +} + +const PresenceMessages: FC = ({ clientId, stateChanger }): ReactElement => { + + const [logs, setLogs] = useState>([]) + const client = useAbly(); + + useEffect(() =>{ + if (clientId === null) return; + client.auth.authorize( + { clientId: clientId }, + { authUrl:'/api/authentication/token-auth', authMethod: 'POST' } + ); + return () => { + console.log(`Unmounting Functional Component`) + } + }, []); + + //this should only happen once we have a valid user name + const { presenceData, updateStatus } = usePresence("room", {'status':'available'}, (member) => { + setLogs(prev => [...prev, new LogEntry(`action: ${member.action} clientId: ${member.clientId}`)]) + return ( +
  • {member.clientId}
  • + ) + }); + + return ( + <> +
    +
      + {presenceData.map((member) => { + //setLogs(prev => [...prev, new LogEntry(`action: ${member.action} clientId: ${member.clientId}`)]) + return (
    • {member.clientId}
    • ) + })} +
    +
    + + +
    + +
    + + ) +} diff --git a/app/pub-sub/page.tsx b/app/pub-sub/page.tsx index 16ccb39..ff9c1ba 100644 --- a/app/pub-sub/page.tsx +++ b/app/pub-sub/page.tsx @@ -1,69 +1,7 @@ -'use client' +import dynamic from 'next/dynamic'; -import * as Ably from 'ably'; -import { AblyProvider, useChannel } from "@ably-labs/react-hooks" -import { MouseEventHandler, MouseEvent, useState } from 'react' +const PubSubClient = dynamic(() => import('./pubsub-client'), { + ssr: false, +}) -import Logger, { LogEntry } from '../../components/logger'; -import NavBar from '../../components/navbar'; - -export default function PubSub() { - - return ( -
    -
    - -
    -
    -
    -

    - Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function. -

    - - - -
    -
    -
    - ) -} - -function PubSubMessages() { - - const [logs, setLogs] = useState>([]) - const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { - setLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) - }); - const [messageText, setMessageText] = useState('A message') - - const publicFromClientHandler: MouseEventHandler = (_event: MouseEvent) => { - if(channel === null) return - channel.publish('update-from-client', {text: `${messageText} @ ${new Date().toISOString()}`}) - } - - const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { - fetch('/api/pub-sub/publish', { - 'method': 'POST', - 'headers': { - 'content-type': 'application/json', - }, - 'body': JSON.stringify({text: `${messageText} @ ${new Date().toISOString()}`}) - }) - } - - return ( - <> -
    - Message text: - setMessageText(e.target.value)} /> - - -
    - -
    -

    Message Log

    - -
    - - ) -} +export default PubSubClient; \ No newline at end of file diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx new file mode 100644 index 0000000..3eab2ad --- /dev/null +++ b/app/pub-sub/pubsub-client.tsx @@ -0,0 +1,70 @@ +'use client' + +import * as Ably from 'ably'; +import { AblyProvider, useChannel } from "@ably-labs/react-hooks" +import { MouseEventHandler, MouseEvent, useState } from 'react' + +import Logger, { LogEntry } from '../../components/logger'; +import NavBar from '../../components/navbar'; + +export default function PubSub() { + + return ( +
    +
    + +
    +
    +
    +

    + Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function. +

    + + + +
    +
    +
    + ) +} + +function PubSubMessages() { + + const [logs, setLogs] = useState>([]) + const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { + setLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) + }); + const [messageText, setMessageText] = useState('A message') + + const publicFromClientHandler: MouseEventHandler = (_event: MouseEvent) => { + if(channel === null) return + channel.publish('update-from-client', {text: `${messageText} @ ${new Date().toISOString()}`}) + } + + const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { + fetch('/api/pub-sub/publish', { + 'method': 'POST', + 'headers': { + 'content-type': 'application/json', + }, + 'body': JSON.stringify({text: `${messageText} @ ${new Date().toISOString()}`}) + }) + } + + return ( + <> +
    + Message text: + setMessageText(e.target.value)} /> + + +
    + +
    +

    Message Log

    + +
    + + ) +} + diff --git a/pages/_app.old b/pages/_app.old deleted file mode 100644 index 1b2a4f6..0000000 --- a/pages/_app.old +++ /dev/null @@ -1,7 +0,0 @@ -// import '../styles/globals.css' -// import type { AppProps } from 'next/app' -// import { AblyProvider } from "@ably-labs/react-hooks" - -// export default function App({ Component, pageProps }: AppProps) { -// return -// } diff --git a/pages/authentication.old b/pages/authentication.old deleted file mode 100644 index ae3c10f..0000000 --- a/pages/authentication.old +++ /dev/null @@ -1,63 +0,0 @@ -// import { MouseEventHandler, MouseEvent, useState, useEffect } from 'react' - -// import Layout from '../components/layout' -// import Logger, { LogEntry } from '../components/logger' - -// import * as Ably from 'ably/promises' -// import { assertConfiguration, configureAbly } from '@ably-labs/react-hooks' - -// import styles from '../styles/Home.module.css' -// import authStyles from '../styles/Authentication.module.css' - -// export default function Authentication() { - -// const [logs, setLogs] = useState>([]) -// const [connectionState, setConnectionState] = useState('unknown') - -// useEffect(() => { -// const handleConnectionStateChange = (stateChange: Ably.Types.ConnectionStateChange) => { -// setLogs(prev => [...prev, new LogEntry(`Connection state change: ${stateChange.previous} -> ${stateChange.current}`)]) - -// setConnectionState(stateChange.current) -// } - -// const ably: Ably.Types.RealtimePromise = configureAbly({ authUrl: '/api/authentication/token-auth' }) -// ably.connection.on(handleConnectionStateChange) - -// return () => { -// ably.connection.off() -// } -// }, []) // Only run the client - -// const connectionToggle: MouseEventHandler = (_event: MouseEvent) => { -// const ably = assertConfiguration() - -// if(connectionState === 'connected') { -// ably.connection.close() -// } -// else if(connectionState === 'closed') { -// ably.connection.connect() -// } -// } - -// return ( -// -//

    -// Authenticate and establish a persistent bi-direction connection to the Ably platform. -//

    - -//
    -//

    Connection status: {connectionState}

    - -//
    -// -//
    - -// -//
    -//
    -// ) -// } From b7649446d2ab22ff7399db229cf38e19db5c0aa6 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 29 Aug 2023 09:13:11 -0400 Subject: [PATCH 09/21] Removing old styles --- styles-old/Authentication.module.css | 36 ------------- styles-old/Home.module.css | 75 ---------------------------- styles-old/Layout.module.css | 64 ------------------------ styles-old/Presence.module.css | 3 -- styles-old/PubSub.module.css | 11 ---- styles-old/globals.css | 49 ------------------ 6 files changed, 238 deletions(-) delete mode 100644 styles-old/Authentication.module.css delete mode 100644 styles-old/Home.module.css delete mode 100644 styles-old/Layout.module.css delete mode 100644 styles-old/Presence.module.css delete mode 100644 styles-old/PubSub.module.css delete mode 100644 styles-old/globals.css diff --git a/styles-old/Authentication.module.css b/styles-old/Authentication.module.css deleted file mode 100644 index a0aceb0..0000000 --- a/styles-old/Authentication.module.css +++ /dev/null @@ -1,36 +0,0 @@ -.label { - display: inline-block; - border-radius: 15px; - padding: 4px 8px; - width: 120px; - text-align: center; - height: 30px; -} - -.connection-connecting .label { - background-color: orange; -} - -.connection-connected .label { - background-color: green; -} - -.connection-closed .label { - background-color: red; -} - -.connection-action { - text-align: center; -} - -.connection-action button { - width: 120px; -} - -.connection-closed button::after { - content: ' ⚡️'; -} - -.connection-connected button::after { - content: ' 🚫'; -} \ No newline at end of file diff --git a/styles-old/Home.module.css b/styles-old/Home.module.css deleted file mode 100644 index c98157a..0000000 --- a/styles-old/Home.module.css +++ /dev/null @@ -1,75 +0,0 @@ -.description { - margin: 4rem; - line-height: 1.5; - font-size: 1.5rem; -} - -.info { - margin: 0 4em; - margin-bottom: 2em; -} - -.info a { - text-decoration: underline; -} - -.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: 350px; - min-height: 250px; -} - -.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: 1rem; - line-height: 1.5; -} - -@media (max-width: 600px) { - .grid { - width: 100%; - flex-direction: column; - } -} - -@media (prefers-color-scheme: dark) { - .card { - border-color: #222; - } -} diff --git a/styles-old/Layout.module.css b/styles-old/Layout.module.css deleted file mode 100644 index 964c45c..0000000 --- a/styles-old/Layout.module.css +++ /dev/null @@ -1,64 +0,0 @@ -.container { - padding: 0 2rem; -} - -.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; -} - -.main { - padding: 4rem 0; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.logo { - height: 1em; - margin: 0 0.1rem; -} - -.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; -} - -@media (prefers-color-scheme: dark) { - .footer { - border-color: #222; - } - .logo img { - filter: invert(1); - } -} \ No newline at end of file diff --git a/styles-old/Presence.module.css b/styles-old/Presence.module.css deleted file mode 100644 index a0e22d3..0000000 --- a/styles-old/Presence.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.presence input, .presence button { - margin: 1rem 1rem; -} \ No newline at end of file diff --git a/styles-old/PubSub.module.css b/styles-old/PubSub.module.css deleted file mode 100644 index 7fa77e9..0000000 --- a/styles-old/PubSub.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.publish { - min-width: 600px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.publish input, .publish button { - margin: 1rem 1rem; -} \ No newline at end of file diff --git a/styles-old/globals.css b/styles-old/globals.css deleted file mode 100644 index ee76c54..0000000 --- a/styles-old/globals.css +++ /dev/null @@ -1,49 +0,0 @@ -html, -body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; -} - -a { - color: inherit; - text-decoration: none; -} - -* { - box-sizing: border-box; -} - -h2, h3 { - text-align: center; -} - -button, input { - font-size: 1em; - cursor: pointer; -} - -button { - border: 0; - border-radius: 15px; - padding: 4px 8px; - height: 30px; - line-height: 100%; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } - body { - color: white; - background: black; - } - .footer { - border-color: #222; - } - .logo img { - filter: invert(1); - } -} From 8e023430278c2459919f8ba5681e36307a030aa9 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Thu, 31 Aug 2023 21:33:41 -0400 Subject: [PATCH 10/21] Move Pages API into Route Handlers --- app/authentication/authentication-client.tsx | 3 +- app/history/history-client.tsx | 2 +- app/presence/presence-client.tsx | 2 +- app/pub-sub/pubsub-client.tsx | 4 +- app/publish/route.ts | 37 ++++++++++++++++ app/token/route.ts | 23 ++++++++++ pages/api/authentication/token-auth.ts | 34 --------------- pages/api/pub-sub/publish.ts | 46 -------------------- 8 files changed, 65 insertions(+), 86 deletions(-) create mode 100644 app/publish/route.ts create mode 100644 app/token/route.ts delete mode 100644 pages/api/authentication/token-auth.ts delete mode 100644 pages/api/pub-sub/publish.ts diff --git a/app/authentication/authentication-client.tsx b/app/authentication/authentication-client.tsx index f9f9b25..63ee634 100644 --- a/app/authentication/authentication-client.tsx +++ b/app/authentication/authentication-client.tsx @@ -19,7 +19,7 @@ export default function Authentication() {

    Authenticate and establish a persistent bi-direction connection to the Ably platform.

    - +
    @@ -35,7 +35,6 @@ const ConnectionStatus = () => { const [logs, setLogs] = useState>([]) const [connectionState, setConnectionState] = useState('unknown') - useConnectionStateListener((stateChange) => { setConnectionState(stateChange.current) setLogs(prev => [...prev, new LogEntry(`Connection state change: ${stateChange.previous} -> ${stateChange.current}`)]) diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx index 9f08ceb..f72472e 100644 --- a/app/history/history-client.tsx +++ b/app/history/history-client.tsx @@ -18,7 +18,7 @@ export default function History() {

    Retrieve a history of messages that have been published to a channel. Publish messages via the Pub/Sub example Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app.

    - + diff --git a/app/presence/presence-client.tsx b/app/presence/presence-client.tsx index ef6d310..a4b30b5 100644 --- a/app/presence/presence-client.tsx +++ b/app/presence/presence-client.tsx @@ -58,7 +58,7 @@ const PresenceMessages: FC = ({ clientId, stateChanger }): if (clientId === null) return; client.auth.authorize( { clientId: clientId }, - { authUrl:'/api/authentication/token-auth', authMethod: 'POST' } + { authUrl:'/token', authMethod: 'POST' } ); return () => { console.log(`Unmounting Functional Component`) diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx index 3eab2ad..7d35add 100644 --- a/app/pub-sub/pubsub-client.tsx +++ b/app/pub-sub/pubsub-client.tsx @@ -19,7 +19,7 @@ export default function PubSub() {

    Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function.

    - + @@ -42,7 +42,7 @@ function PubSubMessages() { } const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { - fetch('/api/pub-sub/publish', { + fetch('/publish', { 'method': 'POST', 'headers': { 'content-type': 'application/json', diff --git a/app/publish/route.ts b/app/publish/route.ts new file mode 100644 index 0000000..16970d9 --- /dev/null +++ b/app/publish/route.ts @@ -0,0 +1,37 @@ +import { NextRequest, NextResponse } from 'next/server' +import * as Ably from "ably/promises" + +export async function POST(req: Request) { + if (!process.env.ABLY_API_KEY) { + return NextResponse.json({ errorMessage: `Missing ABLY_API_KEY environment variable. + If you're running locally, please ensure you have a ./.env file with a value for ABLY_API_KEY=your-key. + If you're running in Netlify, make sure you've configured env variable ABLY_API_KEY. + Please see README.md for more details on configuring your Ably API Key.`, + },{ + status: 500, + headers: new Headers({ + "content-type": "application/json" + }) + }); + } + + const client = new Ably.Rest(process.env.ABLY_API_KEY) + + var channel = client.channels.get('status-updates') + const message: { text: string } = await req.json() + + // By publishing via the serverless function you can perform + // checks in a trusted environment on the data being published + const disallowedWords = [ 'foo', 'bar', 'fizz', 'buzz' ] + + const containsDisallowedWord = disallowedWords.some(word => { + return message.text.match(new RegExp(`\\b${word}\\b`)) + }) + + if(containsDisallowedWord) { + return new Response("", { 'status': 403 }); + } + + await channel.publish('update-from-server', message) + return new Response(""); +} diff --git a/app/token/route.ts b/app/token/route.ts new file mode 100644 index 0000000..69e51fc --- /dev/null +++ b/app/token/route.ts @@ -0,0 +1,23 @@ +import { NextRequest, NextResponse } from 'next/server' +import * as Ably from "ably/promises"; + +export async function POST(req: Request) { + if (!process.env.ABLY_API_KEY) { + return NextResponse.json({ errorMessage: `Missing ABLY_API_KEY environment variable. + If you're running locally, please ensure you have a ./.env file with a value for ABLY_API_KEY=your-key. + If you're running in Netlify, make sure you've configured env variable ABLY_API_KEY. + Please see README.md for more details on configuring your Ably API Key.`, + },{ + status: 500, + headers: new Headers({ + "content-type": "application/json" + }) + }); + } + + const clientId = (await req.text()) || process.env.DEFAULT_CLIENT_ID || "NO_CLIENT_ID"; + const client = new Ably.Rest(process.env.ABLY_API_KEY); + const tokenRequestData = await client.auth.createTokenRequest({ clientId: clientId }); + console.log(tokenRequestData) + return NextResponse.json(tokenRequestData) +} diff --git a/pages/api/authentication/token-auth.ts b/pages/api/authentication/token-auth.ts deleted file mode 100644 index 2e58fd4..0000000 --- a/pages/api/authentication/token-auth.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' - -import * as dotenv from "dotenv"; -import * as Ably from "ably/promises"; - -dotenv.config(); - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - - console.log('/api/authentication/token-auth called') - - if (!process.env.ABLY_API_KEY) { - return res - .status(500) - .setHeader("content-type", "application/json") - .json({ - errorMessage: `Missing ABLY_API_KEY environment variable. - If you're running locally, please ensure you have a ./.env file with a value for ABLY_API_KEY=your-key. - If you're running in Netlify, make sure you've configured env variable ABLY_API_KEY. - Please see README.md for more details on configuring your Ably API Key.`, - }) - } - - const clientId = req.body["clientId"] || process.env.DEFAULT_CLIENT_ID || "NO_CLIENT_ID"; - const client = new Ably.Rest(process.env.ABLY_API_KEY); - const tokenRequestData = await client.auth.createTokenRequest({ clientId: clientId }); - - console.log(`ABLY TOKEN ${tokenRequestData}`) - - return res.status(200).json(tokenRequestData) -} diff --git a/pages/api/pub-sub/publish.ts b/pages/api/pub-sub/publish.ts deleted file mode 100644 index 81b5ec5..0000000 --- a/pages/api/pub-sub/publish.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' - -import * as dotenv from "dotenv" -import * as Ably from "ably/promises" - -dotenv.config() - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - - console.log('/api/pub-sub/publish called') - - if (!process.env.ABLY_API_KEY) { - return res - .status(500) - .setHeader("content-type", "application/json") - .json({ - errorMessage: `Missing ABLY_API_KEY environment variable. - If you're running locally, please ensure you have a ./.env file with a value for ABLY_API_KEY=your-key. - If you're running in Netlify, make sure you've configured env variable ABLY_API_KEY. - Please see README.md for more details on configuring your Ably API Key.`, - }) - } - - const client = new Ably.Rest(process.env.ABLY_API_KEY) - - var channel = client.channels.get('status-updates') - const message: { text: string } = req.body - - // By publishing via the serverless function you can perform - // checks in a trusted environment on the data being published - const disallowedWords = [ 'foo', 'bar', 'fizz', 'buzz' ] - - const containsDisallowedWord = disallowedWords.some(word => { - return message.text.match(new RegExp(`\\b${word}\\b`)) - }) - - if(containsDisallowedWord) { - return res.status(403) - } - - await channel.publish('update-from-server', message) - return res.status(200) -} From 05abd767b6c62e8ae26dea2b8efa9f2ea5c66b4b Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Sat, 9 Sep 2023 10:45:43 +0100 Subject: [PATCH 11/21] Update to use Ably. Change client instantiation. --- app/authentication/authentication-client.tsx | 9 +- app/history/history-client.tsx | 6 +- app/page.tsx | 12 - app/presence/presence-client.tsx | 68 +- app/pub-sub/pubsub-client.tsx | 6 +- app/token/route.ts | 2 +- components/navbar.tsx | 10 - package-lock.json | 4575 +++--------------- package.json | 13 +- 9 files changed, 719 insertions(+), 3982 deletions(-) diff --git a/app/authentication/authentication-client.tsx b/app/authentication/authentication-client.tsx index 63ee634..c88aae7 100644 --- a/app/authentication/authentication-client.tsx +++ b/app/authentication/authentication-client.tsx @@ -3,12 +3,15 @@ import { MouseEventHandler, MouseEvent, useState, useEffect } from 'react' -import * as Ably from 'ably/promises' +import * as Ably from 'ably' import Logger, { LogEntry } from '../../components/logger' import NavBar from '../../components/navbar' -import { AblyProvider, useAbly, useConnectionStateListener } from '@ably-labs/react-hooks' +import { AblyProvider, useAbly, useConnectionStateListener } from 'ably/react' export default function Authentication() { + + const client = new Ably.Realtime.Promise ({ authUrl: '/token', authMethod: 'POST' }); + return (
    @@ -19,7 +22,7 @@ export default function Authentication() {

    Authenticate and establish a persistent bi-direction connection to the Ably platform.

    - +
    diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx index f72472e..38794d2 100644 --- a/app/history/history-client.tsx +++ b/app/history/history-client.tsx @@ -1,13 +1,15 @@ 'use client' import * as Ably from 'ably'; -import { AblyProvider, useChannel } from "@ably-labs/react-hooks" +import { AblyProvider, useChannel } from 'ably/react' import Logger, { LogEntry } from '../../components/logger'; import { useEffect, useState } from 'react'; import NavBar from '../../components/navbar'; export default function History() { + const client = new Ably.Realtime.Promise ({ authUrl: '/token', authMethod: 'POST' }); + return (
    @@ -18,7 +20,7 @@ export default function History() {

    Retrieve a history of messages that have been published to a channel. Publish messages via the Pub/Sub example Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app.

    - +
    diff --git a/app/page.tsx b/app/page.tsx index 21e5940..cd7dabd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -25,9 +25,6 @@ export default function Home() {
    - {/* - - */}

    Token Authentication

    @@ -35,9 +32,6 @@ export default function Home() {
    - {/* - - */}

    Pub/Sub

    @@ -45,9 +39,6 @@ export default function Home() {
    - {/* - - */}

    Presence

    @@ -55,9 +46,6 @@ export default function Home() {
    - {/* - - */}

    History

    diff --git a/app/presence/presence-client.tsx b/app/presence/presence-client.tsx index a4b30b5..b982069 100644 --- a/app/presence/presence-client.tsx +++ b/app/presence/presence-client.tsx @@ -3,45 +3,48 @@ import * as Ably from 'ably'; import names from 'random-names-generator' -import { AblyProvider, useAbly, usePresence } from "@ably-labs/react-hooks" -import { MouseEvent, useState, useEffect, ReactElement, FC, SetStateAction, Dispatch } from 'react' +import { AblyProvider, useAbly, usePresence } from "ably/react" +import { useState, useEffect, ReactElement, FC, SetStateAction, Dispatch } from 'react' import Logger, { LogEntry } from '../../components/logger'; import NavBar from '../../components/navbar'; export default function Presence() { - const [randomName, setRandomName] = useState(''); - const [isUsernameValid, setIsUsernameValid] = useState(false) - useEffect(() => { - let name = names.random(); - setRandomName(name) - }, []) + const client = new Ably.Realtime.Promise ({ authUrl:'/token', autoConnect: false }); - return ( -
    -
    - -
    -
    -
    -

    - Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. Open this page in another tab to see more users enter and leave the presence channel. -

    -

    Hello {randomName}

    - { isUsernameValid === false? -
    - -
    - : - - - - } -
    -
    -
    - ) + const [randomName, setRandomName] = useState(''); + const [isUsernameValid, setIsUsernameValid] = useState(false) + + useEffect(() => { + let name = names.random(); + setRandomName(name) + }, []) + + return ( +
    +
    + +
    +
    +
    +

    + Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. Open this page in another tab to see more users enter and leave the presence channel. +

    +

    Hello {randomName}

    + { isUsernameValid === false? +
    + +
    + : + + + + } +
    +
    +
    + ) } type PresenceMessageProps = { @@ -84,7 +87,6 @@ const PresenceMessages: FC = ({ clientId, stateChanger }): -
    diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx index 7d35add..f562269 100644 --- a/app/pub-sub/pubsub-client.tsx +++ b/app/pub-sub/pubsub-client.tsx @@ -1,7 +1,7 @@ 'use client' import * as Ably from 'ably'; -import { AblyProvider, useChannel } from "@ably-labs/react-hooks" +import { AblyProvider, useChannel } from "ably/react" import { MouseEventHandler, MouseEvent, useState } from 'react' import Logger, { LogEntry } from '../../components/logger'; @@ -9,6 +9,8 @@ import NavBar from '../../components/navbar'; export default function PubSub() { + const client = new Ably.Realtime.Promise ({ authUrl: '/token', authMethod: 'POST' }); + return (
    @@ -19,7 +21,7 @@ export default function PubSub() {

    Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function.

    - +
    diff --git a/app/token/route.ts b/app/token/route.ts index 69e51fc..bfd31de 100644 --- a/app/token/route.ts +++ b/app/token/route.ts @@ -15,7 +15,7 @@ export async function POST(req: Request) { }); } - const clientId = (await req.text()) || process.env.DEFAULT_CLIENT_ID || "NO_CLIENT_ID"; + const clientId = ( (await req.formData()).get('clientId')?.toString() ) || process.env.DEFAULT_CLIENT_ID || "NO_CLIENT_ID"; const client = new Ably.Rest(process.env.ABLY_API_KEY); const tokenRequestData = await client.auth.createTokenRequest({ clientId: clientId }); console.log(tokenRequestData) diff --git a/components/navbar.tsx b/components/navbar.tsx index 608f880..7e69a07 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -1,16 +1,6 @@ -import Head from 'next/head' import Image from 'next/image' -import Link from 'next/link' - -type LayoutProps = { - children: React.ReactNode, - pageTitle?: string, - metaDescription: string, - showHomeLink?: boolean, -} export default function NavBar() { - return (
    + ) } \ No newline at end of file diff --git a/app/authentication/page.tsx b/app/authentication/page.tsx index c5980e5..1a0d294 100644 --- a/app/authentication/page.tsx +++ b/app/authentication/page.tsx @@ -1,7 +1,30 @@ +/** + * Warning: Opening too many live preview tabs will slow down performance. + * We recommend closing them after you're done. + */ +import React from "react"; +import "../global.css"; import dynamic from 'next/dynamic'; +import Sidebar from "../../components/Sidebar.tsx"; -const AuthenticationClient = dynamic(() => import('./authentication-client'), { +const AuthenticationClient = dynamic(() => import('./authentication-client.tsx'), { ssr: false, }) -export default AuthenticationClient; \ No newline at end of file +const Authentication = () => { + + const pageId = "Authentication"; + + return ( +
    +
    + +
    + +
    +
    +
    + ) +}; + +export default Authentication; diff --git a/app/global.css b/app/global.css index 0f368f1..18be11b 100644 --- a/app/global.css +++ b/app/global.css @@ -1,79 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=NEXT+Book:"); @tailwind base; @tailwind components; -@tailwind utilities; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -/*********/ -/* -html, -body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; -} - -a { - color: inherit; - text-decoration: none; -} - -* { - box-sizing: border-box; -} - -h2, h3 { - text-align: center; -} - -button, input { - font-size: 1em; - cursor: pointer; -} - -button { - border: 0; - border-radius: 15px; - padding: 4px 8px; - height: 30px; - line-height: 100%; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } - body { - color: white; - background: black; - } - .footer { - border-color: #222; - } - .logo img { - filter: invert(1); - } -} */ +@tailwind utilities; \ No newline at end of file diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx index 38794d2..1d62ddb 100644 --- a/app/history/history-client.tsx +++ b/app/history/history-client.tsx @@ -1,31 +1,62 @@ 'use client' import * as Ably from 'ably'; -import { AblyProvider, useChannel } from 'ably/react' + +import { AblyProvider, useChannel } from "ably/react" +import { useState, useEffect } from 'react' import Logger, { LogEntry } from '../../components/logger'; -import { useEffect, useState } from 'react'; -import NavBar from '../../components/navbar'; +import SampleHeader from '../../components/SampleHeader'; -export default function History() { +export default function Presence() { - const client = new Ably.Realtime.Promise ({ authUrl: '/token', authMethod: 'POST' }); + const client = new Ably.Realtime.Promise ({ authUrl:'/token', authMethod: 'POST' }); return ( -
    -
    - -
    -
    -
    -

    - Retrieve a history of messages that have been published to a channel. Publish messages via the Pub/Sub example Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the Persist all messages channel rule for the status-updates channel in your Ably app. -

    - - - + +
    + +
    + Retrieve a history of messages that have been published to a channel. + Messages are only stored for 2 minutes by default. In order for them + to be stored for longer you should enable the  + +    + + + Persist all messages + +    + channel rule +  for + the   + + status-updates + +  channel in your Ably app   +
    +
    +
    +
    + Alert
    -
    -
    +
    + Important: You need to + publish at least 1 message from the  + + Pub/Sub Channels example + +  to see history log. +
    +
    + + + +
    ) } @@ -57,25 +88,58 @@ function HistoryMessages() { }, []) return ( -
    -
    -

    History

    - { - historicalLogs.length > 0? - - : -

    No historical messages found

    - } -
    -
    -

    Realtime

    - { - realtimeLogs.length > 0? - - : -

    No realtime messages received yet

    - } -
    + <> +
    +
    + history +
    +
    +
    + { + historicalLogs.length > 0? + + : +

    No historical messages found

    + } +
    +
    +
    +
    +
    + realtime +
    +
    +
    + { + realtimeLogs.length > 0? + + : +

    No realtime messages received yet

    + } + +
    +
    + + //
    + //
    + //

    History

    + // { + // historicalLogs.length > 0? + // + // : + //

    No historical messages found

    + // } + //
    + //
    + //

    Realtime

    + // { + // realtimeLogs.length > 0? + // + // : + //

    No realtime messages received yet

    + // } + //
    + //
    ) } diff --git a/app/history/page.tsx b/app/history/page.tsx index 7f5036f..46097a1 100644 --- a/app/history/page.tsx +++ b/app/history/page.tsx @@ -1,7 +1,32 @@ +/** + * Warning: Opening too many live preview tabs will slow down performance. + * We recommend closing them after you're done. + */ +import React from "react"; +import "../global.css"; import dynamic from 'next/dynamic'; +import MenuFooter from "../../components/FooterItem.tsx"; +import MenuItem from "../../components/MenuItem.tsx"; +import Sidebar from "../../components/Sidebar.tsx"; -const HistoryClient = dynamic(() => import('./history-client'), { +const HistoryClient = dynamic(() => import('./history-client.tsx'), { ssr: false, }) -export default HistoryClient; \ No newline at end of file +const History = () => { + + const pageId = "History" + + return ( +
    +
    + +
    + +
    +
    +
    + ) +} + +export default History; diff --git a/app/layout.tsx b/app/layout.tsx index f979aa6..466fea5 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,9 +1,5 @@ import './global.css' import type { Metadata } from 'next' -import { Inter } from 'next/font/google' -import { Roboto } from "next/font/google"; - -const inter = Inter({ subsets: ['latin'] }) export const metadata: Metadata = { title: 'Create Next App', diff --git a/app/page.tsx b/app/page.tsx index cd7dabd..818f7a7 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,81 +1,233 @@ -import Image from 'next/image' -import NavBar from '../components/navbar' +/** + * Warning: Opening too many live preview tabs will slow down performance. + * We recommend closing them after you're done. + */ +import React from "react"; +import "./global.css"; +import Sidebar from "../components/Sidebar"; -export default function Home() { +const Home = () => { + const pageId = "Start"; + return ( -
    -
    - -
    -
    -
    -
    -
    - Ably logo +
    +
    + +
    +
    + AblyLogo +
    + plus
    -
    - Next.js logo + Next.js +
    +
    + + At Ably we are big fans of Next.js  + + / This application demonstrates using some of the Ably fundamentals + with Next.js. You can build features and use cases upon these + fundamentals such as notifications, activity streams, chat, realtime + visualisations and dashboards, and collaborative multiplayer + experiences. +
    +
    +
    +
    +
    +
    +
    +
    + Authentication +
    +
    +
    + Authentication +
    +
    +
    +
    + Token Authentication is the recommended approach for auth + with Ably. +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + Pub/Sub Channels +
    +
    +
    + Pub/Sub Channels +
    +
    +
    +
    + Pub/Sub (Publish/Subscribe) with Ably lets you publish + messages on channels and subscribe to channels to receive + messages. +
    + +
    +
    +
    -
    - -

    Ably ♥s Next.js

    -

    At Ably we are big fans of Next.js. This application demonstrates using some of the Ably fundamentals with Next.js. You can build features and use cases upon these fundamentals such as notifications, activity streams, chat, realtime visualisations and dashboards, and collaborative multiplayer experiences.

    - -
    - -
    - -

    Token Authentication

    -
    -

    Token Authentication is the recommeded approach for auth with Ably.

    -
    - -
    - -

    Pub/Sub

    -
    -

    Pub/Sub (Publish/Subscribe) with Ably lets you publish messages on channels and subscribe to channels to receive messages.

    -
    - -
    - -

    Presence

    -
    -

    Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat.

    -
    - -
    - -

    History

    -
    -

    Retrieve a history of messages that have been published to a channel.

    +
    +
    +
    +
    +
    +
    + Presence +
    +
    +
    + Presence +
    +
    +
    +
    + Presence with Ably allows you to keep track of devices that + are present on a channel. This is great for tracking if a + device is online or offline or indicating if a user is in a + chat room when using Ably for Chat. +
    + +
    +
    +
    +
    +
    +
    +
    +
    + History +
    +
    +
    + History +
    +
    +
    +
    + Retrieve a history of messages that have been published to a + channel. +
    + +
    +
    +
    -
    +
    -
    - +
    ) } +; + +export default Home; diff --git a/app/presence/page.tsx b/app/presence/page.tsx index f77da73..3310840 100644 --- a/app/presence/page.tsx +++ b/app/presence/page.tsx @@ -1,7 +1,32 @@ +/** + * Warning: Opening too many live preview tabs will slow down performance. + * We recommend closing them after you're done. + */ +import React from "react"; +import "../global.css"; import dynamic from 'next/dynamic'; +import MenuFooter from "../../components/FooterItem.tsx"; +import MenuItem from "../../components/MenuItem.tsx"; +import Sidebar from "../../components/Sidebar.tsx"; -const PresenceClient = dynamic(() => import('./presence-client'), { +const PresenceClient = dynamic(() => import('./presence-client.tsx'), { ssr: false, }) -export default PresenceClient; \ No newline at end of file +const Presence = () => { + + const pageId = "Presence" + + return ( +
    +
    + +
    + +
    +
    +
    + ) +} + +export default Presence; diff --git a/app/presence/presence-client.tsx b/app/presence/presence-client.tsx index b982069..3bf3944 100644 --- a/app/presence/presence-client.tsx +++ b/app/presence/presence-client.tsx @@ -4,92 +4,77 @@ import * as Ably from 'ably'; import names from 'random-names-generator' import { AblyProvider, useAbly, usePresence } from "ably/react" -import { useState, useEffect, ReactElement, FC, SetStateAction, Dispatch } from 'react' - +import { useState, ReactElement, FC } from 'react' import Logger, { LogEntry } from '../../components/logger'; -import NavBar from '../../components/navbar'; +import SampleHeader from '../../components/SampleHeader'; export default function Presence() { - const client = new Ably.Realtime.Promise ({ authUrl:'/token', autoConnect: false }); + const [randomName] = useState(names.random()); + const [isOnline, setIsOnline] = useState(false) - const [randomName, setRandomName] = useState(''); - const [isUsernameValid, setIsUsernameValid] = useState(false) + const client = new Ably.Realtime.Promise ({ authUrl:'/token', authMethod: 'POST', clientId: randomName }); - useEffect(() => { - let name = names.random(); - setRandomName(name) - }, []) + function toggleState(val: boolean) { + setIsOnline(val) + } return ( -
    -
    - -
    -
    -
    -

    - Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when using Ably for Chat. Open this page in another tab to see more users enter and leave the presence channel. -

    -

    Hello {randomName}

    - { isUsernameValid === false? -
    - -
    - : - - - - } + +
    + +
    + Presence with Ably allows you to keep track of devices that are + present on a channel. This is great for tracking if a device is + online or offline or indicating if a user is in a chat room when + using Ably for Chat.  + + Open this page in another tab + +  to see more users enter and leave the presence channel. +
    +
    + { isOnline ? ( + + ) : ( +
    +
    + +
    -
    -
    + ) } +
    ) } -type PresenceMessageProps = { - clientId: string, - stateChanger:Dispatch> -} - -const PresenceMessages: FC = ({ clientId, stateChanger }): ReactElement => { +const PresenceMessages: FC = ({toggle}): ReactElement => { const [logs, setLogs] = useState>([]) const client = useAbly(); - useEffect(() =>{ - if (clientId === null) return; - client.auth.authorize( - { clientId: clientId }, - { authUrl:'/token', authMethod: 'POST' } - ); - return () => { - console.log(`Unmounting Functional Component`) - } - }, []); - - //this should only happen once we have a valid user name const { presenceData, updateStatus } = usePresence("room", {'status':'available'}, (member) => { setLogs(prev => [...prev, new LogEntry(`action: ${member.action} clientId: ${member.clientId}`)]) - return ( -
  • {member.clientId}
  • - ) }); return ( <> -
    -
      - {presenceData.map((member) => { - //setLogs(prev => [...prev, new LogEntry(`action: ${member.action} clientId: ${member.clientId}`)]) - return (
    • {member.clientId}
    • ) - })} -
    -
    - -
    - -
    +
    +
    +
    +
      + {presenceData.map((member) => { + return (
    • {member.clientId}
    • ) + })} +
    +
    +
    +
    +
    + +
    +
    +
    + ) } diff --git a/app/pub-sub/page.tsx b/app/pub-sub/page.tsx index ff9c1ba..1cd2f32 100644 --- a/app/pub-sub/page.tsx +++ b/app/pub-sub/page.tsx @@ -1,7 +1,30 @@ +/** + * Warning: Opening too many live preview tabs will slow down performance. + * We recommend closing them after you're done. + */ +import React from "react"; +import "../global.css"; import dynamic from 'next/dynamic'; +import Sidebar from "../../components/Sidebar.tsx"; -const PubSubClient = dynamic(() => import('./pubsub-client'), { +const PubSubClient = dynamic(() => import('./pubsub-client.tsx'), { ssr: false, }) -export default PubSubClient; \ No newline at end of file +const PubSub = () => { + + const pageId="PubSubChannels" + + return ( +
    +
    + +
    + +
    +
    +
    + ) +} + +export default PubSub; diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx index f562269..ba87a7d 100644 --- a/app/pub-sub/pubsub-client.tsx +++ b/app/pub-sub/pubsub-client.tsx @@ -3,70 +3,76 @@ import * as Ably from 'ably'; import { AblyProvider, useChannel } from "ably/react" import { MouseEventHandler, MouseEvent, useState } from 'react' - import Logger, { LogEntry } from '../../components/logger'; -import NavBar from '../../components/navbar'; +import SampleHeader from '../../components/SampleHeader'; -export default function PubSub() { +export default function PubSubClient() { const client = new Ably.Realtime.Promise ({ authUrl: '/token', authMethod: 'POST' }); - return ( -
    -
    - -
    -
    -
    -

    - Publish messages on channels and subscribe to channels to receive messages. Click the Publish from the client to publish a message on a channel from the web browser client. Click the Public from the server to publish a message from a serverless function. -

    - - - + return ( + +
    + +
    + Publish messages on channels and subscribe to channels to receive messages. Click Publish from Client to publish a message on a channel from the web browser client. Click Publish from Server to publish a message from a serverless function.
    -
    -
    - ) + + + + ) } function PubSubMessages() { - const [logs, setLogs] = useState>([]) - const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { - setLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) - }); - const [messageText, setMessageText] = useState('A message') + const [logs, setLogs] = useState>([]) - const publicFromClientHandler: MouseEventHandler = (_event: MouseEvent) => { - if(channel === null) return - channel.publish('update-from-client', {text: `${messageText} @ ${new Date().toISOString()}`}) - } + const { channel } = useChannel("status-updates", (message: Ably.Types.Message) => { + setLogs(prev => [...prev, new LogEntry(`✉️ event name: ${message.name} text: ${message.data.text}`)]) + }); + + const [messageText, setMessageText] = useState('A message') - const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { - fetch('/publish', { - 'method': 'POST', - 'headers': { - 'content-type': 'application/json', - }, - 'body': JSON.stringify({text: `${messageText} @ ${new Date().toISOString()}`}) - }) - } + const publicFromClientHandler: MouseEventHandler = (_event: MouseEvent) => { + if(channel === null) return + channel.publish('update-from-client', {text: `${messageText} @ ${new Date().toISOString()}`}) + } - return ( - <> -
    - Message text: - setMessageText(e.target.value)} /> - - -
    + const publicFromServerHandler: MouseEventHandler = (_event: MouseEvent) => { + fetch('/publish', { + 'method': 'POST', + 'headers': { + 'content-type': 'application/json', + }, + 'body': JSON.stringify({text: `${messageText} @ ${new Date().toISOString()}`}) + }) + } -
    -

    Message Log

    - + return ( + <> +
    +
    + Message text
    - - ) -} - +
    +
    + setMessageText(e.target.value)} /> +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + ) +} \ No newline at end of file diff --git a/components/FooterItem.tsx b/components/FooterItem.tsx new file mode 100644 index 0000000..b85aa0b --- /dev/null +++ b/components/FooterItem.tsx @@ -0,0 +1,11 @@ +export default function FooterItem(props : { menuItemText:string, menuItemLink:string }) { + return ( + + ) +} \ No newline at end of file diff --git a/components/MenuItem.tsx b/components/MenuItem.tsx new file mode 100644 index 0000000..2b9a597 --- /dev/null +++ b/components/MenuItem.tsx @@ -0,0 +1,26 @@ +interface MenuItemProps { + menuItemText:string, + menuItemActive:boolean, + menuItemLink:string +} + +export default function MenuItem(props:MenuItemProps) { + return ( + + ) +} \ No newline at end of file diff --git a/components/SampleHeader.tsx b/components/SampleHeader.tsx new file mode 100644 index 0000000..7828958 --- /dev/null +++ b/components/SampleHeader.tsx @@ -0,0 +1,38 @@ +export default function SampleHeader(props: { sampleName:string, sampleIcon:string, sampleDocsLink:string }) { + return ( +
    +
    +
    +
    + {props.sampleName} +
    +
    +
    + {props.sampleName} +
    +
    + +
    + ); +} diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx new file mode 100644 index 0000000..aa2a2b0 --- /dev/null +++ b/components/Sidebar.tsx @@ -0,0 +1,175 @@ +import FooterItem from "./FooterItem"; +import MenuItem from "./MenuItem"; +import SocialItem from "./SocialItem"; + +export default function Sidebar(props: { pageId: string; }) { + + const menuItems = [ + { + menuItemId: "Start", + menuItemText: "Start", + menuItemActive: false, + menuItemLink: '/' + }, + { + menuItemId: "Authentication", + menuItemText: "Authentication", + menuItemActive: false, + menuItemLink: '/authentication' + }, + { + menuItemId: "PubSubChannels", + menuItemText: "Pub/Sub Channels", + menuItemActive: false, + menuItemLink: '/pub-sub' + }, + { + menuItemId: "Presence", + menuItemText: "Presence", + menuItemActive: false, + menuItemLink: '/presence' + }, + { + menuItemId: "History", + menuItemText: "History", + menuItemActive: false, + menuItemLink: '/history' + } + ] + + const footerItems = [ + { + menuItemText: "View our Docs", + menuItemLink: 'https://ably.com/docs/' + }, + { + menuItemText: "Explore Pub/Sub Channels", + menuItemLink: 'https://ably.com/channels' + }, + { + menuItemText: "ably.com", + menuItemLink: 'https://ably.com/' + }, + ]; + + const socialItems = [ + { + menuItemText: "X (Twitter)", + menuItemLink: 'https://twitter.com/ablyrealtime/', + menuItemIcon: 'XTwitterLogo.svg' + }, + { + menuItemText: "Github", + menuItemLink: 'https://github.com/ably/', + menuItemIcon: 'GithubLogo.svg' + }, + { + menuItemText: "LinkedIn", + menuItemLink: 'https://linkedin.com/company/ably-realtime/', + menuItemIcon: 'LinkedInLogo.svg' + }, + { + menuItemText: "Discord", + menuItemLink: 'http://go.ably.com/discord', + menuItemIcon: 'DiscordLogo.svg' + }, + + ]; + + return( +
    +
    + AblyLogoWithText +
    + {menuItems.map( + ({ + menuItemId, + menuItemText, + menuItemLink + }) => ( + + ) + )} +
    +
    +
    + Svg Asset 17 +
    + {footerItems.map(({ menuItemText, menuItemLink }) => ( + + ))} +
    + Svg Asset 16 +
    +{/* +
    +
    + X (Twitter) +
    + LinkedIn +
    +
    + Github +
    + Discord +
    +
    */} + + {socialItems.map( + ({ + menuItemText, + menuItemIcon, + menuItemLink + }) => ( + + ) + )} + +
    +
    +
    + ) +} \ No newline at end of file diff --git a/components/SocialItem.tsx b/components/SocialItem.tsx new file mode 100644 index 0000000..883e7af --- /dev/null +++ b/components/SocialItem.tsx @@ -0,0 +1,16 @@ +export default function SocialItem(props : { menuItemText:string, menuItemIcon:string, menuItemLink:string }) { + return ( +
    + + {props.menuItemText} + +
    + ) +} + + \ No newline at end of file diff --git a/components/logger.tsx b/components/logger.tsx index b2ade26..660d892 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -14,19 +14,39 @@ export type LoggingProps = { export default function Logger({ logEntries }: LoggingProps) { return ( -
      - { - // Show the newest log entry at the top - logEntries.sort((a: LogEntry, b: LogEntry) => { - return b.timestamp.getTime() - a.timestamp.getTime() - }).map((logEntry: LogEntry, index: number) => { - return ( -
    • - {logEntry.timestamp.toISOString()}: {logEntry.message} -
    • - )} - ) - } -
    +
    +
    + Message log +
    +
    +
    +
    + Red + Yellow + Green +
    +
    + +
    +
    +
      + { + // Show the newest log entry at the top + logEntries.sort((a: LogEntry, b: LogEntry) => { + return b.timestamp.getTime() - a.timestamp.getTime() + }).map((logEntry: LogEntry, index: number) => { + return ( +
    • + {index+1}  {logEntry.message} +
    • + )} + ) + } +
    +
    +
    +
    +
    + ) } \ No newline at end of file diff --git a/components/navbar.tsx b/components/navbar.tsx deleted file mode 100644 index 7e69a07..0000000 --- a/components/navbar.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import Image from 'next/image' - -export default function NavBar() { - return ( - - ) -} diff --git a/package-lock.json b/package-lock.json index 4b2ccbe..0e8b10b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,15 +8,15 @@ "name": "ably-nextjs-fundamentals-kit", "version": "0.1.0", "dependencies": { - "@types/node": "20.6.0", - "@types/react": "18.2.21", + "@types/node": "20.6.5", + "@types/react": "18.2.22", "@types/react-dom": "18.2.7", - "ably": "^1.2.43", + "ably": "1.2.44", "dotenv": "^16.0.3", - "eslint": "8.49.0", + "eslint": "8.50.0", "flowbite": "^1.8.1", "flowbite-react": "^0.6.0", - "next": "^13.4.16", + "next": "^13.5.3", "random-names-generator": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -58,9 +58,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -84,9 +84,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -114,28 +114,28 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react": { @@ -165,9 +165,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", @@ -243,23 +243,23 @@ } }, "node_modules/@next/env": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz", - "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==" + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.3.tgz", + "integrity": "sha512-X4te86vsbjsB7iO4usY9jLPtZ827Mbx+WcwNBGUOIuswuTAKQtzsuoxc/6KLxCMvogKG795MhrR1LDhYgDvasg==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", - "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.3.tgz", + "integrity": "sha512-lbZOoEjzSuTtpk9UgV9rOmxYw+PsSfNR+00mZcInqooiDMZ1u+RqT1YQYLsEZPW1kumZoQe5+exkCBtZ2xn0uw==", "dev": true, "dependencies": { "glob": "7.1.7" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz", - "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.3.tgz", + "integrity": "sha512-6hiYNJxJmyYvvKGrVThzo4nTcqvqUTA/JvKim7Auaj33NexDqSNwN5YrrQu+QhZJCIpv2tULSHt+lf+rUflLSw==", "cpu": [ "arm64" ], @@ -272,9 +272,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz", - "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.3.tgz", + "integrity": "sha512-UpBKxu2ob9scbpJyEq/xPgpdrgBgN3aLYlxyGqlYX5/KnwpJpFuIHU2lx8upQQ7L+MEmz+fA1XSgesoK92ppwQ==", "cpu": [ "x64" ], @@ -287,9 +287,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz", - "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.3.tgz", + "integrity": "sha512-5AzM7Yx1Ky+oLY6pHs7tjONTF22JirDPd5Jw/3/NazJ73uGB05NqhGhB4SbeCchg7SlVYVBeRMrMSZwJwq/xoA==", "cpu": [ "arm64" ], @@ -302,9 +302,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz", - "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.3.tgz", + "integrity": "sha512-A/C1shbyUhj7wRtokmn73eBksjTM7fFQoY2v/0rTM5wehpkjQRLOXI8WJsag2uLhnZ4ii5OzR1rFPwoD9cvOgA==", "cpu": [ "arm64" ], @@ -317,9 +317,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz", - "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.3.tgz", + "integrity": "sha512-FubPuw/Boz8tKkk+5eOuDHOpk36F80rbgxlx4+xty/U71e3wZZxVYHfZXmf0IRToBn1Crb8WvLM9OYj/Ur815g==", "cpu": [ "x64" ], @@ -332,9 +332,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz", - "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.3.tgz", + "integrity": "sha512-DPw8nFuM1uEpbX47tM3wiXIR0Qa+atSzs9Q3peY1urkhofx44o7E1svnq+a5Q0r8lAcssLrwiM+OyJJgV/oj7g==", "cpu": [ "x64" ], @@ -347,9 +347,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz", - "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.3.tgz", + "integrity": "sha512-zBPSP8cHL51Gub/YV8UUePW7AVGukp2D8JU93IHbVDu2qmhFAn9LWXiOOLKplZQKxnIPUkJTQAJDCWBWU4UWUA==", "cpu": [ "arm64" ], @@ -362,9 +362,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz", - "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.3.tgz", + "integrity": "sha512-ONcL/lYyGUj4W37D4I2I450SZtSenmFAvapkJQNIJhrPMhzDU/AdfLkW98NvH1D2+7FXwe7yclf3+B7v28uzBQ==", "cpu": [ "ia32" ], @@ -377,9 +377,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz", - "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.3.tgz", + "integrity": "sha512-2Vz2tYWaLqJvLcWbbTlJ5k9AN6JD7a5CN2pAeIzpbecK8ZF/yobA39cXtv6e+Z8c5UJuVOmaTldEAIxvsIux/Q==", "cpu": [ "x64" ], @@ -433,9 +433,9 @@ } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz", - "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.4.0.tgz", + "integrity": "sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==", "dev": true }, "node_modules/@sindresorhus/is": { @@ -450,9 +450,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", "dependencies": { "tslib": "^2.4.0" } @@ -480,9 +480,9 @@ } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", + "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -499,19 +499,19 @@ } }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.5.tgz", + "integrity": "sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w==" }, "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==" + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==" }, "node_modules/@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -535,20 +535,20 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", + "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" }, "node_modules/@typescript-eslint/parser": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz", - "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz", + "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4" }, "engines": { @@ -568,13 +568,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -585,9 +585,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -598,13 +598,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -625,12 +625,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.3", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -920,9 +920,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -940,8 +940,8 @@ ], "dependencies": { "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -969,9 +969,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", - "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", + "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", "dev": true, "engines": { "node": ">=4" @@ -1037,9 +1037,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", "dev": true, "funding": [ { @@ -1056,10 +1056,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1134,9 +1134,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001532", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", - "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", + "version": "1.0.30001539", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", + "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", "funding": [ { "type": "opencollective", @@ -1348,12 +1348,27 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -1423,9 +1438,9 @@ "integrity": "sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==" }, "node_modules/electron-to-chromium": { - "version": "1.4.513", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", - "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==", + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", "dev": true }, "node_modules/emoji-regex": { @@ -1456,18 +1471,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -1483,23 +1498,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -1509,14 +1524,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -1526,8 +1541,8 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, "node_modules/es-set-tostringtag": { @@ -1591,14 +1606,14 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1644,19 +1659,19 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", - "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.3.tgz", + "integrity": "sha512-VN2qbCpq2DMWgs7SVF8KTmc8bVaWz3s4nmcFqRLs7PNBt5AXejOhJuZ4zg2sCEHOvz5RvqdwLeI++NSCV6qHVg==", "dev": true, "dependencies": { - "@next/eslint-plugin-next": "13.4.19", - "@rushstack/eslint-patch": "^1.1.3", + "@next/eslint-plugin-next": "13.5.3", + "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/parser": "^5.4.2 || ^6.0.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-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { @@ -1690,9 +1705,9 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", - "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -2100,9 +2115,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/flowbite": { "version": "1.8.1", @@ -2114,9 +2129,9 @@ } }, "node_modules/flowbite-react": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.6.0.tgz", - "integrity": "sha512-nupIRMNbCgoomIPxD/Do5FIqWHz8FQ8kkpnUQER7aZbO92AyITqT3riMwNwKc27zdbit3PY5iEvO5EXiGlmaow==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/flowbite-react/-/flowbite-react-0.6.1.tgz", + "integrity": "sha512-UuAdxmEx5sA8bQ7VKPvGWCY1V6j8a9RPnvBx7Hm/uqTJO8Iq3jLymAgC3uTMcB21G2Qco0Euf1xXPEKuJPTgMQ==", "dependencies": { "@floating-ui/react": "^0.24.3", "flowbite": "^1.6.6", @@ -2248,9 +2263,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -2295,9 +2310,9 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2876,15 +2891,16 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/iterator.prototype": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", - "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jiti": { @@ -3145,12 +3161,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz", - "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==", + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.3.tgz", + "integrity": "sha512-4Nt4HRLYDW/yRpJ/QR2t1v63UOMS55A38dnWv3UDOWGezuY0ZyFO1ABNbD7mulVzs9qVhgy2+ppjdsANpKP1mg==", "dependencies": { - "@next/env": "13.4.19", - "@swc/helpers": "0.5.1", + "@next/env": "13.5.3", + "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", @@ -3162,18 +3178,18 @@ "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=16.14.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.19", - "@next/swc-darwin-x64": "13.4.19", - "@next/swc-linux-arm64-gnu": "13.4.19", - "@next/swc-linux-arm64-musl": "13.4.19", - "@next/swc-linux-x64-gnu": "13.4.19", - "@next/swc-linux-x64-musl": "13.4.19", - "@next/swc-win32-arm64-msvc": "13.4.19", - "@next/swc-win32-ia32-msvc": "13.4.19", - "@next/swc-win32-x64-msvc": "13.4.19" + "@next/swc-darwin-arm64": "13.5.3", + "@next/swc-darwin-x64": "13.5.3", + "@next/swc-linux-arm64-gnu": "13.5.3", + "@next/swc-linux-arm64-musl": "13.5.3", + "@next/swc-linux-x64-gnu": "13.5.3", + "@next/swc-linux-x64-musl": "13.5.3", + "@next/swc-win32-arm64-msvc": "13.5.3", + "@next/swc-win32-ia32-msvc": "13.5.3", + "@next/swc-win32-x64-msvc": "13.5.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -3514,9 +3530,9 @@ } }, "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", "funding": [ { "type": "opencollective", @@ -3812,14 +3828,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -3829,9 +3845,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -3977,6 +3993,20 @@ "node": ">=10" } }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4036,9 +4066,9 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", - "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -4048,6 +4078,7 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -4481,9 +4512,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 81fe027..a95e24a 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,15 @@ "lint": "next lint" }, "dependencies": { - "@types/node": "20.6.0", - "@types/react": "18.2.21", + "@types/node": "20.6.5", + "@types/react": "18.2.22", "@types/react-dom": "18.2.7", - "ably": "^1.2.43", + "ably": "1.2.44", "dotenv": "^16.0.3", - "eslint": "8.49.0", + "eslint": "8.50.0", "flowbite": "^1.8.1", "flowbite-react": "^0.6.0", - "next": "^13.4.16", + "next": "^13.5.3", "random-names-generator": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/public/assets/AblyLogo.svg b/public/assets/AblyLogo.svg new file mode 100644 index 0000000..647b42d --- /dev/null +++ b/public/assets/AblyLogo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/AblyLogoWithText.svg b/public/assets/AblyLogoWithText.svg new file mode 100644 index 0000000..286fcec --- /dev/null +++ b/public/assets/AblyLogoWithText.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Alert.svg b/public/assets/Alert.svg new file mode 100644 index 0000000..8d396ac --- /dev/null +++ b/public/assets/Alert.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/ArrowRight.svg b/public/assets/ArrowRight.svg new file mode 100644 index 0000000..f8bc8c9 --- /dev/null +++ b/public/assets/ArrowRight.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/Authentication.svg b/public/assets/Authentication.svg new file mode 100644 index 0000000..1c47a49 --- /dev/null +++ b/public/assets/Authentication.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/DiscordLogo.svg b/public/assets/DiscordLogo.svg new file mode 100644 index 0000000..29147f0 --- /dev/null +++ b/public/assets/DiscordLogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/ExploreNow.svg b/public/assets/ExploreNow.svg new file mode 100644 index 0000000..f8bc8c9 --- /dev/null +++ b/public/assets/ExploreNow.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/GithubLogo.svg b/public/assets/GithubLogo.svg new file mode 100644 index 0000000..2f080e5 --- /dev/null +++ b/public/assets/GithubLogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/GreenButton.svg b/public/assets/GreenButton.svg new file mode 100644 index 0000000..cccf904 --- /dev/null +++ b/public/assets/GreenButton.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/History.svg b/public/assets/History.svg new file mode 100644 index 0000000..033e2da --- /dev/null +++ b/public/assets/History.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/HorizontalRule.svg b/public/assets/HorizontalRule.svg new file mode 100644 index 0000000..b02d273 --- /dev/null +++ b/public/assets/HorizontalRule.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/LinkedInLogo.svg b/public/assets/LinkedInLogo.svg new file mode 100644 index 0000000..beebe83 --- /dev/null +++ b/public/assets/LinkedInLogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/NextjsLogo.svg b/public/assets/NextjsLogo.svg new file mode 100644 index 0000000..f927208 --- /dev/null +++ b/public/assets/NextjsLogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/PlusSign.svg b/public/assets/PlusSign.svg new file mode 100644 index 0000000..b85fb67 --- /dev/null +++ b/public/assets/PlusSign.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/Presence.svg b/public/assets/Presence.svg new file mode 100644 index 0000000..6b647a1 --- /dev/null +++ b/public/assets/Presence.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/PubSubChannels.svg b/public/assets/PubSubChannels.svg new file mode 100644 index 0000000..226aa35 --- /dev/null +++ b/public/assets/PubSubChannels.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/assets/RedButton.svg b/public/assets/RedButton.svg new file mode 100644 index 0000000..d6d81e3 --- /dev/null +++ b/public/assets/RedButton.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/XTwitterLogo.svg b/public/assets/XTwitterLogo.svg new file mode 100644 index 0000000..0882631 --- /dev/null +++ b/public/assets/XTwitterLogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/YellowButton.svg b/public/assets/YellowButton.svg new file mode 100644 index 0000000..303893c --- /dev/null +++ b/public/assets/YellowButton.svg @@ -0,0 +1,3 @@ + + + diff --git a/tailwind.config.js b/tailwind.config.js index d6afd58..fb67516 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -11,6 +11,9 @@ module.exports = { "./src/**/*.{js,ts,jsx,tsx,mdx}", ], theme: { + fontFamily: { + "next-book": "'NEXT Book', sans-serif", + }, extend: {}, }, plugins: [require("flowbite/plugin")], diff --git a/tsconfig.json b/tsconfig.json index fecd564..11b9d6b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,7 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, + "allowImportingTsExtensions":true, "jsx": "preserve", "incremental": true, "plugins": [ @@ -29,7 +30,7 @@ "**/*.ts", "**/*.tsx", ".next/types/**/*.ts" -, "components/layout.tsx", "pages/pub-sub.old", "pages/index.old" ], +, "components/layout.tsx", "pages/pub-sub.old", "pages/index.old", "app/page.tsx.old", "app/pub-sub/pubsub-client.tsx.old" ], "exclude": [ "node_modules" ] From 3d5176894c3d904c5cca8b4b8ae956118961c121 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 12:55:22 -0400 Subject: [PATCH 13/21] Adding config to handle nextjs warnings --- next.config.js | 7 +++++++ package.json | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/next.config.js b/next.config.js index bd62b3b..faaca07 100644 --- a/next.config.js +++ b/next.config.js @@ -9,6 +9,13 @@ const nextConfig = { dangerouslyAllowSVG: true, domains: ['static.ably.dev'], }, + webpack: (config) => { + config.externals.push({ + 'utf-8-validate': 'commonjs utf-8-validate', + 'bufferutil': 'commonjs bufferutil', + }) + return config + }, } module.exports = nextConfig diff --git a/package.json b/package.json index a95e24a..95ab589 100644 --- a/package.json +++ b/package.json @@ -29,5 +29,10 @@ "eslint-plugin-react-hooks": "^4.6.0", "postcss": "^8.4.28", "tailwindcss": "^3.3.3" - } + }, + "overrides": { + "cacheable-request": { + "keyv": "npm:@keyvhq/core@~1.6.6" + } + } } From 73d6f74ddcd049dfd73d3e8269823dbe61e0a9b2 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:00:03 -0400 Subject: [PATCH 14/21] Adeed missing keys --- components/Sidebar.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index aa2a2b0..f11b44e 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -93,6 +93,7 @@ export default function Sidebar(props: { pageId: string; }) { menuItemLink }) => (
    {footerItems.map(({ menuItemText, menuItemLink }) => ( - + ))}
    ( Date: Tue, 26 Sep 2023 13:20:52 -0400 Subject: [PATCH 15/21] Fix vertcal scroll. Fix message input styling --- app/history/history-client.tsx | 4 ++-- app/pub-sub/pubsub-client.tsx | 6 +----- components/logger.tsx | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx index 1d62ddb..1d920de 100644 --- a/app/history/history-client.tsx +++ b/app/history/history-client.tsx @@ -47,9 +47,9 @@ export default function Presence() {
    Important: You need to publish at least 1 message from the  - + Pub/Sub Channels example - +  to see history log.
    diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx index ba87a7d..782fd77 100644 --- a/app/pub-sub/pubsub-client.tsx +++ b/app/pub-sub/pubsub-client.tsx @@ -54,11 +54,7 @@ function PubSubMessages() {
    Message text
    -
    -
    - setMessageText(e.target.value)} /> -
    -
    + setMessageText(e.target.value)} />
    diff --git a/components/logger.tsx b/components/logger.tsx index 660d892..a83905c 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -27,7 +27,7 @@ export default function Logger({ logEntries }: LoggingProps) {
    -
    +
      { From 0dc11e15dd0a41f4a127a1fa4a44974a67131f13 Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:28:59 -0400 Subject: [PATCH 16/21] Bettering log scroll behavior --- components/logger.tsx | 55 ++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/components/logger.tsx b/components/logger.tsx index a83905c..9b7cba5 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -15,38 +15,35 @@ export type LoggingProps = { export default function Logger({ logEntries }: LoggingProps) { return (
      -
      - Message log +
      + Message log +
      +
      +
      +
      + Red + Yellow + Green
      -
      -
      -
      - Red - Yellow - Green -
      -
      +
      -
      -
      -
        - { - // Show the newest log entry at the top - logEntries.sort((a: LogEntry, b: LogEntry) => { - return b.timestamp.getTime() - a.timestamp.getTime() - }).map((logEntry: LogEntry, index: number) => { - return ( -
      • - {index+1}  {logEntry.message} -
      • - )} - ) - } -
      -
      -
      +
      +
      +
        + { + // Show the newest log entry at the top + logEntries.map((logEntry: LogEntry, index: number) => { + return ( +
      • + {index+1}  {logEntry.message} +
      • + )} + ) + } +
      - +
      +
      ) } \ No newline at end of file From 18397f0445f818db0e3144665ecc211764fa292b Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:56:24 -0400 Subject: [PATCH 17/21] Fixed nextjs logo SVG --- public/assets/NextjsLogo.svg | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/public/assets/NextjsLogo.svg b/public/assets/NextjsLogo.svg index f927208..4f8e1b7 100644 --- a/public/assets/NextjsLogo.svg +++ b/public/assets/NextjsLogo.svg @@ -1,3 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + From bcdc8d0a326ab380b557c2a0169b0d9584fd0f7c Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 16:13:00 -0400 Subject: [PATCH 18/21] Replace next book with manrope --- app/authentication/authentication-client.tsx | 4 +-- app/global.css | 2 +- app/history/history-client.tsx | 8 +++--- app/page.tsx | 26 ++++++++++---------- app/presence/presence-client.tsx | 6 ++--- app/pub-sub/pubsub-client.tsx | 10 ++++---- components/FooterItem.tsx | 2 +- components/MenuItem.tsx | 2 +- components/SampleHeader.tsx | 4 +-- components/logger.tsx | 2 +- package-lock.json | 14 ++++++++++- package.json | 4 +-- tailwind.config.js | 7 ++---- 13 files changed, 50 insertions(+), 41 deletions(-) diff --git a/app/authentication/authentication-client.tsx b/app/authentication/authentication-client.tsx index 93d34f7..24043f2 100644 --- a/app/authentication/authentication-client.tsx +++ b/app/authentication/authentication-client.tsx @@ -16,7 +16,7 @@ export default function Authentication() {
      -
      +
      Authenticate and establish a persistant bi-directional connection to the Ably platform.
      @@ -60,7 +60,7 @@ const ConnectionStatus = () => {
      -
      +
      diff --git a/app/global.css b/app/global.css index 18be11b..39df25f 100644 --- a/app/global.css +++ b/app/global.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css?family=NEXT+Book:"); +@import url("https://fonts.googleapis.com/css2?family=Manrope"); @tailwind base; @tailwind components; @tailwind utilities; \ No newline at end of file diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx index 1d920de..18a7e2e 100644 --- a/app/history/history-client.tsx +++ b/app/history/history-client.tsx @@ -15,7 +15,7 @@ export default function Presence() {
      -
      +
      Retrieve a history of messages that have been published to a channel. Messages are only stored for 2 minutes by default. In order for them to be stored for longer you should enable the  @@ -44,7 +44,7 @@ export default function Presence() { alt="Alert" />
      -
      +
      Important: You need to publish at least 1 message from the  @@ -90,7 +90,7 @@ function HistoryMessages() { return ( <>
      -
      +
      history
      @@ -105,7 +105,7 @@ function HistoryMessages() {
      -
      +
      realtime
      diff --git a/app/page.tsx b/app/page.tsx index 818f7a7..2d26e26 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -37,7 +37,7 @@ const Home = () => { alt="Next.js" />
      -
      +
      At Ably we are big fans of Next.js  @@ -62,19 +62,19 @@ const Home = () => { />
      -
      +
      Authentication
      -
      +
      Token Authentication is the recommended approach for auth with Ably.
      -
      +
      Explore now
      @@ -105,19 +105,19 @@ const Home = () => { />
      -
      +
      Pub/Sub Channels
      -
      +
      Pub/Sub (Publish/Subscribe) with Ably lets you publish messages on channels and subscribe to channels to receive messages.
      -
      +
      Explore now
      @@ -150,12 +150,12 @@ const Home = () => { />
      -
      +
      Presence
      -
      +
      Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a @@ -163,7 +163,7 @@ const Home = () => {
      -
      +
      History
      -
      +
      Retrieve a history of messages that have been published to a channel.
      -
      +
      Explore now
      diff --git a/app/presence/presence-client.tsx b/app/presence/presence-client.tsx index 3bf3944..eaa49c8 100644 --- a/app/presence/presence-client.tsx +++ b/app/presence/presence-client.tsx @@ -23,7 +23,7 @@ export default function Presence() {
      -
      +
      Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when @@ -38,7 +38,7 @@ export default function Presence() { ) : (
      -
      +
      @@ -69,7 +69,7 @@ const PresenceMessages: FC = ({toggle}): ReactElement => {
      -
      +
      diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx index 782fd77..d7d5921 100644 --- a/app/pub-sub/pubsub-client.tsx +++ b/app/pub-sub/pubsub-client.tsx @@ -14,7 +14,7 @@ export default function PubSubClient() {
      -
      +
      Publish messages on channels and subscribe to channels to receive messages. Click Publish from Client to publish a message on a channel from the web browser client. Click Publish from Server to publish a message from a serverless function.
      @@ -51,18 +51,18 @@ function PubSubMessages() { return ( <>
      -
      +
      Message text
      - setMessageText(e.target.value)} /> + setMessageText(e.target.value)} />
      -
      +
      -
      +
      diff --git a/components/FooterItem.tsx b/components/FooterItem.tsx index b85aa0b..97f8d9c 100644 --- a/components/FooterItem.tsx +++ b/components/FooterItem.tsx @@ -2,7 +2,7 @@ export default function FooterItem(props : { menuItemText:string, menuItemLink:s return (
      - -
      +
      {props.sampleName}
      -
      +
      View docs
      diff --git a/components/logger.tsx b/components/logger.tsx index 9b7cba5..4d8b1b9 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -15,7 +15,7 @@ export type LoggingProps = { export default function Logger({ logEntries }: LoggingProps) { return (
      -
      +
      Message log
      diff --git a/package-lock.json b/package-lock.json index 0e8b10b..704ff91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "dotenv": "^16.0.3", "eslint": "8.50.0", "flowbite": "^1.8.1", - "flowbite-react": "^0.6.0", + "flowbite-react": "^0.6.1", "next": "^13.5.3", "random-names-generator": "^1.0.2", "react": "^18.2.0", @@ -1104,6 +1104,18 @@ "node": ">=8" } }, + "node_modules/cacheable-request/node_modules/keyv": { + "name": "@keyvhq/core", + "version": "1.6.26", + "resolved": "https://registry.npmjs.org/@keyvhq/core/-/core-1.6.26.tgz", + "integrity": "sha512-0jy/fOVCYdo3MImM3yjdHuFZNkycPmEAq0v+UGt0dRltnXccgQ+7vCdCNbLpgP3688g5Mw8L+0vcRt5MK53UPA==", + "dependencies": { + "json-buffer": "~3.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", diff --git a/package.json b/package.json index 95ab589..88b3cac 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "dotenv": "^16.0.3", "eslint": "8.50.0", "flowbite": "^1.8.1", - "flowbite-react": "^0.6.0", + "flowbite-react": "^0.6.1", "next": "^13.5.3", "random-names-generator": "^1.0.2", "react": "^18.2.0", @@ -34,5 +34,5 @@ "cacheable-request": { "keyv": "npm:@keyvhq/core@~1.6.6" } - } + } } diff --git a/tailwind.config.js b/tailwind.config.js index fb67516..c48d434 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,8 +1,6 @@ /** @type {import('tailwindcss').Config} */ module.exports = { content: [ - "./node_modules/flowbite-react/**/*.js", - "./app/**/*.{js,ts,jsx,tsx,mdx}", "./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", @@ -12,10 +10,9 @@ module.exports = { ], theme: { fontFamily: { - "next-book": "'NEXT Book', sans-serif", + "manrope": "Manrope, sans-serif", }, extend: {}, - }, - plugins: [require("flowbite/plugin")], + } } From 656f57c108f714fff3122ec0a78b8b65eb4f83cf Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 16:27:29 -0400 Subject: [PATCH 19/21] Fix nextjs svg casing --- app/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/page.tsx b/app/page.tsx index 2d26e26..8967a46 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -33,7 +33,7 @@ const Home = () => { Next.js
      From c17b7a2c5e9fb485086eb67c95ddd53b98dd97cb Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Tue, 26 Sep 2023 17:12:54 -0400 Subject: [PATCH 20/21] Added scrollbar styling --- components/logger.tsx | 2 +- package-lock.json | 12 ++++++++++++ package.json | 1 + tailwind.config.js | 5 ++++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/components/logger.tsx b/components/logger.tsx index 4d8b1b9..151f8f7 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -27,7 +27,7 @@ export default function Logger({ logEntries }: LoggingProps) {
      -
      +
        { diff --git a/package-lock.json b/package-lock.json index 704ff91..af0bbc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "random-names-generator": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", + "tailwind-scrollbar": "^3.0.5", "typescript": "5.2.2" }, "devDependencies": { @@ -4271,6 +4272,17 @@ "url": "https://github.com/sponsors/dcastil" } }, + "node_modules/tailwind-scrollbar": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.0.5.tgz", + "integrity": "sha512-0ZwxTivevqq9BY9fRP9zDjHl7Tu+J5giBGbln+0O1R/7nHtBUKnjQcA1aTIhK7Oyjp6Uc/Dj6/dn8Dq58k5Uww==", + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "3.x" + } + }, "node_modules/tailwindcss": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", diff --git a/package.json b/package.json index 88b3cac..0f24bab 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "random-names-generator": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", + "tailwind-scrollbar": "^3.0.5", "typescript": "5.2.2" }, "devDependencies": { diff --git a/tailwind.config.js b/tailwind.config.js index c48d434..8dcccd2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -13,6 +13,9 @@ module.exports = { "manrope": "Manrope, sans-serif", }, extend: {}, - } + }, + plugins: [ + require('tailwind-scrollbar'), + ], } From b53fe039dbd5d0d80895d44a00f56df0b3b4641e Mon Sep 17 00:00:00 2001 From: ablydevin <136481955+ablydevin@users.noreply.github.com> Date: Wed, 27 Sep 2023 15:01:50 -0400 Subject: [PATCH 21/21] Fixing raised design issues --- app/authentication/authentication-client.tsx | 14 +- app/authentication/page.tsx | 8 +- app/global.css | 2 +- app/history/history-client.tsx | 122 +++--- app/history/page.tsx | 8 +- app/layout.tsx | 8 +- app/page.tsx | 368 ++++++++++--------- app/presence/page.tsx | 8 +- app/presence/presence-client.tsx | 26 +- app/pub-sub/page.tsx | 8 +- app/pub-sub/pubsub-client.tsx | 16 +- components/MenuItem.tsx | 13 +- components/SampleHeader.tsx | 11 +- components/Sidebar.tsx | 86 ++--- components/SocialItem.tsx | 14 +- components/logger.tsx | 13 +- public/assets/icon-social-discord-col.svg | 3 + public/assets/icon-social-github-col.svg | 3 + public/assets/icon-social-linkedin-col.svg | 3 + public/assets/icon-social-x-col.svg | 3 + tailwind.config.js | 9 +- 21 files changed, 353 insertions(+), 393 deletions(-) create mode 100644 public/assets/icon-social-discord-col.svg create mode 100644 public/assets/icon-social-github-col.svg create mode 100644 public/assets/icon-social-linkedin-col.svg create mode 100644 public/assets/icon-social-x-col.svg diff --git a/app/authentication/authentication-client.tsx b/app/authentication/authentication-client.tsx index 24043f2..323ec7f 100644 --- a/app/authentication/authentication-client.tsx +++ b/app/authentication/authentication-client.tsx @@ -14,13 +14,15 @@ export default function Authentication() { return ( -
        - -
        - Authenticate and establish a persistant bi-directional connection to the Ably platform. +
        +
        + +
        + Authenticate and establish a persistant bi-directional connection to the Ably platform. +
        +
        - ) } @@ -65,7 +67,7 @@ const ConnectionStatus = () => {
      - + ) } \ No newline at end of file diff --git a/app/authentication/page.tsx b/app/authentication/page.tsx index 1a0d294..75f3cfe 100644 --- a/app/authentication/page.tsx +++ b/app/authentication/page.tsx @@ -16,14 +16,12 @@ const Authentication = () => { const pageId = "Authentication"; return ( -
      -
      + <> -
      +
      -
      -
      + ) }; diff --git a/app/global.css b/app/global.css index 39df25f..553c0ba 100644 --- a/app/global.css +++ b/app/global.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Manrope"); +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@500&family=Manrope:wght@400;700&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; \ No newline at end of file diff --git a/app/history/history-client.tsx b/app/history/history-client.tsx index 18a7e2e..e6a3558 100644 --- a/app/history/history-client.tsx +++ b/app/history/history-client.tsx @@ -13,49 +13,43 @@ export default function Presence() { return ( -
      - -
      - Retrieve a history of messages that have been published to a channel. - Messages are only stored for 2 minutes by default. In order for them - to be stored for longer you should enable the  - -    - - - Persist all messages - -    - channel rule -  for - the   - - status-updates - -  channel in your Ably app   +
      +
      +
      + +
      + Retrieve a history of messages that have been published to a channel. + Messages are only stored for 2 minutes by default. In order for them + to be stored for longer you should enable the  + + Persist all messages +   + channel rule +  for + the  + + status-updates + +  channel in your Ably app   +
      +
      +
      +
      + Alert +
      +
      + Important: You need to + publish at least 1 message from the  + + Pub/Sub Channels example + +  to see history log. +
      + +
      +
      -
      -
      - Alert -
      -
      - Important: You need to - publish at least 1 message from the  - - Pub/Sub Channels example - -  to see history log. -
      -
      - - - ) } @@ -89,36 +83,36 @@ function HistoryMessages() { return ( <> -
      -
      +
      +
      history
      -
      -
      { - historicalLogs.length > 0? - - : -

      No historical messages found

      - } -
      -
      + historicalLogs.length > 0? ( + + ) : ( +
      +
      +

      No historical messages found

      +
      +
      + )} +
      -
      -
      +
      +
      realtime
      -
      -
      - { - realtimeLogs.length > 0? - - : -

      No realtime messages received yet

      - } - + { + realtimeLogs.length > 0? ( + + ) : ( +
      +
      +

      No realtime messages received yet

      +
      -
      + )}
      //
      diff --git a/app/history/page.tsx b/app/history/page.tsx index 46097a1..b7692e4 100644 --- a/app/history/page.tsx +++ b/app/history/page.tsx @@ -18,14 +18,12 @@ const History = () => { const pageId = "History" return ( -
      -
      + <> -
      +
      -
      -
      + ) } diff --git a/app/layout.tsx b/app/layout.tsx index 466fea5..9a7ca3f 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -13,7 +13,13 @@ export default function RootLayout({ }) { return ( - {children} + +
      +
      + {children} +
      +
      + ) } \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 8967a46..9747200 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -11,212 +11,214 @@ const Home = () => { const pageId = "Start"; return ( -
      -
      - -
      -
      - AblyLogo -
      + <> + +
      +
      +
      +
      plus +
      + plus +
      + Next.js
      - Next.js -
      -
      - - At Ably we are big fans of Next.js  - - / This application demonstrates using some of the Ably fundamentals - with Next.js. You can build features and use cases upon these - fundamentals such as notifications, activity streams, chat, realtime - visualisations and dashboards, and collaborative multiplayer - experiences. -
      -
      -
      -
      -
      -
      -
      -
      - Authentication +
      + + At Ably we are big fans of Next.js  + + / This application demonstrates using some of the Ably fundamentals + with Next.js. You can build features and use cases upon these + fundamentals such as notifications, activity streams, chat, realtime + visualisations and dashboards, and collaborative multiplayer + experiences. +
      +
      +
      +
      +
      +
      +
      +
      + Authentication +
      +
      +
      + Authentication
      -
      - Authentication -
      -
      -
      -
      - Token Authentication is the recommended approach for auth - with Ably. -
      -
      - -
      -
      -
      -
      -
      -
      -
      -
      +
      +
      + Token Authentication is the recommended approach for auth + with Ably. +
      +
      +
      -
      - Pub/Sub Channels -
      -
      -
      -
      - Pub/Sub (Publish/Subscribe) with Ably lets you publish - messages on channels and subscribe to channels to receive - messages. -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - Presence +
      +
      +
      +
      +
      + Pub/Sub Channels +
      +
      +
      + Pub/Sub Channels
      -
      - Presence -
      -
      -
      -
      - Presence with Ably allows you to keep track of devices that - are present on a channel. This is great for tracking if a - device is online or offline or indicating if a user is in a - chat room when using Ably for Chat. -
      - -
      -
      -
      -
      -
      - History +
      +
      +
      +
      +
      +
      + Presence +
      +
      +
      + Presence
      -
      - History +
      +
      + Presence with Ably allows you to keep track of devices that + are present on a channel. This is great for tracking if a + device is online or offline or indicating if a user is in a + chat room when using Ably for Chat. +
      +
      -
      -
      - Retrieve a history of messages that have been published to a - channel. +
      +
      +
      +
      +
      +
      + History +
      +
      +
      + History +
      -
      - -
      - Explore now -
      -
      -
      - Explore Now -
      -
      +
      +
      + Retrieve a history of messages that have been published to a + channel. +
      +
      @@ -225,7 +227,7 @@ const Home = () => {
      -
      + ) } ; diff --git a/app/presence/page.tsx b/app/presence/page.tsx index 3310840..467c78e 100644 --- a/app/presence/page.tsx +++ b/app/presence/page.tsx @@ -18,14 +18,12 @@ const Presence = () => { const pageId = "Presence" return ( -
      -
      + <> -
      +
      -
      -
      + ) } diff --git a/app/presence/presence-client.tsx b/app/presence/presence-client.tsx index eaa49c8..9952506 100644 --- a/app/presence/presence-client.tsx +++ b/app/presence/presence-client.tsx @@ -21,9 +21,10 @@ export default function Presence() { return ( -
      +
      +
      -
      +
      Presence with Ably allows you to keep track of devices that are present on a channel. This is great for tracking if a device is online or offline or indicating if a user is in a chat room when @@ -33,16 +34,17 @@ export default function Presence() {  to see more users enter and leave the presence channel.
      + { isOnline ? ( + + ) : ( +
      +
      + +
      +
      + ) }
      - { isOnline ? ( - - ) : ( -
      -
      - -
      -
      - ) } +
      ) } @@ -74,7 +76,7 @@ const PresenceMessages: FC = ({toggle}): ReactElement => {
      - + ) } diff --git a/app/pub-sub/page.tsx b/app/pub-sub/page.tsx index 1cd2f32..c90a892 100644 --- a/app/pub-sub/page.tsx +++ b/app/pub-sub/page.tsx @@ -16,14 +16,12 @@ const PubSub = () => { const pageId="PubSubChannels" return ( -
      -
      + <> -
      +
      -
      -
      + ) } diff --git a/app/pub-sub/pubsub-client.tsx b/app/pub-sub/pubsub-client.tsx index d7d5921..da0ccd5 100644 --- a/app/pub-sub/pubsub-client.tsx +++ b/app/pub-sub/pubsub-client.tsx @@ -12,13 +12,15 @@ export default function PubSubClient() { return ( -
      - -
      - Publish messages on channels and subscribe to channels to receive messages. Click Publish from Client to publish a message on a channel from the web browser client. Click Publish from Server to publish a message from a serverless function. -
      +
      +
      + +
      + Publish messages on channels and subscribe to channels to receive messages. Click Publish from Client to publish a message on a channel from the web browser client. Click Publish from Server to publish a message from a serverless function. +
      + +
      - ) } @@ -68,7 +70,7 @@ function PubSubMessages() {
      - + ) } \ No newline at end of file diff --git a/components/MenuItem.tsx b/components/MenuItem.tsx index cc83f5d..bd75b74 100644 --- a/components/MenuItem.tsx +++ b/components/MenuItem.tsx @@ -6,18 +6,9 @@ interface MenuItemProps { export default function MenuItem(props:MenuItemProps) { return ( -
      +
      -
      +
      {props.menuItemText}
      diff --git a/components/SampleHeader.tsx b/components/SampleHeader.tsx index f903494..94912bc 100644 --- a/components/SampleHeader.tsx +++ b/components/SampleHeader.tsx @@ -1,15 +1,10 @@ export default function SampleHeader(props: { sampleName:string, sampleIcon:string, sampleDocsLink:string }) { return ( -
      +
      -
      +
      - {props.sampleName} + {props.sampleName}
      diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index f11b44e..cfd44f9 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -56,36 +56,35 @@ export default function Sidebar(props: { pageId: string; }) { { menuItemText: "X (Twitter)", menuItemLink: 'https://twitter.com/ablyrealtime/', - menuItemIcon: 'XTwitterLogo.svg' + menuItemIcon: , + menuItemFillSyles: 'fill-black' }, { menuItemText: "Github", menuItemLink: 'https://github.com/ably/', - menuItemIcon: 'GithubLogo.svg' + menuItemIcon: , + menuItemFillSyles: 'fill-black' }, { menuItemText: "LinkedIn", menuItemLink: 'https://linkedin.com/company/ably-realtime/', - menuItemIcon: 'LinkedInLogo.svg' + menuItemIcon: , + menuItemFillSyles: 'fill-black hover:fill-linkedin' }, { menuItemText: "Discord", menuItemLink: 'http://go.ably.com/discord', - menuItemIcon: 'DiscordLogo.svg' + menuItemIcon: , + menuItemFillSyles: 'fill-black hover:fill-discord' }, ]; return( -
      -
      - AblyLogoWithText -
      +
      +
      + AblyLogoWithText +
      {menuItems.map( ({ menuItemId, @@ -102,70 +101,27 @@ export default function Sidebar(props: { pageId: string; }) { )}
      -
      - Svg Asset 17 -
      +
      + Rule +
      {footerItems.map(({ menuItemText, menuItemLink }) => ( ))}
      - Svg Asset 16 -
      -{/* -
      -
      - X (Twitter) -
      - LinkedIn -
      -
      - Github -
      - Discord -
      -
      */} - + Rule +
      {socialItems.map( ({ menuItemText, menuItemIcon, - menuItemLink + menuItemLink, + menuItemFillSyles }) => ( ) )} diff --git a/components/SocialItem.tsx b/components/SocialItem.tsx index 883e7af..b822998 100644 --- a/components/SocialItem.tsx +++ b/components/SocialItem.tsx @@ -1,13 +1,11 @@ -export default function SocialItem(props : { menuItemText:string, menuItemIcon:string, menuItemLink:string }) { + +export default function SocialItem(props : { menuItemIconSource:any, menuItemLink:string, menuItemFillSyles:string }) { return ( -
      + ) diff --git a/components/logger.tsx b/components/logger.tsx index 151f8f7..be38fbb 100644 --- a/components/logger.tsx +++ b/components/logger.tsx @@ -9,21 +9,24 @@ export class LogEntry { } export type LoggingProps = { - logEntries: Array + logEntries: Array, + displayHeader: boolean } -export default function Logger({ logEntries }: LoggingProps) { +export default function Logger({ logEntries, displayHeader }: LoggingProps) { return (
      + { displayHeader &&
      Message log
      + }
      - Red - Yellow - Green + Red + Yellow + Green
      diff --git a/public/assets/icon-social-discord-col.svg b/public/assets/icon-social-discord-col.svg new file mode 100644 index 0000000..49dd54c --- /dev/null +++ b/public/assets/icon-social-discord-col.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/icon-social-github-col.svg b/public/assets/icon-social-github-col.svg new file mode 100644 index 0000000..926d79c --- /dev/null +++ b/public/assets/icon-social-github-col.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/icon-social-linkedin-col.svg b/public/assets/icon-social-linkedin-col.svg new file mode 100644 index 0000000..a4eb5e9 --- /dev/null +++ b/public/assets/icon-social-linkedin-col.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/icon-social-x-col.svg b/public/assets/icon-social-x-col.svg new file mode 100644 index 0000000..63b2eed --- /dev/null +++ b/public/assets/icon-social-x-col.svg @@ -0,0 +1,3 @@ + + + diff --git a/tailwind.config.js b/tailwind.config.js index 8dcccd2..0e77f56 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -11,11 +11,16 @@ module.exports = { theme: { fontFamily: { "manrope": "Manrope, sans-serif", + "jetbrains-mono": "'JetBrains Mono', monospace", + }, + extend: { + colors: { + 'linkedin':'#1269BF', + 'discord':'#5B64EA' + } }, - extend: {}, }, plugins: [ require('tailwind-scrollbar'), ], } -