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 console.log('💡 vite mode =', mode)
42 let appOrigin, resolver;
43 if (mode === "production") {
44 appOrigin = prod;
45 resolver = prodResolver;
46 if (!appOrigin || !appOrigin.startsWith("https://")) {
47 throw new Error(
48 "VITE_APP_ORIGIN environment variable must be set to a valid HTTPS URL for production build."
49 );
50 }
51 } else {
52 appOrigin = dev;
53 resolver = devResolver;
54 }
55
56 const metadata = generateClientMetadata(appOrigin);
57 const outputPath = path.resolve(
58 process.cwd(),
59 "public",
60 "client-metadata.json"
61 );
62
63 fs.writeFileSync(outputPath, JSON.stringify(metadata, null, 2));
64
65 const resolvers = {
66 resolver: resolver,
67 };
68 const resolverOutPath = path.resolve(
69 process.cwd(),
70 "public",
71 "resolvers.json"
72 );
73
74 fs.writeFileSync(resolverOutPath, JSON.stringify(resolvers, null, 2));
75
76
77 // /*mass comment*/ console.log(`✅ Generated client-metadata.json for ${appOrigin}`);
78 },
79 };
80}