diff --git a/.prettierignore b/.prettierignore index 513f7fdc..deb421f2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -23,3 +23,6 @@ yarn.lock apps/next/tsconfig.json *.timestamp-*.mjs + +# supabase database types +apps/next/src/lib/database.types.ts diff --git a/apps/next/package.json b/apps/next/package.json index a57ec0ab..b429f748 100644 --- a/apps/next/package.json +++ b/apps/next/package.json @@ -17,26 +17,27 @@ "dependencies": { "@emiljohansson/random-string": "1.1.2", "@faker-js/faker": "7.4.0", + "@nanostores/react": "0.7.1", "@radix-ui/react-accessible-icon": "1.0.2", "@radix-ui/react-label": "1.0.0", "@radix-ui/react-progress": "1.0.0", "@radix-ui/react-select": "1.0.0", "@radix-ui/react-tabs": "1.0.0", + "@supabase/ssr": "0.0.10", "@vercel/analytics": "1.1.1", "@vercel/kv": "1.0.0", - "@vercel/postgres": "0.5.1", "crypto-js": "4.2.0", "framer-motion": "6.2.3", "jsonwebtoken": "9.0.2", "just-range": "4.1.1", "lib": "workspace:*", + "nanostores": "0.9.5", "next": "14.0.4", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "4.7.1", "swr": "1.3.0", - "ui": "workspace:*", - "zustand": "4.3.8" + "ui": "workspace:*" }, "devDependencies": { "@types/crypto-js": "4.1.1", diff --git a/apps/next/public/images/logo/android-chrome-192x192.png b/apps/next/public/images/logo/android-chrome-192x192.png old mode 100755 new mode 100644 index 4d345430..9f16a012 Binary files a/apps/next/public/images/logo/android-chrome-192x192.png and b/apps/next/public/images/logo/android-chrome-192x192.png differ diff --git a/apps/next/public/images/logo/android-chrome-512x512.png b/apps/next/public/images/logo/android-chrome-512x512.png old mode 100755 new mode 100644 index 9aad9b2d..7fa62755 Binary files a/apps/next/public/images/logo/android-chrome-512x512.png and b/apps/next/public/images/logo/android-chrome-512x512.png differ diff --git a/apps/next/public/images/logo/apple-touch-icon.png b/apps/next/public/images/logo/apple-touch-icon.png old mode 100755 new mode 100644 index 083e3cb0..0ad4235f Binary files a/apps/next/public/images/logo/apple-touch-icon.png and b/apps/next/public/images/logo/apple-touch-icon.png differ diff --git a/apps/next/public/images/logo/favicon-16x16.png b/apps/next/public/images/logo/favicon-16x16.png old mode 100755 new mode 100644 index 2f01e867..47e66f9e Binary files a/apps/next/public/images/logo/favicon-16x16.png and b/apps/next/public/images/logo/favicon-16x16.png differ diff --git a/apps/next/public/images/logo/favicon-32x32.png b/apps/next/public/images/logo/favicon-32x32.png old mode 100755 new mode 100644 index 7957c461..92fc2977 Binary files a/apps/next/public/images/logo/favicon-32x32.png and b/apps/next/public/images/logo/favicon-32x32.png differ diff --git a/apps/next/public/images/logo/favicon.ico b/apps/next/public/images/logo/favicon.ico old mode 100755 new mode 100644 index 19ad510c..32604c5c Binary files a/apps/next/public/images/logo/favicon.ico and b/apps/next/public/images/logo/favicon.ico differ diff --git a/apps/next/public/images/logo/old/android-chrome-192x192.png b/apps/next/public/images/logo/old/android-chrome-192x192.png new file mode 100755 index 00000000..4d345430 Binary files /dev/null and b/apps/next/public/images/logo/old/android-chrome-192x192.png differ diff --git a/apps/next/public/images/logo/old/android-chrome-512x512.png b/apps/next/public/images/logo/old/android-chrome-512x512.png new file mode 100755 index 00000000..9aad9b2d Binary files /dev/null and b/apps/next/public/images/logo/old/android-chrome-512x512.png differ diff --git a/apps/next/public/images/logo/old/apple-touch-icon.png b/apps/next/public/images/logo/old/apple-touch-icon.png new file mode 100755 index 00000000..083e3cb0 Binary files /dev/null and b/apps/next/public/images/logo/old/apple-touch-icon.png differ diff --git a/apps/next/public/images/logo/old/favicon-16x16.png b/apps/next/public/images/logo/old/favicon-16x16.png new file mode 100755 index 00000000..2f01e867 Binary files /dev/null and b/apps/next/public/images/logo/old/favicon-16x16.png differ diff --git a/apps/next/public/images/logo/old/favicon-32x32.png b/apps/next/public/images/logo/old/favicon-32x32.png new file mode 100755 index 00000000..7957c461 Binary files /dev/null and b/apps/next/public/images/logo/old/favicon-32x32.png differ diff --git a/apps/next/public/images/logo/old/favicon.ico b/apps/next/public/images/logo/old/favicon.ico new file mode 100755 index 00000000..19ad510c Binary files /dev/null and b/apps/next/public/images/logo/old/favicon.ico differ diff --git a/apps/next/public/images/logo/old/site.webmanifest b/apps/next/public/images/logo/old/site.webmanifest new file mode 100755 index 00000000..4815026d --- /dev/null +++ b/apps/next/public/images/logo/old/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/images/logo/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/images/logo/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/apps/next/public/images/logo/site.webmanifest b/apps/next/public/images/logo/site.webmanifest old mode 100755 new mode 100644 index 4815026d..45dc8a20 --- a/apps/next/public/images/logo/site.webmanifest +++ b/apps/next/public/images/logo/site.webmanifest @@ -1,19 +1 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/images/logo/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/images/logo/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} \ No newline at end of file +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/apps/next/public/images/profile2.jpeg b/apps/next/public/images/profile2.jpeg new file mode 100644 index 00000000..a4d405c2 Binary files /dev/null and b/apps/next/public/images/profile2.jpeg differ diff --git a/apps/next/src/app/CommandMenu.tsx b/apps/next/src/app/CommandMenu.tsx index 41163dbf..6875dd11 100644 --- a/apps/next/src/app/CommandMenu.tsx +++ b/apps/next/src/app/CommandMenu.tsx @@ -1,31 +1,26 @@ 'use client' -import type { Project } from './types' - import { PropsWithChildren, useEffect, useMemo, useRef, useState } from 'react' import { useRouter } from 'next/navigation' -import { FiSearch } from 'react-icons/fi' -import { create } from 'zustand' import { useClickOutside } from '@/hooks/useClickOutside' +import { Tables } from '@/lib/database.types' +import { action, atom } from 'nanostores' +import { useStore } from '@nanostores/react' -type State = { - commandMenuIsOpen: boolean -} - -type Action = { - openCommandMenu: () => void - closeCommandMenu: () => void -} +export const $commandMenuIsOpen = atom(false) +export const openCommandMenu = action( + $commandMenuIsOpen, + 'openCommandMenu', + () => $commandMenuIsOpen.set(true), +) +export const closeCommandMenu = action( + $commandMenuIsOpen, + 'closeCommandMenu', + () => $commandMenuIsOpen.set(false), +) -export const useCommandMenu = create((set) => ({ - commandMenuIsOpen: false, - openCommandMenu: () => set(() => ({ commandMenuIsOpen: true })), - closeCommandMenu: () => set(() => ({ commandMenuIsOpen: false })), -})) - -export function CommandMenu({ projects }: { projects: Project[] }) { - const { commandMenuIsOpen, openCommandMenu, closeCommandMenu } = - useCommandMenu() +export function CommandMenu({ projects }: { projects: Tables<'project'>[] }) { + const commandMenuIsOpen = useStore($commandMenuIsOpen) const initList = useMemo( () => [ { @@ -33,7 +28,7 @@ export function CommandMenu({ projects }: { projects: Project[] }) { title: 'Home', description: 'Return to the home page.', test: 'home-page', - } as Project, + } as Tables<'project'>, ...projects, ], [], @@ -43,7 +38,7 @@ export function CommandMenu({ projects }: { projects: Project[] }) { const [list, setList] = useState(initList) const fieldRef = useRef(null) - const handleAction = (action?: Project) => { + const handleAction = (action?: Tables<'project'>) => { if (!action) return setList([...initList]) closeCommandMenu() @@ -84,46 +79,42 @@ export function CommandMenu({ projects }: { projects: Project[] }) { return () => document.removeEventListener('keydown', onKeyDown) }, [selectedIndex, list, commandMenuIsOpen]) + if (!commandMenuIsOpen) return null + return ( - <> - {commandMenuIsOpen && ( - -
- - { - setSelectedIndex(0) - setList( - initList.filter( - ({ title }) => - title.toLowerCase().indexOf(event.currentTarget.value) > - -1, - ), - ) - }} - /> -
- {selectedIndex} -
- {list.map((project, index) => ( -
setSelectedIndex(index)} - onClick={() => handleAction(list[index])} - > - {project.title} -
- ))} + +
+ { + setSelectedIndex(0) + setList( + initList.filter( + ({ title }) => + title.toLowerCase().indexOf(event.currentTarget.value) > -1, + ), + ) + }} + /> +
+ {selectedIndex} +
+ {list.map((project, index) => ( +
setSelectedIndex(index)} + onClick={() => handleAction(list[index])} + > + {project.title}
- - )} - + ))} +
+
) } @@ -134,16 +125,18 @@ const Modal = ({ const rootRef = useClickOutside(onClose) return ( -
-
+ <> +
-
{children}
+
+ {children} +
-
+ ) } diff --git a/apps/next/src/app/Content.tsx b/apps/next/src/app/Content.tsx index eaeb9532..090506cf 100644 --- a/apps/next/src/app/Content.tsx +++ b/apps/next/src/app/Content.tsx @@ -1,15 +1,13 @@ 'use client' -import type { Project } from './types' - +import type { Tables } from '@/lib/database.types' import Link from 'next/link' import { AccessibleIcon } from '@radix-ui/react-accessible-icon' import { FiCommand, FiExternalLink } from 'react-icons/fi' import { GrGithub } from 'react-icons/gr' -import { useCommandMenu } from './CommandMenu' +import { openCommandMenu } from './CommandMenu' -export function Content({ projects }: { projects: Project[] }) { - const { openCommandMenu } = useCommandMenu() +export function Content({ projects }: { projects: Tables<'project'>[] }) { return ( <>
@@ -48,11 +46,14 @@ export function Content({ projects }: { projects: Project[] }) {
- {projects.map(({ title, href, description, external, test }, index) => ( - - - {title}{' '} - {external && ( - - )} - -

{description}

- - ))} + target={external ? '_blank' : undefined} + data-test={test} + > + + {title}{' '} + {external && ( + + )} + +

+ {description} +

+ + ) + })}
) diff --git a/apps/next/src/app/HeaderCurrentProject.tsx b/apps/next/src/app/HeaderCurrentProject.tsx index 0129aa99..51b10102 100644 --- a/apps/next/src/app/HeaderCurrentProject.tsx +++ b/apps/next/src/app/HeaderCurrentProject.tsx @@ -1,8 +1,10 @@ 'use client' +import type { Tables } from '@/lib/database.types' import { usePathname } from 'next/navigation' import { useEffect, useState } from 'react' -import { Project } from './types' + +type Project = Tables<'project'> export function HeaderCurrentProject({ projects, diff --git a/apps/next/src/app/layout.tsx b/apps/next/src/app/layout.tsx index b81b5fcc..a2dee3ab 100644 --- a/apps/next/src/app/layout.tsx +++ b/apps/next/src/app/layout.tsx @@ -1,6 +1,5 @@ import type { PropsWithChildren } from 'react' import type { Metadata } from 'next' -import type { Project } from './types' import './styles.css' import 'ui/globals.css' @@ -8,12 +7,13 @@ import 'ui/globals.css' import { headers } from 'next/headers' import Link from 'next/link' import Image from 'next/image' -import { sql } from '@vercel/postgres' import { Analytics } from '@vercel/analytics/react' import { CommandMenu } from './CommandMenu' // import { ThemeToggle } from './ThemeToggle' import { HeaderCurrentProject } from './HeaderCurrentProject' import { Inter } from 'next/font/google' +import { getProjects } from '@/lib/supabase' +import { Tables } from '@/lib/database.types' const inter = Inter({ weight: ['400', '500', '700'], subsets: ['latin'] }) @@ -61,8 +61,10 @@ export const metadata: Metadata = { export default async function Layout({ children }: PropsWithChildren) { const headersList = headers() const pathname = headersList.get('x-url-pathname') || '' - const { rows: projects } = await sql`select * from projects` - const currentProject = projects.find((project) => project.href === pathname) + const projects = await getProjects() + const currentProject = (projects as Tables<'project'>[]).find( + (project) => project.href === pathname, + ) // const cookieStore = cookies() // const theme = cookieStore.get('theme') // ${theme?.value} @@ -109,23 +111,24 @@ export default async function Layout({ children }: PropsWithChildren) {
Emil Johansson
{/* */}
{children}
- + diff --git a/apps/next/src/app/page.tsx b/apps/next/src/app/page.tsx index 5b314359..ac4f6dba 100644 --- a/apps/next/src/app/page.tsx +++ b/apps/next/src/app/page.tsx @@ -1,10 +1,8 @@ -import type { Project } from './types' - -import { sql } from '@vercel/postgres' import { Content } from './Content' +import { getProjects } from '@/lib/supabase' export default async function Page() { - const { rows: projects } = await sql`select * from projects` + const projects = await getProjects() - return + return } diff --git a/apps/next/src/app/password-generator/page.tsx b/apps/next/src/app/password-generator/page.tsx index 6b41f1c1..5cab8819 100644 --- a/apps/next/src/app/password-generator/page.tsx +++ b/apps/next/src/app/password-generator/page.tsx @@ -138,7 +138,7 @@ export default function PasswordGeneratorPage() { /> {randomSelection.length}
-
+
= PublicTableNameOrOptions extends { schema: keyof Database } + ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & + Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R + } + ? R + : never + : PublicTableNameOrOptions extends keyof (Database["public"]["Tables"] & + Database["public"]["Views"]) + ? (Database["public"]["Tables"] & + Database["public"]["Views"])[PublicTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never + +export type TablesInsert< + PublicTableNameOrOptions extends + | keyof Database["public"]["Tables"] + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + : never = never +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I + } + ? I + : never + : PublicTableNameOrOptions extends keyof Database["public"]["Tables"] + ? Database["public"]["Tables"][PublicTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never + +export type TablesUpdate< + PublicTableNameOrOptions extends + | keyof Database["public"]["Tables"] + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + : never = never +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U + } + ? U + : never + : PublicTableNameOrOptions extends keyof Database["public"]["Tables"] + ? Database["public"]["Tables"][PublicTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never + +export type Enums< + PublicEnumNameOrOptions extends + | keyof Database["public"]["Enums"] + | { schema: keyof Database }, + EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] + : never = never +> = PublicEnumNameOrOptions extends { schema: keyof Database } + ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] + : PublicEnumNameOrOptions extends keyof Database["public"]["Enums"] + ? Database["public"]["Enums"][PublicEnumNameOrOptions] + : never diff --git a/apps/next/src/lib/supabase.ts b/apps/next/src/lib/supabase.ts new file mode 100644 index 00000000..6b863cec --- /dev/null +++ b/apps/next/src/lib/supabase.ts @@ -0,0 +1,29 @@ +import { createServerClient } from '@supabase/ssr' +import { cookies } from 'next/headers' +import { Database } from './database.types' + +const createClient = () => { + const cookieStore = cookies() + + return createServerClient( + process.env.SUPABASE_URL!, + process.env.SUPABASE_ANON_KEY!, + { + cookies: { + get(name: string) { + return cookieStore.get(name)?.value + }, + }, + }, + ) +} + +export async function getProjects() { + const supabase = createClient() + const { data: projects } = await supabase + .from('project') + .select('*') + .order('id', { ascending: true }) + .eq('enabled', true) + return projects || [] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3259d015..581e65bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,6 +183,9 @@ importers: '@faker-js/faker': specifier: 7.4.0 version: 7.4.0 + '@nanostores/react': + specifier: 0.7.1 + version: 0.7.1(nanostores@0.9.5)(react@18.2.0) '@radix-ui/react-accessible-icon': specifier: 1.0.2 version: 1.0.2(react-dom@18.2.0)(react@18.2.0) @@ -198,15 +201,15 @@ importers: '@radix-ui/react-tabs': specifier: 1.0.0 version: 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@supabase/ssr': + specifier: 0.0.10 + version: 0.0.10(@supabase/supabase-js@2.39.3) '@vercel/analytics': specifier: 1.1.1 version: 1.1.1 '@vercel/kv': specifier: 1.0.0 version: 1.0.0 - '@vercel/postgres': - specifier: 0.5.1 - version: 0.5.1 crypto-js: specifier: 4.2.0 version: 4.2.0 @@ -222,6 +225,9 @@ importers: lib: specifier: workspace:* version: link:../../packages/lib + nanostores: + specifier: 0.9.5 + version: 0.9.5 next: specifier: 14.0.4 version: 14.0.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) @@ -240,9 +246,6 @@ importers: ui: specifier: workspace:* version: link:../../packages/ui - zustand: - specifier: 4.3.8 - version: 4.3.8(react@18.2.0) devDependencies: '@types/crypto-js': specifier: 4.1.1 @@ -1521,12 +1524,6 @@ packages: react: 18.2.0 dev: false - /@neondatabase/serverless@0.6.0: - resolution: {integrity: sha512-qXxBRYN0m2v8kVQBfMxbzNGn2xFAhTXFibzQlE++NfJ56Shz3m7+MyBBtXDlEH+3Wfa6lToDXf1MElocY4sJ3w==} - dependencies: - '@types/pg': 8.6.6 - dev: false - /@next/env@14.0.4: resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} dev: false @@ -2594,6 +2591,12 @@ packages: - encoding dev: false + /@supabase/functions-js@2.1.5: + resolution: {integrity: sha512-BNzC5XhCzzCaggJ8s53DP+WeHHGT/NfTsx2wUSSGKR2/ikLFQTBCDzMvGz/PxYMqRko/LwncQtKXGOYp1PkPaw==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + /@supabase/gotrue-js@1.24.0: resolution: {integrity: sha512-6PVv7mHCFOxLm6TSBfR7hsq/y3CMKpvzePVR+ZWtlFBTjJ2J87g2OYE9bgC61P5TNeZopUXKw93H92yz0MTALw==} dependencies: @@ -2602,6 +2605,19 @@ packages: - encoding dev: false + /@supabase/gotrue-js@2.62.0: + resolution: {integrity: sha512-4eBuZNXGOk7ewqJuHPYMnk8clCtEx6Hfnu6yHLjZlx7w18TqcojcTRUBZagErtpgwwdfzUwKbquexhbrpH/ysw==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + + /@supabase/node-fetch@2.6.15: + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: false + /@supabase/postgrest-js@0.37.4: resolution: {integrity: sha512-x+c2rk1fz9s6f1PrGxCJ0QTUgXPDI0G3ngIqD5sSiXhhCyfl8Q5V92mXl2EYtlDhkiUkjFNrOZFhXVbXOHgvDw==} dependencies: @@ -2610,6 +2626,12 @@ packages: - encoding dev: false + /@supabase/postgrest-js@1.9.2: + resolution: {integrity: sha512-I6yHo8CC9cxhOo6DouDMy9uOfW7hjdsnCxZiaJuIVZm1dBGTFiQPgfMa9zXCamEWzNyWRjZvupAUuX+tqcl5Sw==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + /@supabase/realtime-js@1.7.5: resolution: {integrity: sha512-nXuoxt7NE1NTI+G8WBim1K2gkUC8YE3e9evBUG+t6xwd9Sq+sSOrjcE0qJ8/Y631BCnLzlhX6yhFYQFh1oQDOg==} dependencies: @@ -2619,6 +2641,28 @@ packages: - supports-color dev: false + /@supabase/realtime-js@2.9.3: + resolution: {integrity: sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ==} + dependencies: + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.4 + '@types/ws': 8.5.10 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@supabase/ssr@0.0.10(@supabase/supabase-js@2.39.3): + resolution: {integrity: sha512-eVs7+bNlff8Fd79x8K3Jbfpmf8P8QRA1Z6rUDN+fi4ReWvRBZyWOFfR6eqlsX6vTjvGgTiEqujFSkv2PYW5kbQ==} + peerDependencies: + '@supabase/supabase-js': ^2.33.1 + dependencies: + '@supabase/supabase-js': 2.39.3 + cookie: 0.5.0 + ramda: 0.29.1 + dev: false + /@supabase/storage-js@1.7.3: resolution: {integrity: sha512-jnIZWqOc9TGclOozgX9v/RWGFCgJAyW/yvmauexgRZhWknUXoA4b2i8tj7vfwE0WTvNRuA5JpXID98rfJeSG7Q==} dependencies: @@ -2627,6 +2671,12 @@ packages: - encoding dev: false + /@supabase/storage-js@2.5.5: + resolution: {integrity: sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + /@supabase/supabase-js@1.35.6: resolution: {integrity: sha512-KDRXRr+kdGwruIUizZPALbe5YccMYFVyZJf1sFWKLncaLYSFiM6iKFnqCrNeQ4JFoZZiICkiTl1FUuai62jVpg==} dependencies: @@ -2640,6 +2690,20 @@ packages: - supports-color dev: false + /@supabase/supabase-js@2.39.3: + resolution: {integrity: sha512-NoltJSaJNKDJNutO5sJPAAi5RIWrn1z2XH+ig1+cHDojT6BTN7TvZPNa3Kq3gFQWfO5H1N9El/bCTZJ3iFW2kQ==} + dependencies: + '@supabase/functions-js': 2.1.5 + '@supabase/gotrue-js': 2.62.0 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.9.2 + '@supabase/realtime-js': 2.9.3 + '@supabase/storage-js': 2.5.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@supabase/ui@0.36.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-SdjUf20sCVw0Ap+x4YfGmjMunUz9ZEipc0bwGxj2f5pEWf12qrDQyhhMcoWCWgjWneITfrjFcejV0jA9zTuiEw==} peerDependencies: @@ -2730,7 +2794,7 @@ packages: /@swc/helpers@0.5.2: resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: - tslib: 2.6.2 + tslib: 2.4.1 dev: false /@tailwindcss/typography@0.5.9(tailwindcss@3.4.0): @@ -2839,20 +2903,12 @@ packages: /@types/node@18.0.1: resolution: {integrity: sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==} - /@types/node@18.19.6: - resolution: {integrity: sha512-X36s5CXMrrJOs2lQCdDF68apW4Rfx9ixYMawlepwmE4Anezv/AV2LSpKD1Ub8DAc+urp5bk0BGZ6NtmBitfnsg==} + /@types/node@18.19.7: + resolution: {integrity: sha512-IGRJfoNX10N/PfrReRZ1br/7SQ+2vF/tK3KXNwzXz82D32z5dMQEoOlFew18nLSN+vMNcLY4GrKfzwi/yWI8/w==} dependencies: undici-types: 5.26.5 dev: true - /@types/pg@8.6.6: - resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} - dependencies: - '@types/node': 18.0.1 - pg-protocol: 1.6.0 - pg-types: 2.2.0 - dev: false - /@types/phoenix@1.6.4: resolution: {integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==} dev: false @@ -2899,6 +2955,12 @@ packages: resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} dev: true + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 18.0.1 + dev: false + /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true @@ -3065,16 +3127,6 @@ packages: '@upstash/redis': 1.24.3 dev: false - /@vercel/postgres@0.5.1: - resolution: {integrity: sha512-JKl8QOBIDnifhkxAhIKtY0A5Tb8oWBf2nzZhm0OH7Ffjsl0hGVnDL2w1/FCfpX8xna3JAWM034NGuhZfTFdmiw==} - engines: {node: '>=14.6'} - dependencies: - '@neondatabase/serverless': 0.6.0 - bufferutil: 4.0.8 - utf-8-validate: 6.0.3 - ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) - dev: false - /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3586,7 +3638,7 @@ packages: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + set-function-length: 1.2.0 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -3822,7 +3874,6 @@ packages: /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true /core-js@3.35.0: resolution: {integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==} @@ -3924,7 +3975,7 @@ packages: dependencies: '@cypress/request': 3.0.1 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 18.19.6 + '@types/node': 18.19.7 '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.8 arch: 2.2.0 @@ -6434,8 +6485,8 @@ packages: hasBin: true dev: false - /joi@17.11.0: - resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + /joi@17.11.1: + resolution: {integrity: sha512-671acnrx+w96PCcQOzvm0VYQVwNL2PVgZmDRaFuSsx8sIUmGzYElPw5lU8F3Cr0jOuPs1oM56p7W2a1cdDOwcw==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -7353,26 +7404,6 @@ packages: is-reference: 3.0.2 dev: true - /pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - dev: false - - /pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - dev: false - - /pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - dev: false - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -7524,28 +7555,6 @@ packages: source-map-js: 1.0.2 dev: true - /postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - dev: false - - /postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - dev: false - - /postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - dev: false - - /postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - dependencies: - xtend: 4.0.2 - dev: false - /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -7708,6 +7717,10 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: true + /ramda@0.29.1: + resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} + dev: false + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -8040,11 +8053,12 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: true - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 @@ -8731,10 +8745,6 @@ packages: /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - /tsup@5.11.13(postcss@8.4.31)(typescript@5.0.4): resolution: {integrity: sha512-NVMK01gVmojZn7+iZwxRK1CzW2BIabaVMyEjs7Nm9lm4DrSf7IAqs2F3fg0vT7rH72x1cIBsW9U/TlWrCvHVQQ==} hasBin: true @@ -9039,14 +9049,6 @@ packages: node-gyp-build: 4.8.0 dev: false - /utf-8-validate@6.0.3: - resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.0 - dev: false - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -9126,7 +9128,7 @@ packages: hasBin: true dependencies: axios: 1.6.5(debug@4.3.4) - joi: 17.11.0 + joi: 17.11.1 lodash: 4.17.21 minimist: 1.2.8 rxjs: 7.8.1 @@ -9302,8 +9304,8 @@ packages: optional: true dev: true - /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9313,9 +9315,6 @@ packages: optional: true utf-8-validate: optional: true - dependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.3 dev: false /xdg-basedir@4.0.0: @@ -9323,11 +9322,6 @@ packages: engines: {node: '>=8'} dev: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -9395,19 +9389,3 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - - /zustand@4.3.8(react@18.2.0): - resolution: {integrity: sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==} - engines: {node: '>=12.7.0'} - peerDependencies: - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - immer: - optional: true - react: - optional: true - dependencies: - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false