The recipes.blue monorepo recipes.blue
recipes appview atproto
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: working on getting an auth flow working

+508 -73
+1 -3
apps/app/app/(app)/home/home.tsx
··· 25 25 26 26 <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> 27 27 28 - {data && ( 29 - data.recipes.map(v => <RecipeCard key={v.cid} recipe={v} />) 30 - )} 28 + {data && data.recipes.map(v => <RecipeCard key={v.cid} recipe={v} />)} 31 29 32 30 {[1, 2, 3, 4, 5, 6, 7, 8, 9].map(v => ( 33 31 <Card key={v}>
+2 -2
apps/app/app/(app)/home/page.tsx
··· 1 - import { GET_RECIPES_QO } from "@/lib/queries/recipes"; 1 + import { getRecipesOptions } from "@/lib/queries/recipes"; 2 2 import { dehydrate, HydrationBoundary, QueryClient } from "@tanstack/react-query"; 3 3 import { Home } from "./home"; 4 4 import { Client, simpleFetchHandler } from "@atcute/client"; 5 5 6 6 export default async function HomeRoute() { 7 7 const queryClient = new QueryClient(); 8 - await queryClient.prefetchQuery(GET_RECIPES_QO(new Client({ 8 + await queryClient.prefetchQuery(getRecipesOptions(new Client({ 9 9 handler: simpleFetchHandler({ service: 'http://localhost:4000' }), 10 10 }))); 11 11
+5
apps/app/app/auth/layout.tsx
··· 1 + import { PropsWithChildren } from "react"; 2 + 3 + export default ({ children }: PropsWithChildren) => { 4 + return children; 5 + };
+97
apps/app/app/auth/login/page.tsx
··· 1 + "use client"; 2 + 3 + import { Button } from "@/components/ui/button"; 4 + import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; 5 + import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field"; 6 + import { InputGroup, InputGroupAddon, InputGroupInput } from "@/components/ui/input-group"; 7 + import { Separator } from "@/components/ui/separator"; 8 + import { createAuthorizationUrl, OAuthResponseError } from "@atcute/oauth-browser-client"; 9 + import { IconAt } from "@tabler/icons-react"; 10 + import Link from "next/link"; 11 + import { FormEvent, useState } from "react"; 12 + import { isActorIdentifier } from "@atcute/lexicons/syntax"; 13 + 14 + export default () => { 15 + const [handle, setHandle] = useState(''); 16 + const [error, setError] = useState<string | null>(null); 17 + 18 + const submit = async (e: FormEvent) => { 19 + e.preventDefault(); 20 + 21 + if (!isActorIdentifier(handle)) { 22 + setError('Invalid handle or DID.'); 23 + return; 24 + } 25 + 26 + try { 27 + const authUrl = await createAuthorizationUrl({ 28 + target: { type: 'account', identifier: handle }, 29 + scope: 'atproto transition:generic', 30 + }); 31 + 32 + setTimeout(() => { 33 + window.location.assign(authUrl); 34 + }, 200); 35 + } catch (e) { 36 + if (e instanceof OAuthResponseError) { 37 + setError(e.message); 38 + return; 39 + } 40 + console.error(e); 41 + setError('Something went wrong, try again later.'); 42 + } 43 + }; 44 + 45 + return ( 46 + <div className="min-h-screen min-w-screen flex flex-col p-4 items-center justify-center"> 47 + <Card className="max-w-sm w-full"> 48 + <CardHeader> 49 + <CardTitle>Sign in to Cookware</CardTitle> 50 + <CardDescription>Enter your ATProto/Bluesky handle to log in or sign up.</CardDescription> 51 + </CardHeader> 52 + 53 + <CardContent> 54 + <form onSubmit={submit}> 55 + <FieldGroup> 56 + <Field> 57 + <FieldLabel htmlFor="login_handle">Handle</FieldLabel> 58 + <InputGroup> 59 + <InputGroupInput 60 + name="handle" 61 + id="login_handle" 62 + placeholder="john.doe" 63 + autoFocus 64 + aria-invalid={false} 65 + tabIndex={1} 66 + value={handle} 67 + onChange={(e) => { 68 + e.preventDefault(); 69 + setHandle(e.currentTarget.value); 70 + }} 71 + /> 72 + <InputGroupAddon><IconAt /></InputGroupAddon> 73 + </InputGroup> 74 + <FieldDescription>This is the username you use to log in to sites like Bluesky and Leaflet.</FieldDescription> 75 + {error && <FieldError>{error}</FieldError>} 76 + </Field> 77 + <Field> 78 + <Button 79 + type="submit" 80 + tabIndex={2} 81 + > 82 + Sign in 83 + </Button> 84 + </Field> 85 + </FieldGroup> 86 + <Separator className="my-4" /> 87 + <FieldDescription> 88 + <span> 89 + Don't have an account? <Link className="text-bluesky underline" href="https://bsky.app">Sign up on Bluesky!</Link> 90 + </span> 91 + </FieldDescription> 92 + </form> 93 + </CardContent> 94 + </Card> 95 + </div> 96 + ); 97 + };
+111
apps/app/app/auth/signup/page.tsx
··· 1 + "use client"; 2 + 3 + import { Button } from "@/components/ui/button"; 4 + import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; 5 + import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field"; 6 + import { FormEvent, useState } from "react"; 7 + import { useAuth } from "@/lib/state/auth"; 8 + import { redirect } from "next/navigation"; 9 + import { Input } from "@/components/ui/input"; 10 + import { Textarea } from "@/components/ui/textarea"; 11 + 12 + export default () => { 13 + const auth = useAuth(); 14 + const [displayName, setHandle] = useState(''); 15 + const [bio, setBio] = useState(''); 16 + const [pronouns, setPronouns] = useState(''); 17 + const [error, setError] = useState<string | null>(null); 18 + 19 + if (!auth.loggedIn) throw redirect('/auth/login'); 20 + if (auth.profile.exists) throw redirect('/home'); 21 + 22 + const submit = async (e: FormEvent) => { 23 + e.preventDefault(); 24 + console.log('Submit profile payload now'); 25 + }; 26 + 27 + return ( 28 + <div className="min-h-screen min-w-screen flex flex-col p-4 items-center justify-center"> 29 + <Card className="max-w-sm w-full"> 30 + <CardHeader> 31 + <CardTitle>Finish setting up your profile</CardTitle> 32 + <CardDescription>You've logged in, but now tell us about yourself before you start sharing foodie tidbits with the world.</CardDescription> 33 + </CardHeader> 34 + 35 + <CardContent> 36 + <form onSubmit={submit}> 37 + <FieldGroup> 38 + <Field> 39 + <FieldLabel htmlFor="signup_displayname">Display name</FieldLabel> 40 + <Input 41 + name="displayName" 42 + id="signup_displayname" 43 + placeholder="Cookery Master" 44 + autoFocus 45 + aria-invalid={false} 46 + tabIndex={1} 47 + value={displayName} 48 + onChange={(e) => { 49 + e.preventDefault(); 50 + setHandle(e.currentTarget.value); 51 + }} 52 + /> 53 + <FieldDescription>What should we call you?</FieldDescription> 54 + {error && <FieldError>{error}</FieldError>} 55 + </Field> 56 + 57 + <Field> 58 + <FieldLabel htmlFor="signup_bio"> 59 + Your bio 60 + <span className="text-muted-foreground">(optional)</span> 61 + </FieldLabel> 62 + <Textarea 63 + name="bio" 64 + id="signup_bio" 65 + placeholder="I'm a chef from the UK, and I love..." 66 + aria-invalid={false} 67 + tabIndex={2} 68 + value={bio} 69 + onChange={(e) => { 70 + e.preventDefault(); 71 + setBio(e.currentTarget.value); 72 + }} 73 + /> 74 + {error && <FieldError>{error}</FieldError>} 75 + </Field> 76 + 77 + <Field> 78 + <FieldLabel htmlFor="signup_pronouns"> 79 + Your pronouns 80 + <span className="text-muted-foreground">(optional)</span> 81 + </FieldLabel> 82 + <Input 83 + name="pronouns" 84 + id="signup_pronouns" 85 + autoFocus 86 + aria-invalid={false} 87 + tabIndex={3} 88 + value={pronouns} 89 + onChange={(e) => { 90 + e.preventDefault(); 91 + setPronouns(e.currentTarget.value); 92 + }} 93 + /> 94 + {error && <FieldError>{error}</FieldError>} 95 + </Field> 96 + 97 + <Field> 98 + <Button 99 + type="submit" 100 + tabIndex={2} 101 + > 102 + Continue 103 + </Button> 104 + </Field> 105 + </FieldGroup> 106 + </form> 107 + </CardContent> 108 + </Card> 109 + </div> 110 + ); 111 + };
+1 -1
apps/app/app/layout.tsx
··· 27 27 }>) { 28 28 return ( 29 29 <html lang="en" className={`${notoSans.variable}`}> 30 - <body className="antialiased"> 30 + <body className="antialiased bg-sidebar text-foreground"> 31 31 <Providers> 32 32 {children} 33 33 </Providers>
+9
apps/app/app/not-found.tsx
··· 1 + import Layout from './(app)/layout'; 2 + 3 + export default () => { 4 + return ( 5 + <Layout> 6 + <>Not found</> 7 + </Layout> 8 + ); 9 + }
+7 -4
apps/app/app/providers.tsx
··· 4 4 import { PropsWithChildren } from "react"; 5 5 import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; 6 6 import { ClientProvider } from "@/lib/state/query-provider"; 7 + import { AuthProvider } from "@/lib/state/auth"; 7 8 8 9 const makeQueryClient = () => { 9 10 return new QueryClient({ ··· 31 32 32 33 return ( 33 34 <ClientProvider> 34 - <QueryClientProvider client={queryClient}> 35 - {children} 36 - <ReactQueryDevtools /> 37 - </QueryClientProvider> 35 + <AuthProvider> 36 + <QueryClientProvider client={queryClient}> 37 + {children} 38 + <ReactQueryDevtools /> 39 + </QueryClientProvider> 40 + </AuthProvider> 38 41 </ClientProvider> 39 42 ); 40 43 }
+11 -3
apps/app/components/app-sidebar/nav-auth.tsx
··· 1 + "use client"; 2 + 1 3 import { IconBrandBluesky, IconArrowRight } from "@tabler/icons-react"; 2 4 import { SidebarMenuItem, SidebarMenuButton, SidebarMenu } from "../ui/sidebar"; 3 5 import Link from "next/link"; 6 + import { useAuth } from "@/lib/state/auth"; 7 + import { redirect } from "next/navigation"; 4 8 5 9 export const NavAuth = () => { 6 - const isAuthed = false; 10 + const auth = useAuth(); 7 11 8 - if (isAuthed) { 9 - return <>Auth menu here</> 12 + if (auth.loggedIn) { 13 + if (auth.profile.exists) { 14 + return <>Profile menu here</> 15 + } else { 16 + throw redirect("/auth/login"); 17 + } 10 18 } else { 11 19 return ( 12 20 <SidebarMenu>
apps/app/components/app-sidebar/nav-user.tsx

This is a binary file and will not be displayed.

+12
apps/app/lib/consts.ts
··· 1 + export const IS_DEV = process.env.NODE_ENV == "development"; 2 + export const OAUTH_SCOPE = ['atproto', 'transition:generic']; 3 + 4 + export const REDIRECT_URI = IS_DEV 5 + ? "http://127.0.0.1:3000" 6 + : "https://cookware.social"; 7 + 8 + export const CLIENT_ID = IS_DEV 9 + ? `http://localhost?redirect_uri=${encodeURIComponent(REDIRECT_URI)}&scope=${encodeURIComponent(OAUTH_SCOPE.join(' '))}` 10 + : "https://cookware.social/oauth-client-metadata.json"; 11 + 1 12 export const BLUESKY_PROFILE_URL = "https://bsky.app/profile/cookware.social"; 2 13 export const DISCORD_URL = "https://discord.gg/64nAv9QPJ9"; 14 + export const HANDLE_RESOLUTION_SERVICE = "https://slingshot.microcosm.blue";
+6 -41
apps/app/lib/queries/recipes.tsx
··· 1 1 import { Client } from '@atcute/client'; 2 - import type { BlueRecipesFeedGetRecipes } from '@cookware/lexicons'; 3 - import { useQuery } from '@tanstack/react-query'; 2 + import { useQuery, queryOptions } from '@tanstack/react-query'; 4 3 import { useClient } from '../state/query-provider'; 5 4 6 5 export const GET_RECIPES_QK = ['recipes']; 7 6 8 - export const GET_RECIPES_QO = (client: Client) => ({ 7 + export const getRecipesOptions = (client: Client) => queryOptions({ 9 8 queryKey: GET_RECIPES_QK, 10 9 queryFn: async () => { 11 10 const res = await client.get('blue.recipes.feed.getRecipes', { ··· 14 13 15 14 if (!res.ok) throw res; 16 15 17 - return res; 18 - 19 - return { 20 - nextCursor: '', 21 - recipes: [ 22 - { 23 - author: { 24 - did: 'did:web:hayden.moe', 25 - handle: 'hayden.moe', 26 - displayName: 'Hayden~' 27 - }, 28 - cid: 'abc123', 29 - rkey: 'abc123', 30 - uri: 'at://pds.hayden.moe/did:web:hayden.moe/social.cookware.recipe/abc123', 31 - imageUrl: 'https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:26tsx5juuss4yealylyfbj4h/bafkreia4wvg2y4rr6liuffdt4ckcskf4bvdmzbfdsv3ul6t442fu4jxy6m@jpeg', 32 - indexedAt: new Date().toISOString(), 33 - record: { 34 - $type: 'blue.recipes.feed.recipe', 35 - title: 'Delicious Pancakes', 36 - description: 'Fluffy pancakes perfect for breakfast.', 37 - ingredients: [ 38 - { name: 'Flour', amount: '2 cups' }, 39 - { name: 'Milk', amount: '1.5 cups' }, 40 - { name: 'Eggs', amount: '2' } 41 - ], 42 - steps: [ 43 - { text: 'Mix all ingredients together.' }, 44 - { text: 'Heat a skillet and pour batter to form pancakes.' }, 45 - { text: 'Cook until golden brown on both sides.' }, 46 - ], 47 - time: 30, 48 - createdAt: new Date().toISOString(), 49 - serves: 2, 50 - }, 51 - }, 52 - ], 53 - } as BlueRecipesFeedGetRecipes.$output; 16 + return res.data; 54 17 }, 55 18 }); 56 19 57 20 export const useGetRecipesQuery = () => { 58 21 const { client } = useClient(); 59 - return useQuery(GET_RECIPES_QO(client)); 22 + return useQuery({ 23 + ...getRecipesOptions(client) 24 + }); 60 25 };
+130
apps/app/lib/state/auth.tsx
··· 1 + "use client"; 2 + 3 + import { LocalActorResolver, XrpcHandleResolver, CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver } from "@atcute/identity-resolver"; 4 + import { configureOAuth, finalizeAuthorization, getSession, OAuthUserAgent } from "@atcute/oauth-browser-client"; 5 + import { createContext, PropsWithChildren, useContext, useEffect, useLayoutEffect, useState } from "react"; 6 + import { CLIENT_ID, HANDLE_RESOLUTION_SERVICE, REDIRECT_URI } from "@/lib/consts"; 7 + import { useClient } from "./query-provider"; 8 + import { Did, isDid } from "@atcute/lexicons/syntax"; 9 + import { BlueRecipesActorDefs } from "@cookware/lexicons"; 10 + 11 + type AuthContext = { 12 + loggedIn: false; 13 + } | { 14 + loggedIn: true; 15 + actorDid: Did; 16 + profile: { 17 + exists: true; 18 + profileView: BlueRecipesActorDefs.ProfileViewDetailed; 19 + } | { 20 + exists: false; 21 + } 22 + }; 23 + 24 + const authContext = createContext<AuthContext | undefined>(undefined); 25 + 26 + export const AuthProvider = ({ children }: PropsWithChildren) => { 27 + const { client, setHandler } = useClient(); 28 + const [loading, setLoading] = useState<boolean>(true); 29 + const [loggedIn, setLoggedIn] = useState<boolean>(false); 30 + const [actorDid, setActorDid] = useState<Did>(); 31 + const [hasProfile, setHasProfile] = useState<boolean>(false); 32 + const [profileView, setProfileView] = useState<BlueRecipesActorDefs.ProfileViewDetailed>(); 33 + 34 + useLayoutEffect(() => { 35 + configureOAuth({ 36 + metadata: { 37 + client_id: CLIENT_ID, 38 + redirect_uri: REDIRECT_URI, 39 + }, 40 + identityResolver: new LocalActorResolver({ 41 + handleResolver: new XrpcHandleResolver({ serviceUrl: HANDLE_RESOLUTION_SERVICE }), 42 + didDocumentResolver: new CompositeDidDocumentResolver({ 43 + methods: { 44 + plc: new PlcDidDocumentResolver(), 45 + web: new WebDidDocumentResolver(), 46 + }, 47 + }), 48 + }), 49 + }); 50 + 51 + const params = new URLSearchParams(location.hash.slice(1)); 52 + if (params.has('state') && params.has('iss') && params.has('code')) { 53 + // Remove state & code to prevent thievery and abject tomfoolery 54 + window.history.replaceState(null, '', location.pathname + location.search); 55 + 56 + finalizeAuthorization(params) 57 + .then(({ session }) => { 58 + localStorage.setItem('lastSignedIn', session.info.sub); 59 + setHandler(new OAuthUserAgent(session)); 60 + setActorDid(session.info.sub); 61 + setLoggedIn(true); 62 + }); 63 + } else { 64 + const existing = localStorage.getItem('lastSignedIn'); 65 + if (!existing || !isDid(existing)) { 66 + setLoading(false); 67 + return; 68 + }; 69 + getSession(existing, { allowStale: true }) 70 + .then(session => { 71 + setHandler(new OAuthUserAgent(session)); 72 + setActorDid(session.info.sub); 73 + setLoggedIn(true); 74 + setLoading(false); 75 + }); 76 + } 77 + }, []); 78 + 79 + useEffect(() => { 80 + if (loggedIn && actorDid) { 81 + client.get('blue.recipes.actor.getProfile', { 82 + params: { actor: actorDid }, 83 + }) 84 + .then(res => { 85 + if (!res.ok) { 86 + if (res.data.error === 'ProfileNotFound') { 87 + setHasProfile(false); 88 + return; 89 + } 90 + throw res.data.error; 91 + } else { 92 + setHasProfile(true); 93 + setProfileView(res.data); 94 + } 95 + }); 96 + console.log('Do check for profile...'); 97 + } 98 + }, [loggedIn]); 99 + 100 + useEffect(() => { 101 + if (!loading && !hasProfile) { 102 + console.log("No profile -- todo redirect"); 103 + } 104 + }, [loading, hasProfile]); 105 + 106 + if (loading) return <>Loading...</>; 107 + 108 + return ( 109 + <authContext.Provider value={ 110 + loggedIn 111 + ? { 112 + loggedIn, 113 + actorDid: actorDid!, 114 + profile: hasProfile ? { 115 + exists: hasProfile, 116 + profileView: profileView!, 117 + } : { exists: false }, 118 + } 119 + : { loggedIn: false } 120 + }> 121 + {children} 122 + </authContext.Provider> 123 + ); 124 + }; 125 + 126 + export const useAuth = () => { 127 + const ctx = useContext(authContext); 128 + if (!ctx) throw new Error("useAuth() must be called inside <AuthProvider />"); 129 + return ctx; 130 + }
+10 -11
apps/app/lib/state/query-provider.tsx
··· 1 1 "use client"; 2 2 3 3 import { createContext, PropsWithChildren, useContext, useEffect, useState } from "react"; 4 - import { Client, FetchHandler, simpleFetchHandler } from "@atcute/client"; 4 + import { Client, CredentialManager, FetchHandler, FetchHandlerObject } from "@atcute/client"; 5 5 6 6 type QueryContext = { 7 7 client: Client; 8 - handler: FetchHandler; 9 - setHandler?: (handler: FetchHandler) => void; 8 + handler: FetchHandler | FetchHandlerObject; 9 + setHandler: (handler: FetchHandler | FetchHandlerObject) => void; 10 10 }; 11 11 12 12 export const queryContext = createContext<QueryContext | undefined>(undefined); 13 13 14 14 export const ClientProvider = ({ children }: PropsWithChildren) => { 15 15 const [isLoaded, setIsLoaded] = useState(false); 16 - const [client, setClient] = useState<QueryContext["client"]>(); 17 16 const [handler, setHandler] = useState<QueryContext["handler"]>( 18 - simpleFetchHandler({ service: 'http://localhost:4000' }) 17 + new CredentialManager({ service: 'http://localhost:4000' }), 19 18 ); 19 + const [client, setClient] = useState<QueryContext["client"]>(new Client({ handler })); 20 20 21 21 useEffect(() => { 22 - setClient(new Client({ handler: handler! })); 23 - setIsLoaded(true); 24 - }); 25 - 26 - useEffect(() => { 27 - setClient(new Client({ handler: handler! })); 22 + if (!isLoaded) { 23 + setIsLoaded(true); 24 + return; 25 + } 26 + setClient(new Client({ handler })); 28 27 setIsLoaded(true); 29 28 }, [handler]); 30 29
+5 -1
apps/app/package.json
··· 9 9 "lint": "eslint" 10 10 }, 11 11 "dependencies": { 12 - "@atcute/client": "^4.1.0", 12 + "@atcute/client": "catalog:", 13 + "@atcute/identity": "catalog:", 14 + "@atcute/identity-resolver": "catalog:", 15 + "@atcute/lexicons": "catalog:", 16 + "@atproto/oauth-client-node": "^0.3.13", 13 17 "@cookware/lexicons": "workspace:*", 14 18 "@radix-ui/react-avatar": "^1.1.11", 15 19 "@radix-ui/react-dialog": "^1.1.15",
+96 -7
bun.lock
··· 4 4 "workspaces": { 5 5 "": { 6 6 "name": "@cookware/monorepo", 7 + "dependencies": { 8 + "@atcute/oauth-browser-client": "^2.0.2", 9 + }, 7 10 "devDependencies": { 8 11 "turbo": "^2.3.3", 9 12 "typescript": "^5.9.3", ··· 38 41 "name": "app", 39 42 "version": "0.1.0", 40 43 "dependencies": { 41 - "@atcute/client": "^4.1.0", 44 + "@atcute/client": "catalog:", 45 + "@atcute/identity": "catalog:", 46 + "@atcute/identity-resolver": "catalog:", 47 + "@atcute/lexicons": "catalog:", 48 + "@atproto/oauth-client-node": "^0.3.13", 42 49 "@cookware/lexicons": "workspace:*", 43 50 "@radix-ui/react-avatar": "^1.1.11", 44 51 "@radix-ui/react-dialog": "^1.1.15", ··· 209 216 "@atcute/atproto": "^3.1.9", 210 217 "@atcute/bluesky": "^3.2.11", 211 218 "@atcute/client": "^4.0.5", 219 + "@atcute/identity": "^1.1.3", 220 + "@atcute/identity-resolver": "^1.1.4", 212 221 "@atcute/lexicons": "^1.2.5", 213 222 "@types/bun": "^1.3.3", 214 223 "drizzle-orm": "^0.44.7", ··· 224 233 225 234 "@atcute/cid": ["@atcute/cid@2.2.6", "", { "dependencies": { "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5" } }, "sha512-bTAHHbJ24p+E//V4KCS4xdmd39o211jJswvqQOevj7vk+5IYcgDLx1ryZWZ1sEPOo9x875li/kj5gpKL14RDwQ=="], 226 235 227 - "@atcute/client": ["@atcute/client@4.0.5", "", { "dependencies": { "@atcute/identity": "^1.1.1", "@atcute/lexicons": "^1.2.2" } }, "sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA=="], 236 + "@atcute/client": ["@atcute/client@4.1.0", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.5" } }, "sha512-AYhSu3RSDA2VDkVGOmad320NRbUUUf5pCFWJcOzlk25YC/4kyzmMFfpzhf1jjjEcY+anNBXGGhav/kKB1evggQ=="], 228 237 229 238 "@atcute/crypto": ["@atcute/crypto@2.2.6", "", { "dependencies": { "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5", "@noble/secp256k1": "^3.0.0" } }, "sha512-vkuexF+kmrKE1/Uqzub99Qi4QpnxA2jbu60E6PTgL4XypELQ6rb59MB/J1VbY2gs0kd3ET7+L3+NWpKD5nXyfA=="], 230 239 ··· 242 251 243 252 "@atcute/multibase": ["@atcute/multibase@1.1.6", "", { "dependencies": { "@atcute/uint8array": "^1.0.5" } }, "sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg=="], 244 253 245 - "@atcute/oauth-browser-client": ["@atcute/oauth-browser-client@2.0.1", "", { "dependencies": { "@atcute/client": "^4.0.5", "@atcute/identity": "^1.1.1", "@atcute/identity-resolver": "^1.1.4", "@atcute/lexicons": "^1.2.2", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5", "nanoid": "^5.1.5" } }, "sha512-lG021GkeORG06zfFf4bH85egObjBEKHNgAWHvbtY/E2dX4wxo88hf370pJDx8acdnuUJLJ2VKPikJtZwo4Heeg=="], 254 + "@atcute/oauth-browser-client": ["@atcute/oauth-browser-client@2.0.2", "", { "dependencies": { "@atcute/client": "^4.1.0", "@atcute/identity-resolver": "^1.2.0", "@atcute/lexicons": "^1.2.5", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.6", "nanoid": "^5.1.6" } }, "sha512-F76NZwiRbqZl+5X3Uiw3VPSPvdvRugeW9BZppZWqKawkMTYZQB3iyQKBD6ZI0kOdfLNKBamrd3hmeJs+V1xpww=="], 246 255 247 - "@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 256 + "@atcute/uint8array": ["@atcute/uint8array@1.0.6", "", {}, "sha512-ucfRBQc7BFT8n9eCyGOzDHEMKF/nZwhS2pPao4Xtab1ML3HdFYcX2DM1tadCzas85QTGxHe5urnUAAcNKGRi9A=="], 248 257 249 258 "@atcute/util-fetch": ["@atcute/util-fetch@1.0.3", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-f8zzTb/xlKIwv2OQ31DhShPUNCmIIleX6p7qIXwWwEUjX6x8skUtpdISSjnImq01LXpltGV5y8yhV4/Mlb7CRQ=="], 250 259 ··· 280 289 281 290 "@atproto/jwk-webcrypto": ["@atproto/jwk-webcrypto@0.1.8", "", { "dependencies": { "@atproto/jwk": "0.3.0", "@atproto/jwk-jose": "0.1.8", "zod": "^3.23.8" } }, "sha512-oOW/G40f6M0NbTOo8uZgiSsFtcvlfNFldyxm+V+fVo5yKe6cvgvPNqckpqMsoBe6JYfImdc/zdVak9fCSSh41A=="], 282 291 292 + "@atproto/lex-data": ["@atproto/lex-data@0.0.3", "", { "dependencies": { "@atproto/syntax": "0.4.2", "multiformats": "^9.9.0", "tslib": "^2.8.1", "uint8arrays": "3.0.0", "unicode-segmenter": "^0.14.0" } }, "sha512-ivo1IpY/EX+RIpxPgCf4cPhQo5bfu4nrpa1vJCt8hCm9SfoonJkDFGa0n4SMw4JnXZoUcGcrJ46L+D8bH6GI2g=="], 293 + 294 + "@atproto/lex-json": ["@atproto/lex-json@0.0.3", "", { "dependencies": { "@atproto/lex-data": "0.0.3", "tslib": "^2.8.1" } }, "sha512-ZVcY7XlRfdPYvQQ2WroKUepee0+NCovrSXgXURM3Xv+n5jflJCoczguROeRr8sN0xvT0ZbzMrDNHCUYKNnxcjw=="], 295 + 283 296 "@atproto/lexicon": ["@atproto/lexicon@0.4.14", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ=="], 284 297 285 298 "@atproto/oauth-client": ["@atproto/oauth-client@0.4.0", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.13", "@atproto-labs/fetch": "0.2.3", "@atproto-labs/handle-resolver": "0.1.8", "@atproto-labs/identity-resolver": "0.1.18", "@atproto-labs/simple-store": "0.2.0", "@atproto-labs/simple-store-memory": "0.1.3", "@atproto/did": "0.1.5", "@atproto/jwk": "0.3.0", "@atproto/oauth-types": "0.3.0", "@atproto/xrpc": "0.7.0", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-uWVnlhennWkgvzqP0l53sFaw6DM6B4zmq0fv1xs05vt56Sjly8YirAj0GVDXlb37/BQRJQ1WOBzJVYDI3bH9uw=="], ··· 1211 1224 "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 1212 1225 1213 1226 "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], 1227 + 1228 + "core-js": ["core-js@3.47.0", "", {}, "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg=="], 1214 1229 1215 1230 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 1216 1231 ··· 2096 2111 2097 2112 "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], 2098 2113 2114 + "unicode-segmenter": ["unicode-segmenter@0.14.1", "", {}, "sha512-yHedxlEpUyD+u1UE8qAuCMXVdMLn7yUdlmd8WN7FGmO1ICnpE7LJfnmuXBB+T0zkie3qHsy8fSucqceI/MylOg=="], 2115 + 2099 2116 "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], 2100 2117 2101 2118 "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], ··· 2168 2185 2169 2186 "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], 2170 2187 2188 + "@atcute/cbor/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2189 + 2190 + "@atcute/cid/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2191 + 2192 + "@atcute/crypto/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2193 + 2194 + "@atcute/multibase/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2195 + 2196 + "@atcute/oauth-browser-client/@atcute/identity-resolver": ["@atcute/identity-resolver@1.2.0", "", { "dependencies": { "@atcute/lexicons": "^1.2.5", "@atcute/util-fetch": "^1.0.4", "@badrap/valita": "^0.4.6" }, "peerDependencies": { "@atcute/identity": "^1.0.0" } }, "sha512-5UbSJfdV3JIkF8ksXz7g4nKBWasf2wROvzM66cfvTIWydWFO6/oS1KZd+zo9Eokje5Scf5+jsY9ZfgVARLepXg=="], 2197 + 2198 + "@atcute/xrpc-server/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2199 + 2171 2200 "@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2172 2201 2173 2202 "@atproto/common/@atproto/common-web": ["@atproto/common-web@0.4.3", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg=="], 2174 2203 2175 2204 "@atproto/common/pino": ["pino@8.21.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^1.2.0", "pino-std-serializers": "^6.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", "thread-stream": "^2.6.0" }, "bin": { "pino": "bin.js" } }, "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q=="], 2205 + 2206 + "@atproto/lex-data/@atproto/syntax": ["@atproto/syntax@0.4.2", "", {}, "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA=="], 2176 2207 2177 2208 "@atproto/lexicon/@atproto/common-web": ["@atproto/common-web@0.4.3", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg=="], 2178 2209 ··· 2186 2217 2187 2218 "@cookware/database/@libsql/client": ["@libsql/client@0.15.15", "", { "dependencies": { "@libsql/core": "^0.15.14", "@libsql/hrana-client": "^0.7.0", "js-base64": "^3.7.5", "libsql": "^0.5.22", "promise-limit": "^2.7.0" } }, "sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w=="], 2188 2219 2189 - "@cookware/lexicons/@atcute/client": ["@atcute/client@4.1.0", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.5" } }, "sha512-AYhSu3RSDA2VDkVGOmad320NRbUUUf5pCFWJcOzlk25YC/4kyzmMFfpzhf1jjjEcY+anNBXGGhav/kKB1evggQ=="], 2190 - 2191 2220 "@cookware/web/@atcute/bluesky": ["@atcute/bluesky@1.0.15", "", { "peerDependencies": { "@atcute/client": "^1.0.0 || ^2.0.0" } }, "sha512-+EFiybmKQ97aBAgtaD+cKRJER5AMn3cZMkEwEg/pDdWyzxYJ9m1UgemmLdTgI8VrxPufKqdXS2nl7uO7TY6BPA=="], 2221 + 2222 + "@cookware/web/@atcute/oauth-browser-client": ["@atcute/oauth-browser-client@2.0.1", "", { "dependencies": { "@atcute/client": "^4.0.5", "@atcute/identity": "^1.1.1", "@atcute/identity-resolver": "^1.1.4", "@atcute/lexicons": "^1.2.2", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.5", "nanoid": "^5.1.5" } }, "sha512-lG021GkeORG06zfFf4bH85egObjBEKHNgAWHvbtY/E2dX4wxo88hf370pJDx8acdnuUJLJ2VKPikJtZwo4Heeg=="], 2192 2223 2193 2224 "@cookware/web/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], 2194 2225 ··· 2302 2333 2303 2334 "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 2304 2335 2305 - "app/@atcute/client": ["@atcute/client@4.1.0", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.5" } }, "sha512-AYhSu3RSDA2VDkVGOmad320NRbUUUf5pCFWJcOzlk25YC/4kyzmMFfpzhf1jjjEcY+anNBXGGhav/kKB1evggQ=="], 2336 + "app/@atcute/identity-resolver": ["@atcute/identity-resolver@1.2.0", "", { "dependencies": { "@atcute/lexicons": "^1.2.5", "@atcute/util-fetch": "^1.0.4", "@badrap/valita": "^0.4.6" }, "peerDependencies": { "@atcute/identity": "^1.0.0" } }, "sha512-5UbSJfdV3JIkF8ksXz7g4nKBWasf2wROvzM66cfvTIWydWFO6/oS1KZd+zo9Eokje5Scf5+jsY9ZfgVARLepXg=="], 2337 + 2338 + "app/@atproto/oauth-client-node": ["@atproto/oauth-client-node@0.3.13", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.4", "@atproto-labs/handle-resolver-node": "0.1.23", "@atproto-labs/simple-store": "0.3.0", "@atproto/did": "0.2.3", "@atproto/jwk": "0.6.0", "@atproto/jwk-jose": "0.1.11", "@atproto/jwk-webcrypto": "0.2.0", "@atproto/oauth-client": "0.5.11", "@atproto/oauth-types": "0.5.2" } }, "sha512-k2qT5QM6Mj5I412IZOnktShmI1A5YbwLmLM4BkeEcbcOm7kU1Cr/H/zUC/zniCIj641ZudiXU80Bsyw4A6tejA=="], 2306 2339 2307 2340 "app/@tanstack/react-query": ["@tanstack/react-query@5.90.12", "", { "dependencies": { "@tanstack/query-core": "5.90.12" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg=="], 2308 2341 ··· 2394 2427 2395 2428 "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], 2396 2429 2430 + "@atcute/oauth-browser-client/@atcute/identity-resolver/@atcute/util-fetch": ["@atcute/util-fetch@1.0.4", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-sIU9Qk0dE8PLEXSfhy+gIJV+HpiiknMytCI2SqLlqd0vgZUtEKI/EQfP+23LHWvP+CLCzVDOa6cpH045OlmNBg=="], 2431 + 2397 2432 "@atproto/common/pino/pino-abstract-transport": ["pino-abstract-transport@1.2.0", "", { "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q=="], 2398 2433 2399 2434 "@atproto/common/pino/pino-std-serializers": ["pino-std-serializers@6.2.2", "", {}, "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="], ··· 2410 2445 2411 2446 "@cookware/database/@libsql/client/libsql": ["libsql@0.5.22", "", { "dependencies": { "@neon-rs/load": "^0.0.4", "detect-libc": "2.0.2" }, "optionalDependencies": { "@libsql/darwin-arm64": "0.5.22", "@libsql/darwin-x64": "0.5.22", "@libsql/linux-arm-gnueabihf": "0.5.22", "@libsql/linux-arm-musleabihf": "0.5.22", "@libsql/linux-arm64-gnu": "0.5.22", "@libsql/linux-arm64-musl": "0.5.22", "@libsql/linux-x64-gnu": "0.5.22", "@libsql/linux-x64-musl": "0.5.22", "@libsql/win32-x64-msvc": "0.5.22" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "arm", "x64", "arm64", ] }, "sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA=="], 2412 2447 2448 + "@cookware/web/@atcute/bluesky/@atcute/client": ["@atcute/client@4.0.5", "", { "dependencies": { "@atcute/identity": "^1.1.1", "@atcute/lexicons": "^1.2.2" } }, "sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA=="], 2449 + 2450 + "@cookware/web/@atcute/oauth-browser-client/@atcute/client": ["@atcute/client@4.0.5", "", { "dependencies": { "@atcute/identity": "^1.1.1", "@atcute/lexicons": "^1.2.2" } }, "sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA=="], 2451 + 2452 + "@cookware/web/@atcute/oauth-browser-client/@atcute/uint8array": ["@atcute/uint8array@1.0.5", "", {}, "sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q=="], 2453 + 2413 2454 "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], 2414 2455 2415 2456 "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], ··· 2485 2526 "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 2486 2527 2487 2528 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 2529 + 2530 + "app/@atcute/identity-resolver/@atcute/util-fetch": ["@atcute/util-fetch@1.0.4", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-sIU9Qk0dE8PLEXSfhy+gIJV+HpiiknMytCI2SqLlqd0vgZUtEKI/EQfP+23LHWvP+CLCzVDOa6cpH045OlmNBg=="], 2531 + 2532 + "app/@atproto/oauth-client-node/@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.2.4", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.3", "zod": "^3.23.8" } }, "sha512-sbXxBnAJWsKv/FEGG6a/WLz7zQYUr1vA2TXvNnPwwJQJCjPwEJMOh1vM22wBr185Phy7D2GD88PcRokn7eUVyw=="], 2533 + 2534 + "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node": ["@atproto-labs/handle-resolver-node@0.1.23", "", { "dependencies": { "@atproto-labs/fetch-node": "0.2.0", "@atproto-labs/handle-resolver": "0.3.4", "@atproto/did": "0.2.3" } }, "sha512-tBRr2LCgzn3klk+DL0xrTFv4zg5tEszdeW6vSIFVebBYSb3MLdfhievmSqZdIQ4c9UCC4hN7YXTlZCXj8+2YmQ=="], 2535 + 2536 + "app/@atproto/oauth-client-node/@atproto-labs/simple-store": ["@atproto-labs/simple-store@0.3.0", "", {}, "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ=="], 2537 + 2538 + "app/@atproto/oauth-client-node/@atproto/did": ["@atproto/did@0.2.3", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-VI8JJkSizvM2cHYJa37WlbzeCm5tWpojyc1/Zy8q8OOjyoy6X4S4BEfoP941oJcpxpMTObamibQIXQDo7tnIjg=="], 2539 + 2540 + "app/@atproto/oauth-client-node/@atproto/jwk": ["@atproto/jwk@0.6.0", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw=="], 2541 + 2542 + "app/@atproto/oauth-client-node/@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.11", "", { "dependencies": { "@atproto/jwk": "0.6.0", "jose": "^5.2.0" } }, "sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q=="], 2543 + 2544 + "app/@atproto/oauth-client-node/@atproto/jwk-webcrypto": ["@atproto/jwk-webcrypto@0.2.0", "", { "dependencies": { "@atproto/jwk": "0.6.0", "@atproto/jwk-jose": "0.1.11", "zod": "^3.23.8" } }, "sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg=="], 2545 + 2546 + "app/@atproto/oauth-client-node/@atproto/oauth-client": ["@atproto/oauth-client@0.5.11", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.4", "@atproto-labs/fetch": "0.2.3", "@atproto-labs/handle-resolver": "0.3.4", "@atproto-labs/identity-resolver": "0.3.4", "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.3", "@atproto/jwk": "0.6.0", "@atproto/oauth-types": "0.5.2", "@atproto/xrpc": "0.7.7", "core-js": "^3", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-KyxKpnF988BI3m+4NNYDgkN6a2sPORD9uaOEGP4tnJLOvhMVHyATWwq3Jx4LOYotTFDOvLdheWcI1G9DozE88w=="], 2547 + 2548 + "app/@atproto/oauth-client-node/@atproto/oauth-types": ["@atproto/oauth-types@0.5.2", "", { "dependencies": { "@atproto/did": "0.2.3", "@atproto/jwk": "0.6.0", "zod": "^3.23.8" } }, "sha512-9DCDvtvCanTwAaU5UakYDO0hzcOITS3RutK5zfLytE5Y9unj0REmTDdN8Xd8YCfUJl7T/9pYpf04Uyq7bFTASg=="], 2488 2549 2489 2550 "app/@tanstack/react-query/@tanstack/query-core": ["@tanstack/query-core@5.90.12", "", {}, "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg=="], 2490 2551 ··· 2605 2666 "@inquirer/core/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 2606 2667 2607 2668 "@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2669 + 2670 + "app/@atproto/oauth-client-node/@atproto-labs/did-resolver/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "lru-cache": "^10.2.0" } }, "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw=="], 2671 + 2672 + "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node/@atproto-labs/fetch-node": ["@atproto-labs/fetch-node@0.2.0", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "ipaddr.js": "^2.1.0", "undici": "^6.14.1" } }, "sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q=="], 2673 + 2674 + "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node/@atproto-labs/handle-resolver": ["@atproto-labs/handle-resolver@0.3.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.3", "zod": "^3.23.8" } }, "sha512-wsNopfzfgO3uPvfnFDgNeXgDufXxSXhjBjp2WEiSzEiLrMy0Jodnqggw4OzD9MJKf0a4Iu2/ydd537qdy91LrQ=="], 2675 + 2676 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto-labs/handle-resolver": ["@atproto-labs/handle-resolver@0.3.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.3", "zod": "^3.23.8" } }, "sha512-wsNopfzfgO3uPvfnFDgNeXgDufXxSXhjBjp2WEiSzEiLrMy0Jodnqggw4OzD9MJKf0a4Iu2/ydd537qdy91LrQ=="], 2677 + 2678 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto-labs/identity-resolver": ["@atproto-labs/identity-resolver@0.3.4", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.4", "@atproto-labs/handle-resolver": "0.3.4" } }, "sha512-HNUEFQIo2ws6iATxmgHd5D5rAsWYupgxZucgwolVHPiMjE1SY+EmxEsfbEN1wDEzM8/u9AKUg/jrxxPEwsgbew=="], 2679 + 2680 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "lru-cache": "^10.2.0" } }, "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw=="], 2681 + 2682 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="], 2683 + 2684 + "app/@atproto/oauth-client-node/@atproto-labs/did-resolver/@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2685 + 2686 + "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node/@atproto-labs/handle-resolver/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "lru-cache": "^10.2.0" } }, "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw=="], 2687 + 2688 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2689 + 2690 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon": ["@atproto/lexicon@0.6.0", "", { "dependencies": { "@atproto/common-web": "^0.4.7", "@atproto/syntax": "^0.4.2", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ=="], 2691 + 2692 + "app/@atproto/oauth-client-node/@atproto-labs/handle-resolver-node/@atproto-labs/handle-resolver/@atproto-labs/simple-store-memory/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 2693 + 2694 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon/@atproto/common-web": ["@atproto/common-web@0.4.7", "", { "dependencies": { "@atproto/lex-data": "0.0.3", "@atproto/lex-json": "0.0.3", "zod": "^3.23.8" } }, "sha512-vjw2+81KPo2/SAbbARGn64Ln+6JTI0FTI4xk8if0ebBfDxFRmHb2oSN1y77hzNq/ybGHqA2mecfhS03pxC5+lg=="], 2695 + 2696 + "app/@atproto/oauth-client-node/@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.2", "", {}, "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA=="], 2608 2697 } 2609 2698 }
+5
package.json
··· 19 19 "@atcute/atproto": "^3.1.9", 20 20 "@atcute/bluesky": "^3.2.11", 21 21 "@atcute/client": "^4.0.5", 22 + "@atcute/identity": "^1.1.3", 23 + "@atcute/identity-resolver": "^1.1.4", 22 24 "@atcute/lexicons": "^1.2.5", 23 25 "drizzle-orm": "^0.44.7" 24 26 } 27 + }, 28 + "dependencies": { 29 + "@atcute/oauth-browser-client": "^2.0.2" 25 30 } 26 31 }