an appview-less Bluesky client using Constellation and PDS Queries reddwarf.app
frontend spa bluesky reddwarf microcosm
1import fs from "fs"; 2import path from "path"; 3//import { generateClientMetadata } from './src/helpers/oauthClient' 4export const generateClientMetadata = (appOrigin: string) => { 5 const callbackPath = "/callback"; 6 7 return { 8 client_id: `${appOrigin}/client-metadata.json`, 9 client_name: "ForumTest", 10 client_uri: appOrigin, 11 logo_uri: `${appOrigin}/logo192.png`, 12 tos_uri: `${appOrigin}/terms-of-service`, 13 policy_uri: `${appOrigin}/privacy-policy`, 14 redirect_uris: [`${appOrigin}${callbackPath}`] as [string, ...string[]], 15 scope: "atproto transition:generic", 16 grant_types: ["authorization_code", "refresh_token"] as [ 17 "authorization_code", 18 "refresh_token", 19 ], 20 response_types: ["code"] as ["code"], 21 token_endpoint_auth_method: "none" as "none", 22 application_type: "web" as "web", 23 dpop_bound_access_tokens: true, 24 }; 25}; 26 27export function generateMetadataPlugin({ 28 prod, 29 dev, 30 prodResolver = "https://bsky.social", 31 devResolver = prodResolver, 32}: { 33 prod: string; 34 dev: string; 35 prodResolver?: string; 36 devResolver?: string; 37}) { 38 return { 39 name: "vite-plugin-generate-metadata", 40 config(_config: any, { mode }: any) { 41 let appOrigin, resolver; 42 if (mode === "production") { 43 appOrigin = prod; 44 resolver = prodResolver; 45 if (!appOrigin || !appOrigin.startsWith("https://")) { 46 throw new Error( 47 "VITE_APP_ORIGIN environment variable must be set to a valid HTTPS URL for production build." 48 ); 49 } 50 } else { 51 appOrigin = dev; 52 resolver = devResolver; 53 } 54 55 const metadata = generateClientMetadata(appOrigin); 56 const outputPath = path.resolve( 57 process.cwd(), 58 "public", 59 "client-metadata.json" 60 ); 61 62 fs.writeFileSync(outputPath, JSON.stringify(metadata, null, 2)); 63 64 const resolvers = { 65 resolver: resolver, 66 }; 67 const resolverOutPath = path.resolve( 68 process.cwd(), 69 "public", 70 "resolvers.json" 71 ); 72 73 fs.writeFileSync(resolverOutPath, JSON.stringify(resolvers, null, 2)); 74 75 76 // /*mass comment*/ console.log(`✅ Generated client-metadata.json for ${appOrigin}`); 77 }, 78 }; 79}