tangled
alpha
login
or
join now
modamo.xyz
/
bambu
1
fork
atom
this repo has no description
1
fork
atom
overview
issues
pulls
pipelines
Begin OAuth flow
modamo-gh
1 month ago
519cc172
f127d455
+528
-4
6 changed files
expand all
collapse all
unified
split
app
oauth
callback
route.ts
login
route.ts
components
LoginForm.tsx
lib
auth
client.ts
package-lock.json
package.json
+18
app/oauth/callback/route.ts
···
1
1
+
import { getOAuthClient } from "@/lib/auth/client";
2
2
+
import { NextRequest, NextResponse } from "next/server";
3
3
+
4
4
+
const PUBLIC_URL = process.env.PUBLIC_URL || "http://127.0.0.1:3000";
5
5
+
6
6
+
export async function GET(request: NextRequest) {
7
7
+
try {
8
8
+
const params = request.nextUrl.searchParams;
9
9
+
const client = await getOAuthClient();
10
10
+
const {session} = await client.
11
11
+
} catch (error) {
12
12
+
console.error("OAuth callback error:", error);
13
13
+
14
14
+
return NextResponse.redirect(
15
15
+
new URL("/?error=login_failed", PUBLIC_URL)
16
16
+
);
17
17
+
}
18
18
+
}
+29
app/oauth/login/route.ts
···
1
1
+
import { getOAuthClient, SCOPE } from "@/lib/auth/client";
2
2
+
import { NextRequest, NextResponse } from "next/server";
3
3
+
4
4
+
export async function POST(request: NextRequest) {
5
5
+
try {
6
6
+
const { handle } = await request.json();
7
7
+
8
8
+
if (!handle || typeof handle !== "string") {
9
9
+
return NextResponse.json(
10
10
+
{ error: "Handle is required" },
11
11
+
{ status: 400 }
12
12
+
);
13
13
+
}
14
14
+
15
15
+
const client = await getOAuthClient();
16
16
+
const authURL = await client?.authorize(handle, { scope: SCOPE });
17
17
+
18
18
+
return NextResponse.json({ redirectURL: authURL?.toString() });
19
19
+
} catch (error) {
20
20
+
console.error("OAuth login error:", error);
21
21
+
22
22
+
return NextResponse.json(
23
23
+
{
24
24
+
error: error instanceof Error ? error.message : "Login failed"
25
25
+
},
26
26
+
{ status: 500 }
27
27
+
);
28
28
+
}
29
29
+
}
+35
-4
components/LoginForm.tsx
···
4
4
5
5
const LoginForm = () => {
6
6
const [handle, setHandle] = useState("");
7
7
+
const [isLoading, setIsLoading] = useState(false);
8
8
+
9
9
+
const handleSubmit = async (event: Event) => {
10
10
+
event.preventDefault();
11
11
+
12
12
+
setIsLoading(true);
13
13
+
14
14
+
try {
15
15
+
const response = await fetch("/oauth/login", {
16
16
+
body: JSON.stringify({ handle }),
17
17
+
headers: { "Content-Type": "application/json" },
18
18
+
method: "POST"
19
19
+
});
20
20
+
const json = await response.json();
21
21
+
22
22
+
if(!response.ok){
23
23
+
throw new Error(json.error || "Login failed")
24
24
+
}
25
25
+
26
26
+
window.location.href = json.redirectURL;
27
27
+
} catch (error) {
28
28
+
} finally {
29
29
+
setIsLoading(false);
30
30
+
}
31
31
+
};
7
32
8
33
return (
9
9
-
<form className="bg-amber-100 flex flex-col h-fit items-center justify-center p-4 rounded-2xl w-1/3">
34
34
+
<form
35
35
+
className="bg-amber-100 flex flex-col h-fit items-center justify-center p-4 rounded-2xl w-1/3"
36
36
+
onSubmit={handleSubmit}
37
37
+
>
10
38
<div className="flex flex-col p-4 rounded-2xl w-full">
11
39
<label
12
40
className="text-emerald-900"
···
16
44
</label>
17
45
<input
18
46
className="bg-emerald-900 px-4 py-2 rounded-lg"
19
19
-
id="handle"
47
47
+
id="handle"
20
48
onChange={(event) => setHandle(event.currentTarget.value)}
21
49
placeholder="alice.blacksky.app"
22
50
type="text"
23
51
value={handle}
24
52
/>
25
53
</div>
26
26
-
<button className="bg-emerald-900 px-4 py-2 rounded-lg">
27
27
-
Log into the Atmosphere
54
54
+
<button
55
55
+
className="hover:bg-emerald-800 bg-emerald-900 cursor-pointer px-4 py-2 rounded-lg"
56
56
+
disabled={!handle || isLoading}
57
57
+
>
58
58
+
{isLoading ? "Logging in ..." : "Log into the Atmosphere"}
28
59
</button>
29
60
</form>
30
61
);
+29
lib/auth/client.ts
···
1
1
+
import {
2
2
+
buildAtprotoLoopbackClientMetadata,
3
3
+
NodeOAuthClient
4
4
+
} from "@atproto/oauth-client-node";
5
5
+
6
6
+
const PUBLIC_URL = process.env.PUBLIC_URL;
7
7
+
8
8
+
export const SCOPE = "atproto";
9
9
+
10
10
+
let client: NodeOAuthClient | null = null;
11
11
+
12
12
+
const getClientMetadata = () => {
13
13
+
if (PUBLIC_URL) {
14
14
+
} else {
15
15
+
return buildAtprotoLoopbackClientMetadata({
16
16
+
redirect_uris: ["http://127.0.0.1:3000/oauth/callback"],
17
17
+
scope: SCOPE
18
18
+
});
19
19
+
}
20
20
+
};
21
21
+
export const getOAuthClient = async () => {
22
22
+
if (client) {
23
23
+
return client;
24
24
+
}
25
25
+
26
26
+
client = new NodeOAuthClient({
27
27
+
clientMetadata: getClientMetadata()
28
28
+
});
29
29
+
};
+416
package-lock.json
···
8
8
"name": "bambu",
9
9
"version": "0.1.0",
10
10
"dependencies": {
11
11
+
"@atproto/oauth-client-node": "^0.3.16",
11
12
"next": "16.1.6",
12
13
"react": "19.2.3",
13
14
"react-dom": "19.2.3"
···
36
37
"url": "https://github.com/sponsors/sindresorhus"
37
38
}
38
39
},
40
40
+
"node_modules/@atproto-labs/did-resolver": {
41
41
+
"version": "0.2.6",
42
42
+
"resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.2.6.tgz",
43
43
+
"integrity": "sha512-2K1bC04nI2fmgNcvof+yA28IhGlpWn2JKYlPa7To9JTKI45FINCGkQSGiL2nyXlyzDJJ34fZ1aq6/IRFIOIiqg==",
44
44
+
"license": "MIT",
45
45
+
"dependencies": {
46
46
+
"@atproto-labs/fetch": "0.2.3",
47
47
+
"@atproto-labs/pipe": "0.1.1",
48
48
+
"@atproto-labs/simple-store": "0.3.0",
49
49
+
"@atproto-labs/simple-store-memory": "0.1.4",
50
50
+
"@atproto/did": "0.3.0",
51
51
+
"zod": "^3.23.8"
52
52
+
}
53
53
+
},
54
54
+
"node_modules/@atproto-labs/did-resolver/node_modules/zod": {
55
55
+
"version": "3.25.76",
56
56
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
57
57
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
58
58
+
"license": "MIT",
59
59
+
"funding": {
60
60
+
"url": "https://github.com/sponsors/colinhacks"
61
61
+
}
62
62
+
},
63
63
+
"node_modules/@atproto-labs/fetch": {
64
64
+
"version": "0.2.3",
65
65
+
"resolved": "https://registry.npmjs.org/@atproto-labs/fetch/-/fetch-0.2.3.tgz",
66
66
+
"integrity": "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==",
67
67
+
"license": "MIT",
68
68
+
"dependencies": {
69
69
+
"@atproto-labs/pipe": "0.1.1"
70
70
+
}
71
71
+
},
72
72
+
"node_modules/@atproto-labs/fetch-node": {
73
73
+
"version": "0.2.0",
74
74
+
"resolved": "https://registry.npmjs.org/@atproto-labs/fetch-node/-/fetch-node-0.2.0.tgz",
75
75
+
"integrity": "sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q==",
76
76
+
"license": "MIT",
77
77
+
"dependencies": {
78
78
+
"@atproto-labs/fetch": "0.2.3",
79
79
+
"@atproto-labs/pipe": "0.1.1",
80
80
+
"ipaddr.js": "^2.1.0",
81
81
+
"undici": "^6.14.1"
82
82
+
},
83
83
+
"engines": {
84
84
+
"node": ">=18.7.0"
85
85
+
}
86
86
+
},
87
87
+
"node_modules/@atproto-labs/handle-resolver": {
88
88
+
"version": "0.3.6",
89
89
+
"resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.3.6.tgz",
90
90
+
"integrity": "sha512-qnSTXvOBNj1EHhp2qTWSX8MS5q3AwYU5LKlt5fBvSbCjgmTr2j0URHCv+ydrwO55KvsojIkTMgeMOh4YuY4fCA==",
91
91
+
"license": "MIT",
92
92
+
"dependencies": {
93
93
+
"@atproto-labs/simple-store": "0.3.0",
94
94
+
"@atproto-labs/simple-store-memory": "0.1.4",
95
95
+
"@atproto/did": "0.3.0",
96
96
+
"zod": "^3.23.8"
97
97
+
}
98
98
+
},
99
99
+
"node_modules/@atproto-labs/handle-resolver-node": {
100
100
+
"version": "0.1.25",
101
101
+
"resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.25.tgz",
102
102
+
"integrity": "sha512-NY9WYM2VLd3IuMGRkkmvGBg8xqVEaK/fitv1vD8SMXqFTekdpjOLCCyv7EFtqVHouzmDcL83VOvWRfHVa8V9Yw==",
103
103
+
"license": "MIT",
104
104
+
"dependencies": {
105
105
+
"@atproto-labs/fetch-node": "0.2.0",
106
106
+
"@atproto-labs/handle-resolver": "0.3.6",
107
107
+
"@atproto/did": "0.3.0"
108
108
+
},
109
109
+
"engines": {
110
110
+
"node": ">=18.7.0"
111
111
+
}
112
112
+
},
113
113
+
"node_modules/@atproto-labs/handle-resolver/node_modules/zod": {
114
114
+
"version": "3.25.76",
115
115
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
116
116
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
117
117
+
"license": "MIT",
118
118
+
"funding": {
119
119
+
"url": "https://github.com/sponsors/colinhacks"
120
120
+
}
121
121
+
},
122
122
+
"node_modules/@atproto-labs/identity-resolver": {
123
123
+
"version": "0.3.6",
124
124
+
"resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.3.6.tgz",
125
125
+
"integrity": "sha512-qoWqBDRobln0NR8L8dQjSp79E0chGkBhibEgxQa2f9WD+JbJdjQ0YvwwO5yeQn05pJoJmAwmI2wyJ45zjU7aWg==",
126
126
+
"license": "MIT",
127
127
+
"dependencies": {
128
128
+
"@atproto-labs/did-resolver": "0.2.6",
129
129
+
"@atproto-labs/handle-resolver": "0.3.6"
130
130
+
}
131
131
+
},
132
132
+
"node_modules/@atproto-labs/pipe": {
133
133
+
"version": "0.1.1",
134
134
+
"resolved": "https://registry.npmjs.org/@atproto-labs/pipe/-/pipe-0.1.1.tgz",
135
135
+
"integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==",
136
136
+
"license": "MIT"
137
137
+
},
138
138
+
"node_modules/@atproto-labs/simple-store": {
139
139
+
"version": "0.3.0",
140
140
+
"resolved": "https://registry.npmjs.org/@atproto-labs/simple-store/-/simple-store-0.3.0.tgz",
141
141
+
"integrity": "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==",
142
142
+
"license": "MIT"
143
143
+
},
144
144
+
"node_modules/@atproto-labs/simple-store-memory": {
145
145
+
"version": "0.1.4",
146
146
+
"resolved": "https://registry.npmjs.org/@atproto-labs/simple-store-memory/-/simple-store-memory-0.1.4.tgz",
147
147
+
"integrity": "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==",
148
148
+
"license": "MIT",
149
149
+
"dependencies": {
150
150
+
"@atproto-labs/simple-store": "0.3.0",
151
151
+
"lru-cache": "^10.2.0"
152
152
+
}
153
153
+
},
154
154
+
"node_modules/@atproto-labs/simple-store-memory/node_modules/lru-cache": {
155
155
+
"version": "10.4.3",
156
156
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
157
157
+
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
158
158
+
"license": "ISC"
159
159
+
},
160
160
+
"node_modules/@atproto/common-web": {
161
161
+
"version": "0.4.15",
162
162
+
"resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.15.tgz",
163
163
+
"integrity": "sha512-A4l9gyqUNez8CjZp/Trypz/D3WIQsNj8dN05WR6+RoBbvwc9JhWjKPrm+WoVYc/F16RPdXHLkE3BEJlGIyYIiA==",
164
164
+
"license": "MIT",
165
165
+
"dependencies": {
166
166
+
"@atproto/lex-data": "^0.0.10",
167
167
+
"@atproto/lex-json": "^0.0.10",
168
168
+
"@atproto/syntax": "^0.4.3",
169
169
+
"zod": "^3.23.8"
170
170
+
}
171
171
+
},
172
172
+
"node_modules/@atproto/common-web/node_modules/zod": {
173
173
+
"version": "3.25.76",
174
174
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
175
175
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
176
176
+
"license": "MIT",
177
177
+
"funding": {
178
178
+
"url": "https://github.com/sponsors/colinhacks"
179
179
+
}
180
180
+
},
181
181
+
"node_modules/@atproto/did": {
182
182
+
"version": "0.3.0",
183
183
+
"resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.3.0.tgz",
184
184
+
"integrity": "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA==",
185
185
+
"license": "MIT",
186
186
+
"dependencies": {
187
187
+
"zod": "^3.23.8"
188
188
+
}
189
189
+
},
190
190
+
"node_modules/@atproto/did/node_modules/zod": {
191
191
+
"version": "3.25.76",
192
192
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
193
193
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
194
194
+
"license": "MIT",
195
195
+
"funding": {
196
196
+
"url": "https://github.com/sponsors/colinhacks"
197
197
+
}
198
198
+
},
199
199
+
"node_modules/@atproto/jwk": {
200
200
+
"version": "0.6.0",
201
201
+
"resolved": "https://registry.npmjs.org/@atproto/jwk/-/jwk-0.6.0.tgz",
202
202
+
"integrity": "sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==",
203
203
+
"license": "MIT",
204
204
+
"dependencies": {
205
205
+
"multiformats": "^9.9.0",
206
206
+
"zod": "^3.23.8"
207
207
+
}
208
208
+
},
209
209
+
"node_modules/@atproto/jwk-jose": {
210
210
+
"version": "0.1.11",
211
211
+
"resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.11.tgz",
212
212
+
"integrity": "sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==",
213
213
+
"license": "MIT",
214
214
+
"dependencies": {
215
215
+
"@atproto/jwk": "0.6.0",
216
216
+
"jose": "^5.2.0"
217
217
+
}
218
218
+
},
219
219
+
"node_modules/@atproto/jwk-webcrypto": {
220
220
+
"version": "0.2.0",
221
221
+
"resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.2.0.tgz",
222
222
+
"integrity": "sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==",
223
223
+
"license": "MIT",
224
224
+
"dependencies": {
225
225
+
"@atproto/jwk": "0.6.0",
226
226
+
"@atproto/jwk-jose": "0.1.11",
227
227
+
"zod": "^3.23.8"
228
228
+
}
229
229
+
},
230
230
+
"node_modules/@atproto/jwk-webcrypto/node_modules/zod": {
231
231
+
"version": "3.25.76",
232
232
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
233
233
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
234
234
+
"license": "MIT",
235
235
+
"funding": {
236
236
+
"url": "https://github.com/sponsors/colinhacks"
237
237
+
}
238
238
+
},
239
239
+
"node_modules/@atproto/jwk/node_modules/zod": {
240
240
+
"version": "3.25.76",
241
241
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
242
242
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
243
243
+
"license": "MIT",
244
244
+
"funding": {
245
245
+
"url": "https://github.com/sponsors/colinhacks"
246
246
+
}
247
247
+
},
248
248
+
"node_modules/@atproto/lex-data": {
249
249
+
"version": "0.0.10",
250
250
+
"resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.10.tgz",
251
251
+
"integrity": "sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==",
252
252
+
"license": "MIT",
253
253
+
"dependencies": {
254
254
+
"multiformats": "^9.9.0",
255
255
+
"tslib": "^2.8.1",
256
256
+
"uint8arrays": "3.0.0",
257
257
+
"unicode-segmenter": "^0.14.0"
258
258
+
}
259
259
+
},
260
260
+
"node_modules/@atproto/lex-json": {
261
261
+
"version": "0.0.10",
262
262
+
"resolved": "https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.10.tgz",
263
263
+
"integrity": "sha512-L6MyXU17C5ODMeob8myQ2F3xvgCTvJUtM0ew8qSApnN//iDasB/FDGgd7ty4UVNmx4NQ/rtvz8xV94YpG6kneQ==",
264
264
+
"license": "MIT",
265
265
+
"dependencies": {
266
266
+
"@atproto/lex-data": "^0.0.10",
267
267
+
"tslib": "^2.8.1"
268
268
+
}
269
269
+
},
270
270
+
"node_modules/@atproto/lexicon": {
271
271
+
"version": "0.6.1",
272
272
+
"resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.6.1.tgz",
273
273
+
"integrity": "sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==",
274
274
+
"license": "MIT",
275
275
+
"dependencies": {
276
276
+
"@atproto/common-web": "^0.4.13",
277
277
+
"@atproto/syntax": "^0.4.3",
278
278
+
"iso-datestring-validator": "^2.2.2",
279
279
+
"multiformats": "^9.9.0",
280
280
+
"zod": "^3.23.8"
281
281
+
}
282
282
+
},
283
283
+
"node_modules/@atproto/lexicon/node_modules/zod": {
284
284
+
"version": "3.25.76",
285
285
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
286
286
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
287
287
+
"license": "MIT",
288
288
+
"funding": {
289
289
+
"url": "https://github.com/sponsors/colinhacks"
290
290
+
}
291
291
+
},
292
292
+
"node_modules/@atproto/oauth-client": {
293
293
+
"version": "0.5.14",
294
294
+
"resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.5.14.tgz",
295
295
+
"integrity": "sha512-sPH+vcdq9maTEAhJI0HzmFcFAMrkCS19np+RUssNkX6kS8Xr3OYr57tvYRCbkcnIyYTfYcxKQgpwHKx3RVEaYw==",
296
296
+
"license": "MIT",
297
297
+
"dependencies": {
298
298
+
"@atproto-labs/did-resolver": "0.2.6",
299
299
+
"@atproto-labs/fetch": "0.2.3",
300
300
+
"@atproto-labs/handle-resolver": "0.3.6",
301
301
+
"@atproto-labs/identity-resolver": "0.3.6",
302
302
+
"@atproto-labs/simple-store": "0.3.0",
303
303
+
"@atproto-labs/simple-store-memory": "0.1.4",
304
304
+
"@atproto/did": "0.3.0",
305
305
+
"@atproto/jwk": "0.6.0",
306
306
+
"@atproto/oauth-types": "0.6.2",
307
307
+
"@atproto/xrpc": "0.7.7",
308
308
+
"core-js": "^3",
309
309
+
"multiformats": "^9.9.0",
310
310
+
"zod": "^3.23.8"
311
311
+
}
312
312
+
},
313
313
+
"node_modules/@atproto/oauth-client-node": {
314
314
+
"version": "0.3.16",
315
315
+
"resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.3.16.tgz",
316
316
+
"integrity": "sha512-2dooMzxAkiQ4MkOAZlEQ3iwbB9SEovrbIKMNuBbVCLQYORVNxe20tMdjs3lvhrzdpzvaHLlQnJJhw5dA9VELFw==",
317
317
+
"license": "MIT",
318
318
+
"dependencies": {
319
319
+
"@atproto-labs/did-resolver": "0.2.6",
320
320
+
"@atproto-labs/handle-resolver-node": "0.1.25",
321
321
+
"@atproto-labs/simple-store": "0.3.0",
322
322
+
"@atproto/did": "0.3.0",
323
323
+
"@atproto/jwk": "0.6.0",
324
324
+
"@atproto/jwk-jose": "0.1.11",
325
325
+
"@atproto/jwk-webcrypto": "0.2.0",
326
326
+
"@atproto/oauth-client": "0.5.14",
327
327
+
"@atproto/oauth-types": "0.6.2"
328
328
+
},
329
329
+
"engines": {
330
330
+
"node": ">=18.7.0"
331
331
+
}
332
332
+
},
333
333
+
"node_modules/@atproto/oauth-client/node_modules/zod": {
334
334
+
"version": "3.25.76",
335
335
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
336
336
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
337
337
+
"license": "MIT",
338
338
+
"funding": {
339
339
+
"url": "https://github.com/sponsors/colinhacks"
340
340
+
}
341
341
+
},
342
342
+
"node_modules/@atproto/oauth-types": {
343
343
+
"version": "0.6.2",
344
344
+
"resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.6.2.tgz",
345
345
+
"integrity": "sha512-2cuboM4RQBCYR8NQC5uGRkW6KgCgKyq/B5/+tnMmWZYtZGVUQvsUWQHK/ZiMCnVXbcDNtc/RIEJQJDZ8FXMoxg==",
346
346
+
"license": "MIT",
347
347
+
"dependencies": {
348
348
+
"@atproto/did": "0.3.0",
349
349
+
"@atproto/jwk": "0.6.0",
350
350
+
"zod": "^3.23.8"
351
351
+
}
352
352
+
},
353
353
+
"node_modules/@atproto/oauth-types/node_modules/zod": {
354
354
+
"version": "3.25.76",
355
355
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
356
356
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
357
357
+
"license": "MIT",
358
358
+
"funding": {
359
359
+
"url": "https://github.com/sponsors/colinhacks"
360
360
+
}
361
361
+
},
362
362
+
"node_modules/@atproto/syntax": {
363
363
+
"version": "0.4.3",
364
364
+
"resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz",
365
365
+
"integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==",
366
366
+
"license": "MIT",
367
367
+
"dependencies": {
368
368
+
"tslib": "^2.8.1"
369
369
+
}
370
370
+
},
371
371
+
"node_modules/@atproto/xrpc": {
372
372
+
"version": "0.7.7",
373
373
+
"resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.7.tgz",
374
374
+
"integrity": "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==",
375
375
+
"license": "MIT",
376
376
+
"dependencies": {
377
377
+
"@atproto/lexicon": "^0.6.0",
378
378
+
"zod": "^3.23.8"
379
379
+
}
380
380
+
},
381
381
+
"node_modules/@atproto/xrpc/node_modules/zod": {
382
382
+
"version": "3.25.76",
383
383
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
384
384
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
385
385
+
"license": "MIT",
386
386
+
"funding": {
387
387
+
"url": "https://github.com/sponsors/colinhacks"
388
388
+
}
389
389
+
},
39
390
"node_modules/@babel/code-frame": {
40
391
"version": "7.29.0",
41
392
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
···
2610
2961
"dev": true,
2611
2962
"license": "MIT"
2612
2963
},
2964
2964
+
"node_modules/core-js": {
2965
2965
+
"version": "3.48.0",
2966
2966
+
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz",
2967
2967
+
"integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==",
2968
2968
+
"hasInstallScript": true,
2969
2969
+
"license": "MIT",
2970
2970
+
"funding": {
2971
2971
+
"type": "opencollective",
2972
2972
+
"url": "https://opencollective.com/core-js"
2973
2973
+
}
2974
2974
+
},
2613
2975
"node_modules/cross-spawn": {
2614
2976
"version": "7.0.6",
2615
2977
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
···
3942
4304
"node": ">= 0.4"
3943
4305
}
3944
4306
},
4307
4307
+
"node_modules/ipaddr.js": {
4308
4308
+
"version": "2.3.0",
4309
4309
+
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
4310
4310
+
"integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==",
4311
4311
+
"license": "MIT",
4312
4312
+
"engines": {
4313
4313
+
"node": ">= 10"
4314
4314
+
}
4315
4315
+
},
3945
4316
"node_modules/is-array-buffer": {
3946
4317
"version": "3.0.5",
3947
4318
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
···
4371
4742
"dev": true,
4372
4743
"license": "ISC"
4373
4744
},
4745
4745
+
"node_modules/iso-datestring-validator": {
4746
4746
+
"version": "2.2.2",
4747
4747
+
"resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz",
4748
4748
+
"integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==",
4749
4749
+
"license": "MIT"
4750
4750
+
},
4374
4751
"node_modules/iterator.prototype": {
4375
4752
"version": "1.1.5",
4376
4753
"resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
···
4397
4774
"license": "MIT",
4398
4775
"bin": {
4399
4776
"jiti": "lib/jiti-cli.mjs"
4777
4777
+
}
4778
4778
+
},
4779
4779
+
"node_modules/jose": {
4780
4780
+
"version": "5.10.0",
4781
4781
+
"resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
4782
4782
+
"integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
4783
4783
+
"license": "MIT",
4784
4784
+
"funding": {
4785
4785
+
"url": "https://github.com/sponsors/panva"
4400
4786
}
4401
4787
},
4402
4788
"node_modules/js-tokens": {
···
4906
5292
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
4907
5293
"dev": true,
4908
5294
"license": "MIT"
5295
5295
+
},
5296
5296
+
"node_modules/multiformats": {
5297
5297
+
"version": "9.9.0",
5298
5298
+
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
5299
5299
+
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==",
5300
5300
+
"license": "(Apache-2.0 AND MIT)"
4909
5301
},
4910
5302
"node_modules/nanoid": {
4911
5303
"version": "3.3.11",
···
6274
6666
"typescript": ">=4.8.4 <6.0.0"
6275
6667
}
6276
6668
},
6669
6669
+
"node_modules/uint8arrays": {
6670
6670
+
"version": "3.0.0",
6671
6671
+
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz",
6672
6672
+
"integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==",
6673
6673
+
"license": "MIT",
6674
6674
+
"dependencies": {
6675
6675
+
"multiformats": "^9.4.2"
6676
6676
+
}
6677
6677
+
},
6277
6678
"node_modules/unbox-primitive": {
6278
6679
"version": "1.1.0",
6279
6680
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
···
6293
6694
"url": "https://github.com/sponsors/ljharb"
6294
6695
}
6295
6696
},
6697
6697
+
"node_modules/undici": {
6698
6698
+
"version": "6.23.0",
6699
6699
+
"resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
6700
6700
+
"integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==",
6701
6701
+
"license": "MIT",
6702
6702
+
"engines": {
6703
6703
+
"node": ">=18.17"
6704
6704
+
}
6705
6705
+
},
6296
6706
"node_modules/undici-types": {
6297
6707
"version": "6.21.0",
6298
6708
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
6299
6709
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
6300
6710
"dev": true,
6711
6711
+
"license": "MIT"
6712
6712
+
},
6713
6713
+
"node_modules/unicode-segmenter": {
6714
6714
+
"version": "0.14.5",
6715
6715
+
"resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz",
6716
6716
+
"integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==",
6301
6717
"license": "MIT"
6302
6718
},
6303
6719
"node_modules/unrs-resolver": {
+1
package.json
···
9
9
"lint": "eslint"
10
10
},
11
11
"dependencies": {
12
12
+
"@atproto/oauth-client-node": "^0.3.16",
12
13
"next": "16.1.6",
13
14
"react": "19.2.3",
14
15
"react-dom": "19.2.3"