forked from
standard.site/standard.site
Standard.site landing page built in Next.js
1import { AtpAgent } from "@atproto/api";
2import { writeFileSync, mkdirSync, existsSync } from "fs";
3import { join, dirname } from "path";
4import { fileURLToPath } from "url";
5
6const STANDARD_DID = "did:plc:re3ebnp5v7ffagz6rb6xfei4";
7const LEXICON_COLLECTION = "com.atproto.lexicon.schema";
8
9const LEXICONS_TO_SYNC = [
10 "site.standard.publication",
11 "site.standard.document",
12 "site.standard.theme.basic",
13 "site.standard.theme.color",
14 "site.standard.graph.subscription",
15 "site.standard.graph.recommend",
16 "site.standard.authFull",
17 "site.standard.authSocial",
18];
19
20const __dirname = dirname(fileURLToPath(import.meta.url));
21const OUTPUT_DIR = join(__dirname, "../app/data/lexicons");
22
23const agent = new AtpAgent({
24 service: "https://bsky.social",
25});
26
27async function fetchLexicon(nsid: string) {
28 const response = await agent.com.atproto.repo.getRecord({
29 repo: STANDARD_DID,
30 collection: LEXICON_COLLECTION,
31 rkey: nsid,
32 });
33
34 return response.data.value;
35}
36
37function getFileName(nsid: string): string {
38 // site.standard.publication -> publication.json
39 // site.standard.theme.basic -> theme.basic.json
40 const parts = nsid.split(".");
41 const name = parts.slice(2).join(".");
42 return `${name}.json`;
43}
44
45async function main() {
46 console.log("Syncing lexicons from AT Protocol...\n");
47
48 if (!existsSync(OUTPUT_DIR)) {
49 mkdirSync(OUTPUT_DIR, { recursive: true });
50 console.log(`Created directory: ${OUTPUT_DIR}\n`);
51 }
52
53 for (const nsid of LEXICONS_TO_SYNC) {
54 try {
55 console.log(`Fetching ${nsid}...`);
56 const lexicon = await fetchLexicon(nsid);
57 const fileName = getFileName(nsid);
58 const filePath = join(OUTPUT_DIR, fileName);
59
60 writeFileSync(filePath, JSON.stringify(lexicon, null, 2));
61 console.log(` Saved to ${fileName}`);
62 } catch (error) {
63 console.error(` Failed to fetch ${nsid}:`, error);
64 }
65 }
66
67 console.log("\nSync complete.");
68}
69
70main();