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: new recipe page hooked up!

+341 -17
+8
Caddyfile
··· 35 35 rewrite * /oauth{uri} 36 36 reverse_proxy http://host.docker.internal:8080 37 37 } 38 + handle_path /api/* { 39 + rewrite * /api{uri} 40 + reverse_proxy http://host.docker.internal:8080 41 + } 38 42 } 39 43 40 44 http://*.trycloudflare.com { ··· 46 50 } 47 51 handle_path /oauth/* { 48 52 rewrite * /oauth{uri} 53 + reverse_proxy http://host.docker.internal:8080 54 + } 55 + handle_path /api/* { 56 + rewrite * /api{uri} 49 57 reverse_proxy http://host.docker.internal:8080 50 58 } 51 59 }
+1
apps/api/package.json
··· 15 15 "dependencies": { 16 16 "@atcute/client": "^2.0.6", 17 17 "@atproto/api": "^0.13.19", 18 + "@atproto/common": "^0.4.5", 18 19 "@atproto/jwk-jose": "^0.1.2", 19 20 "@atproto/oauth-client-node": "^0.2.3", 20 21 "@cookware/database": "workspace:^",
+2
apps/api/src/index.ts
··· 11 11 import * as Sentry from "@sentry/node" 12 12 import { readFileSync } from "fs"; 13 13 import { getFilePathWithoutDefaultDocument } from "hono/utils/filepath"; 14 + import { recipeApp } from "./recipes/index.js"; 14 15 15 16 if (env.SENTRY_DSN) { 16 17 Sentry.init({ ··· 69 70 70 71 app.route('/xrpc', xrpcApp); 71 72 app.route('/oauth', authApp); 73 + app.route('/api/recipes', recipeApp); 72 74 73 75 app.use(async (ctx, next) => { 74 76 try {
+38
apps/api/src/recipes/index.ts
··· 1 + import { Hono } from "hono"; 2 + import { getSessionAgent } from "../util/api.js"; 3 + import { RecipeCollection, RecipeRecord } from "@cookware/lexicons"; 4 + import { TID } from "@atproto/common"; 5 + 6 + export const recipeApp = new Hono(); 7 + 8 + recipeApp.post('/', async ctx => { 9 + const agent = await getSessionAgent(ctx); 10 + if (!agent) { 11 + ctx.status(401); 12 + return ctx.json({ 13 + error: 'unauthenticated', 14 + message: 'You must be authenticated to access this resource.', 15 + }); 16 + } 17 + 18 + const body = await ctx.req.json(); 19 + const { data: record, success, error } = RecipeRecord.safeParse(body); 20 + if (!success) { 21 + ctx.status(400); 22 + return ctx.json({ 23 + error: 'invalid_recipe', 24 + message: error.message, 25 + fields: error.formErrors, 26 + }); 27 + } 28 + 29 + const res = await agent.com.atproto.repo.putRecord({ 30 + repo: agent.assertDid, 31 + collection: RecipeCollection, 32 + record: record, 33 + rkey: TID.nextStr(), 34 + validate: false, 35 + }); 36 + 37 + return ctx.json(res.data); 38 + });
+19 -1
apps/web/src/queries/recipe.ts
··· 1 1 import { useXrpc } from "@/hooks/use-xrpc"; 2 + import { SERVER_URL } from "@/lib/utils"; 2 3 import { XRPC, XRPCError } from "@atcute/client"; 3 - import { queryOptions, useQuery } from "@tanstack/react-query"; 4 + import { Recipe } from "@cookware/lexicons"; 5 + import { queryOptions, useMutation, useQuery } from "@tanstack/react-query"; 4 6 import { notFound } from "@tanstack/react-router"; 7 + import axios from "axios"; 8 + import { UseFormReturn } from "react-hook-form"; 5 9 6 10 const RQKEY_ROOT = 'posts'; 7 11 export const RQKEY = (cursor: string, did: string, rkey: string) => [RQKEY_ROOT, cursor, did, rkey]; ··· 42 46 const { rpc } = useXrpc(); 43 47 return useQuery(recipeQueryOptions(rpc, did, rkey)); 44 48 }; 49 + 50 + export const useNewRecipeMutation = (form: UseFormReturn<Recipe>) => { 51 + return useMutation({ 52 + mutationKey: ['recipes.new'], 53 + mutationFn: async ({ recipe }: { recipe: Recipe }) => { 54 + const res = await axios.post(`https://${SERVER_URL}/api/recipes`, recipe); 55 + return res.data; 56 + }, 57 + onError: (error) => { 58 + console.error(error); 59 + form.setError('title', error); 60 + }, 61 + }); 62 + };
+42 -12
apps/web/src/routes/_.(app)/recipes/new.lazy.tsx
··· 12 12 import { useFieldArray, useForm } from 'react-hook-form' 13 13 import { z } from 'zod'; 14 14 import { zodResolver } from "@hookform/resolvers/zod" 15 - import { RecipeRecord } from '@cookware/lexicons' 15 + import { IngredientObject, RecipeRecord } from '@cookware/lexicons' 16 16 import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form' 17 17 import { Button } from '@/components/ui/button' 18 18 import { Input } from '@/components/ui/input' ··· 22 22 import { DragHandleDots2Icon } from '@radix-ui/react-icons' 23 23 import { Label } from '@/components/ui/label' 24 24 import { TrashIcon } from 'lucide-react' 25 + import { useNewRecipeMutation } from '@/queries/recipe' 25 26 26 27 export const Route = createLazyFileRoute('/_/(app)/recipes/new')({ 27 28 component: RouteComponent, 28 29 }) 29 30 30 - const schema = RecipeRecord; 31 + const schema = RecipeRecord.extend({ 32 + ingredients: z.array(IngredientObject.extend({ 33 + amount: z.coerce.number().nullable(), 34 + })), 35 + }); 31 36 32 37 function RouteComponent() { 33 38 const form = useForm<z.infer<typeof schema>>({ ··· 43 48 ], 44 49 }, 45 50 }); 51 + 52 + const { mutate, isPending } = useNewRecipeMutation(form); 46 53 47 54 const onSubmit = (values: z.infer<typeof schema>) => { 48 - console.log(values); 55 + mutate({ recipe: values }); 49 56 }; 50 57 51 58 const ingredients = useFieldArray({ ··· 61 68 return ( 62 69 <> 63 70 <Breadcrumbs /> 64 - <div className="flex-1 grid p-4 pt-0 max-w-xl w-full mx-auto"> 71 + <div className="flex-1 flex-col p-4 pt-0 max-w-xl w-full mx-auto"> 65 72 <Card> 66 73 <CardHeader> 67 74 <CardTitle>New recipe</CardTitle> ··· 91 98 <FormField 92 99 name="description" 93 100 control={form.control} 94 - render={({ field }) => ( 101 + render={({ field: { value, ...field } }) => ( 95 102 <FormItem> 96 103 <FormLabel>Description</FormLabel> 97 104 <FormControl> 98 105 <Textarea 99 106 className="resize-none" 107 + value={value || ''} 100 108 {...field} 101 109 /> 102 110 </FormControl> ··· 143 151 {...field} 144 152 /> 145 153 </FormControl> 154 + <FormMessage /> 146 155 </FormItem> 147 156 )} 148 157 /> ··· 156 165 <Input 157 166 type="number" 158 167 placeholder="#" 159 - value={value || 0} 168 + value={value || '0'} 160 169 className="h-8" 161 170 {...field} 162 171 /> 163 172 </FormControl> 173 + <FormMessage /> 164 174 </FormItem> 165 175 )} 166 176 /> ··· 178 188 {...field} 179 189 /> 180 190 </FormControl> 191 + <FormMessage /> 181 192 </FormItem> 182 193 )} 183 194 /> ··· 200 211 </Sortable> 201 212 <Button 202 213 type="button" 214 + variant="secondary" 203 215 onClick={(e) => { 204 216 e.preventDefault(); 205 217 ingredients.append({ name: '', amount: null, unit: null }); ··· 220 232 value={field.id} 221 233 asChild 222 234 > 223 - <div className="grid grid-cols-[2rem_auto] items-center gap-2"> 235 + <div className="grid grid-cols-[2rem_auto_2rem] items-center gap-2"> 224 236 <SortableDragHandle 225 237 type="button" 226 238 variant="outline" ··· 240 252 <FormControl> 241 253 <Input className="h-8" {...field} /> 242 254 </FormControl> 255 + <FormMessage /> 243 256 </FormItem> 244 257 )} 245 258 /> 259 + 260 + <Button 261 + type="button" 262 + variant="destructive" 263 + className="size-8" 264 + onClick={(e) => { 265 + e.preventDefault(); 266 + steps.remove(index); 267 + }} 268 + > 269 + <TrashIcon /> 270 + </Button> 246 271 </div> 247 272 </SortableItem> 248 273 ))} ··· 250 275 </Sortable> 251 276 <Button 252 277 type="button" 278 + variant="secondary" 253 279 onClick={(e) => { 254 280 e.preventDefault(); 255 281 steps.append({ text: '' }) ··· 257 283 >Add</Button> 258 284 </div> 259 285 260 - <Button 261 - type="button" 262 - > 263 - Submit 264 - </Button> 286 + <div className="grid justify-end"> 287 + <Button 288 + type="submit" 289 + className="ml-auto" 290 + disabled={isPending} 291 + > 292 + Submit 293 + </Button> 294 + </div> 265 295 266 296 </form> 267 297 </Form>
+231 -4
pnpm-lock.yaml
··· 20 20 '@atproto/api': 21 21 specifier: ^0.13.19 22 22 version: 0.13.19 23 + '@atproto/common': 24 + specifier: ^0.4.5 25 + version: 0.4.5 23 26 '@atproto/jwk-jose': 24 27 specifier: ^0.1.2 25 28 version: 0.1.2 ··· 46 49 version: 4.0.8 47 50 drizzle-orm: 48 51 specifier: ^0.37.0 49 - version: 0.37.0(@libsql/client@0.14.0(bufferutil@4.0.8))(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0) 52 + version: 0.37.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0) 50 53 hono: 51 54 specifier: ^4.6.12 52 55 version: 4.6.12 ··· 122 125 version: 4.0.8 123 126 drizzle-orm: 124 127 specifier: ^0.37.0 125 - version: 0.37.0(@libsql/client@0.14.0(bufferutil@4.0.8))(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0) 128 + version: 0.37.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0) 126 129 pino: 127 130 specifier: ^9.5.0 128 131 version: 9.5.0 ··· 325 328 version: 0.14.0(bufferutil@4.0.8) 326 329 drizzle-orm: 327 330 specifier: ^0.37.0 328 - version: 0.37.0(@libsql/client@0.14.0(bufferutil@4.0.8))(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0) 331 + version: 0.37.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0) 329 332 zod: 330 333 specifier: ^3.23.8 331 334 version: 3.23.8 ··· 426 429 427 430 '@atproto/common-web@0.3.1': 428 431 resolution: {integrity: sha512-N7wiTnus5vAr+lT//0y8m/FaHHLJ9LpGuEwkwDAeV3LCiPif4m/FS8x/QOYrx1PdZQwKso95RAPzCGWQBH5j6Q==} 432 + 433 + '@atproto/common@0.4.5': 434 + resolution: {integrity: sha512-LFAGqHcxCI5+b31Xgk+VQQtZU258iGPpHJzNeHVcdh6teIKZi4C2l6YV+m+3CEz+yYcfP7jjUmgqesx7l9Arsg==} 429 435 430 436 '@atproto/did@0.1.3': 431 437 resolution: {integrity: sha512-ULD8Gw/KRRwLFZ2Z2L4DjmdOMrg8IYYlcjdSc+GQ2/QJSVnD2zaJJVTLd3vls121wGt/583rNaiZTT2DpBze4w==} ··· 540 546 resolution: {integrity: sha512-slP2blSd6A+xUBgGf+wW6adGd72ojBLxemU0jXQ0fXQcsZWYQ70wTLTJggs6+oxcAqN/bvYA3Ops8SqR2Imyaw==} 541 547 engines: {node: '>= 16'} 542 548 549 + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': 550 + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} 551 + cpu: [arm64] 552 + os: [darwin] 553 + 554 + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': 555 + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} 556 + cpu: [x64] 557 + os: [darwin] 558 + 559 + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': 560 + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} 561 + cpu: [arm64] 562 + os: [linux] 563 + 564 + '@cbor-extract/cbor-extract-linux-arm@2.2.0': 565 + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} 566 + cpu: [arm] 567 + os: [linux] 568 + 569 + '@cbor-extract/cbor-extract-linux-x64@2.2.0': 570 + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} 571 + cpu: [x64] 572 + os: [linux] 573 + 574 + '@cbor-extract/cbor-extract-win32-x64@2.2.0': 575 + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} 576 + cpu: [x64] 577 + os: [win32] 578 + 543 579 '@cspotcode/source-map-support@0.8.1': 544 580 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 545 581 engines: {node: '>=12'} ··· 1225 1261 '@humanwhocodes/retry@0.4.1': 1226 1262 resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 1227 1263 engines: {node: '>=18.18'} 1264 + 1265 + '@ipld/dag-cbor@7.0.3': 1266 + resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} 1228 1267 1229 1268 '@isaacs/cliui@8.0.2': 1230 1269 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} ··· 2405 2444 peerDependencies: 2406 2445 vite: ^4 || ^5 || ^6 2407 2446 2447 + abort-controller@3.0.0: 2448 + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 2449 + engines: {node: '>=6.5'} 2450 + 2408 2451 acorn-import-attributes@1.9.5: 2409 2452 resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} 2410 2453 peerDependencies: ··· 2489 2532 balanced-match@1.0.2: 2490 2533 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 2491 2534 2535 + base64-js@1.5.1: 2536 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 2537 + 2492 2538 binary-extensions@2.3.0: 2493 2539 resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 2494 2540 engines: {node: '>=8'} ··· 2514 2560 buffer-from@1.1.2: 2515 2561 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 2516 2562 2563 + buffer@6.0.3: 2564 + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 2565 + 2517 2566 bufferutil@4.0.8: 2518 2567 resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} 2519 2568 engines: {node: '>=6.14.2'} ··· 2542 2591 caniuse-lite@1.0.30001686: 2543 2592 resolution: {integrity: sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==} 2544 2593 2594 + cbor-extract@2.2.0: 2595 + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} 2596 + hasBin: true 2597 + 2598 + cbor-x@1.6.0: 2599 + resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} 2600 + 2601 + cborg@1.10.2: 2602 + resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} 2603 + hasBin: true 2604 + 2545 2605 chalk@4.1.2: 2546 2606 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 2547 2607 engines: {node: '>=10'} ··· 2911 2971 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 2912 2972 engines: {node: '>=0.10.0'} 2913 2973 2974 + event-target-shim@5.0.1: 2975 + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 2976 + engines: {node: '>=6'} 2977 + 2914 2978 event-target-shim@6.0.2: 2915 2979 resolution: {integrity: sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==} 2916 2980 engines: {node: '>=10.13.0'} 2981 + 2982 + events@3.3.0: 2983 + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 2984 + engines: {node: '>=0.8.x'} 2917 2985 2918 2986 fast-copy@3.0.2: 2919 2987 resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} ··· 3070 3138 resolution: {integrity: sha512-eHtf4kSDNw6VVrdbd5IQi16r22m3s7mWPLd7xOMhg1a/Yyb1A0qpUFq8xYMX4FMuDe1nTKeMX5rTx7Nmw+a+Ag==} 3071 3139 engines: {node: '>=16.9.0'} 3072 3140 3141 + ieee754@1.2.1: 3142 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 3143 + 3073 3144 ignore@5.3.2: 3074 3145 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 3075 3146 engines: {node: '>= 4'} ··· 3303 3374 resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 3304 3375 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 3305 3376 3377 + node-gyp-build-optional-packages@5.1.1: 3378 + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} 3379 + hasBin: true 3380 + 3306 3381 node-gyp-build@4.8.4: 3307 3382 resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} 3308 3383 hasBin: true ··· 3403 3478 resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 3404 3479 engines: {node: '>=0.10.0'} 3405 3480 3481 + pino-abstract-transport@1.2.0: 3482 + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} 3483 + 3406 3484 pino-abstract-transport@2.0.0: 3407 3485 resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} 3408 3486 ··· 3410 3488 resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} 3411 3489 hasBin: true 3412 3490 3491 + pino-std-serializers@6.2.2: 3492 + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} 3493 + 3413 3494 pino-std-serializers@7.0.0: 3414 3495 resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} 3415 3496 3497 + pino@8.21.0: 3498 + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} 3499 + hasBin: true 3500 + 3416 3501 pino@9.5.0: 3417 3502 resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} 3418 3503 hasBin: true ··· 3667 3752 engines: {node: '>=14'} 3668 3753 hasBin: true 3669 3754 3755 + process-warning@3.0.0: 3756 + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} 3757 + 3670 3758 process-warning@4.0.0: 3671 3759 resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} 3760 + 3761 + process@0.11.10: 3762 + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 3763 + engines: {node: '>= 0.6.0'} 3672 3764 3673 3765 promise-limit@2.7.0: 3674 3766 resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} ··· 3740 3832 read-cache@1.0.0: 3741 3833 resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 3742 3834 3835 + readable-stream@4.5.2: 3836 + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} 3837 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 3838 + 3743 3839 readdirp@3.6.0: 3744 3840 resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 3745 3841 engines: {node: '>=8.10.0'} ··· 3788 3884 run-parallel@1.2.0: 3789 3885 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 3790 3886 3887 + safe-buffer@5.2.1: 3888 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 3889 + 3791 3890 safe-stable-stringify@2.5.0: 3792 3891 resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 3793 3892 engines: {node: '>=10'} ··· 3822 3921 resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 3823 3922 engines: {node: '>=14'} 3824 3923 3924 + sonic-boom@3.8.1: 3925 + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} 3926 + 3825 3927 sonic-boom@4.2.0: 3826 3928 resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} 3827 3929 ··· 3852 3954 resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 3853 3955 engines: {node: '>=12'} 3854 3956 3957 + string_decoder@1.3.0: 3958 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 3959 + 3855 3960 strip-ansi@6.0.1: 3856 3961 resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3857 3962 engines: {node: '>=8'} ··· 3907 4012 3908 4013 thenify@3.3.1: 3909 4014 resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 4015 + 4016 + thread-stream@2.7.0: 4017 + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} 3910 4018 3911 4019 thread-stream@3.1.0: 3912 4020 resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} ··· 4305 4413 uint8arrays: 3.0.0 4306 4414 zod: 3.23.8 4307 4415 4416 + '@atproto/common@0.4.5': 4417 + dependencies: 4418 + '@atproto/common-web': 0.3.1 4419 + '@ipld/dag-cbor': 7.0.3 4420 + cbor-x: 1.6.0 4421 + iso-datestring-validator: 2.2.2 4422 + multiformats: 9.9.0 4423 + pino: 8.21.0 4424 + 4308 4425 '@atproto/did@0.1.3': 4309 4426 dependencies: 4310 4427 zod: 3.23.8 ··· 4482 4599 '@babel/helper-validator-identifier': 7.25.9 4483 4600 4484 4601 '@badrap/valita@0.3.16': {} 4602 + 4603 + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': 4604 + optional: true 4605 + 4606 + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': 4607 + optional: true 4608 + 4609 + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': 4610 + optional: true 4611 + 4612 + '@cbor-extract/cbor-extract-linux-arm@2.2.0': 4613 + optional: true 4614 + 4615 + '@cbor-extract/cbor-extract-linux-x64@2.2.0': 4616 + optional: true 4617 + 4618 + '@cbor-extract/cbor-extract-win32-x64@2.2.0': 4619 + optional: true 4485 4620 4486 4621 '@cspotcode/source-map-support@0.8.1': 4487 4622 dependencies: ··· 4890 5025 '@humanwhocodes/retry@0.3.1': {} 4891 5026 4892 5027 '@humanwhocodes/retry@0.4.1': {} 5028 + 5029 + '@ipld/dag-cbor@7.0.3': 5030 + dependencies: 5031 + cborg: 1.10.2 5032 + multiformats: 9.9.0 4893 5033 4894 5034 '@isaacs/cliui@8.0.2': 4895 5035 dependencies: ··· 6136 6276 transitivePeerDependencies: 6137 6277 - '@swc/helpers' 6138 6278 6279 + abort-controller@3.0.0: 6280 + dependencies: 6281 + event-target-shim: 5.0.1 6282 + 6139 6283 acorn-import-attributes@1.9.5(acorn@8.14.0): 6140 6284 dependencies: 6141 6285 acorn: 8.14.0 ··· 6219 6363 6220 6364 balanced-match@1.0.2: {} 6221 6365 6366 + base64-js@1.5.1: {} 6367 + 6222 6368 binary-extensions@2.3.0: {} 6223 6369 6224 6370 boolbase@1.0.0: {} ··· 6244 6390 update-browserslist-db: 1.1.1(browserslist@4.24.2) 6245 6391 6246 6392 buffer-from@1.1.2: {} 6393 + 6394 + buffer@6.0.3: 6395 + dependencies: 6396 + base64-js: 1.5.1 6397 + ieee754: 1.2.1 6247 6398 6248 6399 bufferutil@4.0.8: 6249 6400 dependencies: ··· 6268 6419 lodash.uniq: 4.5.0 6269 6420 6270 6421 caniuse-lite@1.0.30001686: {} 6422 + 6423 + cbor-extract@2.2.0: 6424 + dependencies: 6425 + node-gyp-build-optional-packages: 5.1.1 6426 + optionalDependencies: 6427 + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 6428 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 6429 + '@cbor-extract/cbor-extract-linux-arm': 2.2.0 6430 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 6431 + '@cbor-extract/cbor-extract-linux-x64': 2.2.0 6432 + '@cbor-extract/cbor-extract-win32-x64': 2.2.0 6433 + optional: true 6434 + 6435 + cbor-x@1.6.0: 6436 + optionalDependencies: 6437 + cbor-extract: 2.2.0 6438 + 6439 + cborg@1.10.2: {} 6271 6440 6272 6441 chalk@4.1.2: 6273 6442 dependencies: ··· 6455 6624 transitivePeerDependencies: 6456 6625 - supports-color 6457 6626 6458 - drizzle-orm@0.37.0(@libsql/client@0.14.0(bufferutil@4.0.8))(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0): 6627 + drizzle-orm@0.37.0(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(@types/react@19.0.1)(react@19.0.0): 6459 6628 optionalDependencies: 6460 6629 '@libsql/client': 0.14.0(bufferutil@4.0.8) 6461 6630 '@opentelemetry/api': 1.9.0 ··· 6669 6838 6670 6839 esutils@2.0.3: {} 6671 6840 6841 + event-target-shim@5.0.1: {} 6842 + 6672 6843 event-target-shim@6.0.2: {} 6844 + 6845 + events@3.3.0: {} 6673 6846 6674 6847 fast-copy@3.0.2: {} 6675 6848 ··· 6808 6981 iron-webcrypto: 0.10.1 6809 6982 6810 6983 hono@4.6.12: {} 6984 + 6985 + ieee754@1.2.1: {} 6811 6986 6812 6987 ignore@5.3.2: {} 6813 6988 ··· 7001 7176 fetch-blob: 3.2.0 7002 7177 formdata-polyfill: 4.0.10 7003 7178 7179 + node-gyp-build-optional-packages@5.1.1: 7180 + dependencies: 7181 + detect-libc: 2.0.2 7182 + optional: true 7183 + 7004 7184 node-gyp-build@4.8.4: {} 7005 7185 7006 7186 node-releases@2.0.18: {} ··· 7086 7266 7087 7267 pify@2.3.0: {} 7088 7268 7269 + pino-abstract-transport@1.2.0: 7270 + dependencies: 7271 + readable-stream: 4.5.2 7272 + split2: 4.2.0 7273 + 7089 7274 pino-abstract-transport@2.0.0: 7090 7275 dependencies: 7091 7276 split2: 4.2.0 ··· 7106 7291 sonic-boom: 4.2.0 7107 7292 strip-json-comments: 3.1.1 7108 7293 7294 + pino-std-serializers@6.2.2: {} 7295 + 7109 7296 pino-std-serializers@7.0.0: {} 7110 7297 7298 + pino@8.21.0: 7299 + dependencies: 7300 + atomic-sleep: 1.0.0 7301 + fast-redact: 3.5.0 7302 + on-exit-leak-free: 2.1.2 7303 + pino-abstract-transport: 1.2.0 7304 + pino-std-serializers: 6.2.2 7305 + process-warning: 3.0.0 7306 + quick-format-unescaped: 4.0.4 7307 + real-require: 0.2.0 7308 + safe-stable-stringify: 2.5.0 7309 + sonic-boom: 3.8.1 7310 + thread-stream: 2.7.0 7311 + 7111 7312 pino@9.5.0: 7112 7313 dependencies: 7113 7314 atomic-sleep: 1.0.0 ··· 7334 7535 7335 7536 prettier@3.4.1: {} 7336 7537 7538 + process-warning@3.0.0: {} 7539 + 7337 7540 process-warning@4.0.0: {} 7541 + 7542 + process@0.11.10: {} 7338 7543 7339 7544 promise-limit@2.7.0: {} 7340 7545 ··· 7396 7601 read-cache@1.0.0: 7397 7602 dependencies: 7398 7603 pify: 2.3.0 7604 + 7605 + readable-stream@4.5.2: 7606 + dependencies: 7607 + abort-controller: 3.0.0 7608 + buffer: 6.0.3 7609 + events: 3.3.0 7610 + process: 0.11.10 7611 + string_decoder: 1.3.0 7399 7612 7400 7613 readdirp@3.6.0: 7401 7614 dependencies: ··· 7460 7673 dependencies: 7461 7674 queue-microtask: 1.2.3 7462 7675 7676 + safe-buffer@5.2.1: {} 7677 + 7463 7678 safe-stable-stringify@2.5.0: {} 7464 7679 7465 7680 scheduler@0.25.0: {} ··· 7479 7694 shimmer@1.2.1: {} 7480 7695 7481 7696 signal-exit@4.1.0: {} 7697 + 7698 + sonic-boom@3.8.1: 7699 + dependencies: 7700 + atomic-sleep: 1.0.0 7482 7701 7483 7702 sonic-boom@4.2.0: 7484 7703 dependencies: ··· 7510 7729 eastasianwidth: 0.2.0 7511 7730 emoji-regex: 9.2.2 7512 7731 strip-ansi: 7.1.0 7732 + 7733 + string_decoder@1.3.0: 7734 + dependencies: 7735 + safe-buffer: 5.2.1 7513 7736 7514 7737 strip-ansi@6.0.1: 7515 7738 dependencies: ··· 7593 7816 thenify@3.3.1: 7594 7817 dependencies: 7595 7818 any-promise: 1.3.0 7819 + 7820 + thread-stream@2.7.0: 7821 + dependencies: 7822 + real-require: 0.2.0 7596 7823 7597 7824 thread-stream@3.1.0: 7598 7825 dependencies: