···1-import { createSignal, onMount, For, Show } from "solid-js";
2-import { deleteStoredSession, getSession, OAuthUserAgent } from "@atcute/oauth-browser-client";
3-import { agent, Login, retrieveSession, setAgent } from "./login.jsx";
4import { Did } from "@atcute/lexicons";
5-import { resolveDidDoc } from "../utils/api.js";
006import { createStore } from "solid-js/store";
7-import { Client, CredentialManager } from "@atcute/client";
08import { Modal } from "./modal.jsx";
9-import { A } from "@solidjs/router";
1011const AccountManager = () => {
12 const [openManager, setOpenManager] = createSignal(false);
···1+import { Client, CredentialManager } from "@atcute/client";
002import { Did } from "@atcute/lexicons";
3+import { deleteStoredSession, getSession, OAuthUserAgent } from "@atcute/oauth-browser-client";
4+import { A } from "@solidjs/router";
5+import { createSignal, For, onMount, Show } from "solid-js";
6import { createStore } from "solid-js/store";
7+import { resolveDidDoc } from "../utils/api.js";
8+import { agent, Login, retrieveSession, setAgent } from "./login.jsx";
9import { Modal } from "./modal.jsx";
01011const AccountManager = () => {
12 const [openManager, setOpenManager] = createSignal(false);
+2-2
src/components/backlinks.tsx
···1-import { createSignal, onMount, Show, For, createResource } from "solid-js";
2-import { getRecordBacklinks, getDidBacklinks, getAllBacklinks } from "../utils/api.js";
3import * as TID from "@atcute/tid";
004import { localDateFromTimestamp } from "../utils/date.js";
5import { Button } from "./button.jsx";
6
···001import * as TID from "@atcute/tid";
2+import { createResource, createSignal, For, onMount, Show } from "solid-js";
3+import { getAllBacklinks, getDidBacklinks, getRecordBacklinks } from "../utils/api.js";
4import { localDateFromTimestamp } from "../utils/date.js";
5import { Button } from "./button.jsx";
6
+8-8
src/components/create.tsx
···1-import { createSignal, Show } from "solid-js";
2import { Client } from "@atcute/client";
3-import { agent } from "../components/login.jsx";
4-import { Editor, editorView } from "../components/editor.jsx";
5-import Tooltip from "./tooltip.jsx";
6-import { useNavigate, useParams } from "@solidjs/router";
7import { remove } from "@mary/exif-rm";
8-import { TextInput } from "./text-input.jsx";
9-import { Modal } from "./modal.jsx";
10-import { Button } from "./button.jsx";
011import { setNotif } from "../layout.jsx";
00001213export const RecordEditor = (props: { create: boolean; record?: any; refetch?: any }) => {
14 const navigate = useNavigate();
···01import { Client } from "@atcute/client";
00002import { remove } from "@mary/exif-rm";
3+import { useNavigate, useParams } from "@solidjs/router";
4+import { createSignal, Show } from "solid-js";
5+import { Editor, editorView } from "../components/editor.jsx";
6+import { agent } from "../components/login.jsx";
7import { setNotif } from "../layout.jsx";
8+import { Button } from "./button.jsx";
9+import { Modal } from "./modal.jsx";
10+import { TextInput } from "./text-input.jsx";
11+import Tooltip from "./tooltip.jsx";
1213export const RecordEditor = (props: { create: boolean; record?: any; refetch?: any }) => {
14 const navigate = useNavigate();
+5-5
src/components/editor.tsx
···1-import { onCleanup, onMount } from "solid-js";
2-import { basicSetup, EditorView } from "codemirror";
3import { json, jsonParseLinter } from "@codemirror/lang-json";
4import { linter } from "@codemirror/lint";
5-import { basicLight } from "@fsegurai/codemirror-theme-basic-light";
6-import { basicDark } from "@fsegurai/codemirror-theme-basic-dark";
7import { Compartment } from "@codemirror/state";
8-import { indentWithTab } from "@codemirror/commands";
9import { keymap } from "@codemirror/view";
00001011export let editorView: EditorView;
12
···1+import { indentWithTab } from "@codemirror/commands";
02import { json, jsonParseLinter } from "@codemirror/lang-json";
3import { linter } from "@codemirror/lint";
004import { Compartment } from "@codemirror/state";
05import { keymap } from "@codemirror/view";
6+import { basicDark } from "@fsegurai/codemirror-theme-basic-dark";
7+import { basicLight } from "@fsegurai/codemirror-theme-basic-light";
8+import { basicSetup, EditorView } from "codemirror";
9+import { onCleanup, onMount } from "solid-js";
1011export let editorView: EditorView;
12
+3-3
src/components/json.tsx
···1-import VideoPlayer from "./video-player";
2import { createEffect, createSignal, For, Show } from "solid-js";
3-import { A } from "@solidjs/router";
4import { pds } from "./navbar";
5import Tooltip from "./tooltip";
6-import { hideMedia } from "../views/settings";
78interface AtBlob {
9 $type: string;
···1+import { A } from "@solidjs/router";
2import { createEffect, createSignal, For, Show } from "solid-js";
3+import { hideMedia } from "../views/settings";
4import { pds } from "./navbar";
5import Tooltip from "./tooltip";
6+import VideoPlayer from "./video-player";
78interface AtBlob {
9 $type: string;
+3-3
src/components/login.tsx
···1-import { createSignal } from "solid-js";
02import {
3 configureOAuth,
4 createAuthorizationUrl,
···10 resolveFromService,
11 type Session,
12} from "@atcute/oauth-browser-client";
13-import { Did } from "@atcute/lexicons";
14-import { isHandle } from "@atcute/lexicons/syntax";
15import { TextInput } from "./text-input";
1617configureOAuth({
···1+import { Did } from "@atcute/lexicons";
2+import { isHandle } from "@atcute/lexicons/syntax";
3import {
4 configureOAuth,
5 createAuthorizationUrl,
···11 resolveFromService,
12 type Session,
13} from "@atcute/oauth-browser-client";
14+import { createSignal } from "solid-js";
015import { TextInput } from "./text-input";
1617configureOAuth({
+2-2
src/components/navbar.tsx
···01import { A, Params, useLocation } from "@solidjs/router";
2-import Tooltip from "./tooltip";
3import { createEffect, createSignal, onMount, Show } from "solid-js";
4import { didDocCache, labelerCache, validateHandle } from "../utils/api";
5-import { Did, Handle } from "@atcute/lexicons";
6import { addToClipboard } from "../utils/copy";
078export const [pds, setPDS] = createSignal<string>();
9export const [cid, setCID] = createSignal<string>();
···1+import { Did, Handle } from "@atcute/lexicons";
2import { A, Params, useLocation } from "@solidjs/router";
03import { createEffect, createSignal, onMount, Show } from "solid-js";
4import { didDocCache, labelerCache, validateHandle } from "../utils/api";
05import { addToClipboard } from "../utils/copy";
6+import Tooltip from "./tooltip";
78export const [pds, setPDS] = createSignal<string>();
9export const [cid, setCID] = createSignal<string>();
+2-2
src/components/search.tsx
···1-import { resolveHandle } from "../utils/api.js";
2import { useNavigate } from "@solidjs/router";
3import { createSignal, Show } from "solid-js";
4-import { Handle } from "@atcute/lexicons";
56const Search = () => {
7 const navigate = useNavigate();
···1+import { Handle } from "@atcute/lexicons";
2import { useNavigate } from "@solidjs/router";
3import { createSignal, Show } from "solid-js";
4+import { resolveHandle } from "../utils/api.js";
56const Search = () => {
7 const navigate = useNavigate();
+6-6
src/index.tsx
···1/* @refresh reload */
02import { render } from "solid-js/web";
3-import "./styles/index.css";
4-import { Route, Router } from "@solidjs/router";
5import { Layout } from "./layout.tsx";
6-import { Home } from "./views/home.tsx";
7-import { PdsView } from "./views/pds.tsx";
8-import { RepoView } from "./views/repo.tsx";
9import { CollectionView } from "./views/collection.tsx";
010import { LabelView } from "./views/labels.tsx";
11-import { StreamView } from "./views/stream.tsx";
12import { RecordView } from "./views/record.tsx";
013import { Settings } from "./views/settings.tsx";
01415render(
16 () => (
···1/* @refresh reload */
2+import { Route, Router } from "@solidjs/router";
3import { render } from "solid-js/web";
004import { Layout } from "./layout.tsx";
5+import "./styles/index.css";
006import { CollectionView } from "./views/collection.tsx";
7+import { Home } from "./views/home.tsx";
8import { LabelView } from "./views/labels.tsx";
9+import { PdsView } from "./views/pds.tsx";
10import { RecordView } from "./views/record.tsx";
11+import { RepoView } from "./views/repo.tsx";
12import { Settings } from "./views/settings.tsx";
13+import { StreamView } from "./views/stream.tsx";
1415render(
16 () => (
+6-6
src/layout.tsx
···1-import { createEffect, createSignal, ErrorBoundary, onMount, Show, Suspense } from "solid-js";
02import { A, RouteSectionProps, useLocation, useNavigate } from "@solidjs/router";
3-import { agent } from "./components/login.jsx";
04import { RecordEditor } from "./components/create.jsx";
05import { NavBar } from "./components/navbar.jsx";
6import { Search } from "./components/search.jsx";
7-import { AccountManager } from "./components/account.jsx";
8-import { resolveHandle } from "./utils/api.js";
9-import { Meta, MetaProvider } from "@solidjs/meta";
10-import { Handle } from "@atcute/lexicons";
11import { themeEvent, ThemeSelection } from "./components/theme.jsx";
01213export const [notif, setNotif] = createSignal<{
14 show: boolean;
···1+import { Handle } from "@atcute/lexicons";
2+import { Meta, MetaProvider } from "@solidjs/meta";
3import { A, RouteSectionProps, useLocation, useNavigate } from "@solidjs/router";
4+import { createEffect, createSignal, ErrorBoundary, onMount, Show, Suspense } from "solid-js";
5+import { AccountManager } from "./components/account.jsx";
6import { RecordEditor } from "./components/create.jsx";
7+import { agent } from "./components/login.jsx";
8import { NavBar } from "./components/navbar.jsx";
9import { Search } from "./components/search.jsx";
000010import { themeEvent, ThemeSelection } from "./components/theme.jsx";
11+import { resolveHandle } from "./utils/api.js";
1213export const [notif, setNotif] = createSignal<{
14 show: boolean;
+3-5
src/utils/api.ts
···1-import { createStore } from "solid-js/store";
2-3import "@atcute/atproto";
4import {
5 type DidDocument,
···18} from "@atcute/identity-resolver";
19import { Did, Handle } from "@atcute/lexicons";
20import { isHandle } from "@atcute/lexicons/syntax";
21-22import { setPDS } from "../components/navbar";
2324const didDocumentResolver = new CompositeDidDocumentResolver({
···167 getPDS,
168 getRecordBacklinks,
169 labelerCache,
170- resolveHandle,
171 resolveDidDoc,
172- validateHandle,
173 resolvePDS,
0174 type LinkData,
175};
···001import "@atcute/atproto";
2import {
3 type DidDocument,
···16} from "@atcute/identity-resolver";
17import { Did, Handle } from "@atcute/lexicons";
18import { isHandle } from "@atcute/lexicons/syntax";
19+import { createStore } from "solid-js/store";
20import { setPDS } from "../components/navbar";
2122const didDocumentResolver = new CompositeDidDocumentResolver({
···165 getPDS,
166 getRecordBacklinks,
167 labelerCache,
0168 resolveDidDoc,
169+ resolveHandle,
170 resolvePDS,
171+ validateHandle,
172 type LinkData,
173};
···1-import { Client } from "@atcute/client";
2-3import * as CAR from "@atcute/car";
4import { CarReader } from "@atcute/car/v4";
5import * as CBOR from "@atcute/cbor";
6import * as CID from "@atcute/cid";
07import { type FoundPublicKey, getPublicKeyFromDidController, verifySig } from "@atcute/crypto";
8import { type DidDocument, getAtprotoVerificationMaterial } from "@atcute/identity";
9import { Did } from "@atcute/lexicons";
···001import * as CAR from "@atcute/car";
2import { CarReader } from "@atcute/car/v4";
3import * as CBOR from "@atcute/cbor";
4import * as CID from "@atcute/cid";
5+import { Client } from "@atcute/client";
6import { type FoundPublicKey, getPublicKeyFromDidController, verifySig } from "@atcute/crypto";
7import { type DidDocument, getAtprotoVerificationMaterial } from "@atcute/identity";
8import { Did } from "@atcute/lexicons";
+1-1
src/views/blob.tsx
···1-import { createResource, createSignal, For, Show } from "solid-js";
2import { Client, CredentialManager } from "@atcute/client";
03import { Button } from "../components/button";
45const LIMIT = 1000;
···01import { Client, CredentialManager } from "@atcute/client";
2+import { createResource, createSignal, For, Show } from "solid-js";
3import { Button } from "../components/button";
45const LIMIT = 1000;
+10-10
src/views/collection.tsx
···1-import { createEffect, createResource, createSignal, For, Show, untrack } from "solid-js";
2-import { CredentialManager, Client } from "@atcute/client";
3-import { A, useParams } from "@solidjs/router";
4-import { resolvePDS } from "../utils/api.js";
5import * as TID from "@atcute/tid";
00006import { JSONType, JSONValue } from "../components/json.jsx";
7import { agent } from "../components/login.jsx";
8-import { createStore } from "solid-js/store";
9-import Tooltip from "../components/tooltip.jsx";
10-import { localDateFromTimestamp } from "../utils/date.js";
11-import { $type, ActorIdentifier, InferXRPCBodyOutput } from "@atcute/lexicons";
12-import { ComAtprotoRepoApplyWrites, ComAtprotoRepoGetRecord } from "@atcute/atproto";
13import { TextInput } from "../components/text-input.jsx";
14-import { Button } from "../components/button.jsx";
15import { setNotif } from "../layout.jsx";
001617interface AtprotoRecord {
18 rkey: string;
···1+import { ComAtprotoRepoApplyWrites, ComAtprotoRepoGetRecord } from "@atcute/atproto";
2+import { Client, CredentialManager } from "@atcute/client";
3+import { $type, ActorIdentifier, InferXRPCBodyOutput } from "@atcute/lexicons";
04import * as TID from "@atcute/tid";
5+import { A, useParams } from "@solidjs/router";
6+import { createEffect, createResource, createSignal, For, Show, untrack } from "solid-js";
7+import { createStore } from "solid-js/store";
8+import { Button } from "../components/button.jsx";
9import { JSONType, JSONValue } from "../components/json.jsx";
10import { agent } from "../components/login.jsx";
0000011import { TextInput } from "../components/text-input.jsx";
12+import Tooltip from "../components/tooltip.jsx";
13import { setNotif } from "../layout.jsx";
14+import { resolvePDS } from "../utils/api.js";
15+import { localDateFromTimestamp } from "../utils/date.js";
1617interface AtprotoRecord {
18 rkey: string;
+4-4
src/views/labels.tsx
···1-import { createResource, createSignal, For, onMount, Show } from "solid-js";
2import { Client, CredentialManager } from "@atcute/client";
3import { A, useParams, useSearchParams } from "@solidjs/router";
0004import { labelerCache, resolvePDS } from "../utils/api.js";
5import { localDateFromTimestamp } from "../utils/date.js";
6-import { ComAtprotoLabelDefs } from "@atcute/atproto";
7-import { TextInput } from "../components/text-input.jsx";
8-import { Button } from "../components/button.jsx";
910const LabelView = () => {
11 const params = useParams();
···1+import { ComAtprotoLabelDefs } from "@atcute/atproto";
2import { Client, CredentialManager } from "@atcute/client";
3import { A, useParams, useSearchParams } from "@solidjs/router";
4+import { createResource, createSignal, For, onMount, Show } from "solid-js";
5+import { Button } from "../components/button.jsx";
6+import { TextInput } from "../components/text-input.jsx";
7import { labelerCache, resolvePDS } from "../utils/api.js";
8import { localDateFromTimestamp } from "../utils/date.js";
000910const LabelView = () => {
11 const params = useParams();
+5-5
src/views/pds.tsx
···1-import { createSignal, For, Show, createResource } from "solid-js";
2import { Client, CredentialManager } from "@atcute/client";
003import { A, useParams } from "@solidjs/router";
004import { setPDS } from "../components/navbar";
5import Tooltip from "../components/tooltip";
6-import { InferXRPCBodyOutput } from "@atcute/lexicons";
7-import { ComAtprotoServerDescribeServer, ComAtprotoSyncListRepos } from "@atcute/atproto";
8-import * as TID from "@atcute/tid";
9import { localDateFromTimestamp } from "../utils/date";
10-import { Button } from "../components/button";
1112const LIMIT = 1000;
13
···1+import { ComAtprotoServerDescribeServer, ComAtprotoSyncListRepos } from "@atcute/atproto";
2import { Client, CredentialManager } from "@atcute/client";
3+import { InferXRPCBodyOutput } from "@atcute/lexicons";
4+import * as TID from "@atcute/tid";
5import { A, useParams } from "@solidjs/router";
6+import { createResource, createSignal, For, Show } from "solid-js";
7+import { Button } from "../components/button";
8import { setPDS } from "../components/navbar";
9import Tooltip from "../components/tooltip";
00010import { localDateFromTimestamp } from "../utils/date";
01112const LIMIT = 1000;
13
+10-13
src/views/record.tsx
···1-import { CredentialManager, Client } from "@atcute/client";
2-03import { A, useLocation, useNavigate, useParams } from "@solidjs/router";
4import { createResource, createSignal, ErrorBoundary, Show, Suspense } from "solid-js";
5-6import { Backlinks } from "../components/backlinks.jsx";
007import { JSONValue } from "../components/json.jsx";
8import { agent } from "../components/login.jsx";
09import { pds, setCID, setValidRecord, setValidSchema, validRecord } from "../components/navbar.jsx";
10-011import { didDocCache, resolvePDS } from "../utils/api.js";
012import { AtUri, uriTemplates } from "../utils/templates.js";
13-import { verifyRecord } from "../utils/verify.js";
14-import { ActorIdentifier, is } from "@atcute/lexicons";
15-import { lexiconDoc } from "@atcute/lexicon-doc";
16import { lexicons } from "../utils/types/lexicons.js";
17-import { RecordEditor } from "../components/create.jsx";
18-import { addToClipboard } from "../utils/copy.js";
19-import Tooltip from "../components/tooltip.jsx";
20-import { Modal } from "../components/modal.jsx";
21-import { Button } from "../components/button.jsx";
22-import { setNotif } from "../layout.jsx";
2324export const RecordView = () => {
25 const location = useLocation();
···1+import { Client, CredentialManager } from "@atcute/client";
2+import { lexiconDoc } from "@atcute/lexicon-doc";
3+import { ActorIdentifier, is } from "@atcute/lexicons";
4import { A, useLocation, useNavigate, useParams } from "@solidjs/router";
5import { createResource, createSignal, ErrorBoundary, Show, Suspense } from "solid-js";
06import { Backlinks } from "../components/backlinks.jsx";
7+import { Button } from "../components/button.jsx";
8+import { RecordEditor } from "../components/create.jsx";
9import { JSONValue } from "../components/json.jsx";
10import { agent } from "../components/login.jsx";
11+import { Modal } from "../components/modal.jsx";
12import { pds, setCID, setValidRecord, setValidSchema, validRecord } from "../components/navbar.jsx";
13+import Tooltip from "../components/tooltip.jsx";
14+import { setNotif } from "../layout.jsx";
15import { didDocCache, resolvePDS } from "../utils/api.js";
16+import { addToClipboard } from "../utils/copy.js";
17import { AtUri, uriTemplates } from "../utils/templates.js";
00018import { lexicons } from "../utils/types/lexicons.js";
19+import { verifyRecord } from "../utils/verify.js";
000002021export const RecordView = () => {
22 const location = useLocation();
+12-12
src/views/repo.tsx
···1-import { createSignal, For, Show, createResource, Suspense, ErrorBoundary } from "solid-js";
2import { Client, CredentialManager } from "@atcute/client";
3-import { A, useLocation, useNavigate, useParams } from "@solidjs/router";
4-import { didDocCache, resolvePDS } from "../utils/api.js";
5-import { Backlinks } from "../components/backlinks.jsx";
6-import { ActorIdentifier } from "@atcute/lexicons";
7-import { DidDocument } from "@atcute/identity";
8-import { BlobView } from "./blob.jsx";
9-import { TextInput } from "../components/text-input.jsx";
10-import Tooltip from "../components/tooltip.jsx";
11import {
12 CompatibleOperationOrTombstone,
13 defs,
14 IndexedEntry,
15 processIndexedEntryLog,
16} from "@atcute/did-plc";
17-import { createOperationHistory, DiffEntry, groupBy } from "../utils/plc-logs.js";
18-import { localDateFromTimestamp } from "../utils/date.js";
00019import { Button } from "../components/button.jsx";
20-import { parsePublicMultikey } from "@atcute/crypto";
000002122type Tab = "collections" | "backlinks" | "identity" | "blobs";
23type PlcEvent = "handle" | "rotation_key" | "service" | "verification_method";
···01import { Client, CredentialManager } from "@atcute/client";
2+import { parsePublicMultikey } from "@atcute/crypto";
00000003import {
4 CompatibleOperationOrTombstone,
5 defs,
6 IndexedEntry,
7 processIndexedEntryLog,
8} from "@atcute/did-plc";
9+import { DidDocument } from "@atcute/identity";
10+import { ActorIdentifier } from "@atcute/lexicons";
11+import { A, useLocation, useNavigate, useParams } from "@solidjs/router";
12+import { createResource, createSignal, ErrorBoundary, For, Show, Suspense } from "solid-js";
13+import { Backlinks } from "../components/backlinks.jsx";
14import { Button } from "../components/button.jsx";
15+import { TextInput } from "../components/text-input.jsx";
16+import Tooltip from "../components/tooltip.jsx";
17+import { didDocCache, resolvePDS } from "../utils/api.js";
18+import { localDateFromTimestamp } from "../utils/date.js";
19+import { createOperationHistory, DiffEntry, groupBy } from "../utils/plc-logs.js";
20+import { BlobView } from "./blob.jsx";
2122type Tab = "collections" | "backlinks" | "identity" | "blobs";
23type PlcEvent = "handle" | "rotation_key" | "service" | "verification_method";
+4-4
src/views/stream.tsx
···1-import { createSignal, For, Show, onCleanup, onMount } from "solid-js";
2-import { JSONValue } from "../components/json";
3-import { A, useLocation, useSearchParams } from "@solidjs/router";
4import { Firehose } from "@skyware/firehose";
5-import { TextInput } from "../components/text-input";
06import { Button } from "../components/button";
0078const LIMIT = 25;
9type Parameter = { name: string; param: string | string[] | undefined };
···0001import { Firehose } from "@skyware/firehose";
2+import { A, useLocation, useSearchParams } from "@solidjs/router";
3+import { createSignal, For, onCleanup, onMount, Show } from "solid-js";
4import { Button } from "../components/button";
5+import { JSONValue } from "../components/json";
6+import { TextInput } from "../components/text-input";
78const LIMIT = 25;
9type Parameter = { name: string; param: string | string[] | undefined };
+1-1
vite.config.ts
···01import { defineConfig } from "vite";
2import solidPlugin from "vite-plugin-solid";
3import metadata from "./public/oauth-client-metadata.json";
4-import tailwindcss from "@tailwindcss/vite";
56const SERVER_HOST = "127.0.0.1";
7const SERVER_PORT = 13213;
···1+import tailwindcss from "@tailwindcss/vite";
2import { defineConfig } from "vite";
3import solidPlugin from "vite-plugin-solid";
4import metadata from "./public/oauth-client-metadata.json";
056const SERVER_HOST = "127.0.0.1";
7const SERVER_PORT = 13213;