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}