@authon/vue 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +170 -0
- package/README.md +413 -68
- package/dist/index.cjs +193 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -3
- package/dist/index.d.ts +46 -3
- package/dist/index.js +154 -5
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -30,6 +30,9 @@ __export(index_exports, {
|
|
|
30
30
|
AuthonUserButton: () => AuthonUserButton,
|
|
31
31
|
createAuthon: () => createAuthon,
|
|
32
32
|
useAuthon: () => useAuthon,
|
|
33
|
+
useAuthonPasskeys: () => useAuthonPasskeys,
|
|
34
|
+
useAuthonPasswordless: () => useAuthonPasswordless,
|
|
35
|
+
useAuthonWeb3: () => useAuthonWeb3,
|
|
33
36
|
useUser: () => useUser
|
|
34
37
|
});
|
|
35
38
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -114,9 +117,155 @@ function useUser() {
|
|
|
114
117
|
};
|
|
115
118
|
}
|
|
116
119
|
|
|
117
|
-
// src/
|
|
120
|
+
// src/useAuthonWeb3.ts
|
|
118
121
|
var import_vue3 = require("vue");
|
|
119
|
-
var
|
|
122
|
+
var import_vue4 = require("vue");
|
|
123
|
+
function useAuthonWeb3() {
|
|
124
|
+
const state = (0, import_vue4.inject)(AUTHON_KEY);
|
|
125
|
+
if (!state) {
|
|
126
|
+
throw new Error("useAuthonWeb3() must be called inside a component tree with createAuthon() installed");
|
|
127
|
+
}
|
|
128
|
+
const s = state;
|
|
129
|
+
const isLoading = (0, import_vue3.ref)(false);
|
|
130
|
+
const error = (0, import_vue3.ref)(null);
|
|
131
|
+
async function wrap(fn) {
|
|
132
|
+
isLoading.value = true;
|
|
133
|
+
error.value = null;
|
|
134
|
+
try {
|
|
135
|
+
return await fn();
|
|
136
|
+
} catch (err) {
|
|
137
|
+
error.value = err instanceof Error ? err : new Error(String(err));
|
|
138
|
+
return null;
|
|
139
|
+
} finally {
|
|
140
|
+
isLoading.value = false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function getNonce(address, chain, walletType, chainId) {
|
|
144
|
+
return wrap(() => s.client.web3GetNonce(address, chain, walletType, chainId));
|
|
145
|
+
}
|
|
146
|
+
async function verify(message, signature, address, chain, walletType) {
|
|
147
|
+
const result = await wrap(
|
|
148
|
+
() => s.client.web3Verify(message, signature, address, chain, walletType)
|
|
149
|
+
);
|
|
150
|
+
return result !== null;
|
|
151
|
+
}
|
|
152
|
+
async function listWallets() {
|
|
153
|
+
return wrap(() => s.client.listWallets());
|
|
154
|
+
}
|
|
155
|
+
async function linkWallet(params) {
|
|
156
|
+
return wrap(() => s.client.linkWallet(params));
|
|
157
|
+
}
|
|
158
|
+
async function unlinkWallet(walletId) {
|
|
159
|
+
const result = await wrap(() => s.client.unlinkWallet(walletId));
|
|
160
|
+
return result !== null;
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
getNonce,
|
|
164
|
+
verify,
|
|
165
|
+
listWallets,
|
|
166
|
+
linkWallet,
|
|
167
|
+
unlinkWallet,
|
|
168
|
+
isLoading,
|
|
169
|
+
error
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// src/useAuthonPasswordless.ts
|
|
174
|
+
var import_vue5 = require("vue");
|
|
175
|
+
function useAuthonPasswordless() {
|
|
176
|
+
const state = (0, import_vue5.inject)(AUTHON_KEY);
|
|
177
|
+
if (!state) {
|
|
178
|
+
throw new Error("useAuthonPasswordless() must be called inside a component tree with createAuthon() installed");
|
|
179
|
+
}
|
|
180
|
+
const s = state;
|
|
181
|
+
const isLoading = (0, import_vue5.ref)(false);
|
|
182
|
+
const error = (0, import_vue5.ref)(null);
|
|
183
|
+
async function wrap(fn) {
|
|
184
|
+
isLoading.value = true;
|
|
185
|
+
error.value = null;
|
|
186
|
+
try {
|
|
187
|
+
return await fn();
|
|
188
|
+
} catch (err) {
|
|
189
|
+
error.value = err instanceof Error ? err : new Error(String(err));
|
|
190
|
+
return null;
|
|
191
|
+
} finally {
|
|
192
|
+
isLoading.value = false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async function sendMagicLink(email) {
|
|
196
|
+
const result = await wrap(() => s.client.sendMagicLink(email));
|
|
197
|
+
return result !== null;
|
|
198
|
+
}
|
|
199
|
+
async function sendEmailOtp(email) {
|
|
200
|
+
const result = await wrap(() => s.client.sendEmailOtp(email));
|
|
201
|
+
return result !== null;
|
|
202
|
+
}
|
|
203
|
+
async function verifyPasswordless(opts) {
|
|
204
|
+
const result = await wrap(() => s.client.verifyPasswordless(opts));
|
|
205
|
+
return result !== null;
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
sendMagicLink,
|
|
209
|
+
sendEmailOtp,
|
|
210
|
+
verifyPasswordless,
|
|
211
|
+
isLoading,
|
|
212
|
+
error
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/useAuthonPasskeys.ts
|
|
217
|
+
var import_vue6 = require("vue");
|
|
218
|
+
function useAuthonPasskeys() {
|
|
219
|
+
const state = (0, import_vue6.inject)(AUTHON_KEY);
|
|
220
|
+
if (!state) {
|
|
221
|
+
throw new Error("useAuthonPasskeys() must be called inside a component tree with createAuthon() installed");
|
|
222
|
+
}
|
|
223
|
+
const s = state;
|
|
224
|
+
const isLoading = (0, import_vue6.ref)(false);
|
|
225
|
+
const error = (0, import_vue6.ref)(null);
|
|
226
|
+
async function wrap(fn) {
|
|
227
|
+
isLoading.value = true;
|
|
228
|
+
error.value = null;
|
|
229
|
+
try {
|
|
230
|
+
return await fn();
|
|
231
|
+
} catch (err) {
|
|
232
|
+
error.value = err instanceof Error ? err : new Error(String(err));
|
|
233
|
+
return null;
|
|
234
|
+
} finally {
|
|
235
|
+
isLoading.value = false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
async function registerPasskey(name) {
|
|
239
|
+
return wrap(() => s.client.registerPasskey(name));
|
|
240
|
+
}
|
|
241
|
+
async function authenticateWithPasskey(email) {
|
|
242
|
+
const result = await wrap(() => s.client.authenticateWithPasskey(email));
|
|
243
|
+
return result !== null;
|
|
244
|
+
}
|
|
245
|
+
async function listPasskeys() {
|
|
246
|
+
return wrap(() => s.client.listPasskeys());
|
|
247
|
+
}
|
|
248
|
+
async function renamePasskey(id, name) {
|
|
249
|
+
return wrap(() => s.client.renamePasskey(id, name));
|
|
250
|
+
}
|
|
251
|
+
async function revokePasskey(id) {
|
|
252
|
+
const result = await wrap(() => s.client.revokePasskey(id));
|
|
253
|
+
return result !== null;
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
registerPasskey,
|
|
257
|
+
authenticateWithPasskey,
|
|
258
|
+
listPasskeys,
|
|
259
|
+
renamePasskey,
|
|
260
|
+
revokePasskey,
|
|
261
|
+
isLoading,
|
|
262
|
+
error
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// src/components.ts
|
|
267
|
+
var import_vue7 = require("vue");
|
|
268
|
+
var AuthonSignIn = (0, import_vue7.defineComponent)({
|
|
120
269
|
name: "AuthonSignIn",
|
|
121
270
|
props: {
|
|
122
271
|
mode: {
|
|
@@ -126,20 +275,20 @@ var AuthonSignIn = (0, import_vue3.defineComponent)({
|
|
|
126
275
|
},
|
|
127
276
|
setup(props) {
|
|
128
277
|
const { client } = useAuthon();
|
|
129
|
-
(0,
|
|
278
|
+
(0, import_vue7.onMounted)(() => {
|
|
130
279
|
if (props.mode === "popup") {
|
|
131
280
|
client?.openSignIn();
|
|
132
281
|
}
|
|
133
282
|
});
|
|
134
283
|
return () => {
|
|
135
284
|
if (props.mode === "embedded") {
|
|
136
|
-
return (0,
|
|
285
|
+
return (0, import_vue7.h)("div", { id: "authon-signin-container" });
|
|
137
286
|
}
|
|
138
287
|
return null;
|
|
139
288
|
};
|
|
140
289
|
}
|
|
141
290
|
});
|
|
142
|
-
var AuthonSignUp = (0,
|
|
291
|
+
var AuthonSignUp = (0, import_vue7.defineComponent)({
|
|
143
292
|
name: "AuthonSignUp",
|
|
144
293
|
props: {
|
|
145
294
|
mode: {
|
|
@@ -149,25 +298,25 @@ var AuthonSignUp = (0, import_vue3.defineComponent)({
|
|
|
149
298
|
},
|
|
150
299
|
setup(props) {
|
|
151
300
|
const { client } = useAuthon();
|
|
152
|
-
(0,
|
|
301
|
+
(0, import_vue7.onMounted)(() => {
|
|
153
302
|
if (props.mode === "popup") {
|
|
154
303
|
client?.openSignUp();
|
|
155
304
|
}
|
|
156
305
|
});
|
|
157
306
|
return () => {
|
|
158
307
|
if (props.mode === "embedded") {
|
|
159
|
-
return (0,
|
|
308
|
+
return (0, import_vue7.h)("div", { id: "authon-signup-container" });
|
|
160
309
|
}
|
|
161
310
|
return null;
|
|
162
311
|
};
|
|
163
312
|
}
|
|
164
313
|
});
|
|
165
|
-
var AuthonUserButton = (0,
|
|
314
|
+
var AuthonUserButton = (0, import_vue7.defineComponent)({
|
|
166
315
|
name: "AuthonUserButton",
|
|
167
316
|
setup() {
|
|
168
317
|
const { user, isSignedIn, signOut, openSignIn } = useAuthon();
|
|
169
|
-
const open = (0,
|
|
170
|
-
const initials = (0,
|
|
318
|
+
const open = (0, import_vue7.ref)(false);
|
|
319
|
+
const initials = (0, import_vue7.computed)(() => {
|
|
171
320
|
if (!user) return "?";
|
|
172
321
|
const u = user;
|
|
173
322
|
if (u.displayName) {
|
|
@@ -177,7 +326,7 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
|
|
|
177
326
|
});
|
|
178
327
|
return () => {
|
|
179
328
|
if (!isSignedIn) {
|
|
180
|
-
return (0,
|
|
329
|
+
return (0, import_vue7.h)(
|
|
181
330
|
"button",
|
|
182
331
|
{
|
|
183
332
|
onClick: () => openSignIn(),
|
|
@@ -198,8 +347,8 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
|
|
|
198
347
|
const avatarUrl = user?.avatarUrl;
|
|
199
348
|
const displayName = user?.displayName;
|
|
200
349
|
const email = user?.email;
|
|
201
|
-
return (0,
|
|
202
|
-
(0,
|
|
350
|
+
return (0, import_vue7.h)("div", { style: { position: "relative", display: "inline-block" } }, [
|
|
351
|
+
(0, import_vue7.h)(
|
|
203
352
|
"button",
|
|
204
353
|
{
|
|
205
354
|
onClick: () => open.value = !open.value,
|
|
@@ -220,9 +369,9 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
|
|
|
220
369
|
fontWeight: 700
|
|
221
370
|
}
|
|
222
371
|
},
|
|
223
|
-
avatarUrl ? [(0,
|
|
372
|
+
avatarUrl ? [(0, import_vue7.h)("img", { src: avatarUrl, alt: displayName ?? "avatar", style: { width: "100%", height: "100%", objectFit: "cover" } })] : [initials.value]
|
|
224
373
|
),
|
|
225
|
-
open.value ? (0,
|
|
374
|
+
open.value ? (0, import_vue7.h)(
|
|
226
375
|
"div",
|
|
227
376
|
{
|
|
228
377
|
style: {
|
|
@@ -239,11 +388,11 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
|
|
|
239
388
|
}
|
|
240
389
|
},
|
|
241
390
|
[
|
|
242
|
-
(0,
|
|
243
|
-
displayName && (0,
|
|
244
|
-
email && (0,
|
|
391
|
+
(0, import_vue7.h)("div", { style: { padding: "12px 16px", borderBottom: "1px solid #f3f4f6" } }, [
|
|
392
|
+
displayName && (0, import_vue7.h)("div", { style: { fontSize: "14px", fontWeight: 600, color: "#111827" } }, displayName),
|
|
393
|
+
email && (0, import_vue7.h)("div", { style: { fontSize: "12px", color: "#6b7280", marginTop: "2px" } }, email)
|
|
245
394
|
]),
|
|
246
|
-
(0,
|
|
395
|
+
(0, import_vue7.h)(
|
|
247
396
|
"button",
|
|
248
397
|
{
|
|
249
398
|
onClick: async () => {
|
|
@@ -271,7 +420,7 @@ var AuthonUserButton = (0, import_vue3.defineComponent)({
|
|
|
271
420
|
};
|
|
272
421
|
}
|
|
273
422
|
});
|
|
274
|
-
var AuthonSignedIn = (0,
|
|
423
|
+
var AuthonSignedIn = (0, import_vue7.defineComponent)({
|
|
275
424
|
name: "AuthonSignedIn",
|
|
276
425
|
setup(_, { slots }) {
|
|
277
426
|
const { isSignedIn, isLoading } = useAuthon();
|
|
@@ -281,7 +430,7 @@ var AuthonSignedIn = (0, import_vue3.defineComponent)({
|
|
|
281
430
|
};
|
|
282
431
|
}
|
|
283
432
|
});
|
|
284
|
-
var AuthonSignedOut = (0,
|
|
433
|
+
var AuthonSignedOut = (0, import_vue7.defineComponent)({
|
|
285
434
|
name: "AuthonSignedOut",
|
|
286
435
|
setup(_, { slots }) {
|
|
287
436
|
const { isSignedIn, isLoading } = useAuthon();
|
|
@@ -293,10 +442,10 @@ var AuthonSignedOut = (0, import_vue3.defineComponent)({
|
|
|
293
442
|
});
|
|
294
443
|
|
|
295
444
|
// src/SocialButton.ts
|
|
296
|
-
var
|
|
445
|
+
var import_vue8 = require("vue");
|
|
297
446
|
var import_shared = require("@authon/shared");
|
|
298
447
|
var import_js2 = require("@authon/js");
|
|
299
|
-
var AuthonSocialButton = (0,
|
|
448
|
+
var AuthonSocialButton = (0, import_vue8.defineComponent)({
|
|
300
449
|
name: "AuthonSocialButton",
|
|
301
450
|
props: {
|
|
302
451
|
provider: { type: String, required: true },
|
|
@@ -311,16 +460,16 @@ var AuthonSocialButton = (0, import_vue4.defineComponent)({
|
|
|
311
460
|
size: { type: Number, default: 48 }
|
|
312
461
|
},
|
|
313
462
|
setup(props) {
|
|
314
|
-
const colors = (0,
|
|
315
|
-
const displayName = (0,
|
|
316
|
-
const buttonLabel = (0,
|
|
317
|
-
const needsBorder = (0,
|
|
318
|
-
const resolvedIconSize = (0,
|
|
319
|
-
const iconSvg = (0,
|
|
463
|
+
const colors = (0, import_vue8.computed)(() => import_shared.PROVIDER_COLORS[props.provider] || { bg: "#333", text: "#fff" });
|
|
464
|
+
const displayName = (0, import_vue8.computed)(() => import_shared.PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);
|
|
465
|
+
const buttonLabel = (0, import_vue8.computed)(() => props.label ?? `Continue with ${displayName.value}`);
|
|
466
|
+
const needsBorder = (0, import_vue8.computed)(() => colors.value.bg.toLowerCase() === "#ffffff");
|
|
467
|
+
const resolvedIconSize = (0, import_vue8.computed)(() => props.iconSize ?? (props.compact ? 24 : 20));
|
|
468
|
+
const iconSvg = (0, import_vue8.computed)(() => {
|
|
320
469
|
const config = (0, import_js2.getProviderButtonConfig)(props.provider);
|
|
321
470
|
return config.iconSvg.replace(/width="\d+"/, `width="${resolvedIconSize.value}"`).replace(/height="\d+"/, `height="${resolvedIconSize.value}"`);
|
|
322
471
|
});
|
|
323
|
-
const spinner = () => (0,
|
|
472
|
+
const spinner = () => (0, import_vue8.h)("span", {
|
|
324
473
|
style: {
|
|
325
474
|
display: "inline-block",
|
|
326
475
|
width: "16px",
|
|
@@ -331,14 +480,14 @@ var AuthonSocialButton = (0, import_vue4.defineComponent)({
|
|
|
331
480
|
animation: "authon-spin 0.6s linear infinite"
|
|
332
481
|
}
|
|
333
482
|
});
|
|
334
|
-
const icon = () => (0,
|
|
483
|
+
const icon = () => (0, import_vue8.h)("span", {
|
|
335
484
|
style: { display: "flex", alignItems: "center", flexShrink: 0 },
|
|
336
485
|
innerHTML: iconSvg.value
|
|
337
486
|
});
|
|
338
487
|
return () => {
|
|
339
488
|
const borderStyle = needsBorder.value ? { border: "1px solid #dadce0" } : {};
|
|
340
489
|
if (props.compact) {
|
|
341
|
-
return (0,
|
|
490
|
+
return (0, import_vue8.h)(
|
|
342
491
|
"button",
|
|
343
492
|
{
|
|
344
493
|
style: {
|
|
@@ -362,7 +511,7 @@ var AuthonSocialButton = (0, import_vue4.defineComponent)({
|
|
|
362
511
|
[props.loading ? spinner() : icon()]
|
|
363
512
|
);
|
|
364
513
|
}
|
|
365
|
-
return (0,
|
|
514
|
+
return (0, import_vue8.h)(
|
|
366
515
|
"button",
|
|
367
516
|
{
|
|
368
517
|
style: {
|
|
@@ -389,13 +538,13 @@ var AuthonSocialButton = (0, import_vue4.defineComponent)({
|
|
|
389
538
|
},
|
|
390
539
|
props.loading ? [spinner()] : [
|
|
391
540
|
icon(),
|
|
392
|
-
(0,
|
|
541
|
+
(0, import_vue8.h)("span", { style: { fontSize: "15px", fontWeight: 600, whiteSpace: "nowrap" } }, buttonLabel.value)
|
|
393
542
|
]
|
|
394
543
|
);
|
|
395
544
|
};
|
|
396
545
|
}
|
|
397
546
|
});
|
|
398
|
-
var AuthonSocialButtons = (0,
|
|
547
|
+
var AuthonSocialButtons = (0, import_vue8.defineComponent)({
|
|
399
548
|
name: "AuthonSocialButtons",
|
|
400
549
|
props: {
|
|
401
550
|
onSuccess: { type: Function, default: void 0 },
|
|
@@ -406,10 +555,10 @@ var AuthonSocialButtons = (0, import_vue4.defineComponent)({
|
|
|
406
555
|
},
|
|
407
556
|
setup(props) {
|
|
408
557
|
const { client } = useAuthon();
|
|
409
|
-
const providers = (0,
|
|
410
|
-
const loadingProvider = (0,
|
|
411
|
-
const resolvedGap = (0,
|
|
412
|
-
(0,
|
|
558
|
+
const providers = (0, import_vue8.ref)([]);
|
|
559
|
+
const loadingProvider = (0, import_vue8.ref)(null);
|
|
560
|
+
const resolvedGap = (0, import_vue8.computed)(() => props.gap ?? (props.compact ? 12 : 10));
|
|
561
|
+
(0, import_vue8.onMounted)(async () => {
|
|
413
562
|
if (client) {
|
|
414
563
|
providers.value = await client.getProviders();
|
|
415
564
|
}
|
|
@@ -430,11 +579,11 @@ var AuthonSocialButtons = (0, import_vue4.defineComponent)({
|
|
|
430
579
|
return () => {
|
|
431
580
|
if (providers.value.length === 0) return null;
|
|
432
581
|
const containerStyle = props.compact ? { display: "flex", flexDirection: "row", flexWrap: "wrap", justifyContent: "center", gap: `${resolvedGap.value}px` } : { display: "flex", flexDirection: "column", gap: `${resolvedGap.value}px` };
|
|
433
|
-
return (0,
|
|
582
|
+
return (0, import_vue8.h)(
|
|
434
583
|
"div",
|
|
435
584
|
{ style: containerStyle },
|
|
436
585
|
providers.value.map(
|
|
437
|
-
(provider) => (0,
|
|
586
|
+
(provider) => (0, import_vue8.h)(AuthonSocialButton, {
|
|
438
587
|
key: provider,
|
|
439
588
|
provider,
|
|
440
589
|
onClick: handleClick,
|
|
@@ -460,6 +609,9 @@ var AuthonSocialButtons = (0, import_vue4.defineComponent)({
|
|
|
460
609
|
AuthonUserButton,
|
|
461
610
|
createAuthon,
|
|
462
611
|
useAuthon,
|
|
612
|
+
useAuthonPasskeys,
|
|
613
|
+
useAuthonPasswordless,
|
|
614
|
+
useAuthonWeb3,
|
|
463
615
|
useUser
|
|
464
616
|
});
|
|
465
617
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/composables.ts","../src/components.ts","../src/SocialButton.ts"],"sourcesContent":["export { createAuthon, AUTHON_KEY } from './plugin';\nexport type { AuthonState, AuthonPluginOptions } from './plugin';\nexport { useAuthon, useUser } from './composables';\nexport {\n AuthonSignIn,\n AuthonSignUp,\n AuthonUserButton,\n AuthonSignedIn,\n AuthonSignedOut,\n} from './components';\nexport { AuthonSocialButton, AuthonSocialButtons } from './SocialButton';\n","import type { App } from 'vue';\nimport { reactive } from 'vue';\nimport { Authon } from '@authon/js';\nimport type { AuthonConfig } from '@authon/js';\nimport type { AuthonUser } from '@authon/shared';\n\nexport const AUTHON_KEY = Symbol('authon');\n\nexport interface AuthonState {\n isSignedIn: boolean;\n isLoading: boolean;\n user: AuthonUser | null;\n client: Authon | null;\n}\n\nexport interface AuthonPluginOptions {\n publishableKey: string;\n config?: AuthonConfig;\n}\n\nexport function createAuthon(options: AuthonPluginOptions) {\n const state = reactive<AuthonState>({\n isSignedIn: false,\n isLoading: true,\n user: null,\n client: null,\n });\n\n return {\n install(app: App) {\n const client = new Authon(options.publishableKey, options.config);\n state.client = client as unknown as Authon;\n\n client.on('signedIn', (user) => {\n state.user = user as AuthonUser;\n state.isSignedIn = true;\n state.isLoading = false;\n });\n\n client.on('signedOut', () => {\n state.user = null;\n state.isSignedIn = false;\n });\n\n client.on('error', () => {\n state.isLoading = false;\n });\n\n const existingUser = client.getUser();\n if (existingUser) {\n state.user = existingUser as AuthonUser;\n state.isSignedIn = true;\n }\n state.isLoading = false;\n\n app.provide(AUTHON_KEY, state);\n\n app.config.globalProperties.$authon = state;\n },\n };\n}\n","import { inject, computed } from 'vue';\nimport type { ComputedRef } from 'vue';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\nimport type { AuthonUser } from '@authon/shared';\n\nfunction requireState(): AuthonState {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthon() must be called inside a component tree with createAuthon() installed');\n }\n return state;\n}\n\nexport function useAuthon(): AuthonState & {\n signOut: () => Promise<void>;\n openSignIn: () => Promise<void>;\n openSignUp: () => Promise<void>;\n getToken: () => string | null;\n} {\n const s = requireState();\n\n async function signOut(): Promise<void> {\n await s.client?.signOut();\n s.user = null;\n s.isSignedIn = false;\n }\n\n async function openSignIn(): Promise<void> {\n await s.client?.openSignIn();\n }\n\n async function openSignUp(): Promise<void> {\n await s.client?.openSignUp();\n }\n\n function getToken(): string | null {\n return s.client?.getToken() ?? null;\n }\n\n return {\n ...s,\n signOut,\n openSignIn,\n openSignUp,\n getToken,\n };\n}\n\nexport function useUser(): { user: ComputedRef<AuthonUser | null>; isLoading: ComputedRef<boolean> } {\n const s = requireState();\n return {\n user: computed(() => s.user),\n isLoading: computed(() => s.isLoading),\n };\n}\n","import { defineComponent, h, onMounted, ref, computed } from 'vue';\nimport { useAuthon } from './composables';\n\nexport const AuthonSignIn = defineComponent({\n name: 'AuthonSignIn',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignIn();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signin-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonSignUp = defineComponent({\n name: 'AuthonSignUp',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignUp();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signup-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonUserButton = defineComponent({\n name: 'AuthonUserButton',\n setup() {\n const { user, isSignedIn, signOut, openSignIn } = useAuthon();\n const open = ref(false);\n\n const initials = computed(() => {\n if (!user) return '?';\n const u = user as typeof user;\n if ((u as { displayName?: string | null }).displayName) {\n return ((u as { displayName: string }).displayName)\n .split(' ')\n .map((n: string) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n return ((u as { email?: string | null }).email?.[0] ?? '?').toUpperCase();\n });\n\n return () => {\n if (!isSignedIn) {\n return h(\n 'button',\n {\n onClick: () => openSignIn(),\n style: {\n padding: '8px 16px',\n borderRadius: '8px',\n border: 'none',\n background: 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n },\n },\n 'Sign In',\n );\n }\n\n const avatarUrl = (user as { avatarUrl?: string | null } | null)?.avatarUrl;\n const displayName = (user as { displayName?: string | null } | null)?.displayName;\n const email = (user as { email?: string | null } | null)?.email;\n\n return h('div', { style: { position: 'relative', display: 'inline-block' } }, [\n h(\n 'button',\n {\n onClick: () => (open.value = !open.value),\n style: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n border: '2px solid #7c3aed',\n background: avatarUrl ? 'transparent' : 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n cursor: 'pointer',\n padding: 0,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n fontSize: '13px',\n fontWeight: 700,\n },\n },\n avatarUrl\n ? [h('img', { src: avatarUrl, alt: displayName ?? 'avatar', style: { width: '100%', height: '100%', objectFit: 'cover' } })]\n : [initials.value],\n ),\n open.value\n ? h(\n 'div',\n {\n style: {\n position: 'absolute',\n right: 0,\n top: '44px',\n minWidth: '200px',\n background: '#fff',\n border: '1px solid #e5e7eb',\n borderRadius: '12px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n },\n },\n [\n h('div', { style: { padding: '12px 16px', borderBottom: '1px solid #f3f4f6' } }, [\n displayName && h('div', { style: { fontSize: '14px', fontWeight: 600, color: '#111827' } }, displayName),\n email && h('div', { style: { fontSize: '12px', color: '#6b7280', marginTop: '2px' } }, email),\n ]),\n h(\n 'button',\n {\n onClick: async () => {\n open.value = false;\n await signOut();\n },\n style: {\n display: 'block',\n width: '100%',\n padding: '10px 16px',\n textAlign: 'left',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#ef4444',\n fontWeight: 500,\n },\n },\n 'Sign out',\n ),\n ],\n )\n : null,\n ]);\n };\n },\n});\n\nexport const AuthonSignedIn = defineComponent({\n name: 'AuthonSignedIn',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || !isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n\nexport const AuthonSignedOut = defineComponent({\n name: 'AuthonSignedOut',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n","import { defineComponent, h, ref, computed, onMounted, type PropType } from 'vue';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { getProviderButtonConfig } from '@authon/js';\nimport { useAuthon } from './composables';\n\nexport const AuthonSocialButton = defineComponent({\n name: 'AuthonSocialButton',\n props: {\n provider: { type: String as PropType<OAuthProviderType>, required: true },\n onClick: { type: Function as PropType<(provider: OAuthProviderType) => void | Promise<void>>, required: true },\n loading: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n label: { type: String, default: undefined },\n compact: { type: Boolean, default: false },\n iconSize: { type: Number, default: undefined },\n borderRadius: { type: Number, default: 10 },\n height: { type: Number, default: 48 },\n size: { type: Number, default: 48 },\n },\n setup(props) {\n const colors = computed(() => PROVIDER_COLORS[props.provider] || { bg: '#333', text: '#fff' });\n const displayName = computed(() => PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);\n const buttonLabel = computed(() => props.label ?? `Continue with ${displayName.value}`);\n const needsBorder = computed(() => colors.value.bg.toLowerCase() === '#ffffff');\n const resolvedIconSize = computed(() => props.iconSize ?? (props.compact ? 24 : 20));\n\n const iconSvg = computed(() => {\n const config = getProviderButtonConfig(props.provider);\n return config.iconSvg\n .replace(/width=\"\\d+\"/, `width=\"${resolvedIconSize.value}\"`)\n .replace(/height=\"\\d+\"/, `height=\"${resolvedIconSize.value}\"`);\n });\n\n const spinner = () =>\n h('span', {\n style: {\n display: 'inline-block',\n width: '16px',\n height: '16px',\n border: `2px solid ${colors.value.text}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'authon-spin 0.6s linear infinite',\n },\n });\n\n const icon = () =>\n h('span', {\n style: { display: 'flex', alignItems: 'center', flexShrink: 0 },\n innerHTML: iconSvg.value,\n });\n\n return () => {\n const borderStyle = needsBorder.value ? { border: '1px solid #dadce0' } : {};\n\n if (props.compact) {\n return h(\n 'button',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n cursor: 'pointer',\n transition: 'opacity 0.15s',\n padding: 0,\n backgroundColor: colors.value.bg,\n borderRadius: `${props.borderRadius}px`,\n width: `${props.size}px`,\n height: `${props.size}px`,\n ...borderStyle,\n },\n onClick: () => props.onClick(props.provider),\n disabled: props.disabled || props.loading,\n 'aria-label': `Sign in with ${displayName.value}`,\n },\n [props.loading ? spinner() : icon()],\n );\n }\n\n return h(\n 'button',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '10px',\n paddingLeft: '16px',\n paddingRight: '16px',\n border: 'none',\n cursor: 'pointer',\n fontFamily: 'inherit',\n transition: 'opacity 0.15s',\n width: '100%',\n backgroundColor: colors.value.bg,\n color: colors.value.text,\n borderRadius: `${props.borderRadius}px`,\n height: `${props.height}px`,\n ...borderStyle,\n },\n onClick: () => props.onClick(props.provider),\n disabled: props.disabled || props.loading,\n 'aria-label': `Sign in with ${displayName.value}`,\n },\n props.loading\n ? [spinner()]\n : [\n icon(),\n h('span', { style: { fontSize: '15px', fontWeight: 600, whiteSpace: 'nowrap' } }, buttonLabel.value),\n ],\n );\n };\n },\n});\n\nexport const AuthonSocialButtons = defineComponent({\n name: 'AuthonSocialButtons',\n props: {\n onSuccess: { type: Function as PropType<() => void>, default: undefined },\n onError: { type: Function as PropType<(error: Error) => void>, default: undefined },\n gap: { type: Number, default: undefined },\n compact: { type: Boolean, default: false },\n labels: { type: Object as PropType<Partial<Record<OAuthProviderType, string>>>, default: undefined },\n },\n setup(props) {\n const { client } = useAuthon();\n const providers = ref<OAuthProviderType[]>([]);\n const loadingProvider = ref<string | null>(null);\n const resolvedGap = computed(() => props.gap ?? (props.compact ? 12 : 10));\n\n onMounted(async () => {\n if (client) {\n providers.value = await client.getProviders();\n }\n });\n\n const handleClick = async (provider: OAuthProviderType) => {\n if (!client) return;\n loadingProvider.value = provider;\n try {\n await client.signInWithOAuth(provider);\n props.onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n props.onError?.(error);\n } finally {\n loadingProvider.value = null;\n }\n };\n\n return () => {\n if (providers.value.length === 0) return null;\n\n const containerStyle = props.compact\n ? { display: 'flex', flexDirection: 'row' as const, flexWrap: 'wrap' as const, justifyContent: 'center', gap: `${resolvedGap.value}px` }\n : { display: 'flex', flexDirection: 'column' as const, gap: `${resolvedGap.value}px` };\n\n return h(\n 'div',\n { style: containerStyle },\n providers.value.map((provider) =>\n h(AuthonSocialButton, {\n key: provider,\n provider,\n onClick: handleClick,\n loading: loadingProvider.value === provider,\n disabled: !!loadingProvider.value,\n compact: props.compact,\n label: props.labels?.[provider],\n }),\n ),\n );\n };\n },\n});\n"],"mappings":"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","names":["import_vue","import_vue","import_vue","import_js"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/composables.ts","../src/useAuthonWeb3.ts","../src/useAuthonPasswordless.ts","../src/useAuthonPasskeys.ts","../src/components.ts","../src/SocialButton.ts"],"sourcesContent":["export { createAuthon, AUTHON_KEY } from './plugin';\nexport type { AuthonState, AuthonPluginOptions } from './plugin';\nexport { useAuthon, useUser } from './composables';\nexport { useAuthonWeb3 } from './useAuthonWeb3';\nexport type { UseAuthonWeb3Return, LinkWalletParams } from './useAuthonWeb3';\nexport { useAuthonPasswordless } from './useAuthonPasswordless';\nexport type { UseAuthonPasswordlessReturn } from './useAuthonPasswordless';\nexport { useAuthonPasskeys } from './useAuthonPasskeys';\nexport type { UseAuthonPasskeysReturn } from './useAuthonPasskeys';\nexport {\n AuthonSignIn,\n AuthonSignUp,\n AuthonUserButton,\n AuthonSignedIn,\n AuthonSignedOut,\n} from './components';\nexport { AuthonSocialButton, AuthonSocialButtons } from './SocialButton';\n","import type { App } from 'vue';\nimport { reactive } from 'vue';\nimport { Authon } from '@authon/js';\nimport type { AuthonConfig } from '@authon/js';\nimport type { AuthonUser } from '@authon/shared';\n\nexport const AUTHON_KEY = Symbol('authon');\n\nexport interface AuthonState {\n isSignedIn: boolean;\n isLoading: boolean;\n user: AuthonUser | null;\n client: Authon | null;\n}\n\nexport interface AuthonPluginOptions {\n publishableKey: string;\n config?: AuthonConfig;\n}\n\nexport function createAuthon(options: AuthonPluginOptions) {\n const state = reactive<AuthonState>({\n isSignedIn: false,\n isLoading: true,\n user: null,\n client: null,\n });\n\n return {\n install(app: App) {\n const client = new Authon(options.publishableKey, options.config);\n state.client = client as unknown as Authon;\n\n client.on('signedIn', (user) => {\n state.user = user as AuthonUser;\n state.isSignedIn = true;\n state.isLoading = false;\n });\n\n client.on('signedOut', () => {\n state.user = null;\n state.isSignedIn = false;\n });\n\n client.on('error', () => {\n state.isLoading = false;\n });\n\n const existingUser = client.getUser();\n if (existingUser) {\n state.user = existingUser as AuthonUser;\n state.isSignedIn = true;\n }\n state.isLoading = false;\n\n app.provide(AUTHON_KEY, state);\n\n app.config.globalProperties.$authon = state;\n },\n };\n}\n","import { inject, computed } from 'vue';\nimport type { ComputedRef } from 'vue';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\nimport type { AuthonUser } from '@authon/shared';\n\nfunction requireState(): AuthonState {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthon() must be called inside a component tree with createAuthon() installed');\n }\n return state;\n}\n\nexport function useAuthon(): AuthonState & {\n signOut: () => Promise<void>;\n openSignIn: () => Promise<void>;\n openSignUp: () => Promise<void>;\n getToken: () => string | null;\n} {\n const s = requireState();\n\n async function signOut(): Promise<void> {\n await s.client?.signOut();\n s.user = null;\n s.isSignedIn = false;\n }\n\n async function openSignIn(): Promise<void> {\n await s.client?.openSignIn();\n }\n\n async function openSignUp(): Promise<void> {\n await s.client?.openSignUp();\n }\n\n function getToken(): string | null {\n return s.client?.getToken() ?? null;\n }\n\n return {\n ...s,\n signOut,\n openSignIn,\n openSignUp,\n getToken,\n };\n}\n\nexport function useUser(): { user: ComputedRef<AuthonUser | null>; isLoading: ComputedRef<boolean> } {\n const s = requireState();\n return {\n user: computed(() => s.user),\n isLoading: computed(() => s.isLoading),\n };\n}\n","import { ref } from 'vue';\nimport type { Ref } from 'vue';\nimport type { Web3Chain, Web3NonceResponse, Web3Wallet, Web3WalletType } from '@authon/shared';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\nimport { inject } from 'vue';\n\nexport interface LinkWalletParams {\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId?: number;\n message: string;\n signature: string;\n}\n\nexport interface UseAuthonWeb3Return {\n getNonce: (\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ) => Promise<Web3NonceResponse | null>;\n verify: (\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ) => Promise<boolean>;\n listWallets: () => Promise<Web3Wallet[] | null>;\n linkWallet: (params: LinkWalletParams) => Promise<Web3Wallet | null>;\n unlinkWallet: (walletId: string) => Promise<boolean>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\nexport function useAuthonWeb3(): UseAuthonWeb3Return {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthonWeb3() must be called inside a component tree with createAuthon() installed');\n }\n const s = state;\n\n const isLoading = ref<boolean>(false);\n const error = ref<Error | null>(null);\n\n async function wrap<T>(fn: () => Promise<T>): Promise<T | null> {\n isLoading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n return null;\n } finally {\n isLoading.value = false;\n }\n }\n\n async function getNonce(\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ): Promise<Web3NonceResponse | null> {\n return wrap(() => s.client!.web3GetNonce(address, chain, walletType, chainId));\n }\n\n async function verify(\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ): Promise<boolean> {\n const result = await wrap(() =>\n s.client!.web3Verify(message, signature, address, chain, walletType),\n );\n return result !== null;\n }\n\n async function listWallets(): Promise<Web3Wallet[] | null> {\n return wrap(() => s.client!.listWallets());\n }\n\n async function linkWallet(params: LinkWalletParams): Promise<Web3Wallet | null> {\n return wrap(() => s.client!.linkWallet(params));\n }\n\n async function unlinkWallet(walletId: string): Promise<boolean> {\n const result = await wrap(() => s.client!.unlinkWallet(walletId));\n return result !== null;\n }\n\n return {\n getNonce,\n verify,\n listWallets,\n linkWallet,\n unlinkWallet,\n isLoading,\n error,\n };\n}\n","import { ref, inject } from 'vue';\nimport type { Ref } from 'vue';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\n\nexport interface UseAuthonPasswordlessReturn {\n sendMagicLink: (email: string) => Promise<boolean>;\n sendEmailOtp: (email: string) => Promise<boolean>;\n verifyPasswordless: (opts: { token?: string; email?: string; code?: string }) => Promise<boolean>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\nexport function useAuthonPasswordless(): UseAuthonPasswordlessReturn {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthonPasswordless() must be called inside a component tree with createAuthon() installed');\n }\n const s = state;\n\n const isLoading = ref<boolean>(false);\n const error = ref<Error | null>(null);\n\n async function wrap<T>(fn: () => Promise<T>): Promise<T | null> {\n isLoading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n return null;\n } finally {\n isLoading.value = false;\n }\n }\n\n async function sendMagicLink(email: string): Promise<boolean> {\n const result = await wrap(() => s.client!.sendMagicLink(email));\n return result !== null;\n }\n\n async function sendEmailOtp(email: string): Promise<boolean> {\n const result = await wrap(() => s.client!.sendEmailOtp(email));\n return result !== null;\n }\n\n async function verifyPasswordless(opts: {\n token?: string;\n email?: string;\n code?: string;\n }): Promise<boolean> {\n const result = await wrap(() => s.client!.verifyPasswordless(opts));\n return result !== null;\n }\n\n return {\n sendMagicLink,\n sendEmailOtp,\n verifyPasswordless,\n isLoading,\n error,\n };\n}\n","import { ref, inject } from 'vue';\nimport type { Ref } from 'vue';\nimport type { PasskeyCredential } from '@authon/shared';\nimport { AUTHON_KEY } from './plugin';\nimport type { AuthonState } from './plugin';\n\nexport interface UseAuthonPasskeysReturn {\n registerPasskey: (name?: string) => Promise<PasskeyCredential | null>;\n authenticateWithPasskey: (email?: string) => Promise<boolean>;\n listPasskeys: () => Promise<PasskeyCredential[] | null>;\n renamePasskey: (id: string, name: string) => Promise<PasskeyCredential | null>;\n revokePasskey: (id: string) => Promise<boolean>;\n isLoading: Ref<boolean>;\n error: Ref<Error | null>;\n}\n\nexport function useAuthonPasskeys(): UseAuthonPasskeysReturn {\n const state = inject<AuthonState>(AUTHON_KEY);\n if (!state) {\n throw new Error('useAuthonPasskeys() must be called inside a component tree with createAuthon() installed');\n }\n const s = state;\n\n const isLoading = ref<boolean>(false);\n const error = ref<Error | null>(null);\n\n async function wrap<T>(fn: () => Promise<T>): Promise<T | null> {\n isLoading.value = true;\n error.value = null;\n try {\n return await fn();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n return null;\n } finally {\n isLoading.value = false;\n }\n }\n\n async function registerPasskey(name?: string): Promise<PasskeyCredential | null> {\n return wrap(() => s.client!.registerPasskey(name));\n }\n\n async function authenticateWithPasskey(email?: string): Promise<boolean> {\n const result = await wrap(() => s.client!.authenticateWithPasskey(email));\n return result !== null;\n }\n\n async function listPasskeys(): Promise<PasskeyCredential[] | null> {\n return wrap(() => s.client!.listPasskeys());\n }\n\n async function renamePasskey(id: string, name: string): Promise<PasskeyCredential | null> {\n return wrap(() => s.client!.renamePasskey(id, name));\n }\n\n async function revokePasskey(id: string): Promise<boolean> {\n const result = await wrap(() => s.client!.revokePasskey(id));\n return result !== null;\n }\n\n return {\n registerPasskey,\n authenticateWithPasskey,\n listPasskeys,\n renamePasskey,\n revokePasskey,\n isLoading,\n error,\n };\n}\n","import { defineComponent, h, onMounted, ref, computed } from 'vue';\nimport { useAuthon } from './composables';\n\nexport const AuthonSignIn = defineComponent({\n name: 'AuthonSignIn',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignIn();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signin-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonSignUp = defineComponent({\n name: 'AuthonSignUp',\n props: {\n mode: {\n type: String as () => 'popup' | 'embedded',\n default: 'popup',\n },\n },\n setup(props) {\n const { client } = useAuthon();\n\n onMounted(() => {\n if (props.mode === 'popup') {\n client?.openSignUp();\n }\n });\n\n return () => {\n if (props.mode === 'embedded') {\n return h('div', { id: 'authon-signup-container' });\n }\n return null;\n };\n },\n});\n\nexport const AuthonUserButton = defineComponent({\n name: 'AuthonUserButton',\n setup() {\n const { user, isSignedIn, signOut, openSignIn } = useAuthon();\n const open = ref(false);\n\n const initials = computed(() => {\n if (!user) return '?';\n const u = user as typeof user;\n if ((u as { displayName?: string | null }).displayName) {\n return ((u as { displayName: string }).displayName)\n .split(' ')\n .map((n: string) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n return ((u as { email?: string | null }).email?.[0] ?? '?').toUpperCase();\n });\n\n return () => {\n if (!isSignedIn) {\n return h(\n 'button',\n {\n onClick: () => openSignIn(),\n style: {\n padding: '8px 16px',\n borderRadius: '8px',\n border: 'none',\n background: 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n color: '#fff',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n },\n },\n 'Sign In',\n );\n }\n\n const avatarUrl = (user as { avatarUrl?: string | null } | null)?.avatarUrl;\n const displayName = (user as { displayName?: string | null } | null)?.displayName;\n const email = (user as { email?: string | null } | null)?.email;\n\n return h('div', { style: { position: 'relative', display: 'inline-block' } }, [\n h(\n 'button',\n {\n onClick: () => (open.value = !open.value),\n style: {\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n border: '2px solid #7c3aed',\n background: avatarUrl ? 'transparent' : 'linear-gradient(135deg, #7c3aed, #4f46e5)',\n cursor: 'pointer',\n padding: 0,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n fontSize: '13px',\n fontWeight: 700,\n },\n },\n avatarUrl\n ? [h('img', { src: avatarUrl, alt: displayName ?? 'avatar', style: { width: '100%', height: '100%', objectFit: 'cover' } })]\n : [initials.value],\n ),\n open.value\n ? h(\n 'div',\n {\n style: {\n position: 'absolute',\n right: 0,\n top: '44px',\n minWidth: '200px',\n background: '#fff',\n border: '1px solid #e5e7eb',\n borderRadius: '12px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n zIndex: 9999,\n overflow: 'hidden',\n },\n },\n [\n h('div', { style: { padding: '12px 16px', borderBottom: '1px solid #f3f4f6' } }, [\n displayName && h('div', { style: { fontSize: '14px', fontWeight: 600, color: '#111827' } }, displayName),\n email && h('div', { style: { fontSize: '12px', color: '#6b7280', marginTop: '2px' } }, email),\n ]),\n h(\n 'button',\n {\n onClick: async () => {\n open.value = false;\n await signOut();\n },\n style: {\n display: 'block',\n width: '100%',\n padding: '10px 16px',\n textAlign: 'left',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#ef4444',\n fontWeight: 500,\n },\n },\n 'Sign out',\n ),\n ],\n )\n : null,\n ]);\n };\n },\n});\n\nexport const AuthonSignedIn = defineComponent({\n name: 'AuthonSignedIn',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || !isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n\nexport const AuthonSignedOut = defineComponent({\n name: 'AuthonSignedOut',\n setup(_, { slots }) {\n const { isSignedIn, isLoading } = useAuthon();\n return () => {\n if (isLoading || isSignedIn) return null;\n return slots.default?.();\n };\n },\n});\n","import { defineComponent, h, ref, computed, onMounted, type PropType } from 'vue';\nimport { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\nimport { getProviderButtonConfig } from '@authon/js';\nimport { useAuthon } from './composables';\n\nexport const AuthonSocialButton = defineComponent({\n name: 'AuthonSocialButton',\n props: {\n provider: { type: String as PropType<OAuthProviderType>, required: true },\n onClick: { type: Function as PropType<(provider: OAuthProviderType) => void | Promise<void>>, required: true },\n loading: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n label: { type: String, default: undefined },\n compact: { type: Boolean, default: false },\n iconSize: { type: Number, default: undefined },\n borderRadius: { type: Number, default: 10 },\n height: { type: Number, default: 48 },\n size: { type: Number, default: 48 },\n },\n setup(props) {\n const colors = computed(() => PROVIDER_COLORS[props.provider] || { bg: '#333', text: '#fff' });\n const displayName = computed(() => PROVIDER_DISPLAY_NAMES[props.provider] || props.provider);\n const buttonLabel = computed(() => props.label ?? `Continue with ${displayName.value}`);\n const needsBorder = computed(() => colors.value.bg.toLowerCase() === '#ffffff');\n const resolvedIconSize = computed(() => props.iconSize ?? (props.compact ? 24 : 20));\n\n const iconSvg = computed(() => {\n const config = getProviderButtonConfig(props.provider);\n return config.iconSvg\n .replace(/width=\"\\d+\"/, `width=\"${resolvedIconSize.value}\"`)\n .replace(/height=\"\\d+\"/, `height=\"${resolvedIconSize.value}\"`);\n });\n\n const spinner = () =>\n h('span', {\n style: {\n display: 'inline-block',\n width: '16px',\n height: '16px',\n border: `2px solid ${colors.value.text}`,\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'authon-spin 0.6s linear infinite',\n },\n });\n\n const icon = () =>\n h('span', {\n style: { display: 'flex', alignItems: 'center', flexShrink: 0 },\n innerHTML: iconSvg.value,\n });\n\n return () => {\n const borderStyle = needsBorder.value ? { border: '1px solid #dadce0' } : {};\n\n if (props.compact) {\n return h(\n 'button',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n cursor: 'pointer',\n transition: 'opacity 0.15s',\n padding: 0,\n backgroundColor: colors.value.bg,\n borderRadius: `${props.borderRadius}px`,\n width: `${props.size}px`,\n height: `${props.size}px`,\n ...borderStyle,\n },\n onClick: () => props.onClick(props.provider),\n disabled: props.disabled || props.loading,\n 'aria-label': `Sign in with ${displayName.value}`,\n },\n [props.loading ? spinner() : icon()],\n );\n }\n\n return h(\n 'button',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '10px',\n paddingLeft: '16px',\n paddingRight: '16px',\n border: 'none',\n cursor: 'pointer',\n fontFamily: 'inherit',\n transition: 'opacity 0.15s',\n width: '100%',\n backgroundColor: colors.value.bg,\n color: colors.value.text,\n borderRadius: `${props.borderRadius}px`,\n height: `${props.height}px`,\n ...borderStyle,\n },\n onClick: () => props.onClick(props.provider),\n disabled: props.disabled || props.loading,\n 'aria-label': `Sign in with ${displayName.value}`,\n },\n props.loading\n ? [spinner()]\n : [\n icon(),\n h('span', { style: { fontSize: '15px', fontWeight: 600, whiteSpace: 'nowrap' } }, buttonLabel.value),\n ],\n );\n };\n },\n});\n\nexport const AuthonSocialButtons = defineComponent({\n name: 'AuthonSocialButtons',\n props: {\n onSuccess: { type: Function as PropType<() => void>, default: undefined },\n onError: { type: Function as PropType<(error: Error) => void>, default: undefined },\n gap: { type: Number, default: undefined },\n compact: { type: Boolean, default: false },\n labels: { type: Object as PropType<Partial<Record<OAuthProviderType, string>>>, default: undefined },\n },\n setup(props) {\n const { client } = useAuthon();\n const providers = ref<OAuthProviderType[]>([]);\n const loadingProvider = ref<string | null>(null);\n const resolvedGap = computed(() => props.gap ?? (props.compact ? 12 : 10));\n\n onMounted(async () => {\n if (client) {\n providers.value = await client.getProviders();\n }\n });\n\n const handleClick = async (provider: OAuthProviderType) => {\n if (!client) return;\n loadingProvider.value = provider;\n try {\n await client.signInWithOAuth(provider);\n props.onSuccess?.();\n } catch (e: any) {\n const error = e instanceof Error ? e : new Error(String(e));\n props.onError?.(error);\n } finally {\n loadingProvider.value = null;\n }\n };\n\n return () => {\n if (providers.value.length === 0) return null;\n\n const containerStyle = props.compact\n ? { display: 'flex', flexDirection: 'row' as const, flexWrap: 'wrap' as const, justifyContent: 'center', gap: `${resolvedGap.value}px` }\n : { display: 'flex', flexDirection: 'column' as const, gap: `${resolvedGap.value}px` };\n\n return h(\n 'div',\n { style: containerStyle },\n providers.value.map((provider) =>\n h(AuthonSocialButton, {\n key: provider,\n provider,\n onClick: handleClick,\n loading: loadingProvider.value === provider,\n disabled: !!loadingProvider.value,\n compact: props.compact,\n label: props.labels?.[provider],\n }),\n ),\n );\n };\n },\n});\n"],"mappings":"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","names":["import_vue","import_vue","import_vue","import_vue","import_vue","import_vue","import_vue","import_js"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as vue from 'vue';
|
|
2
|
-
import { App, ComputedRef, PropType } from 'vue';
|
|
2
|
+
import { App, ComputedRef, Ref, PropType } from 'vue';
|
|
3
3
|
import { AuthonConfig, Authon } from '@authon/js';
|
|
4
|
-
import { AuthonUser, OAuthProviderType } from '@authon/shared';
|
|
4
|
+
import { AuthonUser, Web3Chain, Web3WalletType, Web3NonceResponse, Web3Wallet, PasskeyCredential, OAuthProviderType } from '@authon/shared';
|
|
5
5
|
|
|
6
6
|
declare const AUTHON_KEY: unique symbol;
|
|
7
7
|
interface AuthonState {
|
|
@@ -29,6 +29,49 @@ declare function useUser(): {
|
|
|
29
29
|
isLoading: ComputedRef<boolean>;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
interface LinkWalletParams {
|
|
33
|
+
address: string;
|
|
34
|
+
chain: Web3Chain;
|
|
35
|
+
walletType: Web3WalletType;
|
|
36
|
+
chainId?: number;
|
|
37
|
+
message: string;
|
|
38
|
+
signature: string;
|
|
39
|
+
}
|
|
40
|
+
interface UseAuthonWeb3Return {
|
|
41
|
+
getNonce: (address: string, chain: Web3Chain, walletType: Web3WalletType, chainId?: number) => Promise<Web3NonceResponse | null>;
|
|
42
|
+
verify: (message: string, signature: string, address: string, chain: Web3Chain, walletType: Web3WalletType) => Promise<boolean>;
|
|
43
|
+
listWallets: () => Promise<Web3Wallet[] | null>;
|
|
44
|
+
linkWallet: (params: LinkWalletParams) => Promise<Web3Wallet | null>;
|
|
45
|
+
unlinkWallet: (walletId: string) => Promise<boolean>;
|
|
46
|
+
isLoading: Ref<boolean>;
|
|
47
|
+
error: Ref<Error | null>;
|
|
48
|
+
}
|
|
49
|
+
declare function useAuthonWeb3(): UseAuthonWeb3Return;
|
|
50
|
+
|
|
51
|
+
interface UseAuthonPasswordlessReturn {
|
|
52
|
+
sendMagicLink: (email: string) => Promise<boolean>;
|
|
53
|
+
sendEmailOtp: (email: string) => Promise<boolean>;
|
|
54
|
+
verifyPasswordless: (opts: {
|
|
55
|
+
token?: string;
|
|
56
|
+
email?: string;
|
|
57
|
+
code?: string;
|
|
58
|
+
}) => Promise<boolean>;
|
|
59
|
+
isLoading: Ref<boolean>;
|
|
60
|
+
error: Ref<Error | null>;
|
|
61
|
+
}
|
|
62
|
+
declare function useAuthonPasswordless(): UseAuthonPasswordlessReturn;
|
|
63
|
+
|
|
64
|
+
interface UseAuthonPasskeysReturn {
|
|
65
|
+
registerPasskey: (name?: string) => Promise<PasskeyCredential | null>;
|
|
66
|
+
authenticateWithPasskey: (email?: string) => Promise<boolean>;
|
|
67
|
+
listPasskeys: () => Promise<PasskeyCredential[] | null>;
|
|
68
|
+
renamePasskey: (id: string, name: string) => Promise<PasskeyCredential | null>;
|
|
69
|
+
revokePasskey: (id: string) => Promise<boolean>;
|
|
70
|
+
isLoading: Ref<boolean>;
|
|
71
|
+
error: Ref<Error | null>;
|
|
72
|
+
}
|
|
73
|
+
declare function useAuthonPasskeys(): UseAuthonPasskeysReturn;
|
|
74
|
+
|
|
32
75
|
declare const AuthonSignIn: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
33
76
|
mode: {
|
|
34
77
|
type: () => "popup" | "embedded";
|
|
@@ -215,4 +258,4 @@ declare const AuthonSocialButtons: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
215
258
|
labels: Partial<Record<"google" | "apple" | "kakao" | "naver" | "facebook" | "github" | "discord" | "x" | "line" | "microsoft", string>>;
|
|
216
259
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
217
260
|
|
|
218
|
-
export { AUTHON_KEY, type AuthonPluginOptions, AuthonSignIn, AuthonSignUp, AuthonSignedIn, AuthonSignedOut, AuthonSocialButton, AuthonSocialButtons, type AuthonState, AuthonUserButton, createAuthon, useAuthon, useUser };
|
|
261
|
+
export { AUTHON_KEY, type AuthonPluginOptions, AuthonSignIn, AuthonSignUp, AuthonSignedIn, AuthonSignedOut, AuthonSocialButton, AuthonSocialButtons, type AuthonState, AuthonUserButton, type LinkWalletParams, type UseAuthonPasskeysReturn, type UseAuthonPasswordlessReturn, type UseAuthonWeb3Return, createAuthon, useAuthon, useAuthonPasskeys, useAuthonPasswordless, useAuthonWeb3, useUser };
|