browse the protocol like its 2008 ibex.desertthunder.dev
ubuntu atproto svelte
7

Configure Feed

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

refactor: collapse into rest route

Owais Jamil (Jun 16, 2026, 11:58 PM -0500) 39b61a09 91b99383

+76 -39
+47
src/lib/desktop-routes.test.ts
··· 1 + import { describe, expect, it } from 'vitest'; 2 + import { repoPathSegments, repoRouteFromSegments } from './desktop-routes'; 3 + 4 + describe('desktop repo route parsing', () => { 5 + it('parses repo roots', () => { 6 + expect(repoRouteFromSegments('did:plc:abc123', [])).toEqual({ kind: 'repo', did: 'did:plc:abc123' }); 7 + }); 8 + 9 + it('parses identity routes', () => { 10 + expect(repoRouteFromSegments('did:plc:abc123', ['identity'])).toEqual({ 11 + kind: 'identity', 12 + did: 'did:plc:abc123' 13 + }); 14 + }); 15 + 16 + it('parses blob routes with encoded slashes', () => { 17 + expect(repoRouteFromSegments('did:plc:abc123', ['blobs', 'bafy%2Ftest'])).toEqual({ 18 + kind: 'blob', 19 + did: 'did:plc:abc123', 20 + cid: 'bafy/test' 21 + }); 22 + }); 23 + 24 + it('parses collection and record routes', () => { 25 + expect(repoRouteFromSegments('did:plc:abc123', ['collections', 'app.bsky.feed.post'])).toEqual({ 26 + kind: 'collection', 27 + did: 'did:plc:abc123', 28 + collection: 'app.bsky.feed.post' 29 + }); 30 + expect(repoRouteFromSegments('did:plc:abc123', ['collections', 'app.bsky.feed.post', 'post%2Fkey'])).toEqual({ 31 + kind: 'record', 32 + did: 'did:plc:abc123', 33 + collection: 'app.bsky.feed.post', 34 + rkey: 'post/key' 35 + }); 36 + }); 37 + 38 + it('extracts encoded repo path segments from URLs', () => { 39 + const url = new URL('https://example.com/base/repos/did:plc:abc123/collections/app.bsky.feed.post/post%2Fkey'); 40 + 41 + expect(repoPathSegments(url)).toEqual(['collections', 'app.bsky.feed.post', 'post%2Fkey']); 42 + }); 43 + 44 + it('rejects unknown repo routes', () => { 45 + expect(() => repoRouteFromSegments('did:plc:abc123', ['unknown'])).toThrow('Unknown repository route.'); 46 + }); 47 + });
+21
src/lib/desktop-routes.ts
··· 12 12 if (route.kind === 'blob') return `${route.kind}/${route.did}/${route.cid}`; 13 13 return `${route.kind}/${route.did}`; 14 14 } 15 + 16 + export function repoRouteFromSegments(did: string, encodedSegments: string[]): RepoRoute { 17 + const [app, second, third, ...rest] = encodedSegments.map((segment) => decodeURIComponent(segment)); 18 + 19 + if (!app) return { kind: 'repo', did }; 20 + if (app === 'identity' && !second) return { kind: 'identity', did }; 21 + if (app === 'blobs' && !second) return { kind: 'blobs', did }; 22 + if (app === 'blobs' && second && !third) return { kind: 'blob', did, cid: second }; 23 + if (app === 'collections' && second && !third) return { kind: 'collection', did, collection: second }; 24 + if (app === 'collections' && second && third && rest.length === 0) { 25 + return { kind: 'record', did, collection: second, rkey: third }; 26 + } 27 + 28 + throw new Error('Unknown repository route.'); 29 + } 30 + 31 + export function repoPathSegments(url: URL) { 32 + const segments = url.pathname.split('/').filter(Boolean); 33 + const reposIndex = segments.indexOf('repos'); 34 + return reposIndex === -1 ? [] : segments.slice(reposIndex + 2); 35 + }
-1
src/lib/index.ts
··· 1 - // place files you want to import through the `$lib` alias in this folder.
+2 -1
src/routes/repos/[did]/+page.ts
··· 1 + import { repoRouteFromSegments } from '$lib/desktop-routes'; 1 2 import type { PageLoad } from './$types'; 2 3 3 4 export const load: PageLoad = ({ params }) => ({ 4 - repoRoute: { kind: 'repo', did: params.did } 5 + repoRoute: repoRouteFromSegments(params.did, []) 5 6 });
+6
src/routes/repos/[did]/[...repoPath]/+page.ts
··· 1 + import { repoPathSegments, repoRouteFromSegments } from '$lib/desktop-routes'; 2 + import type { PageLoad } from './$types'; 3 + 4 + export const load: PageLoad = ({ params, url }) => ({ 5 + repoRoute: repoRouteFromSegments(params.did, repoPathSegments(url)) 6 + });
src/routes/repos/[did]/blobs/+page.svelte src/routes/repos/[did]/[...repoPath]/+page.svelte
-5
src/routes/repos/[did]/blobs/+page.ts
··· 1 - import type { PageLoad } from './$types'; 2 - 3 - export const load: PageLoad = ({ params }) => ({ 4 - repoRoute: { kind: 'blobs', did: params.did } 5 - });
-1
src/routes/repos/[did]/blobs/[cid]/+page.svelte
··· 1 - <script lang="ts"></script>
-5
src/routes/repos/[did]/blobs/[cid]/+page.ts
··· 1 - import type { PageLoad } from './$types'; 2 - 3 - export const load: PageLoad = ({ params }) => ({ 4 - repoRoute: { kind: 'blob', did: params.did, cid: params.cid } 5 - });
-1
src/routes/repos/[did]/collections/[collection]/+page.svelte
··· 1 - <script lang="ts"></script>
-5
src/routes/repos/[did]/collections/[collection]/+page.ts
··· 1 - import type { PageLoad } from './$types'; 2 - 3 - export const load: PageLoad = ({ params }) => ({ 4 - repoRoute: { kind: 'collection', did: params.did, collection: params.collection } 5 - });
-1
src/routes/repos/[did]/collections/[collection]/[rkey]/+page.svelte
··· 1 - <script lang="ts"></script>
-10
src/routes/repos/[did]/collections/[collection]/[rkey]/+page.ts
··· 1 - import type { PageLoad } from './$types'; 2 - 3 - export const load: PageLoad = ({ params }) => ({ 4 - repoRoute: { 5 - kind: 'record', 6 - did: params.did, 7 - collection: params.collection, 8 - rkey: params.rkey 9 - } 10 - });
-4
src/routes/repos/[did]/identity/+page.svelte
··· 1 - <!-- TODO: we should use this page properly, such that identity manager 2 - can direct link to it 3 - --> 4 - <script lang="ts"></script>
-5
src/routes/repos/[did]/identity/+page.ts
··· 1 - import type { PageLoad } from './$types'; 2 - 3 - export const load: PageLoad = ({ params }) => ({ 4 - repoRoute: { kind: 'identity', did: params.did } 5 - });