this repo has no description
0
fork

Configure Feed

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

feat: add getTracksByDid

ansxor 5ceba89b 45dc6c13

+413 -123
+19 -1
apps/api/index.ts
··· 5 5 import { createDb } from "db"; 6 6 import type { BlobRef } from "db/schema"; 7 7 import * as dbschema from "db/schema"; 8 - import { inArray } from "drizzle-orm"; 8 + import { eq, inArray } from "drizzle-orm"; 9 9 import { 10 10 CaAnsxorCatnipGetTracks, 11 + CaAnsxorCatnipGetTracksByDid, 11 12 type CaAnsxorCatnipTrack, 12 13 } from "lexicon/atcute-lexicon"; 13 14 ··· 63 64 async handler({ params }) { 64 65 const tracks = await db.query.tracks.findMany({ 65 66 where: inArray(dbschema.tracks.uri, params.uris), 67 + with: { 68 + trackArtists: { 69 + with: { 70 + artist: true, 71 + }, 72 + }, 73 + }, 74 + }); 75 + 76 + return json({ tracks: tracks.map((t) => dbTrackToLexicon(t as DbTrack)) }); 77 + }, 78 + }); 79 + 80 + router.addQuery(CaAnsxorCatnipGetTracksByDid, { 81 + async handler({ params }) { 82 + const tracks = await db.query.tracks.findMany({ 83 + where: eq(dbschema.tracks.did, params.did), 66 84 with: { 67 85 trackArtists: { 68 86 with: {
+48
apps/api/tests/server.test.ts
··· 104 104 return router.fetch(new Request(url, { method: "GET" })); 105 105 } 106 106 107 + async function fetchTracksByDid(router: XRPCRouter, did: string) { 108 + const url = new URL("http://localhost/xrpc/ca.ansxor.catnip.getTracksByDid"); 109 + url.searchParams.set("did", did); 110 + return router.fetch(new Request(url, { method: "GET" })); 111 + } 112 + 107 113 test("returns a track by URI", async () => { 108 114 const title = faker.music.songName(); 109 115 const artistName = faker.person.fullName(); ··· 155 161 const titles = data.tracks.map((t: any) => t.title).sort(); 156 162 expect(titles).toEqual(["Track One", "Track Two"]); 157 163 }); 164 + 165 + // getTracksByDid tests 166 + 167 + test("getTracksByDid returns tracks for a given DID", async () => { 168 + const did = fakeDid(); 169 + await insertTrack(txDb, { did, title: "DID Track 1" }); 170 + await insertTrack(txDb, { did, title: "DID Track 2" }); 171 + 172 + const router = makeRouter(); 173 + const response = await fetchTracksByDid(router, did); 174 + expect(response.status).toBe(200); 175 + 176 + const data = await response.json(); 177 + expect(data.tracks).toHaveLength(2); 178 + 179 + const titles = data.tracks.map((t: any) => t.title).sort(); 180 + expect(titles).toEqual(["DID Track 1", "DID Track 2"]); 181 + }); 182 + 183 + test("getTracksByDid returns empty array for unknown DID", async () => { 184 + const router = makeRouter(); 185 + const response = await fetchTracksByDid(router, fakeDid()); 186 + expect(response.status).toBe(200); 187 + 188 + const data = await response.json(); 189 + expect(data.tracks).toHaveLength(0); 190 + }); 191 + 192 + test("getTracksByDid only returns tracks from the specified DID", async () => { 193 + const did1 = fakeDid(); 194 + const did2 = fakeDid(); 195 + await insertTrack(txDb, { did: did1, title: "User 1 Track" }); 196 + await insertTrack(txDb, { did: did2, title: "User 2 Track" }); 197 + 198 + const router = makeRouter(); 199 + const response = await fetchTracksByDid(router, did1); 200 + expect(response.status).toBe(200); 201 + 202 + const data = await response.json(); 203 + expect(data.tracks).toHaveLength(1); 204 + expect(data.tracks[0].title).toBe("User 1 Track"); 205 + });
+4 -1
apps/frontend/package.json
··· 10 10 "preview": "vite preview" 11 11 }, 12 12 "dependencies": { 13 + "@atcute/bluesky": "^3.2.20", 13 14 "@atcute/client": "^4.2.1", 15 + "@tailwindcss/vite": "^4.2.1", 14 16 "@tanstack/react-router": "^1.166.3", 15 17 "@tanstack/react-router-devtools": "^1.166.3", 16 18 "@vitejs/plugin-react": "^5.1.4", 17 19 "lexicon": "workspace:*", 18 20 "react": "^19.2.0", 19 - "react-dom": "^19.2.0" 21 + "react-dom": "^19.2.0", 22 + "tailwindcss": "^4.2.1" 20 23 }, 21 24 "devDependencies": { 22 25 "@eslint/js": "^9.39.1",
-42
apps/frontend/src/App.css
··· 1 - #root { 2 - max-width: 1280px; 3 - margin: 0 auto; 4 - padding: 2rem; 5 - text-align: center; 6 - } 7 - 8 - .logo { 9 - height: 6em; 10 - padding: 1.5em; 11 - will-change: filter; 12 - transition: filter 300ms; 13 - } 14 - .logo:hover { 15 - filter: drop-shadow(0 0 2em #646cffaa); 16 - } 17 - .logo.react:hover { 18 - filter: drop-shadow(0 0 2em #61dafbaa); 19 - } 20 - 21 - @keyframes logo-spin { 22 - from { 23 - transform: rotate(0deg); 24 - } 25 - to { 26 - transform: rotate(360deg); 27 - } 28 - } 29 - 30 - @media (prefers-reduced-motion: no-preference) { 31 - a:nth-of-type(2) .logo { 32 - animation: logo-spin infinite 20s linear; 33 - } 34 - } 35 - 36 - .card { 37 - padding: 2em; 38 - } 39 - 40 - .read-the-docs { 41 - color: #888; 42 - }
+3 -3
apps/frontend/src/App.tsx
··· 1 1 import { useState } from "react"; 2 2 import viteLogo from "/vite.svg"; 3 3 import reactLogo from "./assets/react.svg"; 4 - import "./App.css"; 4 + import "./layout.css"; 5 5 6 6 function App() { 7 7 const [count, setCount] = useState(0); 8 8 9 9 return ( 10 - <> 10 + <div className="bg-background"> 11 11 <div> 12 12 <a href="https://vite.dev" target="_blank" rel="noopener"> 13 13 <img src={viteLogo} className="logo" alt="Vite logo" /> ··· 28 28 <p className="read-the-docs"> 29 29 Click on the Vite and React logos to learn more 30 30 </p> 31 - </> 31 + </div> 32 32 ); 33 33 } 34 34
-68
apps/frontend/src/index.css
··· 1 - :root { 2 - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; 3 - line-height: 1.5; 4 - font-weight: 400; 5 - 6 - color-scheme: light dark; 7 - color: rgba(255, 255, 255, 0.87); 8 - background-color: #242424; 9 - 10 - font-synthesis: none; 11 - text-rendering: optimizeLegibility; 12 - -webkit-font-smoothing: antialiased; 13 - -moz-osx-font-smoothing: grayscale; 14 - } 15 - 16 - a { 17 - font-weight: 500; 18 - color: #646cff; 19 - text-decoration: inherit; 20 - } 21 - a:hover { 22 - color: #535bf2; 23 - } 24 - 25 - body { 26 - margin: 0; 27 - display: flex; 28 - place-items: center; 29 - min-width: 320px; 30 - min-height: 100vh; 31 - } 32 - 33 - h1 { 34 - font-size: 3.2em; 35 - line-height: 1.1; 36 - } 37 - 38 - button { 39 - border-radius: 8px; 40 - border: 1px solid transparent; 41 - padding: 0.6em 1.2em; 42 - font-size: 1em; 43 - font-weight: 500; 44 - font-family: inherit; 45 - background-color: #1a1a1a; 46 - cursor: pointer; 47 - transition: border-color 0.25s; 48 - } 49 - button:hover { 50 - border-color: #646cff; 51 - } 52 - button:focus, 53 - button:focus-visible { 54 - outline: 4px auto -webkit-focus-ring-color; 55 - } 56 - 57 - @media (prefers-color-scheme: light) { 58 - :root { 59 - color: #213547; 60 - background-color: #ffffff; 61 - } 62 - a:hover { 63 - color: #747bff; 64 - } 65 - button { 66 - background-color: #f9f9f9; 67 - } 68 - }
+14
apps/frontend/src/layout.css
··· 1 + @import "tailwindcss"; 2 + 3 + @theme { 4 + --color-primary-text: #304345; 5 + --color-background: #FDFBEA; 6 + --color-primary: #FDFBEA: 7 + --color-secondary: #FDFBEA; 8 + --color-accent: #FDFBEA; 9 + } 10 + 11 + body { 12 + background-color: var(--color-background); 13 + color: var(--color-primary-text); 14 + }
+1
apps/frontend/src/main.tsx
··· 1 1 import { createRouter, RouterProvider } from "@tanstack/react-router"; 2 2 import { StrictMode } from "react"; 3 3 import ReactDOM from "react-dom/client"; 4 + import "./layout.css"; 4 5 5 6 // Import the generated route tree 6 7 import { routeTree } from "./routeTree.gen";
+84 -6
apps/frontend/src/routes/profile/$did.tsx
··· 1 - import { createFileRoute } from '@tanstack/react-router' 1 + import { Client, simpleFetchHandler } from "@atcute/client"; 2 + import type {} from "@atcute/bluesky"; 3 + import { createFileRoute } from "@tanstack/react-router"; 4 + import type {} from "lexicon/atcute-lexicon"; 5 + 6 + const rpc = new Client({ 7 + handler: simpleFetchHandler({ service: "http://localhost:3000" }), 8 + }); 9 + 10 + const bskyRpc = new Client({ 11 + handler: simpleFetchHandler({ service: "https://public.api.bsky.app" }), 12 + }); 13 + 14 + export const Route = createFileRoute("/profile/$did")({ 15 + component: ProfilePage, 16 + loader: async ({ params }) => { 17 + const [tracksResult, profileResult] = await Promise.all([ 18 + rpc.get("ca.ansxor.catnip.getTracksByDid", { 19 + params: { did: params.did }, 20 + }), 21 + bskyRpc.get("app.bsky.actor.getProfile", { 22 + params: { actor: params.did }, 23 + }), 24 + ]); 2 25 3 - export const Route = createFileRoute('/profile/$did')({ 4 - component: RouteComponent, 5 - }) 26 + return { 27 + tracks: tracksResult.ok ? tracksResult.data.tracks : [], 28 + profile: profileResult.ok ? profileResult.data : null, 29 + }; 30 + }, 31 + }); 6 32 7 - function RouteComponent() { 8 - return <div>Hello "/tracks/$did"!</div> 33 + function ProfilePage() { 34 + const { tracks, profile } = Route.useLoaderData(); 35 + const { did } = Route.useParams(); 36 + 37 + return ( 38 + <div className="p-4 max-w-2xl mx-auto"> 39 + <div className="mb-6"> 40 + {profile ? ( 41 + <div className="flex items-center gap-4"> 42 + {profile.avatar && ( 43 + <img 44 + src={profile.avatar} 45 + alt={profile.displayName ?? profile.handle} 46 + className="w-16 h-16 rounded-full" 47 + /> 48 + )} 49 + <div> 50 + <h1 className="text-2xl font-bold"> 51 + {profile.displayName ?? profile.handle} 52 + </h1> 53 + <p className="text-sm opacity-70">@{profile.handle}</p> 54 + {profile.description && ( 55 + <p className="mt-1 text-sm">{profile.description}</p> 56 + )} 57 + </div> 58 + </div> 59 + ) : ( 60 + <h1 className="text-2xl font-bold font-mono">{did}</h1> 61 + )} 62 + </div> 63 + 64 + <h2 className="text-lg font-semibold mb-3">Tracks</h2> 65 + 66 + {tracks.length === 0 ? ( 67 + <p className="opacity-70">No tracks found.</p> 68 + ) : ( 69 + <ul className="space-y-3"> 70 + {tracks.map((track, i) => ( 71 + <li key={i} className="border rounded-lg p-3"> 72 + <p className="font-semibold">{track.title}</p> 73 + {track.artists && track.artists.length > 0 && ( 74 + <p className="text-sm opacity-70"> 75 + {track.artists.map((a) => a.name ?? a.did).join(", ")} 76 + </p> 77 + )} 78 + {track.description && ( 79 + <p className="text-sm mt-1">{track.description}</p> 80 + )} 81 + </li> 82 + ))} 83 + </ul> 84 + )} 85 + </div> 86 + ); 9 87 }
+1 -1
apps/frontend/tsconfig.json
··· 5 5 { "path": "./tsconfig.node.json" } 6 6 ], 7 7 "compilerOptions": { 8 - "types": ["lexicon/atcute-lexicon"] 8 + "types": ["lexicon/atcute-lexicon", "@atcute/bluesky"] 9 9 } 10 10 }
+3 -1
apps/frontend/vite.config.ts
··· 1 1 import { tanstackRouter } from "@tanstack/router-plugin/vite"; 2 2 import react from "@vitejs/plugin-react"; 3 3 import { defineConfig } from "vite"; 4 + import tailwindcss from '@tailwindcss/vite' 4 5 // https://vite.dev/config/ 5 6 export default defineConfig({ 6 7 plugins: [ ··· 9 10 target: "react", 10 11 autoCodeSplitting: true, 11 12 }), 13 + tailwindcss(), 12 14 react({ 13 15 babel: { 14 16 plugins: ["babel-plugin-react-compiler"], 15 17 }, 16 - }), 18 + }), 17 19 ], 18 20 });
+113
bun.lock
··· 56 56 "name": "frontend", 57 57 "version": "0.0.0", 58 58 "dependencies": { 59 + "@atcute/bluesky": "^3.2.20", 59 60 "@atcute/client": "^4.2.1", 61 + "@tailwindcss/vite": "^4.2.1", 60 62 "@tanstack/react-router": "^1.166.3", 61 63 "@tanstack/react-router-devtools": "^1.166.3", 62 64 "@vitejs/plugin-react": "^5.1.4", 63 65 "lexicon": "workspace:*", 64 66 "react": "^19.2.0", 65 67 "react-dom": "^19.2.0", 68 + "tailwindcss": "^4.2.1", 66 69 }, 67 70 "devDependencies": { 68 71 "@eslint/js": "^9.39.1", ··· 117 120 }, 118 121 "packages": { 119 122 "@atcute/atproto": ["@atcute/atproto@3.1.10", "", { "dependencies": { "@atcute/lexicons": "^1.2.6" } }, "sha512-+GKZpOc0PJcdWMQEkTfg/rSNDAAHxmAUGBl60g2az15etqJn5WaUPNGFE2sB7hKpwi5Ue2h/L0OacINcE/JDDQ=="], 123 + 124 + "@atcute/bluesky": ["@atcute/bluesky@3.2.20", "", { "dependencies": { "@atcute/atproto": "^3.1.10", "@atcute/lexicons": "^1.2.9" } }, "sha512-N+o7K31ptnHSFoYKOHfQYJHFqU7CgGbCX8lDeWvpQuwkEMTEPojrQXIQD/+FL+FVEvRV/84LNi9cEnhPKShE5w=="], 120 125 121 126 "@atcute/car": ["@atcute/car@5.1.1", "", { "dependencies": { "@atcute/cbor": "^2.3.2", "@atcute/cid": "^2.4.1", "@atcute/uint8array": "^1.1.1", "@atcute/varint": "^2.0.0" } }, "sha512-MeRUJNXYgAHrJZw7mMoZJb9xIqv3LZLQw90rRRAVAo8SGNdICwyqe6Bf2LGesX73QM04MBuYO6Kqhvold3TFfg=="], 122 127 ··· 446 451 447 452 "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], 448 453 454 + "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="], 455 + 456 + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="], 457 + 458 + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg=="], 459 + 460 + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw=="], 461 + 462 + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw=="], 463 + 464 + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA=="], 465 + 466 + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw=="], 467 + 468 + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ=="], 469 + 470 + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ=="], 471 + 472 + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g=="], 473 + 474 + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g=="], 475 + 476 + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.1", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q=="], 477 + 478 + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA=="], 479 + 480 + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="], 481 + 482 + "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], 483 + 449 484 "@tanstack/history": ["@tanstack/history@1.161.4", "", {}, "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww=="], 450 485 451 486 "@tanstack/react-router": ["@tanstack/react-router@1.166.3", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.166.2", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-5NOwAnEp+koHYaRkK5+biYiuOxnQe/7q8R7LLAJ5Ryk6hXoIimOv6gWimPxANwhCWg9spfRZCNswi8EQaidYBg=="], ··· 594 629 595 630 "electron-to-chromium": ["electron-to-chromium@1.5.307", "", {}, "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg=="], 596 631 632 + "enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="], 633 + 597 634 "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], 598 635 599 636 "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], ··· 661 698 "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], 662 699 663 700 "goober": ["goober@2.1.18", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw=="], 701 + 702 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 664 703 665 704 "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 666 705 ··· 738 777 739 778 "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 740 779 780 + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 781 + 741 782 "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], 742 783 743 784 "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], ··· 822 863 823 864 "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 824 865 866 + "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], 867 + 868 + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], 869 + 825 870 "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], 826 871 827 872 "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], ··· 878 923 879 924 "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 880 925 926 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], 927 + 928 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], 929 + 930 + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], 931 + 932 + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], 933 + 934 + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 935 + 936 + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 937 + 938 + "@tailwindcss/vite/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], 939 + 881 940 "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 882 941 883 942 "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], ··· 959 1018 "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], 960 1019 961 1020 "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], 1021 + 1022 + "@tailwindcss/vite/vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], 962 1023 963 1024 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], 964 1025 ··· 1071 1132 "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], 1072 1133 1073 1134 "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], 1135 + 1136 + "@tailwindcss/vite/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], 1137 + 1138 + "@tailwindcss/vite/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], 1139 + 1140 + "@tailwindcss/vite/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], 1141 + 1142 + "@tailwindcss/vite/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], 1143 + 1144 + "@tailwindcss/vite/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], 1145 + 1146 + "@tailwindcss/vite/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], 1147 + 1148 + "@tailwindcss/vite/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], 1149 + 1150 + "@tailwindcss/vite/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], 1151 + 1152 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], 1153 + 1154 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], 1155 + 1156 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], 1157 + 1158 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], 1159 + 1160 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], 1161 + 1162 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], 1163 + 1164 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], 1165 + 1166 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], 1167 + 1168 + "@tailwindcss/vite/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], 1169 + 1170 + "@tailwindcss/vite/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], 1171 + 1172 + "@tailwindcss/vite/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], 1173 + 1174 + "@tailwindcss/vite/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], 1175 + 1176 + "@tailwindcss/vite/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], 1177 + 1178 + "@tailwindcss/vite/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], 1179 + 1180 + "@tailwindcss/vite/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], 1181 + 1182 + "@tailwindcss/vite/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], 1183 + 1184 + "@tailwindcss/vite/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], 1185 + 1186 + "@tailwindcss/vite/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], 1074 1187 1075 1188 "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 1076 1189
+39
packages/lexicon/dist/lexicon/ca/ansxor/catnip/getTracksByDid.json
··· 1 + { 2 + "defs": { 3 + "main": { 4 + "description": "Get all tracks published by a specific user, identified by their DID.", 5 + "output": { 6 + "encoding": "application/json", 7 + "schema": { 8 + "properties": { 9 + "tracks": { 10 + "description": "List of track views.", 11 + "items": { 12 + "ref": "ca.ansxor.catnip.track", 13 + "type": "ref" 14 + }, 15 + "type": "array" 16 + } 17 + }, 18 + "required": ["tracks"], 19 + "type": "object" 20 + } 21 + }, 22 + "parameters": { 23 + "properties": { 24 + "did": { 25 + "type": "string", 26 + "description": "The DID of the user whose tracks to retrieve.", 27 + "format": "did" 28 + } 29 + }, 30 + "required": ["did"], 31 + "type": "params" 32 + }, 33 + "type": "query" 34 + } 35 + }, 36 + "description": "Get tracks published by a specific user (by DID).", 37 + "id": "ca.ansxor.catnip.getTracksByDid", 38 + "lexicon": 1 39 + }
+1
packages/lexicon/dist/src/index.ts
··· 1 1 export * as CaAnsxorCatnipGetTracks from "./types/ca/ansxor/catnip/getTracks.js"; 2 + export * as CaAnsxorCatnipGetTracksByDid from "./types/ca/ansxor/catnip/getTracksByDid.js"; 2 3 export * as CaAnsxorCatnipTrack from "./types/ca/ansxor/catnip/track.js";
+39
packages/lexicon/dist/src/types/ca/ansxor/catnip/getTracksByDid.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as CaAnsxorCatnipTrack from "./track.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.query("ca.ansxor.catnip.getTracksByDid", { 7 + params: /*#__PURE__*/ v.object({ 8 + /** 9 + * The DID of the user whose tracks to retrieve. 10 + */ 11 + did: /*#__PURE__*/ v.didString(), 12 + }), 13 + output: { 14 + type: "lex", 15 + schema: /*#__PURE__*/ v.object({ 16 + /** 17 + * List of track views. 18 + */ 19 + get tracks() { 20 + return /*#__PURE__*/ v.array(CaAnsxorCatnipTrack.mainSchema); 21 + }, 22 + }), 23 + }, 24 + }); 25 + 26 + type main$schematype = typeof _mainSchema; 27 + 28 + export interface mainSchema extends main$schematype {} 29 + 30 + export const mainSchema = _mainSchema as mainSchema; 31 + 32 + export interface $params extends v.InferInput<mainSchema["params"]> {} 33 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 34 + 35 + declare module "@atcute/lexicons/ambient" { 36 + interface XRPCQueries { 37 + "ca.ansxor.catnip.getTracksByDid": mainSchema; 38 + } 39 + }
+44
packages/lexicon/lexicons-src/ca.ansxor.catnip.getTracksByDid.ts
··· 1 + import { 2 + array, 3 + document, 4 + object, 5 + params, 6 + query, 7 + ref, 8 + required, 9 + string, 10 + } from "@atcute/lexicon-doc/builder"; 11 + 12 + export default document({ 13 + id: "ca.ansxor.catnip.getTracksByDid", 14 + description: "Get tracks published by a specific user (by DID).", 15 + defs: { 16 + main: query({ 17 + description: 18 + "Get all tracks published by a specific user, identified by their DID.", 19 + parameters: params({ 20 + properties: { 21 + did: required( 22 + string({ 23 + description: "The DID of the user whose tracks to retrieve.", 24 + format: "did", 25 + }), 26 + ), 27 + }, 28 + }), 29 + output: { 30 + encoding: "application/json", 31 + schema: object({ 32 + properties: { 33 + tracks: required( 34 + array({ 35 + description: "List of track views.", 36 + items: ref({ ref: "ca.ansxor.catnip.track" }), 37 + }), 38 + ), 39 + }, 40 + }), 41 + }, 42 + }), 43 + }, 44 + });