faire-auth 1.0.3 → 1.1.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/dist/{adapter-factory-lKIOf2OR.mjs → adapter-factory-qPVW8x9-.mjs} +34 -36
- package/dist/{adapter-factory-D1I7joki.cjs → adapter-factory-u8r3oTez.cjs} +66 -68
- package/dist/adapters/drizzle-adapter/index.cjs +34 -40
- package/dist/adapters/drizzle-adapter/index.d.cts +4 -9
- package/dist/adapters/drizzle-adapter/index.d.mts +4 -9
- package/dist/adapters/drizzle-adapter/index.mjs +20 -26
- package/dist/adapters/index.cjs +11 -16
- package/dist/adapters/index.d.cts +11 -37
- package/dist/adapters/index.d.mts +11 -37
- package/dist/adapters/index.mjs +4 -13
- package/dist/adapters/kysely-adapter/index.cjs +270 -11
- package/dist/adapters/kysely-adapter/index.d.cts +9 -19
- package/dist/adapters/kysely-adapter/index.d.mts +9 -19
- package/dist/adapters/kysely-adapter/index.mjs +267 -9
- package/dist/adapters/memory-adapter/index.cjs +146 -9
- package/dist/adapters/memory-adapter/index.d.cts +4 -10
- package/dist/adapters/memory-adapter/index.d.mts +4 -10
- package/dist/adapters/memory-adapter/index.mjs +145 -9
- package/dist/adapters/mongodb-adapter/index.cjs +13 -21
- package/dist/adapters/mongodb-adapter/index.d.cts +3 -8
- package/dist/adapters/mongodb-adapter/index.d.mts +4 -9
- package/dist/adapters/mongodb-adapter/index.mjs +12 -20
- package/dist/adapters/prisma-adapter/index.cjs +12 -20
- package/dist/adapters/prisma-adapter/index.d.cts +4 -8
- package/dist/adapters/prisma-adapter/index.d.mts +4 -8
- package/dist/adapters/prisma-adapter/index.mjs +5 -13
- package/dist/adapters/test.cjs +86 -69
- package/dist/adapters/test.d.cts +7 -11
- package/dist/adapters/test.d.mts +7 -11
- package/dist/adapters/test.mjs +83 -66
- package/dist/api/index.cjs +3 -20
- package/dist/api/index.d.cts +2 -3
- package/dist/api/index.d.mts +2 -3
- package/dist/api/index.mjs +1 -20
- package/dist/api/middleware/index.cjs +4 -11
- package/dist/api/middleware/index.d.cts +3 -9
- package/dist/api/middleware/index.d.mts +3 -9
- package/dist/api/middleware/index.mjs +3 -11
- package/dist/{api-B4RDwBty.mjs → api-0f-F-Fi2.mjs} +292 -189
- package/dist/{api-CaRC1Gio.cjs → api-LjfH6hQi.cjs} +557 -452
- package/dist/{test-utils/bun-sqlite-dialect-BZBvHchL.cjs → bun-sqlite-dialect-BHkarnxN.cjs} +5 -9
- package/dist/{test-utils/bun-sqlite-dialect-BSWhhKNs.mjs → bun-sqlite-dialect-BiZBuEF6.mjs} +6 -9
- package/dist/client/index.cjs +8 -15
- package/dist/client/index.d.cts +9 -14
- package/dist/client/index.d.mts +9 -14
- package/dist/client/index.mjs +7 -15
- package/dist/client/lynx/index.cjs +10 -18
- package/dist/client/lynx/index.d.cts +402 -71
- package/dist/client/lynx/index.d.mts +402 -71
- package/dist/client/lynx/index.mjs +5 -13
- package/dist/client/plugins/index.cjs +3 -5
- package/dist/client/plugins/index.d.cts +5 -10
- package/dist/client/plugins/index.d.mts +5 -10
- package/dist/client/plugins/index.mjs +2 -4
- package/dist/client/react/index.cjs +6 -14
- package/dist/client/react/index.d.cts +402 -71
- package/dist/client/react/index.d.mts +402 -71
- package/dist/client/react/index.mjs +5 -13
- package/dist/client/solid/index.cjs +6 -14
- package/dist/client/solid/index.d.cts +393 -57
- package/dist/client/solid/index.d.mts +393 -57
- package/dist/client/solid/index.mjs +5 -13
- package/dist/client/svelte/index.cjs +5 -10
- package/dist/client/svelte/index.d.cts +400 -67
- package/dist/client/svelte/index.d.mts +400 -67
- package/dist/client/svelte/index.mjs +4 -10
- package/dist/client/vue/index.cjs +6 -14
- package/dist/client/vue/index.d.cts +401 -68
- package/dist/client/vue/index.d.mts +401 -68
- package/dist/client/vue/index.mjs +5 -13
- package/dist/{cookies-BTs1o992.mjs → cookies-D9aY_gJh.mjs} +25 -21
- package/dist/{cookies-BTl72THv.cjs → cookies-DQ52rcOy.cjs} +119 -115
- package/dist/crypto/index.cjs +10 -8
- package/dist/crypto/index.d.cts +5 -13
- package/dist/crypto/index.d.mts +5 -13
- package/dist/crypto/index.mjs +2 -5
- package/dist/{crypto-DH2Aa7jN.mjs → crypto-BH-hD0lJ.mjs} +7 -10
- package/dist/{crypto-DpSCnrTp.cjs → crypto-BITfWVwD.cjs} +24 -27
- package/dist/db/index.cjs +1135 -29
- package/dist/db/index.d.cts +1 -2
- package/dist/db/index.d.mts +1 -2
- package/dist/db/index.mjs +1115 -16
- package/dist/defu-D2h4S3X-.mjs +87 -0
- package/dist/defu-DWS5RPWt.cjs +134 -0
- package/dist/{email-verification-DI_0H4JC.cjs → email-verification-DOPnSgbI.cjs} +65 -71
- package/dist/{email-verification-C_lBu_JY.mjs → email-verification-YSR5n5lb.mjs} +23 -29
- package/dist/{hono-CO-zsqI-.mjs → hono-BAV2wQkK.mjs} +16 -33
- package/dist/hono-SVQuc5Ru.mjs +4 -0
- package/dist/hono-pgK4H_U1.cjs +9 -0
- package/dist/{hono-DnW5crl1.cjs → hono-tyFFJFdS.cjs} +42 -60
- package/dist/index-B86Cy0dE.d.cts +2 -0
- package/dist/index-B86Cy0dE.d.mts +2 -0
- package/dist/index.cjs +115 -150
- package/dist/index.d.cts +4 -5
- package/dist/index.d.mts +4 -5
- package/dist/index.mjs +46 -81
- package/dist/integrations/next-js.cjs +5 -9
- package/dist/integrations/next-js.d.cts +6 -14
- package/dist/integrations/next-js.d.mts +6 -14
- package/dist/integrations/next-js.mjs +4 -9
- package/dist/integrations/node.cjs +16 -14
- package/dist/integrations/node.d.cts +6 -14
- package/dist/integrations/node.d.mts +6 -14
- package/dist/integrations/node.mjs +15 -13
- package/dist/integrations/react-start.cjs +7 -11
- package/dist/integrations/react-start.d.cts +5 -13
- package/dist/integrations/react-start.d.mts +5 -13
- package/dist/integrations/react-start.mjs +6 -11
- package/dist/integrations/solid-start.cjs +3 -5
- package/dist/integrations/solid-start.d.cts +2 -5
- package/dist/integrations/solid-start.d.mts +2 -5
- package/dist/integrations/solid-start.mjs +2 -4
- package/dist/integrations/svelte-kit.cjs +6 -10
- package/dist/integrations/svelte-kit.d.cts +11 -23
- package/dist/integrations/svelte-kit.d.mts +11 -23
- package/dist/integrations/svelte-kit.mjs +5 -10
- package/dist/{ip-BjNYspCH.mjs → ip-6Lv2o42m.mjs} +4 -9
- package/dist/{ip-C17Qdq-G.cjs → ip-DPydExzV.cjs} +21 -27
- package/dist/{json--tl7Grvs.cjs → json-D3aq-nH2.cjs} +9 -13
- package/dist/{json-B1v2qRTQ.mjs → json-DooGMtnJ.mjs} +2 -5
- package/dist/{logged-CyGfp8_H.mjs → logged-B83SzMnJ.mjs} +6 -10
- package/dist/{logged-Dv3st5qc.cjs → logged-BIpCpnVY.cjs} +13 -18
- package/dist/{middleware-CE6OhDkq.mjs → middleware-Cakg4e1D.mjs} +2 -4
- package/dist/{middleware-CWvRH4EW.cjs → middleware-Cd-VkNxB.cjs} +17 -20
- package/dist/{node-sqlite-dialect-w4DAg0PH.mjs → node-sqlite-dialect-BMVOjEMh.mjs} +6 -9
- package/dist/{test-utils/node-sqlite-dialect-BgJqjBOu.cjs → node-sqlite-dialect-D3QPFROH.cjs} +5 -9
- package/dist/oauth2/index.cjs +166 -22
- package/dist/oauth2/index.d.cts +5 -17
- package/dist/oauth2/index.d.mts +5 -17
- package/dist/oauth2/index.mjs +156 -16
- package/dist/{origin-check-DjLTuZQ8.cjs → origin-check-BflGhEEN.cjs} +34 -38
- package/dist/{origin-check-8Gajklvh.mjs → origin-check-CRgs1M7k.mjs} +13 -16
- package/dist/{parser-B25ylT5u.mjs → parser-CqwvpF6l.cjs} +12 -10
- package/dist/{parser-B_wxvaAr.cjs → parser-DcKDjjHO.mjs} +7 -22
- package/dist/plugins/access/index.cjs +38 -4
- package/dist/plugins/access/index.d.cts +36 -2
- package/dist/plugins/access/index.d.mts +36 -2
- package/dist/plugins/access/index.mjs +36 -3
- package/dist/plugins/bearer/index.cjs +52 -7
- package/dist/plugins/bearer/index.d.cts +27 -4
- package/dist/plugins/bearer/index.d.mts +27 -4
- package/dist/plugins/bearer/index.mjs +51 -7
- package/dist/plugins/index.cjs +1385 -842
- package/dist/plugins/index.d.cts +489 -7566
- package/dist/plugins/index.d.mts +489 -7566
- package/dist/plugins/index.mjs +1118 -576
- package/dist/plugins/passkey/index.cjs +551 -15
- package/dist/plugins/passkey/index.d.cts +123 -4
- package/dist/plugins/passkey/index.d.mts +123 -4
- package/dist/plugins/passkey/index.mjs +547 -15
- package/dist/{chunk-BFnQceUY.mjs → rolldown-runtime-BKpuH2hG.mjs} +6 -7
- package/dist/{chunk-fPmz2rbM.cjs → rolldown-runtime-C_Pgydhf.cjs} +22 -24
- package/dist/{schema-DTIwLLmf.mjs → schema-CFCpv0tK.mjs} +3 -6
- package/dist/{schema-CirKflVs.cjs → schema-b-lKhMkG.cjs} +51 -55
- package/dist/{session-CM3rmOYF.mjs → session-BGjJgihS.mjs} +51 -74
- package/dist/{session-Cwrj4GfV.cjs → session-CzZSMmQC.cjs} +197 -219
- package/dist/shared.d.cts +1581 -0
- package/dist/shared.d.mts +1581 -0
- package/dist/social-providers/index.cjs +9 -9
- package/dist/social-providers/index.d.cts +1 -1
- package/dist/social-providers/index.d.mts +1 -1
- package/dist/social-providers/index.mjs +3 -5
- package/dist/social-providers-CjPww-qf.mjs +6 -0
- package/dist/social-providers-D7w_7Ym8.cjs +10 -0
- package/dist/{state-CvSihlVT.cjs → state-2OrNjOO-.cjs} +24 -24
- package/dist/{state-CQghgH9I.mjs → state-Dooeisfq.mjs} +17 -17
- package/dist/{bun-sqlite-dialect-DPgTzc0w.cjs → test-utils/bun-sqlite-dialect-BHkarnxN.cjs} +5 -9
- package/dist/{bun-sqlite-dialect-6NqeV3px.mjs → test-utils/bun-sqlite-dialect-BiZBuEF6.mjs} +6 -9
- package/dist/test-utils/index.cjs +8831 -7941
- package/dist/test-utils/index.d.cts +310 -12440
- package/dist/test-utils/index.d.mts +313 -12440
- package/dist/test-utils/index.mjs +8591 -7701
- package/dist/test-utils/{node-sqlite-dialect-DAQXiobH.mjs → node-sqlite-dialect-BMVOjEMh.mjs} +6 -9
- package/dist/{node-sqlite-dialect-DP11CB0y.cjs → test-utils/node-sqlite-dialect-D3QPFROH.cjs} +5 -9
- package/dist/types/index.d.cts +2 -3
- package/dist/types/index.d.mts +2 -3
- package/dist/types/index.mjs +1 -1
- package/dist/{url-BoUuoIwZ.mjs → url-CJtdrrUu.mjs} +12 -13
- package/dist/{url-Ce7CVaQD.cjs → url-DjCmCUHS.cjs} +42 -44
- package/dist/utils/cookies.cjs +29 -30
- package/dist/utils/cookies.d.cts +21 -25
- package/dist/utils/cookies.d.mts +20 -24
- package/dist/utils/cookies.mjs +2 -7
- package/dist/utils-C7OHyfHa.mjs +4 -0
- package/dist/utils-iX0Vy_UL.cjs +3 -0
- package/package.json +40 -30
- package/dist/access-BZ7-AbTM.cjs +0 -51
- package/dist/access-D0DRqUKC.mjs +0 -39
- package/dist/bearer-DDzrp5M7.cjs +0 -60
- package/dist/bearer-WZcs7gxL.mjs +0 -54
- package/dist/db-4tUsQJXd.mjs +0 -1119
- package/dist/db-ChMbb_U-.cjs +0 -1180
- package/dist/defu-BmOYq4PU.cjs +0 -34
- package/dist/defu-D9ZTXqlo.mjs +0 -28
- package/dist/hono-C14rpOEa.cjs +0 -13
- package/dist/hono-CoKYWnXA.mjs +0 -7
- package/dist/hono-D0VqxVy1.d.mts +0 -18
- package/dist/hono-DOM31WQz.d.cts +0 -18
- package/dist/index-BCTFWP_o.d.mts +0 -992
- package/dist/index-BDhhaE6Y.d.cts +0 -3
- package/dist/index-BVRfQy6L.d.mts +0 -992
- package/dist/index-Baarsq5J.d.mts +0 -33
- package/dist/index-By364WbF.d.cts +0 -992
- package/dist/index-BzWwMgxr.d.cts +0 -992
- package/dist/index-CF9iq55a.d.mts +0 -3
- package/dist/index-CJD2yB-W.d.cts +0 -33
- package/dist/index-CRt_fppq.d.mts +0 -41
- package/dist/index-CdLyn7qP.d.cts +0 -41
- package/dist/index-CsWF3f7U.d.cts +0 -13350
- package/dist/index-CzidsAyA.d.mts +0 -13350
- package/dist/index-DvW-GCcI.d.cts +0 -33
- package/dist/index-f-5OJ9yV.d.cts +0 -13350
- package/dist/index-rFv8Hxld.d.mts +0 -13350
- package/dist/index-ztVZPQdV.d.mts +0 -33
- package/dist/kysely-adapter-CtIdoHa8.mjs +0 -270
- package/dist/kysely-adapter-QZTx077T.cjs +0 -288
- package/dist/memory-adapter-17RZd5df.cjs +0 -154
- package/dist/memory-adapter-Dp4XdCZK.mjs +0 -148
- package/dist/oauth2-5RL4cVNS.cjs +0 -177
- package/dist/oauth2-C56wz-n9.mjs +0 -159
- package/dist/passkey-BTT-v5c-.cjs +0 -512
- package/dist/passkey-CzY_W2us.mjs +0 -505
- package/dist/request-1NL_1lyJ.mjs +0 -58
- package/dist/request-CPNlp-DK.cjs +0 -100
- package/dist/social-providers-B8RK5yqI.mjs +0 -9
- package/dist/social-providers-BmFOIIPk.cjs +0 -13
- package/dist/utils-44aDDP8f.cjs +0 -2
- package/dist/utils-D4vZd1-9.mjs +0 -4
|
@@ -1,505 +0,0 @@
|
|
|
1
|
-
import { n as cookies_exports, y as setSessionCookie } from "./cookies-BTs1o992.mjs";
|
|
2
|
-
import { f as createEndpoint, r as getSessionFromCtx, t as freshSessionMiddleware, u as sessionMiddleware } from "./session-CM3rmOYF.mjs";
|
|
3
|
-
import { i as generateRandomString, r as generateId } from "./utils-D4vZd1-9.mjs";
|
|
4
|
-
import { t as mergeSchema } from "./schema-DTIwLLmf.mjs";
|
|
5
|
-
import { logger } from "@faire-auth/core/env";
|
|
6
|
-
import { createRoute, emailSchema, req, res } from "@faire-auth/core/factory";
|
|
7
|
-
import { Definitions, False, SCHEMAS, True } from "@faire-auth/core/static";
|
|
8
|
-
import { toSuccess } from "@faire-auth/core/utils";
|
|
9
|
-
import { base64 } from "@faire-auth/core/datatypes";
|
|
10
|
-
import * as z$1 from "zod";
|
|
11
|
-
import { generateAuthenticationOptions, generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse } from "@simplewebauthn/server";
|
|
12
|
-
|
|
13
|
-
//#region src/plugins/passkey/index.ts
|
|
14
|
-
const getRpID = (options, baseURL) => options.rpID || (baseURL ? new URL(baseURL).hostname : "localhost");
|
|
15
|
-
const passkeySchema = z$1.object({
|
|
16
|
-
id: z$1.string(),
|
|
17
|
-
name: z$1.string().optional(),
|
|
18
|
-
publicKey: z$1.string(),
|
|
19
|
-
userId: z$1.string(),
|
|
20
|
-
credentialID: z$1.string(),
|
|
21
|
-
counter: z$1.number().int().nonnegative(),
|
|
22
|
-
deviceType: z$1.enum(["singleDevice", "multiDevice"]),
|
|
23
|
-
backedUp: z$1.boolean(),
|
|
24
|
-
transports: z$1.string().optional(),
|
|
25
|
-
createdAt: z$1.date().or(z$1.iso.datetime()),
|
|
26
|
-
aaguid: z$1.string().optional()
|
|
27
|
-
});
|
|
28
|
-
const passkey = (options) => {
|
|
29
|
-
const opts = {
|
|
30
|
-
origin: null,
|
|
31
|
-
...options,
|
|
32
|
-
advanced: {
|
|
33
|
-
webAuthnChallengeCookie: "better-auth-passkey",
|
|
34
|
-
...options?.advanced
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
const expirationTime = new Date(Date.now() + 1e3 * 60 * 5);
|
|
38
|
-
const currentTime = /* @__PURE__ */ new Date();
|
|
39
|
-
const maxAgeInSeconds = Math.floor((expirationTime.getTime() - currentTime.getTime()) / 1e3);
|
|
40
|
-
const ERROR_CODES = {
|
|
41
|
-
CHALLENGE_NOT_FOUND: "Challenge not found",
|
|
42
|
-
YOU_ARE_NOT_ALLOWED_TO_REGISTER_THIS_PASSKEY: "You are not allowed to register this passkey",
|
|
43
|
-
FAILED_TO_VERIFY_REGISTRATION: "Failed to verify registration",
|
|
44
|
-
PASSKEY_NOT_FOUND: "Passkey not found",
|
|
45
|
-
AUTHENTICATION_FAILED: "Authentication failed",
|
|
46
|
-
UNABLE_TO_CREATE_SESSION: "Unable to create session",
|
|
47
|
-
FAILED_TO_UPDATE_PASSKEY: "Failed to update passkey"
|
|
48
|
-
};
|
|
49
|
-
return {
|
|
50
|
-
id: "passkey",
|
|
51
|
-
routes: {
|
|
52
|
-
generatePasskeyRegistrationOptions: createEndpoint(createRoute({
|
|
53
|
-
operationId: "generatePasskeyRegistrationOptions",
|
|
54
|
-
method: "get",
|
|
55
|
-
path: "/passkey/generate-register-options",
|
|
56
|
-
client: false,
|
|
57
|
-
description: "Generate registration options for a new passkey",
|
|
58
|
-
middleware: [freshSessionMiddleware],
|
|
59
|
-
request: req().qry(z$1.object({
|
|
60
|
-
authenticatorAttachment: z$1.enum(["platform", "cross-platform"]).optional().openapi({ description: `Type of authenticator to use for registration.
|
|
61
|
-
"platform" for device-specific authenticators,
|
|
62
|
-
"cross-platform" for authenticators that can be used across devices.` }),
|
|
63
|
-
name: z$1.string().optional().openapi({ description: `Optional custom name for the passkey.
|
|
64
|
-
This can help identify the passkey when managing multiple credentials.` })
|
|
65
|
-
})).bld(),
|
|
66
|
-
responses: res(z$1.object({
|
|
67
|
-
challenge: z$1.base64url(),
|
|
68
|
-
timeout: z$1.number().optional(),
|
|
69
|
-
rp: z$1.object({
|
|
70
|
-
name: z$1.string(),
|
|
71
|
-
id: z$1.string().optional()
|
|
72
|
-
}),
|
|
73
|
-
user: z$1.object({
|
|
74
|
-
id: z$1.string(),
|
|
75
|
-
name: z$1.string(),
|
|
76
|
-
displayName: z$1.string()
|
|
77
|
-
}),
|
|
78
|
-
pubKeyCredParams: z$1.array(z$1.object({
|
|
79
|
-
type: z$1.string(),
|
|
80
|
-
alg: z$1.number()
|
|
81
|
-
})),
|
|
82
|
-
excludeCredentials: z$1.array(z$1.object({
|
|
83
|
-
id: z$1.string(),
|
|
84
|
-
type: z$1.string(),
|
|
85
|
-
transports: z$1.array(z$1.enum([
|
|
86
|
-
"ble",
|
|
87
|
-
"cable",
|
|
88
|
-
"hybrid",
|
|
89
|
-
"internal",
|
|
90
|
-
"nfc",
|
|
91
|
-
"smart-card",
|
|
92
|
-
"usb"
|
|
93
|
-
])).optional()
|
|
94
|
-
})).optional(),
|
|
95
|
-
authenticatorSelection: z$1.object({
|
|
96
|
-
authenticatorAttachment: z$1.string(),
|
|
97
|
-
requireResidentKey: z$1.boolean(),
|
|
98
|
-
userVerification: z$1.string()
|
|
99
|
-
}).partial().optional(),
|
|
100
|
-
attestation: z$1.string(),
|
|
101
|
-
extensions: z$1.record(z$1.string(), z$1.any())
|
|
102
|
-
}).transform(toSuccess)).err(401).bld()
|
|
103
|
-
}), (authOptions) => async (ctx) => {
|
|
104
|
-
const session = ctx.get("session");
|
|
105
|
-
const { name, authenticatorAttachment } = ctx.req.valid("query");
|
|
106
|
-
const userPasskeys = await ctx.get("context").adapter.findMany({
|
|
107
|
-
model: "passkey",
|
|
108
|
-
where: [{
|
|
109
|
-
field: "userId",
|
|
110
|
-
value: session.user.id
|
|
111
|
-
}]
|
|
112
|
-
});
|
|
113
|
-
const userID = new TextEncoder().encode(generateRandomString(32, "a-z", "0-9"));
|
|
114
|
-
let options$1;
|
|
115
|
-
options$1 = await generateRegistrationOptions({
|
|
116
|
-
rpName: opts.rpName || ctx.get("context").appName,
|
|
117
|
-
rpID: getRpID(opts, authOptions.baseURL),
|
|
118
|
-
userID,
|
|
119
|
-
userName: name ?? session.user.email ?? session.user.id,
|
|
120
|
-
userDisplayName: session.user.email ?? session.user.id,
|
|
121
|
-
attestationType: "none",
|
|
122
|
-
excludeCredentials: userPasskeys.map((passkey$1) => ({
|
|
123
|
-
id: passkey$1.credentialID,
|
|
124
|
-
transports: passkey$1.transports?.split(",")
|
|
125
|
-
})),
|
|
126
|
-
authenticatorSelection: {
|
|
127
|
-
residentKey: "preferred",
|
|
128
|
-
userVerification: "preferred",
|
|
129
|
-
...opts.authenticatorSelection ?? {},
|
|
130
|
-
...authenticatorAttachment && { authenticatorAttachment }
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
const id = generateId(32);
|
|
134
|
-
const webAuthnCookie = ctx.get("context").createAuthCookie(opts.advanced.webAuthnChallengeCookie);
|
|
135
|
-
await (0, cookies_exports.setSignedCookie)(ctx, webAuthnCookie.name, id, ctx.get("context").secret, {
|
|
136
|
-
...webAuthnCookie.attributes,
|
|
137
|
-
maxAge: maxAgeInSeconds
|
|
138
|
-
});
|
|
139
|
-
await ctx.get("context").internalAdapter.createVerificationValue({
|
|
140
|
-
identifier: id,
|
|
141
|
-
value: JSON.stringify({
|
|
142
|
-
expectedChallenge: options$1.challenge,
|
|
143
|
-
userData: { id: session.user.id }
|
|
144
|
-
}),
|
|
145
|
-
expiresAt: expirationTime
|
|
146
|
-
});
|
|
147
|
-
return ctx.render(options$1, 200);
|
|
148
|
-
}),
|
|
149
|
-
generatePasskeyAuthenticationOptions: createEndpoint(createRoute({
|
|
150
|
-
operationId: "generatePasskeyAuthenticationOptions",
|
|
151
|
-
method: "post",
|
|
152
|
-
path: "/passkey/generate-authenticate-options",
|
|
153
|
-
description: "Generate authentication options for a passkey",
|
|
154
|
-
request: req().bdy(z$1.object({ email: emailSchema.openapi({ description: "The email address of the user" }).optional() })).bld(),
|
|
155
|
-
responses: res(z$1.object({
|
|
156
|
-
challenge: z$1.base64url(),
|
|
157
|
-
timeout: z$1.number().optional(),
|
|
158
|
-
rpId: z$1.string().optional(),
|
|
159
|
-
allowCredentials: z$1.array(z$1.object({
|
|
160
|
-
id: z$1.string(),
|
|
161
|
-
type: z$1.string(),
|
|
162
|
-
transports: z$1.array(z$1.enum([
|
|
163
|
-
"ble",
|
|
164
|
-
"cable",
|
|
165
|
-
"hybrid",
|
|
166
|
-
"internal",
|
|
167
|
-
"nfc",
|
|
168
|
-
"smart-card",
|
|
169
|
-
"usb"
|
|
170
|
-
])).optional()
|
|
171
|
-
})).optional(),
|
|
172
|
-
userVerification: z$1.enum([
|
|
173
|
-
"discouraged",
|
|
174
|
-
"preferred",
|
|
175
|
-
"required"
|
|
176
|
-
]).optional(),
|
|
177
|
-
extensions: z$1.record(z$1.string(), z$1.any()).optional()
|
|
178
|
-
}).transform(toSuccess)).bld()
|
|
179
|
-
}), (authOptions) => async (ctx) => {
|
|
180
|
-
const session = await getSessionFromCtx(ctx);
|
|
181
|
-
let userPasskeys = [];
|
|
182
|
-
if (!(session instanceof Response)) userPasskeys = await ctx.get("context").adapter.findMany({
|
|
183
|
-
model: "passkey",
|
|
184
|
-
where: [{
|
|
185
|
-
field: "userId",
|
|
186
|
-
value: session.user.id
|
|
187
|
-
}]
|
|
188
|
-
});
|
|
189
|
-
const options$1 = await generateAuthenticationOptions({
|
|
190
|
-
rpID: getRpID(opts, authOptions.baseURL),
|
|
191
|
-
userVerification: "preferred",
|
|
192
|
-
...userPasskeys.length > 0 && { allowCredentials: userPasskeys.map((passkey$1) => ({
|
|
193
|
-
id: passkey$1.credentialID,
|
|
194
|
-
transports: passkey$1.transports?.split(",")
|
|
195
|
-
})) }
|
|
196
|
-
});
|
|
197
|
-
const data = {
|
|
198
|
-
expectedChallenge: options$1.challenge,
|
|
199
|
-
userData: { id: "user" in session ? session.user.id : "" }
|
|
200
|
-
};
|
|
201
|
-
const id = generateId(32);
|
|
202
|
-
const webAuthnCookie = ctx.get("context").createAuthCookie(opts.advanced.webAuthnChallengeCookie);
|
|
203
|
-
await (0, cookies_exports.setSignedCookie)(ctx, webAuthnCookie.name, id, ctx.get("context").secret, {
|
|
204
|
-
...webAuthnCookie.attributes,
|
|
205
|
-
maxAge: maxAgeInSeconds
|
|
206
|
-
});
|
|
207
|
-
await ctx.get("context").internalAdapter.createVerificationValue({
|
|
208
|
-
identifier: id,
|
|
209
|
-
value: JSON.stringify(data),
|
|
210
|
-
expiresAt: expirationTime
|
|
211
|
-
});
|
|
212
|
-
return ctx.render(options$1, 200);
|
|
213
|
-
}),
|
|
214
|
-
verifyPasskeyRegistration: createEndpoint(createRoute({
|
|
215
|
-
operationId: "verifyPasskeyRegistration",
|
|
216
|
-
method: "post",
|
|
217
|
-
path: "/passkey/verify-registration",
|
|
218
|
-
description: "Verify registration of a new passkey",
|
|
219
|
-
middleware: [freshSessionMiddleware],
|
|
220
|
-
request: req().bdy(z$1.object({
|
|
221
|
-
response: z$1.any(),
|
|
222
|
-
name: z$1.string().openapi({ description: "Name of the passkey" }).optional()
|
|
223
|
-
})).bld(),
|
|
224
|
-
responses: res(passkeySchema.transform(toSuccess)).err(400).err(401).err(500, "Failed to verify registration").bld()
|
|
225
|
-
}), (authOptions) => async (ctx) => {
|
|
226
|
-
const origin = options?.origin ?? ctx.req.header("origin") ?? "";
|
|
227
|
-
if (!origin) return ctx.render({ success: False }, 400);
|
|
228
|
-
const session = ctx.get("session");
|
|
229
|
-
const { response } = ctx.req.valid("json");
|
|
230
|
-
const webAuthnCookie = ctx.get("context").createAuthCookie(opts.advanced.webAuthnChallengeCookie);
|
|
231
|
-
const challengeId = await (0, cookies_exports.getSignedCookie)(ctx, ctx.get("context").secret, webAuthnCookie.name);
|
|
232
|
-
if (!challengeId) return ctx.render({
|
|
233
|
-
success: False,
|
|
234
|
-
message: ERROR_CODES.CHALLENGE_NOT_FOUND
|
|
235
|
-
}, 400);
|
|
236
|
-
const data = await ctx.get("context").internalAdapter.findVerificationValue(challengeId);
|
|
237
|
-
if (!data) return ctx.render({
|
|
238
|
-
success: False,
|
|
239
|
-
message: ERROR_CODES.FAILED_TO_VERIFY_REGISTRATION
|
|
240
|
-
}, 400);
|
|
241
|
-
const { expectedChallenge, userData } = JSON.parse(data.value);
|
|
242
|
-
if (userData.id !== session.user.id) return ctx.render({
|
|
243
|
-
success: False,
|
|
244
|
-
message: ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_REGISTER_THIS_PASSKEY
|
|
245
|
-
}, 401);
|
|
246
|
-
try {
|
|
247
|
-
const { verified, registrationInfo } = await verifyRegistrationResponse({
|
|
248
|
-
response,
|
|
249
|
-
expectedChallenge,
|
|
250
|
-
expectedOrigin: origin,
|
|
251
|
-
expectedRPID: getRpID(opts, authOptions.baseURL),
|
|
252
|
-
requireUserVerification: false
|
|
253
|
-
});
|
|
254
|
-
if (!verified || !registrationInfo) return ctx.render({
|
|
255
|
-
success: False,
|
|
256
|
-
message: ERROR_CODES.FAILED_TO_VERIFY_REGISTRATION
|
|
257
|
-
}, 400);
|
|
258
|
-
const { aaguid, credentialDeviceType, credentialBackedUp, credential } = registrationInfo;
|
|
259
|
-
const pubKey = base64.encode(credential.publicKey);
|
|
260
|
-
const newPasskey = {
|
|
261
|
-
name: ctx.body.name,
|
|
262
|
-
userId: userData.id,
|
|
263
|
-
credentialID: credential.id,
|
|
264
|
-
publicKey: pubKey,
|
|
265
|
-
counter: credential.counter,
|
|
266
|
-
deviceType: credentialDeviceType,
|
|
267
|
-
transports: response.response.transports.join(","),
|
|
268
|
-
backedUp: credentialBackedUp,
|
|
269
|
-
createdAt: /* @__PURE__ */ new Date(),
|
|
270
|
-
aaguid
|
|
271
|
-
};
|
|
272
|
-
const newPasskeyRes = await ctx.get("context").adapter.create({
|
|
273
|
-
model: "passkey",
|
|
274
|
-
data: newPasskey
|
|
275
|
-
});
|
|
276
|
-
return ctx.render(newPasskeyRes, 200);
|
|
277
|
-
} catch (e) {
|
|
278
|
-
logger.error(String(e));
|
|
279
|
-
return ctx.render({
|
|
280
|
-
success: False,
|
|
281
|
-
message: ERROR_CODES.FAILED_TO_VERIFY_REGISTRATION
|
|
282
|
-
}, 500);
|
|
283
|
-
}
|
|
284
|
-
}),
|
|
285
|
-
verifyPasskeyAuthentication: createEndpoint(createRoute({
|
|
286
|
-
operationId: "verifyPasskeyAuthentication",
|
|
287
|
-
method: "post",
|
|
288
|
-
path: "/passkey/verify-authentication",
|
|
289
|
-
description: "Verify authentication of a passkey",
|
|
290
|
-
$Infer: { body: {} },
|
|
291
|
-
request: req().bdy(z$1.object({ response: z$1.record(z$1.string(), z$1.any()) })).bld(),
|
|
292
|
-
responses: res(SCHEMAS[Definitions.SESSION_RESPONSE].default).err(400, "Origin missing, challenge not found, or auth failed").err(401, "Passkey not found or auth failed").err(500, "User not found or unable to create session").bld()
|
|
293
|
-
}), (authOptions) => async (ctx) => {
|
|
294
|
-
const origin = options?.origin ?? ctx.req.header("origin") ?? "";
|
|
295
|
-
if (!origin) return ctx.render({
|
|
296
|
-
success: False,
|
|
297
|
-
message: "Origin missing"
|
|
298
|
-
}, 400);
|
|
299
|
-
const { response } = ctx.req.valid("json");
|
|
300
|
-
const webAuthnCookie = ctx.get("context").createAuthCookie(opts.advanced.webAuthnChallengeCookie);
|
|
301
|
-
const challengeId = await (0, cookies_exports.getSignedCookie)(ctx, ctx.get("context").secret, webAuthnCookie.name);
|
|
302
|
-
if (!challengeId) return ctx.render({
|
|
303
|
-
success: False,
|
|
304
|
-
message: ERROR_CODES.CHALLENGE_NOT_FOUND
|
|
305
|
-
}, 400);
|
|
306
|
-
const data = await ctx.get("context").internalAdapter.findVerificationValue(challengeId);
|
|
307
|
-
if (!data) return ctx.render({
|
|
308
|
-
success: False,
|
|
309
|
-
message: ERROR_CODES.CHALLENGE_NOT_FOUND
|
|
310
|
-
}, 400);
|
|
311
|
-
const { expectedChallenge } = JSON.parse(data.value);
|
|
312
|
-
const passkey$1 = await ctx.get("context").adapter.findOne({
|
|
313
|
-
model: "passkey",
|
|
314
|
-
where: [{
|
|
315
|
-
field: "credentialID",
|
|
316
|
-
value: response["id"]
|
|
317
|
-
}]
|
|
318
|
-
});
|
|
319
|
-
if (!passkey$1) return ctx.render({
|
|
320
|
-
success: False,
|
|
321
|
-
message: ERROR_CODES.PASSKEY_NOT_FOUND
|
|
322
|
-
}, 401);
|
|
323
|
-
try {
|
|
324
|
-
const verification = await verifyAuthenticationResponse({
|
|
325
|
-
response,
|
|
326
|
-
expectedChallenge,
|
|
327
|
-
expectedOrigin: origin,
|
|
328
|
-
expectedRPID: getRpID(opts, authOptions.baseURL),
|
|
329
|
-
credential: {
|
|
330
|
-
id: passkey$1.credentialID,
|
|
331
|
-
publicKey: base64.decode(passkey$1.publicKey),
|
|
332
|
-
counter: passkey$1.counter,
|
|
333
|
-
transports: passkey$1.transports?.split(",")
|
|
334
|
-
},
|
|
335
|
-
requireUserVerification: false
|
|
336
|
-
});
|
|
337
|
-
const { verified } = verification;
|
|
338
|
-
if (!verified) return ctx.render({
|
|
339
|
-
success: False,
|
|
340
|
-
message: ERROR_CODES.AUTHENTICATION_FAILED
|
|
341
|
-
}, 401);
|
|
342
|
-
await ctx.get("context").adapter.update({
|
|
343
|
-
model: "passkey",
|
|
344
|
-
where: [{
|
|
345
|
-
field: "id",
|
|
346
|
-
value: passkey$1.id
|
|
347
|
-
}],
|
|
348
|
-
update: { counter: verification.authenticationInfo.newCounter }
|
|
349
|
-
});
|
|
350
|
-
const s = await ctx.get("context").internalAdapter.createSession(passkey$1.userId);
|
|
351
|
-
if (!s) return ctx.render({
|
|
352
|
-
success: False,
|
|
353
|
-
message: ERROR_CODES.UNABLE_TO_CREATE_SESSION
|
|
354
|
-
}, 500);
|
|
355
|
-
const user = await ctx.get("context").internalAdapter.findUserById(passkey$1.userId);
|
|
356
|
-
if (!user) return ctx.render({
|
|
357
|
-
success: False,
|
|
358
|
-
message: "User not found"
|
|
359
|
-
}, 500);
|
|
360
|
-
await setSessionCookie(ctx, authOptions, {
|
|
361
|
-
session: s,
|
|
362
|
-
user
|
|
363
|
-
});
|
|
364
|
-
return ctx.render(s, 200);
|
|
365
|
-
} catch (e) {
|
|
366
|
-
ctx.get("context").logger.error("Failed to verify authentication", e);
|
|
367
|
-
return ctx.render({
|
|
368
|
-
success: False,
|
|
369
|
-
message: ERROR_CODES.AUTHENTICATION_FAILED
|
|
370
|
-
}, 400);
|
|
371
|
-
}
|
|
372
|
-
}),
|
|
373
|
-
listPasskeys: createEndpoint(createRoute({
|
|
374
|
-
operationId: "listPasskeys",
|
|
375
|
-
method: "get",
|
|
376
|
-
path: "/passkey/list-user-passkeys",
|
|
377
|
-
description: "List all passkeys for the authenticated user",
|
|
378
|
-
middleware: [sessionMiddleware()],
|
|
379
|
-
responses: res(z$1.array(passkeySchema).openapi({ description: "Array of passkey objects associated with the user" }).transform(toSuccess)).err(401).bld()
|
|
380
|
-
}), (_authOptions) => async (ctx) => {
|
|
381
|
-
const session = ctx.get("session");
|
|
382
|
-
const passkeys = await ctx.get("context").adapter.findMany({
|
|
383
|
-
model: "passkey",
|
|
384
|
-
where: [{
|
|
385
|
-
field: "userId",
|
|
386
|
-
value: session.user.id
|
|
387
|
-
}]
|
|
388
|
-
});
|
|
389
|
-
return ctx.render(passkeys, 200);
|
|
390
|
-
}),
|
|
391
|
-
deletePasskey: createEndpoint(createRoute({
|
|
392
|
-
operationId: "deletePasskey",
|
|
393
|
-
method: "post",
|
|
394
|
-
path: "/passkey/delete-passkey",
|
|
395
|
-
description: "Delete a specific passkey",
|
|
396
|
-
middleware: [sessionMiddleware()],
|
|
397
|
-
request: req().bdy(z$1.object({ id: z$1.string().openapi({ description: "The ID of the passkey to delete. Eg: \"some-passkey-id\"" }) })).bld(),
|
|
398
|
-
responses: res(SCHEMAS[Definitions.SUCCESS].default, "Passkey deleted successfully").err(401).bld()
|
|
399
|
-
}), (_authOptions) => async (ctx) => {
|
|
400
|
-
await ctx.get("context").adapter.delete({
|
|
401
|
-
model: "passkey",
|
|
402
|
-
where: [{
|
|
403
|
-
field: "id",
|
|
404
|
-
value: ctx.req.valid("json").id
|
|
405
|
-
}]
|
|
406
|
-
});
|
|
407
|
-
return ctx.render({ success: True }, 200);
|
|
408
|
-
}),
|
|
409
|
-
updatePasskey: createEndpoint(createRoute({
|
|
410
|
-
operationId: "updatePasskey",
|
|
411
|
-
method: "post",
|
|
412
|
-
path: "/passkey/update-passkey",
|
|
413
|
-
description: "Update a specific passkey's name",
|
|
414
|
-
middleware: [sessionMiddleware()],
|
|
415
|
-
request: req().bdy(z$1.object({
|
|
416
|
-
id: z$1.string().openapi({ description: `The ID of the passkey which will be updated. Eg: \"passkey-id\"` }),
|
|
417
|
-
name: z$1.string().openapi({ description: `The new name which the passkey will be updated to. Eg: \"my-new-passkey-name\"` })
|
|
418
|
-
})).bld(),
|
|
419
|
-
responses: res(passkeySchema.transform(toSuccess)).err(401, "Invalid session or not allowed to register").err(404, "Passkey not found").err(500, "Failed to update passkey").bld()
|
|
420
|
-
}), (_authOptions) => async (ctx) => {
|
|
421
|
-
const session = ctx.get("session");
|
|
422
|
-
const { id, name } = ctx.req.valid("json");
|
|
423
|
-
const passkey$1 = await ctx.get("context").adapter.findOne({
|
|
424
|
-
model: "passkey",
|
|
425
|
-
where: [{
|
|
426
|
-
field: "id",
|
|
427
|
-
value: id
|
|
428
|
-
}]
|
|
429
|
-
});
|
|
430
|
-
if (!passkey$1) return ctx.render({
|
|
431
|
-
success: False,
|
|
432
|
-
message: ERROR_CODES.PASSKEY_NOT_FOUND
|
|
433
|
-
}, 404);
|
|
434
|
-
if (passkey$1.userId !== session.user.id) return ctx.render({
|
|
435
|
-
success: False,
|
|
436
|
-
message: ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_REGISTER_THIS_PASSKEY
|
|
437
|
-
}, 401);
|
|
438
|
-
const updatedPasskey = await ctx.get("context").adapter.update({
|
|
439
|
-
model: "passkey",
|
|
440
|
-
where: [{
|
|
441
|
-
field: "id",
|
|
442
|
-
value: id
|
|
443
|
-
}],
|
|
444
|
-
update: { name }
|
|
445
|
-
});
|
|
446
|
-
if (!updatedPasskey) return ctx.render({
|
|
447
|
-
success: False,
|
|
448
|
-
message: ERROR_CODES.FAILED_TO_UPDATE_PASSKEY
|
|
449
|
-
}, 500);
|
|
450
|
-
return ctx.render(updatedPasskey, 200);
|
|
451
|
-
})
|
|
452
|
-
},
|
|
453
|
-
schema: mergeSchema(schema, options?.schema),
|
|
454
|
-
$ERROR_CODES: ERROR_CODES
|
|
455
|
-
};
|
|
456
|
-
};
|
|
457
|
-
const schema = { passkey: { fields: {
|
|
458
|
-
name: {
|
|
459
|
-
type: "string",
|
|
460
|
-
required: false
|
|
461
|
-
},
|
|
462
|
-
publicKey: {
|
|
463
|
-
type: "string",
|
|
464
|
-
required: true
|
|
465
|
-
},
|
|
466
|
-
userId: {
|
|
467
|
-
type: "string",
|
|
468
|
-
references: {
|
|
469
|
-
model: "user",
|
|
470
|
-
field: "id"
|
|
471
|
-
},
|
|
472
|
-
required: true
|
|
473
|
-
},
|
|
474
|
-
credentialID: {
|
|
475
|
-
type: "string",
|
|
476
|
-
required: true
|
|
477
|
-
},
|
|
478
|
-
counter: {
|
|
479
|
-
type: "number",
|
|
480
|
-
required: true
|
|
481
|
-
},
|
|
482
|
-
deviceType: {
|
|
483
|
-
type: "string",
|
|
484
|
-
required: true
|
|
485
|
-
},
|
|
486
|
-
backedUp: {
|
|
487
|
-
type: "boolean",
|
|
488
|
-
required: true
|
|
489
|
-
},
|
|
490
|
-
transports: {
|
|
491
|
-
type: "string",
|
|
492
|
-
required: false
|
|
493
|
-
},
|
|
494
|
-
createdAt: {
|
|
495
|
-
type: "date",
|
|
496
|
-
required: false
|
|
497
|
-
},
|
|
498
|
-
aaguid: {
|
|
499
|
-
type: "string",
|
|
500
|
-
required: false
|
|
501
|
-
}
|
|
502
|
-
} } };
|
|
503
|
-
|
|
504
|
-
//#endregion
|
|
505
|
-
export { passkey as t };
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
//#region src/utils/request.ts
|
|
2
|
-
const isPromise = (value) => value != null && typeof value.then === "function";
|
|
3
|
-
const normaliseHeaders = (source) => {
|
|
4
|
-
if (source == null) return new Headers();
|
|
5
|
-
let result;
|
|
6
|
-
result = typeof source === "function" ? source() : source;
|
|
7
|
-
if (isPromise(result)) return result.then((h) => new Headers(h));
|
|
8
|
-
return new Headers(result);
|
|
9
|
-
};
|
|
10
|
-
const mergeHeaders = (...sources) => {
|
|
11
|
-
const resolved = sources.filter((v) => v !== void 0).map((src) => src == null ? {} : typeof src === "function" ? src() : src);
|
|
12
|
-
if (!resolved.some((r) => isPromise(r))) {
|
|
13
|
-
const out = new Headers();
|
|
14
|
-
resolved.forEach((h) => new Headers(h).forEach((v, k) => out.set(k, v)));
|
|
15
|
-
return out;
|
|
16
|
-
}
|
|
17
|
-
return async () => {
|
|
18
|
-
const out = new Headers();
|
|
19
|
-
for (const r of resolved) new Headers(isPromise(r) ? await r : r).forEach((v, k) => out.set(k, v));
|
|
20
|
-
return out;
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
const buildSearchParams = (query) => {
|
|
24
|
-
const searchParams = new URLSearchParams();
|
|
25
|
-
for (const [k, v] of Object.entries(query)) {
|
|
26
|
-
if (v === void 0) continue;
|
|
27
|
-
if (Array.isArray(v)) for (const v2 of v) searchParams.append(k, v2);
|
|
28
|
-
else searchParams.set(k, v);
|
|
29
|
-
}
|
|
30
|
-
return searchParams;
|
|
31
|
-
};
|
|
32
|
-
const removeIndexString = (urlString) => {
|
|
33
|
-
if (/^https?:\/\/[^\/]+?\/index$/.test(urlString)) return urlString.replace(/\/index$/, "/");
|
|
34
|
-
return urlString.replace(/\/index$/, "");
|
|
35
|
-
};
|
|
36
|
-
const replaceUrlParam = (urlString, params) => {
|
|
37
|
-
for (const [k, v] of Object.entries(params)) {
|
|
38
|
-
const reg = /* @__PURE__ */ new RegExp("/?:" + k + "(?:{[^/]+})?\\??");
|
|
39
|
-
urlString = urlString.replace(reg, (substring) => v ? `${substring[0] === "/" ? "/" : ""}${v}` : "");
|
|
40
|
-
}
|
|
41
|
-
return urlString.replace(/^\/\//, "/");
|
|
42
|
-
};
|
|
43
|
-
const mergePath = (base, path) => {
|
|
44
|
-
if (base == null) return path;
|
|
45
|
-
base = base.replace(/\/+$/, "");
|
|
46
|
-
base = base + "/";
|
|
47
|
-
path = path.replace(/^\/+/, "");
|
|
48
|
-
return base + path;
|
|
49
|
-
};
|
|
50
|
-
const replaceUrlProtocol = (urlString, protocol) => {
|
|
51
|
-
switch (protocol) {
|
|
52
|
-
case "ws": return urlString.replace(/^https?/i, (match) => match.toLowerCase() === "https" ? "wss" : "ws");
|
|
53
|
-
case "http": return urlString.replace(/^wss?/i, (match) => match.toLowerCase() === "wss" ? "https" : "http");
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
//#endregion
|
|
58
|
-
export { removeIndexString as a, normaliseHeaders as i, mergeHeaders as n, replaceUrlParam as o, mergePath as r, replaceUrlProtocol as s, buildSearchParams as t };
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/request.ts
|
|
3
|
-
const isPromise = (value) => value != null && typeof value.then === "function";
|
|
4
|
-
const normaliseHeaders = (source) => {
|
|
5
|
-
if (source == null) return new Headers();
|
|
6
|
-
let result;
|
|
7
|
-
result = typeof source === "function" ? source() : source;
|
|
8
|
-
if (isPromise(result)) return result.then((h) => new Headers(h));
|
|
9
|
-
return new Headers(result);
|
|
10
|
-
};
|
|
11
|
-
const mergeHeaders = (...sources) => {
|
|
12
|
-
const resolved = sources.filter((v) => v !== void 0).map((src) => src == null ? {} : typeof src === "function" ? src() : src);
|
|
13
|
-
if (!resolved.some((r) => isPromise(r))) {
|
|
14
|
-
const out = new Headers();
|
|
15
|
-
resolved.forEach((h) => new Headers(h).forEach((v, k) => out.set(k, v)));
|
|
16
|
-
return out;
|
|
17
|
-
}
|
|
18
|
-
return async () => {
|
|
19
|
-
const out = new Headers();
|
|
20
|
-
for (const r of resolved) new Headers(isPromise(r) ? await r : r).forEach((v, k) => out.set(k, v));
|
|
21
|
-
return out;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
const buildSearchParams = (query) => {
|
|
25
|
-
const searchParams = new URLSearchParams();
|
|
26
|
-
for (const [k, v] of Object.entries(query)) {
|
|
27
|
-
if (v === void 0) continue;
|
|
28
|
-
if (Array.isArray(v)) for (const v2 of v) searchParams.append(k, v2);
|
|
29
|
-
else searchParams.set(k, v);
|
|
30
|
-
}
|
|
31
|
-
return searchParams;
|
|
32
|
-
};
|
|
33
|
-
const removeIndexString = (urlString) => {
|
|
34
|
-
if (/^https?:\/\/[^\/]+?\/index$/.test(urlString)) return urlString.replace(/\/index$/, "/");
|
|
35
|
-
return urlString.replace(/\/index$/, "");
|
|
36
|
-
};
|
|
37
|
-
const replaceUrlParam = (urlString, params) => {
|
|
38
|
-
for (const [k, v] of Object.entries(params)) {
|
|
39
|
-
const reg = /* @__PURE__ */ new RegExp("/?:" + k + "(?:{[^/]+})?\\??");
|
|
40
|
-
urlString = urlString.replace(reg, (substring) => v ? `${substring[0] === "/" ? "/" : ""}${v}` : "");
|
|
41
|
-
}
|
|
42
|
-
return urlString.replace(/^\/\//, "/");
|
|
43
|
-
};
|
|
44
|
-
const mergePath = (base, path) => {
|
|
45
|
-
if (base == null) return path;
|
|
46
|
-
base = base.replace(/\/+$/, "");
|
|
47
|
-
base = base + "/";
|
|
48
|
-
path = path.replace(/^\/+/, "");
|
|
49
|
-
return base + path;
|
|
50
|
-
};
|
|
51
|
-
const replaceUrlProtocol = (urlString, protocol) => {
|
|
52
|
-
switch (protocol) {
|
|
53
|
-
case "ws": return urlString.replace(/^https?/i, (match) => match.toLowerCase() === "https" ? "wss" : "ws");
|
|
54
|
-
case "http": return urlString.replace(/^wss?/i, (match) => match.toLowerCase() === "wss" ? "https" : "http");
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
//#endregion
|
|
59
|
-
Object.defineProperty(exports, 'buildSearchParams', {
|
|
60
|
-
enumerable: true,
|
|
61
|
-
get: function () {
|
|
62
|
-
return buildSearchParams;
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
Object.defineProperty(exports, 'mergeHeaders', {
|
|
66
|
-
enumerable: true,
|
|
67
|
-
get: function () {
|
|
68
|
-
return mergeHeaders;
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
Object.defineProperty(exports, 'mergePath', {
|
|
72
|
-
enumerable: true,
|
|
73
|
-
get: function () {
|
|
74
|
-
return mergePath;
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
Object.defineProperty(exports, 'normaliseHeaders', {
|
|
78
|
-
enumerable: true,
|
|
79
|
-
get: function () {
|
|
80
|
-
return normaliseHeaders;
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
Object.defineProperty(exports, 'removeIndexString', {
|
|
84
|
-
enumerable: true,
|
|
85
|
-
get: function () {
|
|
86
|
-
return removeIndexString;
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
Object.defineProperty(exports, 'replaceUrlParam', {
|
|
90
|
-
enumerable: true,
|
|
91
|
-
get: function () {
|
|
92
|
-
return replaceUrlParam;
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
Object.defineProperty(exports, 'replaceUrlProtocol', {
|
|
96
|
-
enumerable: true,
|
|
97
|
-
get: function () {
|
|
98
|
-
return replaceUrlProtocol;
|
|
99
|
-
}
|
|
100
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { n as __reExport } from "./chunk-BFnQceUY.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/social-providers/index.ts
|
|
4
|
-
var social_providers_exports = {};
|
|
5
|
-
import * as import___faire_auth_core_social_providers from "@faire-auth/core/social-providers";
|
|
6
|
-
__reExport(social_providers_exports, import___faire_auth_core_social_providers);
|
|
7
|
-
|
|
8
|
-
//#endregion
|
|
9
|
-
export { social_providers_exports as t };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-fPmz2rbM.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/social-providers/index.ts
|
|
4
|
-
var social_providers_exports = {};
|
|
5
|
-
require_chunk.__reExport(social_providers_exports, require("@faire-auth/core/social-providers"));
|
|
6
|
-
|
|
7
|
-
//#endregion
|
|
8
|
-
Object.defineProperty(exports, 'social_providers_exports', {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function () {
|
|
11
|
-
return social_providers_exports;
|
|
12
|
-
}
|
|
13
|
-
});
|
package/dist/utils-44aDDP8f.cjs
DELETED
package/dist/utils-D4vZd1-9.mjs
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { ENV as ENV$1, createLogger as createLogger$1, logger as logger$1 } from "@faire-auth/core/env";
|
|
2
|
-
import { generateId, generateRandomString } from "@faire-auth/core/crypto";
|
|
3
|
-
|
|
4
|
-
export { logger$1 as a, generateRandomString as i, createLogger$1 as n, generateId as r, ENV$1 as t };
|