better-auth 0.6.1-beta.9 → 0.6.2-beta.1
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/access.cjs +2 -1
- package/dist/access.cjs.map +1 -0
- package/dist/access.js +2 -1
- package/dist/access.js.map +1 -0
- package/dist/adapters/drizzle.cjs +2 -1
- package/dist/adapters/drizzle.cjs.map +1 -0
- package/dist/adapters/drizzle.js +2 -1
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/kysely.cjs +2 -1
- package/dist/adapters/kysely.cjs.map +1 -0
- package/dist/adapters/kysely.js +2 -1
- package/dist/adapters/kysely.js.map +1 -0
- package/dist/adapters/mongodb.cjs +2 -1
- package/dist/adapters/mongodb.cjs.map +1 -0
- package/dist/adapters/mongodb.js +2 -1
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/prisma.cjs +2 -1
- package/dist/adapters/prisma.cjs.map +1 -0
- package/dist/adapters/prisma.js +2 -1
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/api.cjs +2 -1
- package/dist/api.cjs.map +1 -0
- package/dist/api.js +2 -1
- package/dist/api.js.map +1 -0
- package/dist/chunk-2BBAB6DP.cjs +2 -0
- package/dist/chunk-2BBAB6DP.cjs.map +1 -0
- package/dist/chunk-3AAEZ2OW.js +2 -0
- package/dist/chunk-3AAEZ2OW.js.map +1 -0
- package/dist/chunk-4C666HHU.js +2 -0
- package/dist/chunk-4C666HHU.js.map +1 -0
- package/dist/chunk-4CFYZITA.cjs +2 -0
- package/dist/chunk-4CFYZITA.cjs.map +1 -0
- package/dist/chunk-4CY5SJAH.js +2 -0
- package/dist/chunk-4CY5SJAH.js.map +1 -0
- package/dist/chunk-4INQICGP.cjs +3 -0
- package/dist/chunk-4INQICGP.cjs.map +1 -0
- package/dist/chunk-4LSFAAZW.js +1 -0
- package/dist/chunk-4LSFAAZW.js.map +1 -0
- package/dist/chunk-4X5O2226.js +2 -0
- package/dist/chunk-4X5O2226.js.map +1 -0
- package/dist/chunk-57KKPQYR.js +2 -0
- package/dist/chunk-57KKPQYR.js.map +1 -0
- package/dist/chunk-5CGFZN2L.cjs +2 -0
- package/dist/chunk-5CGFZN2L.cjs.map +1 -0
- package/dist/chunk-5TFMNJQL.cjs +2 -0
- package/dist/chunk-5TFMNJQL.cjs.map +1 -0
- package/dist/chunk-622ZL6N3.cjs +2 -0
- package/dist/chunk-622ZL6N3.cjs.map +1 -0
- package/dist/chunk-6YSOZOBL.cjs +2 -0
- package/dist/chunk-6YSOZOBL.cjs.map +1 -0
- package/dist/chunk-73SJ5X6L.cjs +2 -0
- package/dist/chunk-73SJ5X6L.cjs.map +1 -0
- package/dist/chunk-7OILVMQO.js +2 -0
- package/dist/chunk-7OILVMQO.js.map +1 -0
- package/dist/chunk-AFA2APLD.js +2 -0
- package/dist/chunk-AFA2APLD.js.map +1 -0
- package/dist/chunk-C57CCQKY.js +2 -0
- package/dist/chunk-C57CCQKY.js.map +1 -0
- package/dist/chunk-CKMZLDAT.js +2 -0
- package/dist/chunk-CKMZLDAT.js.map +1 -0
- package/dist/chunk-CO5UG7AX.js +2 -0
- package/dist/chunk-CO5UG7AX.js.map +1 -0
- package/dist/chunk-DMAK6URH.cjs +2 -0
- package/dist/chunk-DMAK6URH.cjs.map +1 -0
- package/dist/chunk-FUVIWAGV.js +2 -0
- package/dist/chunk-FUVIWAGV.js.map +1 -0
- package/dist/chunk-GFCR6QEP.js +2 -0
- package/dist/chunk-GFCR6QEP.js.map +1 -0
- package/dist/chunk-GNYPEE5I.js +2 -0
- package/dist/chunk-GNYPEE5I.js.map +1 -0
- package/dist/chunk-GOLT3J43.js +2 -0
- package/dist/chunk-GOLT3J43.js.map +1 -0
- package/dist/chunk-H27YSXFM.cjs +2 -0
- package/dist/chunk-H27YSXFM.cjs.map +1 -0
- package/dist/chunk-H5ZHLIW4.cjs +2 -0
- package/dist/chunk-H5ZHLIW4.cjs.map +1 -0
- package/dist/{chunk-IOGBXWDX.js → chunk-HBHHT77G.js} +2 -1
- package/dist/{chunk-CLON6BC7.cjs → chunk-HORVA6HL.cjs} +2 -1
- package/dist/chunk-L3RMKKWR.js +3 -0
- package/dist/chunk-L3RMKKWR.js.map +1 -0
- package/dist/chunk-LE7R2XND.js +4 -0
- package/dist/chunk-LE7R2XND.js.map +1 -0
- package/dist/chunk-LF4SJYGR.cjs +2 -0
- package/dist/chunk-LF4SJYGR.cjs.map +1 -0
- package/dist/chunk-M4G6J7DP.cjs +2 -0
- package/dist/chunk-M4G6J7DP.cjs.map +1 -0
- package/dist/chunk-NZ3R5XBV.cjs +2 -0
- package/dist/chunk-NZ3R5XBV.cjs.map +1 -0
- package/dist/chunk-OQSWDMGG.cjs +2 -0
- package/dist/chunk-OQSWDMGG.cjs.map +1 -0
- package/dist/chunk-OXAT7NHE.js +2 -0
- package/dist/chunk-OXAT7NHE.js.map +1 -0
- package/dist/chunk-PQ5IONW7.cjs +2 -0
- package/dist/chunk-PQ5IONW7.cjs.map +1 -0
- package/dist/chunk-RUHFLVS7.cjs +4 -0
- package/dist/chunk-RUHFLVS7.cjs.map +1 -0
- package/dist/chunk-RW5L5YQV.cjs +2 -0
- package/dist/chunk-RW5L5YQV.cjs.map +1 -0
- package/dist/chunk-S56R3UUZ.js +84 -0
- package/dist/chunk-S56R3UUZ.js.map +1 -0
- package/dist/chunk-T3MCWLBP.cjs +2 -0
- package/dist/chunk-T3MCWLBP.cjs.map +1 -0
- package/dist/chunk-TCHOIK53.cjs +1 -0
- package/dist/chunk-TCHOIK53.cjs.map +1 -0
- package/dist/chunk-TKTXK746.cjs +2 -0
- package/dist/chunk-TKTXK746.cjs.map +1 -0
- package/dist/chunk-TUL3AUOB.js +2 -0
- package/dist/chunk-TUL3AUOB.js.map +1 -0
- package/dist/chunk-U5FXGV3G.cjs +2 -0
- package/dist/chunk-U5FXGV3G.cjs.map +1 -0
- package/dist/chunk-UGP43E4I.cjs +84 -0
- package/dist/chunk-UGP43E4I.cjs.map +1 -0
- package/dist/chunk-UMXT2JXJ.js +2 -0
- package/dist/chunk-UMXT2JXJ.js.map +1 -0
- package/dist/chunk-WNGZ4EQP.cjs +2 -0
- package/dist/chunk-WNGZ4EQP.cjs.map +1 -0
- package/dist/chunk-X25G3YQH.cjs +2 -0
- package/dist/chunk-X25G3YQH.cjs.map +1 -0
- package/dist/chunk-XVQ2OCXP.js +2 -0
- package/dist/chunk-XVQ2OCXP.js.map +1 -0
- package/dist/chunk-XYSHU5WH.js +2 -0
- package/dist/chunk-XYSHU5WH.js.map +1 -0
- package/dist/chunk-YVCL4SNR.js +2 -0
- package/dist/chunk-YVCL4SNR.js.map +1 -0
- package/dist/chunk-ZB5XSQW3.js +2 -0
- package/dist/chunk-ZB5XSQW3.js.map +1 -0
- package/dist/chunk-ZXH7J5K5.js +2 -0
- package/dist/chunk-ZXH7J5K5.js.map +1 -0
- package/dist/chunk-ZZ4X6MII.cjs +2 -0
- package/dist/chunk-ZZ4X6MII.cjs.map +1 -0
- package/dist/client/plugins.cjs +2 -1
- package/dist/client/plugins.cjs.map +1 -0
- package/dist/client/plugins.js +2 -1
- package/dist/client/plugins.js.map +1 -0
- package/dist/client.cjs +2 -1
- package/dist/client.cjs.map +1 -0
- package/dist/client.js +2 -1
- package/dist/client.js.map +1 -0
- package/dist/cookies.cjs +2 -1
- package/dist/cookies.cjs.map +1 -0
- package/dist/cookies.js +2 -1
- package/dist/cookies.js.map +1 -0
- package/dist/crypto.cjs +2 -1
- package/dist/crypto.cjs.map +1 -0
- package/dist/crypto.js +2 -1
- package/dist/crypto.js.map +1 -0
- package/dist/db.cjs +2 -1
- package/dist/db.cjs.map +1 -0
- package/dist/db.js +2 -1
- package/dist/db.js.map +1 -0
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -0
- package/dist/next-js.cjs +2 -1
- package/dist/next-js.cjs.map +1 -0
- package/dist/next-js.js +2 -1
- package/dist/next-js.js.map +1 -0
- package/dist/node.cjs +2 -1
- package/dist/node.cjs.map +1 -0
- package/dist/node.js +2 -1
- package/dist/node.js.map +1 -0
- package/dist/oauth2.cjs +2 -1
- package/dist/oauth2.cjs.map +1 -0
- package/dist/oauth2.js +2 -1
- package/dist/oauth2.js.map +1 -0
- package/dist/plugins.cjs +3 -2
- package/dist/plugins.cjs.map +1 -0
- package/dist/plugins.js +2 -1
- package/dist/plugins.js.map +1 -0
- package/dist/react.cjs +2 -1
- package/dist/react.cjs.map +1 -0
- package/dist/react.js +2 -1
- package/dist/react.js.map +1 -0
- package/dist/social.cjs +2 -1
- package/dist/social.cjs.map +1 -0
- package/dist/social.js +2 -1
- package/dist/social.js.map +1 -0
- package/dist/solid-start.cjs +2 -1
- package/dist/solid-start.cjs.map +1 -0
- package/dist/solid-start.js +2 -1
- package/dist/solid-start.js.map +1 -0
- package/dist/solid.cjs +2 -1
- package/dist/solid.cjs.map +1 -0
- package/dist/solid.js +2 -1
- package/dist/solid.js.map +1 -0
- package/dist/svelte-kit.cjs +2 -1
- package/dist/svelte-kit.cjs.map +1 -0
- package/dist/svelte-kit.js +2 -1
- package/dist/svelte-kit.js.map +1 -0
- package/dist/svelte.cjs +2 -1
- package/dist/svelte.cjs.map +1 -0
- package/dist/svelte.js +2 -1
- package/dist/svelte.js.map +1 -0
- package/dist/types.cjs +2 -1
- package/dist/types.cjs.map +1 -0
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -0
- package/dist/vue.cjs +2 -1
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.js +2 -1
- package/dist/vue.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-5TFMNJQL.cjs","../src/client/config.ts","../src/client/fetch-plugins.ts","../src/client/proxy.ts"],"names":["redirectPlugin","context","addCurrentURL","url","csrfPlugin","options","data","error","betterFetch","BetterAuthError","csrfToken","getClientConfig","$fetch","createFetch","getBaseURL","pl","plugin","plugins","pluginsActions","pluginsAtoms","pluginPathMethods","atomListeners","path","getMethod","knownPathMethods","args","method","fetchOptions","query","body","createDynamicPathProxy","routes","client","atoms","createProxy","target","prop","fullPath","current","segment","_","__","routePath","letter"],"mappings":"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","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-5TFMNJQL.cjs","sourcesContent":[null,"import { createFetch } from \"@better-fetch/fetch\";\nimport { getBaseURL } from \"../utils/url\";\nimport { type Atom } from \"nanostores\";\nimport type { AtomListener, ClientOptions } from \"./types\";\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\n\nexport const getClientConfig = <O extends ClientOptions>(options?: O) => {\n\tconst $fetch = createFetch({\n\t\tbaseURL: getBaseURL(options?.fetchOptions?.baseURL || options?.baseURL),\n\t\tmethod: \"GET\",\n\t\t...options?.fetchOptions,\n\t\tplugins: options?.disableDefaultFetchPlugins\n\t\t\t? options.fetchOptions?.plugins\n\t\t\t: [\n\t\t\t\t\t...(!options?.disableCSRFTokenCheck ? [csrfPlugin] : []),\n\t\t\t\t\tredirectPlugin,\n\t\t\t\t\taddCurrentURL,\n\t\t\t\t\t...(options?.fetchOptions?.plugins?.filter(\n\t\t\t\t\t\t(pl) => pl !== undefined,\n\t\t\t\t\t) || []),\n\t\t\t\t\t...(options?.plugins\n\t\t\t\t\t\t?.flatMap((plugin) => plugin.fetchPlugins)\n\t\t\t\t\t\t.filter((pl) => pl !== undefined) || []),\n\t\t\t\t],\n\t});\n\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {} as Record<string, any>;\n\tlet pluginsAtoms = {} as Record<string, Atom<any>>;\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {\n\t\t\"/sign-out\": \"POST\",\n\t\t\"/user/revoke-sessions\": \"POST\",\n\t};\n\tconst atomListeners: AtomListener[] = [\n\t\t{\n\t\t\tsignal: \"_sessionSignal\",\n\t\t\tmatcher(path) {\n\t\t\t\treturn (\n\t\t\t\t\tpath === \"/sign-out\" ||\n\t\t\t\t\tpath === \"/user/update\" ||\n\t\t\t\t\tpath.startsWith(\"/sign-in\") ||\n\t\t\t\t\tpath.startsWith(\"/sign-up\")\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getActions) {\n\t\t\tObject.assign(pluginsActions, plugin.getActions?.($fetch));\n\t\t}\n\t\tif (plugin.getAtoms) {\n\t\t\tObject.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\t}\n\t\tif (plugin.pathMethods) {\n\t\t\tObject.assign(pluginPathMethods, plugin.pathMethods);\n\t\t}\n\t\tif (plugin.atomListeners) {\n\t\t\tatomListeners.push(...plugin.atomListeners);\n\t\t}\n\t}\n\treturn {\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t};\n};\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error\";\n\nexport const redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: {\n\t\tonSuccess(context) {\n\t\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\twindow.location.href = context.data.url;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const addCurrentURL = {\n\tid: \"add-current-url\",\n\tname: \"Add current URL\",\n\thooks: {\n\t\tonRequest(context) {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconst url = new URL(context.url);\n\t\t\t\turl.searchParams.set(\"currentURL\", window.location.href);\n\t\t\t\tcontext.url = url;\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const csrfPlugin = {\n\tid: \"csrf\",\n\tname: \"CSRF Check\",\n\tasync init(url, options) {\n\t\tif (options?.method !== \"GET\") {\n\t\t\toptions = options || {};\n\t\t\tconst { data, error } = await betterFetch<{\n\t\t\t\tcsrfToken: string;\n\t\t\t}>(\"/csrf\", {\n\t\t\t\tbody: undefined,\n\t\t\t\tbaseURL: options.baseURL,\n\t\t\t\tplugins: [],\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tcustomFetchImpl: options.customFetchImpl,\n\t\t\t});\n\t\t\tif (error) {\n\t\t\t\tif (error.status === 404) {\n\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\"CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (error.status === 429) {\n\t\t\t\t\treturn new Response(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tmessage: \"Too many requests. Please try again later.\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 429,\n\t\t\t\t\t\t\tstatusText: \"Too Many Requests\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"Failed to fetch CSRF token: \" + error.message,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst csrfToken = data?.csrfToken;\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: csrfToken,\n\t\t\t};\n\t\t}\n\t\toptions.credentials = \"include\";\n\t\treturn { url, options };\n\t},\n} satisfies BetterFetchPlugin;\n","import type { BetterFetch, BetterFetchOption } from \"@better-fetch/fetch\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { BetterAuthClientPlugin } from \"./types\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs:\n\t\t| { fetchOptions?: BetterFetchOption; query?: Record<string, any> }\n\t\t| undefined,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { fetchOptions, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (fetchOptions?.method) {\n\t\treturn fetchOptions.method;\n\t}\n\tif (body && Object.keys(body).length > 0) {\n\t\treturn \"POST\";\n\t}\n\treturn \"GET\";\n}\n\nexport type AuthProxySignal = {\n\tatom: PreinitializedWritableAtom<boolean>;\n\tmatcher: (path: string) => boolean;\n};\n\nexport function createDynamicPathProxy<T extends Record<string, any>>(\n\troutes: T,\n\tclient: BetterFetch,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\tatoms: Record<string, Atom>,\n\tatomListeners: BetterAuthClientPlugin[\"atomListeners\"],\n): T {\n\tfunction createProxy(path: string[] = []): any {\n\t\treturn new Proxy(function () {}, {\n\t\t\tget(target, prop: string) {\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current: any = routes;\n\t\t\t\tfor (const segment of fullPath) {\n\t\t\t\t\tif (current && typeof current === \"object\" && segment in current) {\n\t\t\t\t\t\tcurrent = current[segment];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrent = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath =\n\t\t\t\t\t\"/\" +\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((segment) =>\n\t\t\t\t\t\t\tsegment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"/\");\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst fetchOptions = (args[1] || {}) as BetterFetchOption;\n\t\t\t\tconst { query, fetchOptions: argFetchOptions, ...body } = arg;\n\t\t\t\tconst options = {\n\t\t\t\t\t...fetchOptions,\n\t\t\t\t\t...argFetchOptions,\n\t\t\t\t};\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody:\n\t\t\t\t\t\tmethod === \"GET\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...(options?.body || {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\tquery: query || options?.query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We trigger listeners\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst matches = atomListeners?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches) return;\n\t\t\t\t\t\tconst signal = atoms[matches.signal as any];\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * To avoid race conditions we set the signal in a setTimeout\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst val = signal.get();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\t\tsignal.set(!val);\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\treturn createProxy() as T;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkM4G6J7DPcjs = require('./chunk-M4G6J7DP.cjs');var w={};_chunkM4G6J7DPcjs.a.call(void 0, w,{AccessControl:()=>c,ParsingError:()=>o,Role:()=>i,adminAc:()=>S,createAccessControl:()=>l,defaultAc:()=>m,defaultRoles:()=>y,defaultStatements:()=>d,memberAc:()=>x,ownerAc:()=>f,permissionFromString:()=>b});var o=class extends Error{constructor(e,n){super(e),this.path=n}},c= exports.b =class{constructor(e){this.s=e;this.statements=e}newRole(e){return new i(e)}},i= exports.c =class s{constructor(e){this.statements=e}authorize(e,n){for(let[t,a]of Object.entries(e)){let r=this.statements[t];if(!r)return{success:!1,error:`You are not allowed to access resource: ${t}`};let p=n==="OR"?a.some(u=>r.includes(u)):a.every(u=>r.includes(u));return p?{success:p}:{success:!1,error:`unauthorized to access resource "${t}"`}}return{success:!1,error:"Not authorized"}}static fromString(e){let n=JSON.parse(e);if(typeof n!="object")throw new o("statements is not an object",".");for(let[t,a]of Object.entries(n)){if(typeof t!="string")throw new o("invalid resource identifier",t);if(!Array.isArray(a))throw new o("actions is not an array",t);for(let r=0;r<a.length;r++)if(typeof a[r]!="string")throw new o("action is not a string",`${t}[${r}]`)}return new s(n)}toString(){return JSON.stringify(this.statements)}};var l=s=>new c(s),d= exports.e ={organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]},m= exports.f =l(d),S= exports.g =m.newRole({organization:["update"],invitation:["create","cancel"],member:["create","update","delete"]}),f= exports.h =m.newRole({organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]}),x= exports.i =m.newRole({organization:[],member:[],invitation:[]}),y= exports.j ={admin:S,owner:f,member:x};var b=s=>i.fromString(_nullishCoalesce(s, () => ("")));exports.a = o; exports.b = c; exports.c = i; exports.d = l; exports.e = d; exports.f = m; exports.g = S; exports.h = f; exports.i = x; exports.j = y; exports.k = b; exports.l = w;
|
|
2
|
+
//# sourceMappingURL=chunk-622ZL6N3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-622ZL6N3.cjs","../src/plugins/organization/access/index.ts","../src/plugins/organization/access/src/access.ts"],"names":["access_exports","__export","AccessControl","ParsingError","Role","adminAc","createAccessControl","defaultAc","defaultRoles","defaultStatements","memberAc","ownerAc","permissionFromString","message","path","s","statements","_Role","request","connector","requestedResource","requestedActions","allowedActions"],"mappings":"AAAA,qOAAwC,ICAxCA,CAAAA,CAAA,CAAA,CAAA,CAAAC,iCAAAA,CAAAD,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,EAAAE,CAAAA,CAAA,YAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,IAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,mBAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,SAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,YAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,iBAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,QAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAA,oBAAA,CAAA,CAAA,CAAA,EAAAC,CAAAA,CAAAA,CAAAA,CCEO,IAAMT,CAAAA,CAAN,MAAA,QAA2B,KAAM,CACvB,WAChB,CAAYU,CAAAA,CAAiBC,CAAAA,CAAc,CAC1C,KAAA,CAAMD,CAAO,CAAA,CACb,IAAA,CAAK,IAAA,CAAOC,CACb,CACD,CAAA,CAIaZ,CAAAA,aAAN,KAAiE,CAEvE,WAAA,CAA6Ba,CAAAA,CAAgB,CAAhB,IAAA,CAAA,CAAA,CAAAA,CAAAA,CAC5B,IAAA,CAAK,UAAA,CAAaA,CACnB,CAHiB,OAIV,CACNC,CAAAA,CACC,CACD,OAAO,IAAIZ,CAAAA,CAA6BY,CAAU,CACnD,CACD,CAAA,CAMaZ,CAAAA,aAAN,MAAMa,CAAqC,CACjC,WAEhB,CAAYD,CAAAA,CAAyB,CACpC,IAAA,CAAK,UAAA,CAAaA,CACnB,CAEO,SAAA,CACNE,CAAAA,CACAC,CAAAA,CACqB,CACrB,GAAA,CAAA,GAAW,CAACC,CAAAA,CAAmBC,CAAgB,CAAA,GAAK,MAAA,CAAO,OAAA,CAC1DH,CACD,CAAA,CAAG,CACF,IAAMI,CAAAA,CAAiB,IAAA,CAAK,UAAA,CAAWF,CAAiB,CAAA,CACxD,EAAA,CAAI,CAACE,CAAAA,CACJ,MAAO,CACN,OAAA,CAAS,CAAA,CAAA,CACT,KAAA,CAAO,CAAA,wCAAA,EAA2CF,CAAiB,CAAA,CAAA","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-622ZL6N3.cjs","sourcesContent":[null,"export * from \"./src/access\";\nexport * from \"./src/types\";\nexport * from \"./statement\";\nexport * from \"./utils\";\n","import type { StatementsPrimitive as Statements, Subset } from \"./types\";\n\nexport class ParsingError extends Error {\n\tpublic readonly path: string;\n\tconstructor(message: string, path: string) {\n\t\tsuper(message);\n\t\tthis.path = path;\n\t}\n}\n\ntype Connector = \"OR\" | \"AND\";\n\nexport class AccessControl<TStatements extends Statements = Statements> {\n\tprivate readonly statements: TStatements;\n\tconstructor(private readonly s: TStatements) {\n\t\tthis.statements = s;\n\t}\n\tpublic newRole<K extends keyof TStatements>(\n\t\tstatements: Subset<K, TStatements>,\n\t) {\n\t\treturn new Role<Subset<K, TStatements>>(statements);\n\t}\n}\n\nexport type AuthortizeResponse =\n\t| { success: false; error: string }\n\t| { success: true; error?: never };\n\nexport class Role<TStatements extends Statements> {\n\tpublic readonly statements: TStatements;\n\n\tconstructor(statements: TStatements) {\n\t\tthis.statements = statements;\n\t}\n\n\tpublic authorize<K extends keyof TStatements>(\n\t\trequest: Subset<K, TStatements>,\n\t\tconnector?: Connector,\n\t): AuthortizeResponse {\n\t\tfor (const [requestedResource, requestedActions] of Object.entries(\n\t\t\trequest,\n\t\t)) {\n\t\t\tconst allowedActions = this.statements[requestedResource];\n\t\t\tif (!allowedActions) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `You are not allowed to access resource: ${requestedResource}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst success =\n\t\t\t\tconnector === \"OR\"\n\t\t\t\t\t? (requestedActions as string[]).some((requestedAction) =>\n\t\t\t\t\t\t\tallowedActions.includes(requestedAction),\n\t\t\t\t\t\t)\n\t\t\t\t\t: (requestedActions as string[]).every((requestedAction) =>\n\t\t\t\t\t\t\tallowedActions.includes(requestedAction),\n\t\t\t\t\t\t);\n\t\t\tif (success) {\n\t\t\t\treturn { success };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `unauthorized to access resource \"${requestedResource}\"`,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: \"Not authorized\",\n\t\t};\n\t}\n\n\tstatic fromString<TStatements extends Statements>(s: string) {\n\t\tconst statements = JSON.parse(s) as TStatements;\n\n\t\tif (typeof statements !== \"object\") {\n\t\t\tthrow new ParsingError(\"statements is not an object\", \".\");\n\t\t}\n\t\tfor (const [resource, actions] of Object.entries(statements)) {\n\t\t\tif (typeof resource !== \"string\") {\n\t\t\t\tthrow new ParsingError(\"invalid resource identifier\", resource);\n\t\t\t}\n\t\t\tif (!Array.isArray(actions)) {\n\t\t\t\tthrow new ParsingError(\"actions is not an array\", resource);\n\t\t\t}\n\t\t\tfor (let i = 0; i < actions.length; i++) {\n\t\t\t\tif (typeof actions[i] !== \"string\") {\n\t\t\t\t\tthrow new ParsingError(\"action is not a string\", `${resource}[${i}]`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Role<TStatements>(statements);\n\t}\n\n\tpublic toString(): string {\n\t\treturn JSON.stringify(this.statements);\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/misc.ts"],"names":["capitalizeFirstLetter","str"],"mappings":"AAAO,kFAASA,CAAAA,CAAsBC,CAAAA,CAAa,CAClD,OAAOA,CAAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,CAAY,CAAA,CAAIA,CAAAA,CAAI,KAAA,CAAM,CAAC,CACjD,CAAA,cAAA","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-6YSOZOBL.cjs","sourcesContent":["export function capitalizeFirstLetter(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkRW5L5YQVcjs = require('./chunk-RW5L5YQV.cjs');var _chunk6YSOZOBLcjs = require('./chunk-6YSOZOBL.cjs');function O(p){let{pluginPathMethods:f,pluginsActions:l,pluginsAtoms:t,$fetch:e,atomListeners:m}=_chunkRW5L5YQVcjs.a.call(void 0, p),n={};for(let[a,g]of Object.entries(t))n[`use${_chunk6YSOZOBLcjs.a.call(void 0, a)}`]=g;let{$session:c,_sessionSignal:u}=_chunkRW5L5YQVcjs.d.call(void 0, e),y={...l,...n,$fetch:e,useSession:c};return _chunkRW5L5YQVcjs.b.call(void 0, y,e,f,{...t,_sessionSignal:u},m)}exports.a = O;
|
|
2
|
+
//# sourceMappingURL=chunk-73SJ5X6L.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-73SJ5X6L.cjs","../src/client/vanilla.ts"],"names":["createAuthClient","options","pluginPathMethods","pluginsActions","pluginsAtoms","$fetch","atomListeners","getClientConfig","resolvedHooks","key","value","capitalizeFirstLetter"],"mappings":"AAAA,iIAAsD,wDAAyC,SCiC/EA,CAAAA,CACfC,CAAAA,CACC,CACD,GAAM,CACL,iBAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CACD,CAAA,CAAIC,iCAAAA,CAAuB,CAAA,CACvBC,CAAAA,CAAqC,CAAC,CAAA,CAC1C,GAAA,CAAA,GAAW,CAACC,CAAAA,CAAKC,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQN,CAAY,CAAA,CACrDI,CAAAA,CAAc,CAAA,GAAA,EAAMG,iCAAAA,CAAyB,CAAC,CAAA,CAAA","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-73SJ5X6L.cjs","sourcesContent":[null,"import { getClientConfig } from \"./config\";\nimport { capitalizeFirstLetter } from \"../utils/misc\";\nimport type {\n\tBetterAuthClientPlugin,\n\tClientOptions,\n\tInferActions,\n\tInferClientAPI,\n\tInferSessionFromClient,\n\tInferUserFromClient,\n\tIsSignal,\n} from \"./types\";\nimport { createDynamicPathProxy } from \"./proxy\";\nimport { getSessionAtom } from \"./session-atom\";\nimport type { UnionToIntersection } from \"../types/helper\";\n\ntype InferResolvedHooks<O extends ClientOptions> = O[\"plugins\"] extends Array<\n\tinfer Plugin\n>\n\t? Plugin extends BetterAuthClientPlugin\n\t\t? Plugin[\"getAtoms\"] extends (fetch: any) => infer Atoms\n\t\t\t? Atoms extends Record<string, any>\n\t\t\t\t? {\n\t\t\t\t\t\t[key in keyof Atoms as IsSignal<key> extends true\n\t\t\t\t\t\t\t? never\n\t\t\t\t\t\t\t: key extends string\n\t\t\t\t\t\t\t\t? `use${Capitalize<key>}`\n\t\t\t\t\t\t\t\t: never]: Atoms[key];\n\t\t\t\t\t}\n\t\t\t\t: {}\n\t\t\t: {}\n\t\t: {}\n\t: {};\n\nexport function createAuthClient<Option extends ClientOptions>(\n\toptions?: Option,\n) {\n\tconst {\n\t\tpluginPathMethods,\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\t$fetch,\n\t\tatomListeners,\n\t} = getClientConfig(options);\n\tlet resolvedHooks: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(pluginsAtoms)) {\n\t\tresolvedHooks[`use${capitalizeFirstLetter(key)}`] = value;\n\t}\n\n\tconst { $session, _sessionSignal } = getSessionAtom<Option>($fetch);\n\tconst routes = {\n\t\t...pluginsActions,\n\t\t...resolvedHooks,\n\t\t$fetch,\n\t\tuseSession: $session,\n\t};\n\tconst proxy = createDynamicPathProxy(\n\t\troutes,\n\t\t$fetch,\n\t\tpluginPathMethods,\n\t\t{\n\t\t\t...pluginsAtoms,\n\t\t\t_sessionSignal,\n\t\t},\n\t\tatomListeners,\n\t);\n\treturn proxy as UnionToIntersection<InferResolvedHooks<Option>> &\n\t\tInferClientAPI<Option> &\n\t\tInferActions<Option> & {\n\t\t\tuseSession: typeof $session;\n\t\t\t$fetch: typeof $fetch;\n\t\t\t$Infer: {\n\t\t\t\tSession: {\n\t\t\t\t\tsession: InferSessionFromClient<Option>;\n\t\t\t\t\tuser: InferUserFromClient<Option>;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as s,b as i,d as r}from"./chunk-YVCL4SNR.js";import{a as o}from"./chunk-C57CCQKY.js";function O(p){let{pluginPathMethods:f,pluginsActions:l,pluginsAtoms:t,$fetch:e,atomListeners:m}=s(p),n={};for(let[a,g]of Object.entries(t))n[`use${o(a)}`]=g;let{$session:c,_sessionSignal:u}=r(e),y={...l,...n,$fetch:e,useSession:c};return i(y,e,f,{...t,_sessionSignal:u},m)}export{O as a};
|
|
2
|
+
//# sourceMappingURL=chunk-7OILVMQO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/vanilla.ts"],"sourcesContent":["import { getClientConfig } from \"./config\";\nimport { capitalizeFirstLetter } from \"../utils/misc\";\nimport type {\n\tBetterAuthClientPlugin,\n\tClientOptions,\n\tInferActions,\n\tInferClientAPI,\n\tInferSessionFromClient,\n\tInferUserFromClient,\n\tIsSignal,\n} from \"./types\";\nimport { createDynamicPathProxy } from \"./proxy\";\nimport { getSessionAtom } from \"./session-atom\";\nimport type { UnionToIntersection } from \"../types/helper\";\n\ntype InferResolvedHooks<O extends ClientOptions> = O[\"plugins\"] extends Array<\n\tinfer Plugin\n>\n\t? Plugin extends BetterAuthClientPlugin\n\t\t? Plugin[\"getAtoms\"] extends (fetch: any) => infer Atoms\n\t\t\t? Atoms extends Record<string, any>\n\t\t\t\t? {\n\t\t\t\t\t\t[key in keyof Atoms as IsSignal<key> extends true\n\t\t\t\t\t\t\t? never\n\t\t\t\t\t\t\t: key extends string\n\t\t\t\t\t\t\t\t? `use${Capitalize<key>}`\n\t\t\t\t\t\t\t\t: never]: Atoms[key];\n\t\t\t\t\t}\n\t\t\t\t: {}\n\t\t\t: {}\n\t\t: {}\n\t: {};\n\nexport function createAuthClient<Option extends ClientOptions>(\n\toptions?: Option,\n) {\n\tconst {\n\t\tpluginPathMethods,\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\t$fetch,\n\t\tatomListeners,\n\t} = getClientConfig(options);\n\tlet resolvedHooks: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(pluginsAtoms)) {\n\t\tresolvedHooks[`use${capitalizeFirstLetter(key)}`] = value;\n\t}\n\n\tconst { $session, _sessionSignal } = getSessionAtom<Option>($fetch);\n\tconst routes = {\n\t\t...pluginsActions,\n\t\t...resolvedHooks,\n\t\t$fetch,\n\t\tuseSession: $session,\n\t};\n\tconst proxy = createDynamicPathProxy(\n\t\troutes,\n\t\t$fetch,\n\t\tpluginPathMethods,\n\t\t{\n\t\t\t...pluginsAtoms,\n\t\t\t_sessionSignal,\n\t\t},\n\t\tatomListeners,\n\t);\n\treturn proxy as UnionToIntersection<InferResolvedHooks<Option>> &\n\t\tInferClientAPI<Option> &\n\t\tInferActions<Option> & {\n\t\t\tuseSession: typeof $session;\n\t\t\t$fetch: typeof $fetch;\n\t\t\t$Infer: {\n\t\t\t\tSession: {\n\t\t\t\t\tsession: InferSessionFromClient<Option>;\n\t\t\t\t\tuser: InferUserFromClient<Option>;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n}\n"],"mappings":"8FAiCO,SAASA,EACfC,EACC,CACD,GAAM,CACL,kBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,OAAAC,EACA,cAAAC,CACD,EAAIC,EAAgBN,CAAO,EACvBO,EAAqC,CAAC,EAC1C,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQN,CAAY,EACrDI,EAAc,MAAMG,EAAsBF,CAAG,CAAC,EAAE,EAAIC,EAGrD,GAAM,CAAE,SAAAE,EAAU,eAAAC,CAAe,EAAIC,EAAuBT,CAAM,EAC5DU,EAAS,CACd,GAAGZ,EACH,GAAGK,EACH,OAAAH,EACA,WAAYO,CACb,EAWA,OAVcI,EACbD,EACAV,EACAH,EACA,CACC,GAAGE,EACH,eAAAS,CACD,EACAP,CACD,CAaD","names":["createAuthClient","options","pluginPathMethods","pluginsActions","pluginsAtoms","$fetch","atomListeners","getClientConfig","resolvedHooks","key","value","capitalizeFirstLetter","$session","_sessionSignal","getSessionAtom","routes","createDynamicPathProxy"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crypto/buffer.ts"],"sourcesContent":["/**\n * Compare two buffers in constant time.\n */\nexport function constantTimeEqual(\n\ta: ArrayBuffer | Uint8Array,\n\tb: ArrayBuffer | Uint8Array,\n): boolean {\n\tconst aBuffer = new Uint8Array(a);\n\tconst bBuffer = new Uint8Array(b);\n\tif (aBuffer.length !== bBuffer.length) {\n\t\treturn false;\n\t}\n\tlet c = 0;\n\tfor (let i = 0; i < aBuffer.length; i++) {\n\t\tc |= aBuffer[i]! ^ bBuffer[i]!; // ^: XOR operator\n\t}\n\treturn c === 0;\n}\n"],"mappings":"AAGO,SAASA,EACfC,EACAC,EACU,CACV,IAAMC,EAAU,IAAI,WAAWF,CAAC,EAC1BG,EAAU,IAAI,WAAWF,CAAC,EAChC,GAAIC,EAAQ,SAAWC,EAAQ,OAC9B,MAAO,GAER,IAAIC,EAAI,EACR,QAASC,EAAI,EAAGA,EAAIH,EAAQ,OAAQG,IACnCD,GAAKF,EAAQG,CAAC,EAAKF,EAAQE,CAAC,EAE7B,OAAOD,IAAM,CACd","names":["constantTimeEqual","a","b","aBuffer","bBuffer","c","i"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/misc.ts"],"sourcesContent":["export function capitalizeFirstLetter(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n"],"mappings":"AAAO,SAASA,EAAsBC,EAAa,CAClD,OAAOA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,CACjD","names":["capitalizeFirstLetter","str"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as n}from"./chunk-YVCL4SNR.js";var m=(e={redirect:!0,twoFactorPage:"/"})=>({id:"two-factor",$InferServerPlugin:{},atomListeners:[{matcher:t=>t.startsWith("/two-factor/"),signal:"_sessionSignal"}],pathMethods:{"/two-factor/disable":"POST","/two-factor/enable":"POST","/two-factor/send-otp":"POST","/two-factor/generate-backup-codes":"POST"},fetchPlugins:[{id:"two-factor",name:"two-factor",hooks:{async onSuccess(t){t.data?.twoFactorRedirect&&(e.redirect||e.twoFactorPage)&&typeof window<"u"&&(window.location.href=e.twoFactorPage)}}}]});import{WebAuthnError as p,startAuthentication as y,startRegistration as u}from"@simplewebauthn/browser";import{atom as l}from"nanostores";var f=(e,{_listPasskeys:t})=>({signIn:{passkey:async(r,i)=>{let a=await e("/passkey/generate-authenticate-options",{method:"POST",body:{email:r?.email}});if(!a.data)return a;try{let s=await y(a.data,r?.autoFill||!1),o=await e("/passkey/verify-authentication",{body:{response:s},...r?.fetchOptions,...i,method:"POST"});if(!o.data)return o}catch(s){console.log(s)}}},passkey:{addPasskey:async(r,i)=>{let a=await e("/passkey/generate-register-options",{method:"GET"});if(!a.data)return a;try{let s=await u(a.data),o=await e("/passkey/verify-registration",{...r?.fetchOptions,...i,body:{response:s,name:r?.name},method:"POST"});if(!o.data)return o;t.set(Math.random())}catch(s){return s instanceof p?s.code==="ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED"?{data:null,error:{message:"previously registered",status:400,statusText:"BAD_REQUEST"}}:s.code==="ERROR_CEREMONY_ABORTED"?{data:null,error:{message:"registration cancelled",status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:s.message,status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:s instanceof Error?s.message:"unknown error",status:500,statusText:"INTERNAL_SERVER_ERROR"}}}}},$Infer:{}}),O=()=>{let e=l();return{id:"passkey",$InferServerPlugin:{},getActions:t=>f(t,{_listPasskeys:e}),getAtoms(t){return{listPasskeys:n(e,"/passkey/list-user-passkeys",t,{method:"GET",credentials:"include"}),_listPasskeys:e}},pathMethods:{"/passkey/register":"POST","/passkey/authenticate":"POST"},atomListeners:[{matcher(t){return t==="/passkey/verify-registration"||t==="/passkey/delete-passkey"},signal:"_listPasskeys"}]}};export{m as a,f as b,O as c};
|
|
2
|
+
//# sourceMappingURL=chunk-CKMZLDAT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugins/two-factor/client.ts","../src/plugins/passkey/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"../../client/types\";\nimport type { twoFactor as twoFa } from \"../../plugins/two-factor\";\n\nexport const twoFactorClient = (\n\toptions: {\n\t\ttwoFactorPage: string;\n\t\t/**\n\t\t * Redirect to the two factor page. If twoFactorPage\n\t\t * is not set this will redirect to the root path.\n\t\t * @default true\n\t\t */\n\t\tredirect?: boolean;\n\t} = {\n\t\tredirect: true,\n\t\ttwoFactorPage: \"/\",\n\t},\n) => {\n\treturn {\n\t\tid: \"two-factor\",\n\t\t$InferServerPlugin: {} as ReturnType<typeof twoFa>,\n\t\tatomListeners: [\n\t\t\t{\n\t\t\t\tmatcher: (path) => path.startsWith(\"/two-factor/\"),\n\t\t\t\tsignal: \"_sessionSignal\",\n\t\t\t},\n\t\t],\n\t\tpathMethods: {\n\t\t\t\"/two-factor/disable\": \"POST\",\n\t\t\t\"/two-factor/enable\": \"POST\",\n\t\t\t\"/two-factor/send-otp\": \"POST\",\n\t\t\t\"/two-factor/generate-backup-codes\": \"POST\",\n\t\t},\n\t\tfetchPlugins: [\n\t\t\t{\n\t\t\t\tid: \"two-factor\",\n\t\t\t\tname: \"two-factor\",\n\t\t\t\thooks: {\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tif (context.data?.twoFactorRedirect) {\n\t\t\t\t\t\t\tif (options.redirect || options.twoFactorPage) {\n\t\t\t\t\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\t\t\t\t\twindow.location.href = options.twoFactorPage;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t} satisfies BetterAuthClientPlugin;\n};\n","import type { BetterFetch, BetterFetchOption } from \"@better-fetch/fetch\";\nimport {\n\tWebAuthnError,\n\tstartAuthentication,\n\tstartRegistration,\n} from \"@simplewebauthn/browser\";\nimport type {\n\tPublicKeyCredentialCreationOptionsJSON,\n\tPublicKeyCredentialRequestOptionsJSON,\n} from \"@simplewebauthn/types\";\nimport type { Session } from \"inspector\";\nimport type { User } from \"../../db/schema\";\nimport type { passkey as passkeyPl, Passkey } from \"../../plugins\";\nimport type { BetterAuthClientPlugin } from \"../../client/types\";\nimport { useAuthQuery } from \"../../client\";\nimport { atom } from \"nanostores\";\n\nexport const getPasskeyActions = (\n\t$fetch: BetterFetch,\n\t{\n\t\t_listPasskeys,\n\t}: {\n\t\t_listPasskeys: ReturnType<typeof atom<any>>;\n\t},\n) => {\n\tconst signInPasskey = async (\n\t\topts?: {\n\t\t\tautoFill?: boolean;\n\t\t\temail?: string;\n\t\t\tfetchOptions?: BetterFetchOption;\n\t\t},\n\t\toptions?: BetterFetchOption,\n\t) => {\n\t\tconst response = await $fetch<PublicKeyCredentialRequestOptionsJSON>(\n\t\t\t\"/passkey/generate-authenticate-options\",\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: {\n\t\t\t\t\temail: opts?.email,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tif (!response.data) {\n\t\t\treturn response;\n\t\t}\n\t\ttry {\n\t\t\tconst res = await startAuthentication(\n\t\t\t\tresponse.data,\n\t\t\t\topts?.autoFill || false,\n\t\t\t);\n\t\t\tconst verified = await $fetch<{\n\t\t\t\tsession: Session;\n\t\t\t\tuser: User;\n\t\t\t}>(\"/passkey/verify-authentication\", {\n\t\t\t\tbody: {\n\t\t\t\t\tresponse: res,\n\t\t\t\t},\n\t\t\t\t...opts?.fetchOptions,\n\t\t\t\t...options,\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t\tif (!verified.data) {\n\t\t\t\treturn verified;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t};\n\n\tconst registerPasskey = async (\n\t\topts?: {\n\t\t\tfetchOptions?: BetterFetchOption;\n\t\t\t/**\n\t\t\t * The name of the passkey. This is used to\n\t\t\t * identify the passkey in the UI.\n\t\t\t */\n\t\t\tname?: string;\n\t\t},\n\t\tfetchOpts?: BetterFetchOption,\n\t) => {\n\t\tconst options = await $fetch<PublicKeyCredentialCreationOptionsJSON>(\n\t\t\t\"/passkey/generate-register-options\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\",\n\t\t\t},\n\t\t);\n\t\tif (!options.data) {\n\t\t\treturn options;\n\t\t}\n\t\ttry {\n\t\t\tconst res = await startRegistration(options.data);\n\t\t\tconst verified = await $fetch<{\n\t\t\t\tpasskey: Passkey;\n\t\t\t}>(\"/passkey/verify-registration\", {\n\t\t\t\t...opts?.fetchOptions,\n\t\t\t\t...fetchOpts,\n\t\t\t\tbody: {\n\t\t\t\t\tresponse: res,\n\t\t\t\t\tname: opts?.name,\n\t\t\t\t},\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t\tif (!verified.data) {\n\t\t\t\treturn verified;\n\t\t\t}\n\t\t\t_listPasskeys.set(Math.random());\n\t\t} catch (e) {\n\t\t\tif (e instanceof WebAuthnError) {\n\t\t\t\tif (e.code === \"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: \"previously registered\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (e.code === \"ERROR_CEREMONY_ABORTED\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: \"registration cancelled\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: e.message,\n\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: null,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: e instanceof Error ? e.message : \"unknown error\",\n\t\t\t\t\tstatus: 500,\n\t\t\t\t\tstatusText: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t};\n\n\treturn {\n\t\tsignIn: {\n\t\t\t/**\n\t\t\t * Sign in with a registered passkey\n\t\t\t */\n\t\t\tpasskey: signInPasskey,\n\t\t},\n\t\tpasskey: {\n\t\t\t/**\n\t\t\t * Add a passkey to the user account\n\t\t\t */\n\t\t\taddPasskey: registerPasskey,\n\t\t},\n\t\t/**\n\t\t * Inferred Internal Types\n\t\t */\n\t\t$Infer: {} as {\n\t\t\tPasskey: Passkey;\n\t\t},\n\t};\n};\n\nexport const passkeyClient = () => {\n\tconst _listPasskeys = atom<any>();\n\treturn {\n\t\tid: \"passkey\",\n\t\t$InferServerPlugin: {} as ReturnType<typeof passkeyPl>,\n\t\tgetActions: ($fetch) =>\n\t\t\tgetPasskeyActions($fetch, {\n\t\t\t\t_listPasskeys,\n\t\t\t}),\n\t\tgetAtoms($fetch) {\n\t\t\tconst listPasskeys = useAuthQuery<Passkey[]>(\n\t\t\t\t_listPasskeys,\n\t\t\t\t\"/passkey/list-user-passkeys\",\n\t\t\t\t$fetch,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tlistPasskeys,\n\t\t\t\t_listPasskeys,\n\t\t\t};\n\t\t},\n\t\tpathMethods: {\n\t\t\t\"/passkey/register\": \"POST\",\n\t\t\t\"/passkey/authenticate\": \"POST\",\n\t\t},\n\t\tatomListeners: [\n\t\t\t{\n\t\t\t\tmatcher(path) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tpath === \"/passkey/verify-registration\" ||\n\t\t\t\t\t\tpath === \"/passkey/delete-passkey\"\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tsignal: \"_listPasskeys\",\n\t\t\t},\n\t\t],\n\t} satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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","names":["twoFactorClient","options","path","context","WebAuthnError","startAuthentication","startRegistration","atom","getPasskeyActions","$fetch","_listPasskeys","opts","options","response","res","startAuthentication","verified","e","fetchOpts","startRegistration","WebAuthnError","passkeyClient","useAuthQuery","path"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as i}from"./chunk-AFA2APLD.js";import{xchacha20poly1305 as u}from"@noble/ciphers/chacha";import{bytesToHex as S,hexToBytes as T,utf8ToBytes as k}from"@noble/ciphers/utils";import{managedNonce as g}from"@noble/ciphers/webcrypto";import{sha256 as f}from"oslo/crypto";import p from"uncrypto";import{decodeHex as l,encodeHex as c}from"oslo/encoding";import{scryptAsync as w}from"@noble/hashes/scrypt";import{getRandomValues as h}from"uncrypto";var s={N:16384,r:16,p:1,dkLen:64};async function y(t,e){return await w(t.normalize("NFKC"),e,{N:s.N,p:s.p,r:s.r,dkLen:s.dkLen,maxmem:128*s.N*s.r*2})}var R=async t=>{let e=c(h(new Uint8Array(16))),r=await y(t,e);return`${e}:${c(r)}`},D=async(t,e)=>{let[r,n]=t.split(":"),o=await y(e,r);return i(o,l(n))};import a from"uncrypto";function x(t){return t.toString(2).padStart(8,"0")}function b(t){return[...t].map(e=>x(e)).join("")}function m(t){return parseInt(b(t),2)}function V(){let t=new ArrayBuffer(8),e=a.getRandomValues(new Uint8Array(t));return e[0]=63,e[1]=e[1]|240,new DataView(t).getFloat64(0)-1}function A(t){if(t<0||!Number.isInteger(t))throw new Error("Argument 'max' must be an integer greater than or equal to 0");let e=(t-1).toString(2).length,r=e%8,n=new Uint8Array(Math.ceil(e/8));a.getRandomValues(n),r!==0&&(n[0]&=(1<<r)-1);let o=m(n);for(;o>=t;)a.getRandomValues(n),r!==0&&(n[0]&=(1<<r)-1),o=m(n);return o}function C(t,e){let r="";for(let n=0;n<t;n++)r+=e[A(e.length)];return r}function I(...t){let e=new Set(t),r="";for(let n of e)n==="a-z"?r+="abcdefghijklmnopqrstuvwxyz":n==="A-Z"?r+="ABCDEFGHIJKLMNOPQRSTUVWXYZ":n==="0-9"?r+="0123456789":r+=n;return r}async function F(t,e){let r=new TextEncoder,n={name:"HMAC",hash:"SHA-256"},o=await p.subtle.importKey("raw",r.encode(t),n,!1,["sign","verify"]),d=await p.subtle.sign(n.name,o,r.encode(e));return btoa(String.fromCharCode(...new Uint8Array(d)))}var M=async({key:t,data:e})=>{let r=await f(new TextEncoder().encode(t)),n=k(e),o=g(u)(new Uint8Array(r));return S(o.encrypt(n))},Z=async({key:t,data:e})=>{let r=await f(new TextEncoder().encode(t)),n=T(e),o=g(u)(new Uint8Array(r));return new TextDecoder().decode(o.decrypt(n))};export{R as a,D as b,x as c,b as d,m as e,V as f,A as g,C as h,I as i,F as j,M as k,Z as l};
|
|
2
|
+
//# sourceMappingURL=chunk-CO5UG7AX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crypto/index.ts","../src/crypto/password.ts","../src/crypto/random.ts"],"sourcesContent":["import { xchacha20poly1305 } from \"@noble/ciphers/chacha\";\nimport { bytesToHex, hexToBytes, utf8ToBytes } from \"@noble/ciphers/utils\";\nimport { managedNonce } from \"@noble/ciphers/webcrypto\";\nimport { sha256 } from \"oslo/crypto\";\nimport crypto from \"uncrypto\";\n\nexport async function hs256(secretKey: string, message: string) {\n\tconst enc = new TextEncoder();\n\tconst algorithm = { name: \"HMAC\", hash: \"SHA-256\" };\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tenc.encode(secretKey),\n\t\talgorithm,\n\t\tfalse,\n\t\t[\"sign\", \"verify\"],\n\t);\n\tconst signature = await crypto.subtle.sign(\n\t\talgorithm.name,\n\t\tkey,\n\t\tenc.encode(message),\n\t);\n\treturn btoa(String.fromCharCode(...new Uint8Array(signature)));\n}\n\nexport type SymmetricEncryptOptions = {\n\tkey: string;\n\tdata: string;\n};\n\nexport const symmetricEncrypt = async ({\n\tkey,\n\tdata,\n}: SymmetricEncryptOptions) => {\n\tconst keyAsBytes = await sha256(new TextEncoder().encode(key));\n\tconst dataAsBytes = utf8ToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(new Uint8Array(keyAsBytes));\n\treturn bytesToHex(chacha.encrypt(dataAsBytes));\n};\n\nexport type SymmetricDecryptOptions = {\n\tkey: string;\n\tdata: string;\n};\n\nexport const symmetricDecrypt = async ({\n\tkey,\n\tdata,\n}: SymmetricDecryptOptions) => {\n\tconst keyAsBytes = await sha256(new TextEncoder().encode(key));\n\tconst dataAsBytes = hexToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(new Uint8Array(keyAsBytes));\n\treturn new TextDecoder().decode(chacha.decrypt(dataAsBytes));\n};\n\nexport * from \"./buffer\";\nexport * from \"./password\";\nexport * from \"./random\";\nexport * from \"./buffer\";\n","import { decodeHex, encodeHex } from \"oslo/encoding\";\nimport { constantTimeEqual } from \"./buffer\";\nimport { scryptAsync } from \"@noble/hashes/scrypt\";\nimport { getRandomValues } from \"uncrypto\";\n\nconst config = {\n\tN: 16384,\n\tr: 16,\n\tp: 1,\n\tdkLen: 64,\n};\n\nasync function generateKey(password: string, salt: string) {\n\treturn await scryptAsync(password.normalize(\"NFKC\"), salt, {\n\t\tN: config.N,\n\t\tp: config.p,\n\t\tr: config.r,\n\t\tdkLen: config.dkLen,\n\t\tmaxmem: 128 * config.N * config.r * 2,\n\t});\n}\n\nexport const hashPassword = async (password: string) => {\n\tconst salt = encodeHex(getRandomValues(new Uint8Array(16)));\n\tconst key = await generateKey(password, salt);\n\treturn `${salt}:${encodeHex(key)}`;\n};\n\nexport const verifyPassword = async (hash: string, password: string) => {\n\tconst [salt, key] = hash.split(\":\");\n\tconst targetKey = await generateKey(password, salt!);\n\treturn constantTimeEqual(targetKey, decodeHex(key!));\n};\n","//https://github.com/pilcrowOnPaper/oslo/blob/main/src/crypto/random.ts\nimport crypto from \"uncrypto\";\n\nexport function byteToBinary(byte: number): string {\n\treturn byte.toString(2).padStart(8, \"0\");\n}\n\nexport function bytesToBinary(bytes: Uint8Array): string {\n\treturn [...bytes].map((val) => byteToBinary(val)).join(\"\");\n}\n\nexport function bytesToInteger(bytes: Uint8Array): number {\n\treturn parseInt(bytesToBinary(bytes), 2);\n}\n\nexport function random(): number {\n\tconst buffer = new ArrayBuffer(8);\n\tconst bytes = crypto.getRandomValues(new Uint8Array(buffer));\n\n\t// sets the exponent value (11 bits) to 01111111111 (1023)\n\t// since the bias is 1023 (2 * (11 - 1) - 1), 1023 - 1023 = 0\n\t// 2^0 * (1 + [52 bit number between 0-1]) = number between 1-2\n\tbytes[0] = 63;\n\tbytes[1] = bytes[1]! | 240;\n\n\treturn new DataView(buffer).getFloat64(0) - 1;\n}\n\nexport function generateRandomInteger(max: number): number {\n\tif (max < 0 || !Number.isInteger(max)) {\n\t\tthrow new Error(\n\t\t\t\"Argument 'max' must be an integer greater than or equal to 0\",\n\t\t);\n\t}\n\tconst bitLength = (max - 1).toString(2).length;\n\tconst shift = bitLength % 8;\n\tconst bytes = new Uint8Array(Math.ceil(bitLength / 8));\n\n\tcrypto.getRandomValues(bytes);\n\n\t// This zeroes bits that can be ignored to increase the chance `result` < `max`.\n\t// For example, if `max` can be represented with 10 bits, the leading 6 bits of the random 16 bits (2 bytes) can be ignored.\n\tif (shift !== 0) {\n\t\tbytes[0] &= (1 << shift) - 1;\n\t}\n\tlet result = bytesToInteger(bytes);\n\twhile (result >= max) {\n\t\tcrypto.getRandomValues(bytes);\n\t\tif (shift !== 0) {\n\t\t\tbytes[0] &= (1 << shift) - 1;\n\t\t}\n\t\tresult = bytesToInteger(bytes);\n\t}\n\treturn result;\n}\n\nexport function generateRandomString(length: number, alphabet: string): string {\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tresult += alphabet[generateRandomInteger(alphabet.length)];\n\t}\n\treturn result;\n}\n\ntype AlphabetPattern = \"a-z\" | \"A-Z\" | \"0-9\" | \"-\" | \"_\";\n\nexport function alphabet(...patterns: AlphabetPattern[]): string {\n\tconst patternSet = new Set<AlphabetPattern>(patterns);\n\tlet result = \"\";\n\tfor (const pattern of patternSet) {\n\t\tif (pattern === \"a-z\") {\n\t\t\tresult += \"abcdefghijklmnopqrstuvwxyz\";\n\t\t} else if (pattern === \"A-Z\") {\n\t\t\tresult += \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\t\t} else if (pattern === \"0-9\") {\n\t\t\tresult += \"0123456789\";\n\t\t} else {\n\t\t\tresult += pattern;\n\t\t}\n\t}\n\treturn result;\n}\n"],"mappings":"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","names":["xchacha20poly1305","bytesToHex","hexToBytes","utf8ToBytes","managedNonce","sha256","crypto","decodeHex","encodeHex","scryptAsync","getRandomValues","config","generateKey","password","salt","hashPassword","encodeHex","key","verifyPassword","hash","targetKey","constantTimeEqual","decodeHex","crypto","byteToBinary","byte","bytesToBinary","bytes","val","bytesToInteger","random","buffer","generateRandomInteger","max","bitLength","shift","result","generateRandomString","length","alphabet","i","patterns","patternSet","pattern","hs256","secretKey","message","enc","algorithm","key","crypto","signature","symmetricEncrypt","data","keyAsBytes","sha256","dataAsBytes","utf8ToBytes","chacha","managedNonce","xchacha20poly1305","bytesToHex","symmetricDecrypt","hexToBytes"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/date.ts"],"names":["getDate","span","unit"],"mappings":"AAAO,6EAAMA,CAAAA,CAAU,CAACC,CAAAA,CAAcC,CAAAA,CAAqB,IAAA,CAAA,EACnD,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,CAAKA,CAAAA,GAAS,KAAA,CAAQD,CAAAA,CAAO,GAAA,CAAOA,CAAAA,CAAK,CAAA,CAAA,cAAA","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-DMAK6URH.cjs","sourcesContent":["export const getDate = (span: number, unit: \"sec\" | \"ms\" = \"ms\") => {\n\treturn new Date(Date.now() + (unit === \"sec\" ? span * 1000 : span));\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as P}from"./chunk-ZXH7J5K5.js";import{a as m}from"./chunk-GNYPEE5I.js";import{createFetch as U}from"@better-fetch/fetch";import"nanostores";import{betterFetch as L}from"@better-fetch/fetch";var F={id:"redirect",name:"Redirect",hooks:{onSuccess(e){e.data?.url&&e.data?.redirect&&typeof window<"u"&&(window.location.href=e.data.url)}}},b={id:"add-current-url",name:"Add current URL",hooks:{onRequest(e){if(typeof window<"u"){let r=new URL(e.url);r.searchParams.set("currentURL",window.location.href),e.url=r}return e}}},R={id:"csrf",name:"CSRF Check",async init(e,r){if(r?.method!=="GET"){r=r||{};let{data:i,error:s}=await L("/csrf",{body:void 0,baseURL:r.baseURL,plugins:[],method:"GET",credentials:"include",customFetchImpl:r.customFetchImpl});if(s){if(s.status===404)throw new m("CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).");if(s.status===429)return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests"});throw new m("Failed to fetch CSRF token: "+s.message)}let n=i?.csrfToken;r.body={...r?.body,csrfToken:n}}return r.credentials="include",{url:e,options:r}}};var $=e=>{let r="credentials"in Request.prototype,i=U({baseURL:P(e?.fetchOptions?.baseURL||e?.baseURL),...r?{credentials:"include"}:{},method:"GET",...e?.fetchOptions,plugins:e?.disableDefaultFetchPlugins?e.fetchOptions?.plugins:[...e?.disableCSRFTokenCheck?[]:[R],F,b,...e?.fetchOptions?.plugins?.filter(t=>t!==void 0)||[],...e?.plugins?.flatMap(t=>t.fetchPlugins).filter(t=>t!==void 0)||[]]}),s=e?.plugins||[],n={},u={},c={"/sign-out":"POST","/user/revoke-sessions":"POST"},o=[{signal:"_sessionSignal",matcher(t){return t==="/sign-out"||t==="/user/update"||t.startsWith("/sign-in")||t.startsWith("/sign-up")}}];for(let t of s)t.getActions&&Object.assign(n,t.getActions?.(i)),t.getAtoms&&Object.assign(u,t.getAtoms?.(i)),t.pathMethods&&Object.assign(c,t.pathMethods),t.atomListeners&&o.push(...t.atomListeners);return{pluginsActions:n,pluginsAtoms:u,pluginPathMethods:c,atomListeners:o,$fetch:i}};function E(e,r,i){let s=r[e],{fetchOptions:n,query:u,...c}=i||{};return s||(n?.method?n.method:c&&Object.keys(c).length>0?"POST":"GET")}function Q(e,r,i,s,n){function u(c=[]){return new Proxy(function(){},{get(o,t){let l=[...c,t],a=e;for(let d of l)if(a&&typeof a=="object"&&d in a)a=a[d];else{a=void 0;break}return typeof a=="function"?a:u(l)},apply:async(o,t,l)=>{let a="/"+c.map(g=>g.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`)).join("/"),d=l[0]||{},T=l[1]||{},{query:A,fetchOptions:S,...B}=d,f={...T,...S},y=E(a,i,d);return await r(a,{...f,body:y==="GET"?void 0:{...B,...f?.body||{}},query:A||f?.query,method:y,async onSuccess(g){await f?.onSuccess?.(g);let h=n?.find(C=>C.matcher(a));if(!h)return;let p=s[h.signal];if(!p)return;let w=p.get();setTimeout(()=>{p.set(!w)},10)}})}})}return u()}import"@better-fetch/fetch";import{atom as k,onMount as q}from"nanostores";var O=(e,r,i,s)=>{let n=k({data:null,error:null,isPending:!0,isRefetching:!1}),u=()=>{let o=typeof s=="function"?s({data:n.get().data,error:n.get().error,isPending:n.get().isPending}):s;return i(r,{...o,onSuccess:async t=>{n.set({data:t.data,error:null,isPending:!1,isRefetching:!1}),await o?.onSuccess?.(t)},async onError(t){n.set({error:t.error,data:null,isPending:!1,isRefetching:!1}),await o?.onError?.(t)},async onRequest(t){let l=n.get();n.set({isPending:l.data===null,data:l.data,error:null,isRefetching:!0}),await o?.onRequest?.(t)}})};e=Array.isArray(e)?e:[e];let c=!1;for(let o of e)o.subscribe(()=>{c?u():q(n,()=>(u(),c=!0,()=>{n.off(),o.off()}))});return n};import{atom as W}from"nanostores";function X(e){let r=W(!1);return{$session:O(r,"/get-session",e,{method:"GET"}),_sessionSignal:r,$Infer:{}}}export{$ as a,Q as b,O as c,X as d};
|
|
2
|
+
//# sourceMappingURL=chunk-FUVIWAGV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/config.ts","../src/client/fetch-plugins.ts","../src/client/proxy.ts","../src/client/query.ts","../src/client/session-atom.ts"],"sourcesContent":["import { createFetch } from \"@better-fetch/fetch\";\nimport { getBaseURL } from \"../utils/url\";\nimport { type Atom } from \"nanostores\";\nimport type { AtomListener, ClientOptions } from \"./types\";\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\n\nexport const getClientConfig = <O extends ClientOptions>(options?: O) => {\n\tconst isCredentialsSupported = \"credentials\" in Request.prototype;\n\n\tconst $fetch = createFetch({\n\t\tbaseURL: getBaseURL(options?.fetchOptions?.baseURL || options?.baseURL),\n\t\t...(isCredentialsSupported ? { credentials: \"include\" } : {}),\n\t\tmethod: \"GET\",\n\t\t...options?.fetchOptions,\n\t\tplugins: options?.disableDefaultFetchPlugins\n\t\t\t? options.fetchOptions?.plugins\n\t\t\t: [\n\t\t\t\t\t...(!options?.disableCSRFTokenCheck ? [csrfPlugin] : []),\n\t\t\t\t\tredirectPlugin,\n\t\t\t\t\taddCurrentURL,\n\t\t\t\t\t...(options?.fetchOptions?.plugins?.filter(\n\t\t\t\t\t\t(pl) => pl !== undefined,\n\t\t\t\t\t) || []),\n\t\t\t\t\t...(options?.plugins\n\t\t\t\t\t\t?.flatMap((plugin) => plugin.fetchPlugins)\n\t\t\t\t\t\t.filter((pl) => pl !== undefined) || []),\n\t\t\t\t],\n\t});\n\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {} as Record<string, any>;\n\tlet pluginsAtoms = {} as Record<string, Atom<any>>;\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {\n\t\t\"/sign-out\": \"POST\",\n\t\t\"/user/revoke-sessions\": \"POST\",\n\t};\n\tconst atomListeners: AtomListener[] = [\n\t\t{\n\t\t\tsignal: \"_sessionSignal\",\n\t\t\tmatcher(path) {\n\t\t\t\treturn (\n\t\t\t\t\tpath === \"/sign-out\" ||\n\t\t\t\t\tpath === \"/user/update\" ||\n\t\t\t\t\tpath.startsWith(\"/sign-in\") ||\n\t\t\t\t\tpath.startsWith(\"/sign-up\")\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getActions) {\n\t\t\tObject.assign(pluginsActions, plugin.getActions?.($fetch));\n\t\t}\n\t\tif (plugin.getAtoms) {\n\t\t\tObject.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\t}\n\t\tif (plugin.pathMethods) {\n\t\t\tObject.assign(pluginPathMethods, plugin.pathMethods);\n\t\t}\n\t\tif (plugin.atomListeners) {\n\t\t\tatomListeners.push(...plugin.atomListeners);\n\t\t}\n\t}\n\treturn {\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t};\n};\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error\";\n\nexport const redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: {\n\t\tonSuccess(context) {\n\t\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\twindow.location.href = context.data.url;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const addCurrentURL = {\n\tid: \"add-current-url\",\n\tname: \"Add current URL\",\n\thooks: {\n\t\tonRequest(context) {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconst url = new URL(context.url);\n\t\t\t\turl.searchParams.set(\"currentURL\", window.location.href);\n\t\t\t\tcontext.url = url;\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const csrfPlugin = {\n\tid: \"csrf\",\n\tname: \"CSRF Check\",\n\tasync init(url, options) {\n\t\tif (options?.method !== \"GET\") {\n\t\t\toptions = options || {};\n\t\t\tconst { data, error } = await betterFetch<{\n\t\t\t\tcsrfToken: string;\n\t\t\t}>(\"/csrf\", {\n\t\t\t\tbody: undefined,\n\t\t\t\tbaseURL: options.baseURL,\n\t\t\t\tplugins: [],\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tcustomFetchImpl: options.customFetchImpl,\n\t\t\t});\n\t\t\tif (error) {\n\t\t\t\tif (error.status === 404) {\n\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\"CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (error.status === 429) {\n\t\t\t\t\treturn new Response(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tmessage: \"Too many requests. Please try again later.\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 429,\n\t\t\t\t\t\t\tstatusText: \"Too Many Requests\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"Failed to fetch CSRF token: \" + error.message,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst csrfToken = data?.csrfToken;\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: csrfToken,\n\t\t\t};\n\t\t}\n\t\toptions.credentials = \"include\";\n\t\treturn { url, options };\n\t},\n} satisfies BetterFetchPlugin;\n","import type { BetterFetch, BetterFetchOption } from \"@better-fetch/fetch\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { BetterAuthClientPlugin } from \"./types\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs:\n\t\t| { fetchOptions?: BetterFetchOption; query?: Record<string, any> }\n\t\t| undefined,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { fetchOptions, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (fetchOptions?.method) {\n\t\treturn fetchOptions.method;\n\t}\n\tif (body && Object.keys(body).length > 0) {\n\t\treturn \"POST\";\n\t}\n\treturn \"GET\";\n}\n\nexport type AuthProxySignal = {\n\tatom: PreinitializedWritableAtom<boolean>;\n\tmatcher: (path: string) => boolean;\n};\n\nexport function createDynamicPathProxy<T extends Record<string, any>>(\n\troutes: T,\n\tclient: BetterFetch,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\tatoms: Record<string, Atom>,\n\tatomListeners: BetterAuthClientPlugin[\"atomListeners\"],\n): T {\n\tfunction createProxy(path: string[] = []): any {\n\t\treturn new Proxy(function () {}, {\n\t\t\tget(target, prop: string) {\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current: any = routes;\n\t\t\t\tfor (const segment of fullPath) {\n\t\t\t\t\tif (current && typeof current === \"object\" && segment in current) {\n\t\t\t\t\t\tcurrent = current[segment];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrent = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath =\n\t\t\t\t\t\"/\" +\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((segment) =>\n\t\t\t\t\t\t\tsegment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"/\");\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst fetchOptions = (args[1] || {}) as BetterFetchOption;\n\t\t\t\tconst { query, fetchOptions: argFetchOptions, ...body } = arg;\n\t\t\t\tconst options = {\n\t\t\t\t\t...fetchOptions,\n\t\t\t\t\t...argFetchOptions,\n\t\t\t\t};\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody:\n\t\t\t\t\t\tmethod === \"GET\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...(options?.body || {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\tquery: query || options?.query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We trigger listeners\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst matches = atomListeners?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches) return;\n\t\t\t\t\t\tconst signal = atoms[matches.signal as any];\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * To avoid race conditions we set the signal in a setTimeout\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst val = signal.get();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\t\tsignal.set(!val);\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\treturn createProxy() as T;\n}\n","import {\n\tBetterFetchError,\n\ttype BetterFetch,\n\ttype BetterFetchOption,\n} from \"@better-fetch/fetch\";\nimport { atom, onMount, type PreinitializedWritableAtom } from \"nanostores\";\n\nexport const useAuthQuery = <T>(\n\tinitializedAtom:\n\t\t| PreinitializedWritableAtom<any>\n\t\t| PreinitializedWritableAtom<any>[],\n\tpath: string,\n\t$fetch: BetterFetch,\n\toptions?:\n\t\t| ((value: {\n\t\t\t\tdata: null | T;\n\t\t\t\terror: null | BetterFetchError;\n\t\t\t\tisPending: boolean;\n\t\t }) => BetterFetchOption)\n\t\t| BetterFetchOption,\n) => {\n\tconst value = atom<{\n\t\tdata: null | T;\n\t\terror: null | BetterFetchError;\n\t\tisPending: boolean;\n\t\tisRefetching: boolean;\n\t}>({\n\t\tdata: null,\n\t\terror: null,\n\t\tisPending: true,\n\t\tisRefetching: false,\n\t});\n\n\tconst fn = () => {\n\t\tconst opts =\n\t\t\ttypeof options === \"function\"\n\t\t\t\t? options({\n\t\t\t\t\t\tdata: value.get().data,\n\t\t\t\t\t\terror: value.get().error,\n\t\t\t\t\t\tisPending: value.get().isPending,\n\t\t\t\t\t})\n\t\t\t\t: options;\n\t\treturn $fetch<T>(path, {\n\t\t\t...opts,\n\t\t\tonSuccess: async (context) => {\n\t\t\t\tvalue.set({\n\t\t\t\t\tdata: context.data,\n\t\t\t\t\terror: null,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t});\n\t\t\t\tawait opts?.onSuccess?.(context);\n\t\t\t},\n\t\t\tasync onError(context) {\n\t\t\t\tvalue.set({\n\t\t\t\t\terror: context.error,\n\t\t\t\t\tdata: null,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t});\n\t\t\t\tawait opts?.onError?.(context);\n\t\t\t},\n\t\t\tasync onRequest(context) {\n\t\t\t\tconst currentValue = value.get();\n\t\t\t\tvalue.set({\n\t\t\t\t\tisPending: currentValue.data === null,\n\t\t\t\t\tdata: currentValue.data,\n\t\t\t\t\terror: null,\n\t\t\t\t\tisRefetching: true,\n\t\t\t\t});\n\t\t\t\tawait opts?.onRequest?.(context);\n\t\t\t},\n\t\t});\n\t};\n\n\tinitializedAtom = Array.isArray(initializedAtom)\n\t\t? initializedAtom\n\t\t: [initializedAtom];\n\tlet isMounted = false;\n\tfor (const initAtom of initializedAtom) {\n\t\tinitAtom.subscribe(() => {\n\t\t\tif (isMounted) {\n\t\t\t\tfn();\n\t\t\t} else {\n\t\t\t\tonMount(value, () => {\n\t\t\t\t\tfn();\n\t\t\t\t\tisMounted = true;\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tvalue.off();\n\t\t\t\t\t\tinitAtom.off();\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\treturn value;\n};\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport { atom } from \"nanostores\";\nimport type { Prettify } from \"../types/helper\";\nimport type {\n\tClientOptions,\n\tInferSessionFromClient,\n\tInferUserFromClient,\n} from \"./types\";\nimport { useAuthQuery } from \"./query\";\n\nexport function getSessionAtom<Option extends ClientOptions>(\n\t$fetch: BetterFetch,\n) {\n\ttype UserWithAdditionalFields = InferUserFromClient<Option>;\n\ttype SessionWithAdditionalFields = InferSessionFromClient<Option>;\n\tconst $signal = atom<boolean>(false);\n\tconst session = useAuthQuery<{\n\t\tuser: Prettify<UserWithAdditionalFields>;\n\t\tsession: Prettify<SessionWithAdditionalFields>;\n\t}>($signal, \"/get-session\", $fetch, {\n\t\tmethod: \"GET\",\n\t});\n\treturn {\n\t\t$session: session,\n\t\t_sessionSignal: $signal,\n\t\t$Infer: {} as {\n\t\t\tSession: {\n\t\t\t\tsession: SessionWithAdditionalFields;\n\t\t\t\tuser: UserWithAdditionalFields;\n\t\t\t};\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["createFetch","betterFetch","redirectPlugin","context","addCurrentURL","url","csrfPlugin","options","data","error","betterFetch","BetterAuthError","csrfToken","getClientConfig","options","isCredentialsSupported","$fetch","createFetch","getBaseURL","csrfPlugin","redirectPlugin","addCurrentURL","pl","plugin","plugins","pluginsActions","pluginsAtoms","pluginPathMethods","atomListeners","path","getMethod","path","knownPathMethods","args","method","fetchOptions","query","body","createDynamicPathProxy","routes","client","atoms","atomListeners","createProxy","target","prop","fullPath","current","segment","_","__","routePath","letter","arg","argFetchOptions","options","context","matches","s","signal","val","atom","onMount","useAuthQuery","initializedAtom","path","$fetch","options","value","fn","opts","context","currentValue","isMounted","initAtom","atom","getSessionAtom","$fetch","$signal","atom","useAuthQuery"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Kysely as h,MssqlDialect as q}from"kysely";import{MysqlDialect as w,PostgresDialect as A,SqliteDialect as D}from"kysely";function k(r){if("dialect"in r)return k(r.dialect);if("createDriver"in r){if(r instanceof D)return"sqlite";if(r instanceof w)return"mysql";if(r instanceof A)return"postgres";if(r instanceof q)return"mssql"}return"aggregate"in r?"sqlite":"getConnection"in r?"mysql":"connect"in r?"postgres":null}var T=async r=>{let e=r.database;if("db"in e)return{kysely:e.db,databaseType:e.type};if("dialect"in e)return{kysely:new h({dialect:e.dialect}),databaseType:e.type};let a,n=k(e);return"createDriver"in e&&(a=e),"aggregate"in e&&(a=new D({database:e})),"getConnection"in e&&(a=new w({pool:e})),"connect"in e&&(a=new A({pool:e})),{kysely:a?new h({dialect:a}):null,databaseType:n}};function m(r){if(!r)return{and:null,or:null};let e={and:[],or:[]};return r.forEach(a=>{let{field:n,value:i,operator:l="=",connector:f="AND"}=a,o=t=>l.toLowerCase()==="in"?t(n,"in",Array.isArray(i)?i:[i]):l==="contains"?t(n,"like",`%${i}%`):l==="starts_with"?t(n,"like",`${i}%`):l==="ends_with"?t(n,"like",`%${i}`):t(n,l,i);f==="OR"?e.or.push(o):e.and.push(o)}),{and:e.and.length?e.and:null,or:e.or.length?e.or:null}}function p(r,e,a){for(let n in r){let i=e[n]||Object.values(e).find(l=>l.fieldName===n);r[n]===0&&i.type==="boolean"&&a?.boolean&&(r[n]=!1),r[n]===1&&i?.type==="boolean"&&a?.boolean&&(r[n]=!0),i?.type==="date"&&(r[n]instanceof Date||(r[n]=new Date(r[n])))}return r}function g(r,e){for(let a in r)typeof r[a]=="boolean"&&e?.boolean&&(r[a]=r[a]?1:0),r[a]instanceof Date&&(r[a]=r[a].toISOString());return r}var C=(r,e)=>({id:"kysely",async create(a){let{model:n,data:i,select:l}=a;e?.transform&&(i=g(i,e.transform)),e?.generateId!==void 0&&(i.id=e.generateId?e.generateId():void 0);let f=await r.insertInto(n).values(i).returningAll().executeTakeFirst();if(e?.transform){let o=e.transform.schema[n];f=o?p(i,o,e.transform):f}return l?.length&&(f=f?l.reduce((t,s)=>f?.[s]?{...t,[s]:f[s]}:t,{}):null),f},async findOne(a){let{model:n,where:i,select:l}=a,{and:f,or:o}=m(i),t=r.selectFrom(n).selectAll();f&&(t=t.where(y=>y.and(f.map(d=>d(y))))),o&&(t=t.where(y=>y.or(o.map(d=>d(y)))));let s=await t.executeTakeFirst();if(l?.length&&(s=s?l.reduce((d,u)=>s?.[u]?{...d,[u]:s[u]}:d,{}):null),e?.transform){let y=e.transform.schema[n];return s=s&&y?p(s,y,e.transform):s,s||null}return s||null},async findMany(a){let{model:n,where:i,limit:l,offset:f,sortBy:o}=a,t=r.selectFrom(n),{and:s,or:y}=m(i);s&&(t=t.where(u=>u.and(s.map(c=>c(u))))),y&&(t=t.where(u=>u.or(y.map(c=>c(u))))),t=t.limit(l||100),f&&(t=t.offset(f)),o&&(t=t.orderBy(o.field,o.direction));let d=await t.selectAll().execute();if(e?.transform){let u=e.transform.schema[n];return u?d.map(c=>p(c,u,e.transform)):d}return d},async update(a){let{model:n,where:i,update:l}=a,{and:f,or:o}=m(i);e?.transform&&(l=g(l,e.transform)),l.id&&(l.id=void 0);let t=r.updateTable(n).set(l);f&&(t=t.where(y=>y.and(f.map(d=>d(y))))),o&&(t=t.where(y=>y.or(o.map(d=>d(y)))));let s=await t.returningAll().executeTakeFirst()||null;if(e?.transform){let y=e.transform.schema[n];return y?p(s,y,e.transform):s}return s},async delete(a){let{model:n,where:i}=a,{and:l,or:f}=m(i),o=r.deleteFrom(n);l&&(o=o.where(t=>t.and(l.map(s=>s(t))))),f&&(o=o.where(t=>t.or(f.map(s=>s(t))))),await o.execute()},async deleteMany(a){let{model:n,where:i}=a,{and:l,or:f}=m(i),o=r.deleteFrom(n);l&&(o=o.where(t=>t.and(l.map(s=>s(t))))),f&&(o=o.where(t=>t.or(f.map(s=>s(t))))),await o.execute()}});export{T as a,C as b};
|
|
2
|
+
//# sourceMappingURL=chunk-GFCR6QEP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/kysely-adapter/dialect.ts","../src/adapters/kysely-adapter/index.ts"],"sourcesContent":["import { Kysely, MssqlDialect } from \"kysely\";\nimport {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresDialect,\n\tSqliteDialect,\n} from \"kysely\";\nimport type { BetterAuthOptions } from \"../../types\";\nimport type { KyselyDatabaseType } from \"./types\";\n\nfunction getDatabaseType(\n\tdb: BetterAuthOptions[\"database\"],\n): KyselyDatabaseType | null {\n\tif (\"dialect\" in db) {\n\t\treturn getDatabaseType(db.dialect as Dialect);\n\t}\n\tif (\"createDriver\" in db) {\n\t\tif (db instanceof SqliteDialect) {\n\t\t\treturn \"sqlite\";\n\t\t}\n\t\tif (db instanceof MysqlDialect) {\n\t\t\treturn \"mysql\";\n\t\t}\n\t\tif (db instanceof PostgresDialect) {\n\t\t\treturn \"postgres\";\n\t\t}\n\t\tif (db instanceof MssqlDialect) {\n\t\t\treturn \"mssql\";\n\t\t}\n\t}\n\tif (\"aggregate\" in db) {\n\t\treturn \"sqlite\";\n\t}\n\n\tif (\"getConnection\" in db) {\n\t\treturn \"mysql\";\n\t}\n\tif (\"connect\" in db) {\n\t\treturn \"postgres\";\n\t}\n\n\treturn null;\n}\n\nexport const createKyselyAdapter = async (config: BetterAuthOptions) => {\n\tconst db = config.database;\n\n\tif (\"db\" in db) {\n\t\treturn {\n\t\t\tkysely: db.db,\n\t\t\tdatabaseType: db.type,\n\t\t};\n\t}\n\n\tif (\"dialect\" in db) {\n\t\treturn {\n\t\t\tkysely: new Kysely({ dialect: db.dialect }),\n\t\t\tdatabaseType: db.type,\n\t\t};\n\t}\n\n\tlet dialect: Dialect | undefined = undefined;\n\n\tconst databaseType = getDatabaseType(db);\n\n\tif (\"createDriver\" in db) {\n\t\tdialect = db;\n\t}\n\n\tif (\"aggregate\" in db) {\n\t\tdialect = new SqliteDialect({\n\t\t\tdatabase: db,\n\t\t});\n\t}\n\n\tif (\"getConnection\" in db) {\n\t\tdialect = new MysqlDialect({\n\t\t\tpool: db,\n\t\t});\n\t}\n\n\tif (\"connect\" in db) {\n\t\tdialect = new PostgresDialect({\n\t\t\tpool: db,\n\t\t});\n\t}\n\n\treturn {\n\t\tkysely: dialect ? new Kysely({ dialect }) : null,\n\t\tdatabaseType,\n\t};\n};\n","import type { Kysely } from \"kysely\";\nimport type { FieldAttribute } from \"../../db\";\nimport type { Adapter, Where } from \"../../types\";\n\nfunction convertWhere(w?: Where[]) {\n\tif (!w)\n\t\treturn {\n\t\t\tand: null,\n\t\t\tor: null,\n\t\t};\n\n\tconst conditions = {\n\t\tand: [] as any[],\n\t\tor: [] as any[],\n\t};\n\n\tw.forEach((condition) => {\n\t\tconst { field, value, operator = \"=\", connector = \"AND\" } = condition;\n\t\tconst expr = (eb: any) => {\n\t\t\tif (operator.toLowerCase() === \"in\") {\n\t\t\t\treturn eb(field, \"in\", Array.isArray(value) ? value : [value]);\n\t\t\t}\n\n\t\t\tif (operator === \"contains\") {\n\t\t\t\treturn eb(field, \"like\", `%${value}%`);\n\t\t\t}\n\n\t\t\tif (operator === \"starts_with\") {\n\t\t\t\treturn eb(field, \"like\", `${value}%`);\n\t\t\t}\n\n\t\t\tif (operator === \"ends_with\") {\n\t\t\t\treturn eb(field, \"like\", `%${value}`);\n\t\t\t}\n\n\t\t\treturn eb(field, operator, value);\n\t\t};\n\n\t\tif (connector === \"OR\") {\n\t\t\tconditions.or.push(expr);\n\t\t} else {\n\t\t\tconditions.and.push(expr);\n\t\t}\n\t});\n\n\treturn {\n\t\tand: conditions.and.length ? conditions.and : null,\n\t\tor: conditions.or.length ? conditions.or : null,\n\t};\n}\n\nfunction transformTo(\n\tval: any,\n\tfields: Record<string, FieldAttribute>,\n\ttransform: KyselyAdapterConfig[\"transform\"],\n) {\n\tfor (const key in val) {\n\t\tconst field =\n\t\t\tfields[key] || Object.values(fields).find((f) => f.fieldName === key);\n\t\tif (val[key] === 0 && field.type === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = false;\n\t\t}\n\t\tif (val[key] === 1 && field?.type === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = true;\n\t\t}\n\t\tif (field?.type === \"date\") {\n\t\t\tif (!(val[key] instanceof Date)) {\n\t\t\t\tval[key] = new Date(val[key]);\n\t\t\t}\n\t\t}\n\t}\n\treturn val;\n}\n\nfunction transformFrom(val: any, transform: KyselyAdapterConfig[\"transform\"]) {\n\tfor (const key in val) {\n\t\tif (typeof val[key] === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = val[key] ? 1 : 0;\n\t\t}\n\t\tif (val[key] instanceof Date) {\n\t\t\tval[key] = val[key].toISOString();\n\t\t}\n\t}\n\treturn val;\n}\n\nexport interface KyselyAdapterConfig {\n\t/**\n\t * Transform dates and booleans for sqlite.\n\t */\n\ttransform?: {\n\t\tschema: {\n\t\t\t[table: string]: Record<string, FieldAttribute>;\n\t\t};\n\t\tboolean: boolean;\n\t\tdate: boolean;\n\t};\n\t/**\n\t * Custom generateId function.\n\t *\n\t * If not provided, nanoid will be used.\n\t * If set to false, the database's auto generated id will be used.\n\t *\n\t * @default nanoid\n\t */\n\tgenerateId?: ((size?: number) => string) | false;\n}\n\nexport const kyselyAdapter = (\n\tdb: Kysely<any>,\n\tconfig?: KyselyAdapterConfig,\n): Adapter => {\n\treturn {\n\t\tid: \"kysely\",\n\t\tasync create(data) {\n\t\t\tlet { model, data: val, select } = data;\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\t\t\tif (config?.generateId !== undefined) {\n\t\t\t\tval.id = config.generateId ? config.generateId() : undefined;\n\t\t\t}\n\t\t\tlet res = await db\n\t\t\t\t.insertInto(model)\n\t\t\t\t.values(val as any)\n\t\t\t\t.returningAll()\n\t\t\t\t.executeTakeFirst();\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = schema ? transformTo(val, schema, config.transform) : res;\n\t\t\t}\n\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\treturn res as any;\n\t\t},\n\t\tasync findOne(data) {\n\t\t\tconst { model, where, select } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.selectFrom(model).selectAll();\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tlet res = await query.executeTakeFirst();\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = res && schema ? transformTo(res, schema, config.transform) : res;\n\n\t\t\t\treturn res || null;\n\t\t\t}\n\t\t\treturn (res || null) as any;\n\t\t},\n\t\tasync findMany(data) {\n\t\t\tconst { model, where, limit, offset, sortBy } = data;\n\t\t\tlet query = db.selectFrom(model);\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tquery = query.limit(limit || 100);\n\t\t\tif (offset) {\n\t\t\t\tquery = query.offset(offset);\n\t\t\t}\n\t\t\tif (sortBy) {\n\t\t\t\tquery = query.orderBy(sortBy.field, sortBy.direction);\n\t\t\t}\n\t\t\tconst res = await query.selectAll().execute();\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema\n\t\t\t\t\t? res.map((v) => transformTo(v, schema, config.transform))\n\t\t\t\t\t: res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync update(data) {\n\t\t\tlet { model, where, update: val } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\n\t\t\tif (val.id) {\n\t\t\t\tval.id = undefined;\n\t\t\t}\n\n\t\t\tlet query = db.updateTable(model).set(val);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tconst res = (await query.returningAll().executeTakeFirst()) || null;\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema ? transformTo(res, schema, config.transform) : res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync delete(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.deleteFrom(model);\n\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t\tasync deleteMany(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.deleteFrom(model);\n\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t};\n};\nexport * from \"./dialect\";\nexport * from \"./types\";\n"],"mappings":"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","names":["Kysely","MssqlDialect","MysqlDialect","PostgresDialect","SqliteDialect","getDatabaseType","db","createKyselyAdapter","config","dialect","databaseType","convertWhere","w","conditions","condition","field","value","operator","connector","expr","eb","transformTo","val","fields","transform","key","f","transformFrom","kyselyAdapter","db","config","data","model","select","res","schema","acc","cur","where","and","or","query","limit","offset","sortBy","v"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var t=class extends Error{constructor(s,i){super(s),this.name="BetterAuthError",this.message=s,this.cause=i}},r=class extends t{constructor(s){super(`The package "${s}" is required. Make sure it is installed.`,s)}};export{t as a,r as b};
|
|
2
|
+
//# sourceMappingURL=chunk-GNYPEE5I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error/index.ts"],"sourcesContent":["export class BetterAuthError extends Error {\n\tconstructor(message: string, cause?: string) {\n\t\tsuper(message);\n\t\tthis.name = \"BetterAuthError\";\n\t\tthis.message = message;\n\t\tthis.cause = cause;\n\t}\n}\nexport class MissingDependencyError extends BetterAuthError {\n\tconstructor(pkgName: string) {\n\t\tsuper(\n\t\t\t`The package \"${pkgName}\" is required. Make sure it is installed.`,\n\t\t\tpkgName,\n\t\t);\n\t}\n}\n"],"mappings":"AAAO,IAAMA,EAAN,cAA8B,KAAM,CAC1C,YAAYC,EAAiBC,EAAgB,CAC5C,MAAMD,CAAO,EACb,KAAK,KAAO,kBACZ,KAAK,QAAUA,EACf,KAAK,MAAQC,CACd,CACD,EACaC,EAAN,cAAqCH,CAAgB,CAC3D,YAAYI,EAAiB,CAC5B,MACC,gBAAgBA,CAAO,4CACvBA,CACD,CACD,CACD","names":["BetterAuthError","message","cause","MissingDependencyError","pkgName"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as P}from"./chunk-ZXH7J5K5.js";import{a as p}from"./chunk-GNYPEE5I.js";import{createFetch as U}from"@better-fetch/fetch";import"nanostores";import{betterFetch as L}from"@better-fetch/fetch";var F={id:"redirect",name:"Redirect",hooks:{onSuccess(e){e.data?.url&&e.data?.redirect&&typeof window<"u"&&(window.location.href=e.data.url)}}},b={id:"add-current-url",name:"Add current URL",hooks:{onRequest(e){if(typeof window<"u"){let r=new URL(e.url);r.searchParams.set("currentURL",window.location.href),e.url=r}return e}}},R={id:"csrf",name:"CSRF Check",async init(e,r){if(r?.method!=="GET"){r=r||{};let{data:a,error:s}=await L("/csrf",{body:void 0,baseURL:r.baseURL,plugins:[],method:"GET",credentials:"include",customFetchImpl:r.customFetchImpl});if(s){if(s.status===404)throw new p("CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).");if(s.status===429)return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests"});throw new p("Failed to fetch CSRF token: "+s.message)}let n=a?.csrfToken;r.body={...r?.body,csrfToken:n}}return r.credentials="include",{url:e,options:r}}};var $=e=>{let r=U({baseURL:P(e?.fetchOptions?.baseURL||e?.baseURL),method:"GET",...e?.fetchOptions,plugins:e?.disableDefaultFetchPlugins?e.fetchOptions?.plugins:[...e?.disableCSRFTokenCheck?[]:[R],F,b,...e?.fetchOptions?.plugins?.filter(t=>t!==void 0)||[],...e?.plugins?.flatMap(t=>t.fetchPlugins).filter(t=>t!==void 0)||[]]}),a=e?.plugins||[],s={},n={},u={"/sign-out":"POST","/user/revoke-sessions":"POST"},o=[{signal:"_sessionSignal",matcher(t){return t==="/sign-out"||t==="/user/update"||t.startsWith("/sign-in")||t.startsWith("/sign-up")}}];for(let t of a)t.getActions&&Object.assign(s,t.getActions?.(r)),t.getAtoms&&Object.assign(n,t.getAtoms?.(r)),t.pathMethods&&Object.assign(u,t.pathMethods),t.atomListeners&&o.push(...t.atomListeners);return{pluginsActions:s,pluginsAtoms:n,pluginPathMethods:u,atomListeners:o,$fetch:r}};function E(e,r,a){let s=r[e],{fetchOptions:n,query:u,...o}=a||{};return s||(n?.method?n.method:o&&Object.keys(o).length>0?"POST":"GET")}function Q(e,r,a,s,n){function u(o=[]){return new Proxy(function(){},{get(t,c){let l=[...o,c],i=e;for(let f of l)if(i&&typeof i=="object"&&f in i)i=i[f];else{i=void 0;break}return typeof i=="function"?i:u(l)},apply:async(t,c,l)=>{let i="/"+o.map(g=>g.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`)).join("/"),f=l[0]||{},T=l[1]||{},{query:A,fetchOptions:S,...B}=f,d={...T,...S},y=E(i,a,f);return await r(i,{...d,body:y==="GET"?void 0:{...B,...d?.body||{}},query:A||d?.query,method:y,async onSuccess(g){await d?.onSuccess?.(g);let h=n?.find(C=>C.matcher(i));if(!h)return;let m=s[h.signal];if(!m)return;let w=m.get();setTimeout(()=>{m.set(!w)},10)}})}})}return u()}import"@better-fetch/fetch";import{atom as k,onMount as W}from"nanostores";var O=(e,r,a,s)=>{let n=k({data:null,error:null,isPending:!0,isRefetching:!1}),u=()=>{let t=typeof s=="function"?s({data:n.get().data,error:n.get().error,isPending:n.get().isPending}):s;return a(r,{...t,onSuccess:async c=>{n.set({data:c.data,error:null,isPending:!1,isRefetching:!1}),await t?.onSuccess?.(c)},async onError(c){n.set({error:c.error,data:null,isPending:!1,isRefetching:!1}),await t?.onError?.(c)},async onRequest(c){let l=n.get();n.set({isPending:l.data===null,data:l.data,error:null,isRefetching:!0}),await t?.onRequest?.(c)}})};e=Array.isArray(e)?e:[e];let o=!1;for(let t of e)t.subscribe(()=>{o?u():W(n,()=>(u(),o=!0,()=>{n.off(),t.off()}))});return n};import{atom as q}from"nanostores";function X(e){let r=q(!1);return{$session:O(r,"/get-session",e,{method:"GET"}),_sessionSignal:r,$Infer:{}}}export{$ as a,Q as b,O as c,X as d};
|
|
2
|
+
//# sourceMappingURL=chunk-GOLT3J43.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/config.ts","../src/client/fetch-plugins.ts","../src/client/proxy.ts","../src/client/query.ts","../src/client/session-atom.ts"],"sourcesContent":["import { createFetch } from \"@better-fetch/fetch\";\nimport { getBaseURL } from \"../utils/url\";\nimport { type Atom } from \"nanostores\";\nimport type { AtomListener, ClientOptions } from \"./types\";\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\n\nexport const getClientConfig = <O extends ClientOptions>(options?: O) => {\n\tconst $fetch = createFetch({\n\t\tbaseURL: getBaseURL(options?.fetchOptions?.baseURL || options?.baseURL),\n\t\tmethod: \"GET\",\n\t\t...options?.fetchOptions,\n\t\tplugins: options?.disableDefaultFetchPlugins\n\t\t\t? options.fetchOptions?.plugins\n\t\t\t: [\n\t\t\t\t\t...(!options?.disableCSRFTokenCheck ? [csrfPlugin] : []),\n\t\t\t\t\tredirectPlugin,\n\t\t\t\t\taddCurrentURL,\n\t\t\t\t\t...(options?.fetchOptions?.plugins?.filter(\n\t\t\t\t\t\t(pl) => pl !== undefined,\n\t\t\t\t\t) || []),\n\t\t\t\t\t...(options?.plugins\n\t\t\t\t\t\t?.flatMap((plugin) => plugin.fetchPlugins)\n\t\t\t\t\t\t.filter((pl) => pl !== undefined) || []),\n\t\t\t\t],\n\t});\n\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {} as Record<string, any>;\n\tlet pluginsAtoms = {} as Record<string, Atom<any>>;\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {\n\t\t\"/sign-out\": \"POST\",\n\t\t\"/user/revoke-sessions\": \"POST\",\n\t};\n\tconst atomListeners: AtomListener[] = [\n\t\t{\n\t\t\tsignal: \"_sessionSignal\",\n\t\t\tmatcher(path) {\n\t\t\t\treturn (\n\t\t\t\t\tpath === \"/sign-out\" ||\n\t\t\t\t\tpath === \"/user/update\" ||\n\t\t\t\t\tpath.startsWith(\"/sign-in\") ||\n\t\t\t\t\tpath.startsWith(\"/sign-up\")\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getActions) {\n\t\t\tObject.assign(pluginsActions, plugin.getActions?.($fetch));\n\t\t}\n\t\tif (plugin.getAtoms) {\n\t\t\tObject.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\t}\n\t\tif (plugin.pathMethods) {\n\t\t\tObject.assign(pluginPathMethods, plugin.pathMethods);\n\t\t}\n\t\tif (plugin.atomListeners) {\n\t\t\tatomListeners.push(...plugin.atomListeners);\n\t\t}\n\t}\n\treturn {\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t};\n};\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error\";\n\nexport const redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: {\n\t\tonSuccess(context) {\n\t\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\twindow.location.href = context.data.url;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const addCurrentURL = {\n\tid: \"add-current-url\",\n\tname: \"Add current URL\",\n\thooks: {\n\t\tonRequest(context) {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconst url = new URL(context.url);\n\t\t\t\turl.searchParams.set(\"currentURL\", window.location.href);\n\t\t\t\tcontext.url = url;\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const csrfPlugin = {\n\tid: \"csrf\",\n\tname: \"CSRF Check\",\n\tasync init(url, options) {\n\t\tif (options?.method !== \"GET\") {\n\t\t\toptions = options || {};\n\t\t\tconst { data, error } = await betterFetch<{\n\t\t\t\tcsrfToken: string;\n\t\t\t}>(\"/csrf\", {\n\t\t\t\tbody: undefined,\n\t\t\t\tbaseURL: options.baseURL,\n\t\t\t\tplugins: [],\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tcustomFetchImpl: options.customFetchImpl,\n\t\t\t});\n\t\t\tif (error) {\n\t\t\t\tif (error.status === 404) {\n\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\"CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (error.status === 429) {\n\t\t\t\t\treturn new Response(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tmessage: \"Too many requests. Please try again later.\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 429,\n\t\t\t\t\t\t\tstatusText: \"Too Many Requests\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"Failed to fetch CSRF token: \" + error.message,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst csrfToken = data?.csrfToken;\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: csrfToken,\n\t\t\t};\n\t\t}\n\t\toptions.credentials = \"include\";\n\t\treturn { url, options };\n\t},\n} satisfies BetterFetchPlugin;\n","import type { BetterFetch, BetterFetchOption } from \"@better-fetch/fetch\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { BetterAuthClientPlugin } from \"./types\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs:\n\t\t| { fetchOptions?: BetterFetchOption; query?: Record<string, any> }\n\t\t| undefined,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { fetchOptions, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (fetchOptions?.method) {\n\t\treturn fetchOptions.method;\n\t}\n\tif (body && Object.keys(body).length > 0) {\n\t\treturn \"POST\";\n\t}\n\treturn \"GET\";\n}\n\nexport type AuthProxySignal = {\n\tatom: PreinitializedWritableAtom<boolean>;\n\tmatcher: (path: string) => boolean;\n};\n\nexport function createDynamicPathProxy<T extends Record<string, any>>(\n\troutes: T,\n\tclient: BetterFetch,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\tatoms: Record<string, Atom>,\n\tatomListeners: BetterAuthClientPlugin[\"atomListeners\"],\n): T {\n\tfunction createProxy(path: string[] = []): any {\n\t\treturn new Proxy(function () {}, {\n\t\t\tget(target, prop: string) {\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current: any = routes;\n\t\t\t\tfor (const segment of fullPath) {\n\t\t\t\t\tif (current && typeof current === \"object\" && segment in current) {\n\t\t\t\t\t\tcurrent = current[segment];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrent = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath =\n\t\t\t\t\t\"/\" +\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((segment) =>\n\t\t\t\t\t\t\tsegment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"/\");\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst fetchOptions = (args[1] || {}) as BetterFetchOption;\n\t\t\t\tconst { query, fetchOptions: argFetchOptions, ...body } = arg;\n\t\t\t\tconst options = {\n\t\t\t\t\t...fetchOptions,\n\t\t\t\t\t...argFetchOptions,\n\t\t\t\t};\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody:\n\t\t\t\t\t\tmethod === \"GET\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...(options?.body || {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\tquery: query || options?.query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We trigger listeners\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst matches = atomListeners?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches) return;\n\t\t\t\t\t\tconst signal = atoms[matches.signal as any];\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * To avoid race conditions we set the signal in a setTimeout\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst val = signal.get();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\t\tsignal.set(!val);\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\treturn createProxy() as T;\n}\n","import {\n\tBetterFetchError,\n\ttype BetterFetch,\n\ttype BetterFetchOption,\n} from \"@better-fetch/fetch\";\nimport { atom, onMount, type PreinitializedWritableAtom } from \"nanostores\";\n\nexport const useAuthQuery = <T>(\n\tinitializedAtom:\n\t\t| PreinitializedWritableAtom<any>\n\t\t| PreinitializedWritableAtom<any>[],\n\tpath: string,\n\t$fetch: BetterFetch,\n\toptions?:\n\t\t| ((value: {\n\t\t\t\tdata: null | T;\n\t\t\t\terror: null | BetterFetchError;\n\t\t\t\tisPending: boolean;\n\t\t }) => BetterFetchOption)\n\t\t| BetterFetchOption,\n) => {\n\tconst value = atom<{\n\t\tdata: null | T;\n\t\terror: null | BetterFetchError;\n\t\tisPending: boolean;\n\t\tisRefetching: boolean;\n\t}>({\n\t\tdata: null,\n\t\terror: null,\n\t\tisPending: true,\n\t\tisRefetching: false,\n\t});\n\n\tconst fn = () => {\n\t\tconst opts =\n\t\t\ttypeof options === \"function\"\n\t\t\t\t? options({\n\t\t\t\t\t\tdata: value.get().data,\n\t\t\t\t\t\terror: value.get().error,\n\t\t\t\t\t\tisPending: value.get().isPending,\n\t\t\t\t\t})\n\t\t\t\t: options;\n\t\treturn $fetch<T>(path, {\n\t\t\t...opts,\n\t\t\tonSuccess: async (context) => {\n\t\t\t\tvalue.set({\n\t\t\t\t\tdata: context.data,\n\t\t\t\t\terror: null,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t});\n\t\t\t\tawait opts?.onSuccess?.(context);\n\t\t\t},\n\t\t\tasync onError(context) {\n\t\t\t\tvalue.set({\n\t\t\t\t\terror: context.error,\n\t\t\t\t\tdata: null,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t});\n\t\t\t\tawait opts?.onError?.(context);\n\t\t\t},\n\t\t\tasync onRequest(context) {\n\t\t\t\tconst currentValue = value.get();\n\t\t\t\tvalue.set({\n\t\t\t\t\tisPending: currentValue.data === null,\n\t\t\t\t\tdata: currentValue.data,\n\t\t\t\t\terror: null,\n\t\t\t\t\tisRefetching: true,\n\t\t\t\t});\n\t\t\t\tawait opts?.onRequest?.(context);\n\t\t\t},\n\t\t});\n\t};\n\n\tinitializedAtom = Array.isArray(initializedAtom)\n\t\t? initializedAtom\n\t\t: [initializedAtom];\n\tlet isMounted = false;\n\tfor (const initAtom of initializedAtom) {\n\t\tinitAtom.subscribe(() => {\n\t\t\tif (isMounted) {\n\t\t\t\tfn();\n\t\t\t} else {\n\t\t\t\tonMount(value, () => {\n\t\t\t\t\tfn();\n\t\t\t\t\tisMounted = true;\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tvalue.off();\n\t\t\t\t\t\tinitAtom.off();\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\treturn value;\n};\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport { atom } from \"nanostores\";\nimport type { Prettify } from \"../types/helper\";\nimport type {\n\tClientOptions,\n\tInferSessionFromClient,\n\tInferUserFromClient,\n} from \"./types\";\nimport { useAuthQuery } from \"./query\";\n\nexport function getSessionAtom<Option extends ClientOptions>(\n\t$fetch: BetterFetch,\n) {\n\ttype UserWithAdditionalFields = InferUserFromClient<Option>;\n\ttype SessionWithAdditionalFields = InferSessionFromClient<Option>;\n\tconst $signal = atom<boolean>(false);\n\tconst session = useAuthQuery<{\n\t\tuser: Prettify<UserWithAdditionalFields>;\n\t\tsession: Prettify<SessionWithAdditionalFields>;\n\t}>($signal, \"/get-session\", $fetch, {\n\t\tmethod: \"GET\",\n\t});\n\treturn {\n\t\t$session: session,\n\t\t_sessionSignal: $signal,\n\t\t$Infer: {} as {\n\t\t\tSession: {\n\t\t\t\tsession: SessionWithAdditionalFields;\n\t\t\t\tuser: UserWithAdditionalFields;\n\t\t\t};\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["createFetch","betterFetch","redirectPlugin","context","addCurrentURL","url","csrfPlugin","options","data","error","betterFetch","BetterAuthError","csrfToken","getClientConfig","options","$fetch","createFetch","getBaseURL","csrfPlugin","redirectPlugin","addCurrentURL","pl","plugin","plugins","pluginsActions","pluginsAtoms","pluginPathMethods","atomListeners","path","getMethod","path","knownPathMethods","args","method","fetchOptions","query","body","createDynamicPathProxy","routes","client","atoms","atomListeners","createProxy","target","prop","fullPath","current","segment","_","__","routePath","letter","arg","argFetchOptions","options","context","matches","s","signal","val","atom","onMount","useAuthQuery","initializedAtom","path","$fetch","options","value","fn","opts","context","currentValue","isMounted","initAtom","atom","getSessionAtom","$fetch","$signal","atom","useAuthQuery"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkRW5L5YQVcjs = require('./chunk-RW5L5YQV.cjs');var m=(e={redirect:!0,twoFactorPage:"/"})=>({id:"two-factor",$InferServerPlugin:{},atomListeners:[{matcher:t=>t.startsWith("/two-factor/"),signal:"_sessionSignal"}],pathMethods:{"/two-factor/disable":"POST","/two-factor/enable":"POST","/two-factor/send-otp":"POST","/two-factor/generate-backup-codes":"POST"},fetchPlugins:[{id:"two-factor",name:"two-factor",hooks:{async onSuccess(t){_optionalChain([t, 'access', _ => _.data, 'optionalAccess', _2 => _2.twoFactorRedirect])&&(e.redirect||e.twoFactorPage)&&typeof window<"u"&&(window.location.href=e.twoFactorPage)}}}]});var _browser = require('@simplewebauthn/browser');var _nanostores = require('nanostores');var f=(e,{_listPasskeys:t})=>({signIn:{passkey:async(r,i)=>{let a=await e("/passkey/generate-authenticate-options",{method:"POST",body:{email:_optionalChain([r, 'optionalAccess', _3 => _3.email])}});if(!a.data)return a;try{let s=await _browser.startAuthentication.call(void 0, a.data,_optionalChain([r, 'optionalAccess', _4 => _4.autoFill])||!1),o=await e("/passkey/verify-authentication",{body:{response:s},..._optionalChain([r, 'optionalAccess', _5 => _5.fetchOptions]),...i,method:"POST"});if(!o.data)return o}catch(s){console.log(s)}}},passkey:{addPasskey:async(r,i)=>{let a=await e("/passkey/generate-register-options",{method:"GET"});if(!a.data)return a;try{let s=await _browser.startRegistration.call(void 0, a.data),o=await e("/passkey/verify-registration",{..._optionalChain([r, 'optionalAccess', _6 => _6.fetchOptions]),...i,body:{response:s,name:_optionalChain([r, 'optionalAccess', _7 => _7.name])},method:"POST"});if(!o.data)return o;t.set(Math.random())}catch(s){return s instanceof _browser.WebAuthnError?s.code==="ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED"?{data:null,error:{message:"previously registered",status:400,statusText:"BAD_REQUEST"}}:s.code==="ERROR_CEREMONY_ABORTED"?{data:null,error:{message:"registration cancelled",status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:s.message,status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:s instanceof Error?s.message:"unknown error",status:500,statusText:"INTERNAL_SERVER_ERROR"}}}}},$Infer:{}}),O= exports.c =()=>{let e=_nanostores.atom.call(void 0, );return{id:"passkey",$InferServerPlugin:{},getActions:t=>f(t,{_listPasskeys:e}),getAtoms(t){return{listPasskeys:_chunkRW5L5YQVcjs.c.call(void 0, e,"/passkey/list-user-passkeys",t,{method:"GET",credentials:"include"}),_listPasskeys:e}},pathMethods:{"/passkey/register":"POST","/passkey/authenticate":"POST"},atomListeners:[{matcher(t){return t==="/passkey/verify-registration"||t==="/passkey/delete-passkey"},signal:"_listPasskeys"}]}};exports.a = m; exports.b = f; exports.c = O;
|
|
2
|
+
//# sourceMappingURL=chunk-H27YSXFM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-H27YSXFM.cjs","../src/plugins/two-factor/client.ts","../src/plugins/passkey/client.ts"],"names":["twoFactorClient","options","path","context","getPasskeyActions","$fetch","_listPasskeys","opts","response","res","startAuthentication","verified","e","fetchOpts","startRegistration","WebAuthnError","passkeyClient","atom","useAuthQuery"],"mappings":"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","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-H27YSXFM.cjs","sourcesContent":[null,"import type { BetterAuthClientPlugin } from \"../../client/types\";\nimport type { twoFactor as twoFa } from \"../../plugins/two-factor\";\n\nexport const twoFactorClient = (\n\toptions: {\n\t\ttwoFactorPage: string;\n\t\t/**\n\t\t * Redirect to the two factor page. If twoFactorPage\n\t\t * is not set this will redirect to the root path.\n\t\t * @default true\n\t\t */\n\t\tredirect?: boolean;\n\t} = {\n\t\tredirect: true,\n\t\ttwoFactorPage: \"/\",\n\t},\n) => {\n\treturn {\n\t\tid: \"two-factor\",\n\t\t$InferServerPlugin: {} as ReturnType<typeof twoFa>,\n\t\tatomListeners: [\n\t\t\t{\n\t\t\t\tmatcher: (path) => path.startsWith(\"/two-factor/\"),\n\t\t\t\tsignal: \"_sessionSignal\",\n\t\t\t},\n\t\t],\n\t\tpathMethods: {\n\t\t\t\"/two-factor/disable\": \"POST\",\n\t\t\t\"/two-factor/enable\": \"POST\",\n\t\t\t\"/two-factor/send-otp\": \"POST\",\n\t\t\t\"/two-factor/generate-backup-codes\": \"POST\",\n\t\t},\n\t\tfetchPlugins: [\n\t\t\t{\n\t\t\t\tid: \"two-factor\",\n\t\t\t\tname: \"two-factor\",\n\t\t\t\thooks: {\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tif (context.data?.twoFactorRedirect) {\n\t\t\t\t\t\t\tif (options.redirect || options.twoFactorPage) {\n\t\t\t\t\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\t\t\t\t\twindow.location.href = options.twoFactorPage;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t} satisfies BetterAuthClientPlugin;\n};\n","import type { BetterFetch, BetterFetchOption } from \"@better-fetch/fetch\";\nimport {\n\tWebAuthnError,\n\tstartAuthentication,\n\tstartRegistration,\n} from \"@simplewebauthn/browser\";\nimport type {\n\tPublicKeyCredentialCreationOptionsJSON,\n\tPublicKeyCredentialRequestOptionsJSON,\n} from \"@simplewebauthn/types\";\nimport type { Session } from \"inspector\";\nimport type { User } from \"../../db/schema\";\nimport type { passkey as passkeyPl, Passkey } from \"../../plugins\";\nimport type { BetterAuthClientPlugin } from \"../../client/types\";\nimport { useAuthQuery } from \"../../client\";\nimport { atom } from \"nanostores\";\n\nexport const getPasskeyActions = (\n\t$fetch: BetterFetch,\n\t{\n\t\t_listPasskeys,\n\t}: {\n\t\t_listPasskeys: ReturnType<typeof atom<any>>;\n\t},\n) => {\n\tconst signInPasskey = async (\n\t\topts?: {\n\t\t\tautoFill?: boolean;\n\t\t\temail?: string;\n\t\t\tfetchOptions?: BetterFetchOption;\n\t\t},\n\t\toptions?: BetterFetchOption,\n\t) => {\n\t\tconst response = await $fetch<PublicKeyCredentialRequestOptionsJSON>(\n\t\t\t\"/passkey/generate-authenticate-options\",\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: {\n\t\t\t\t\temail: opts?.email,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tif (!response.data) {\n\t\t\treturn response;\n\t\t}\n\t\ttry {\n\t\t\tconst res = await startAuthentication(\n\t\t\t\tresponse.data,\n\t\t\t\topts?.autoFill || false,\n\t\t\t);\n\t\t\tconst verified = await $fetch<{\n\t\t\t\tsession: Session;\n\t\t\t\tuser: User;\n\t\t\t}>(\"/passkey/verify-authentication\", {\n\t\t\t\tbody: {\n\t\t\t\t\tresponse: res,\n\t\t\t\t},\n\t\t\t\t...opts?.fetchOptions,\n\t\t\t\t...options,\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t\tif (!verified.data) {\n\t\t\t\treturn verified;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t};\n\n\tconst registerPasskey = async (\n\t\topts?: {\n\t\t\tfetchOptions?: BetterFetchOption;\n\t\t\t/**\n\t\t\t * The name of the passkey. This is used to\n\t\t\t * identify the passkey in the UI.\n\t\t\t */\n\t\t\tname?: string;\n\t\t},\n\t\tfetchOpts?: BetterFetchOption,\n\t) => {\n\t\tconst options = await $fetch<PublicKeyCredentialCreationOptionsJSON>(\n\t\t\t\"/passkey/generate-register-options\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\",\n\t\t\t},\n\t\t);\n\t\tif (!options.data) {\n\t\t\treturn options;\n\t\t}\n\t\ttry {\n\t\t\tconst res = await startRegistration(options.data);\n\t\t\tconst verified = await $fetch<{\n\t\t\t\tpasskey: Passkey;\n\t\t\t}>(\"/passkey/verify-registration\", {\n\t\t\t\t...opts?.fetchOptions,\n\t\t\t\t...fetchOpts,\n\t\t\t\tbody: {\n\t\t\t\t\tresponse: res,\n\t\t\t\t\tname: opts?.name,\n\t\t\t\t},\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t\tif (!verified.data) {\n\t\t\t\treturn verified;\n\t\t\t}\n\t\t\t_listPasskeys.set(Math.random());\n\t\t} catch (e) {\n\t\t\tif (e instanceof WebAuthnError) {\n\t\t\t\tif (e.code === \"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: \"previously registered\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (e.code === \"ERROR_CEREMONY_ABORTED\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: \"registration cancelled\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: e.message,\n\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: null,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: e instanceof Error ? e.message : \"unknown error\",\n\t\t\t\t\tstatus: 500,\n\t\t\t\t\tstatusText: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t};\n\n\treturn {\n\t\tsignIn: {\n\t\t\t/**\n\t\t\t * Sign in with a registered passkey\n\t\t\t */\n\t\t\tpasskey: signInPasskey,\n\t\t},\n\t\tpasskey: {\n\t\t\t/**\n\t\t\t * Add a passkey to the user account\n\t\t\t */\n\t\t\taddPasskey: registerPasskey,\n\t\t},\n\t\t/**\n\t\t * Inferred Internal Types\n\t\t */\n\t\t$Infer: {} as {\n\t\t\tPasskey: Passkey;\n\t\t},\n\t};\n};\n\nexport const passkeyClient = () => {\n\tconst _listPasskeys = atom<any>();\n\treturn {\n\t\tid: \"passkey\",\n\t\t$InferServerPlugin: {} as ReturnType<typeof passkeyPl>,\n\t\tgetActions: ($fetch) =>\n\t\t\tgetPasskeyActions($fetch, {\n\t\t\t\t_listPasskeys,\n\t\t\t}),\n\t\tgetAtoms($fetch) {\n\t\t\tconst listPasskeys = useAuthQuery<Passkey[]>(\n\t\t\t\t_listPasskeys,\n\t\t\t\t\"/passkey/list-user-passkeys\",\n\t\t\t\t$fetch,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tlistPasskeys,\n\t\t\t\t_listPasskeys,\n\t\t\t};\n\t\t},\n\t\tpathMethods: {\n\t\t\t\"/passkey/register\": \"POST\",\n\t\t\t\"/passkey/authenticate\": \"POST\",\n\t\t},\n\t\tatomListeners: [\n\t\t\t{\n\t\t\t\tmatcher(path) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tpath === \"/passkey/verify-registration\" ||\n\t\t\t\t\t\tpath === \"/passkey/delete-passkey\"\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tsignal: \"_listPasskeys\",\n\t\t\t},\n\t\t],\n\t} satisfies BetterAuthClientPlugin;\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkWNGZ4EQPcjs = require('./chunk-WNGZ4EQP.cjs');var _stdenv = require('std-env');function U(n){try{return new URL(n).pathname!=="/"}catch (e2){throw new (0, _chunkWNGZ4EQPcjs.a)(`Invalid base URL: ${n}. Please provide a valid base URL.`)}}function i(n,r="/api/auth"){return U(n)?n:(r=r.startsWith("/")?r:`/${r}`,`${n}${r}`)}function _(n,r){if(n)return i(n,r);let t=_stdenv.env.BETTER_AUTH_URL||_stdenv.env.NEXT_PUBLIC_BETTER_AUTH_URL||_stdenv.env.PUBLIC_BETTER_AUTH_URL||_stdenv.env.NUXT_PUBLIC_BETTER_AUTH_URL||_stdenv.env.NUXT_PUBLIC_AUTH_URL||(_stdenv.env.BASE_URL!=="/"?_stdenv.env.BASE_URL:void 0);if(t)return i(t,r);if(typeof window<"u")return i(window.location.origin,r)}function L(n){return new URL(n).origin.replace("http://","").replace("https://","")}exports.a = _; exports.b = L;
|
|
2
|
+
//# sourceMappingURL=chunk-H5ZHLIW4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-H5ZHLIW4.cjs","../src/utils/url.ts"],"names":["checkHasPath","url","BetterAuthError","withPath","path"],"mappings":"AAAA,iIAAwC,iCCApB,SAGXA,CAAAA,CAAaC,CAAAA,CAAsB,CAC3C,GAAI,CAEH,OADkB,IAAI,GAAA,CAAIA,CAAG,CAAA,CACZ,QAAA,GAAa,GAC/B,CAAA,UAAgB,CACf,MAAM,IAAIC,wBAAAA,CACT,CAAA,kBAAA,EAAqBD,CAAG,CAAA,kCAAA,CACzB,CACD,CACD,CAEA,SAASE,CAAAA,CAASF,CAAAA,CAAaG,CAAAA,CAAO,WAAA,CAAa,CAElD,OADgBJ,CAAAA,CAAaC,CAAG,CAAA,CAExBA,CAAAA,CAAAA,CAERG,CAAAA,CAAOA,CAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CAAIA,CAAAA,CAAO,CAAA,CAAA,EAAIA,CAAI,CAAA,CAAA","file":"/Users/beka/Desktop/Development/better-auth/packages/better-auth/dist/chunk-H5ZHLIW4.cjs","sourcesContent":[null,"import { env } from \"std-env\";\nimport { BetterAuthError } from \"../error\";\n\nfunction checkHasPath(url: string): boolean {\n\ttry {\n\t\tconst parsedUrl = new URL(url);\n\t\treturn parsedUrl.pathname !== \"/\";\n\t} catch (error) {\n\t\tthrow new BetterAuthError(\n\t\t\t`Invalid base URL: ${url}. Please provide a valid base URL.`,\n\t\t);\n\t}\n}\n\nfunction withPath(url: string, path = \"/api/auth\") {\n\tconst hasPath = checkHasPath(url);\n\tif (hasPath) {\n\t\treturn url;\n\t}\n\tpath = path.startsWith(\"/\") ? path : `/${path}`;\n\treturn `${url}${path}`;\n}\n\nexport function getBaseURL(url?: string, path?: string) {\n\tif (url) {\n\t\treturn withPath(url, path);\n\t}\n\tconst fromEnv =\n\t\tenv.BETTER_AUTH_URL ||\n\t\tenv.NEXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_AUTH_URL ||\n\t\t(env.BASE_URL !== \"/\" ? env.BASE_URL : undefined);\n\n\tif (fromEnv) {\n\t\treturn withPath(fromEnv, path);\n\t}\n\n\tif (typeof window !== \"undefined\") {\n\t\treturn withPath(window.location.origin, path);\n\t}\n\treturn undefined;\n}\n\nexport function getOrigin(url: string) {\n\tconst parsedUrl = new URL(url);\n\treturn parsedUrl.origin.replace(\"http://\", \"\").replace(\"https://\", \"\");\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import{a as re}from"./chunk-NCRSY4BM.js";import{h as C,n as Z}from"./chunk-Q2P2HXYZ.js";import{b as h,c as oe}from"./chunk-ASMXGQJE.js";import{a as te,b as F,c as G}from"./chunk-MIF2W335.js";import{a as Q}from"./chunk-333I4LG2.js";import{h as X,i as ee,j as M}from"./chunk-RM4AH2KQ.js";import{c as L,d as _}from"./chunk-77SRGBR2.js";import{APIError as De,createRouter as ot,statusCode as rt}from"better-call";import{APIError as J}from"better-call";import{z as ie}from"zod";import{createEndpointCreator as qe,createMiddleware as se,createMiddlewareCreator as je}from"better-call";var ne=se(async()=>({})),B=je({use:[ne,se(async()=>({}))]}),p=qe({use:[ne]});var ae=B({body:ie.object({csrfToken:ie.string().optional()}).optional()},async e=>{if(e.request?.method!=="POST"||e.context.options.advanced?.disableCSRFCheck)return;let t=e.headers?.get("origin")||"";if(t){let d=new URL(t).origin;if(e.context.trustedOrigins.includes(d))return}let o=e.body?.csrfToken;if(!o)throw new J("UNAUTHORIZED",{message:"CSRF Token is required"});let s=await e.getSignedCookie(e.context.authCookies.csrfToken.name,e.context.secret),[r,n]=s?.split("!")||[null,null];if(!o||!r||!n||r!==o)throw new J("UNAUTHORIZED",{message:"Invalid CSRF Token"});let i=await M(e.context.secret,r);if(n!==i)throw e.setCookie(e.context.authCookies.csrfToken.name,"",{maxAge:0}),new J("UNAUTHORIZED",{message:"Invalid CSRF Token"})});import{APIError as O}from"better-call";import{generateCodeVerifier as Fe}from"oslo/oauth2";import{z as S}from"zod";import{APIError as Ve}from"better-call";var b=B(async e=>{let{body:t,query:o,context:s}=e,r=t?.callbackURL||o?.callbackURL||o?.redirectTo||t?.redirectTo,n=o?.currentURL,i=s.trustedOrigins,d=(c,a)=>{if(c?.startsWith("http")&&!i.some(w=>c.startsWith(w)))throw h.error(`Invalid ${a}`,{[a]:c,trustedOrigins:i}),new Ve("FORBIDDEN",{message:`Invalid ${a}`})};d(r,"callbackURL"),d(n,"currentURL")});import{TimeSpan as $e}from"oslo";import{createJWT as Ne,validateJWT as Me}from"oslo/jwt";import{z as I}from"zod";import{APIError as q}from"better-call";import{APIError as V}from"better-call";import{z as $}from"zod";var Y=()=>p("/get-session",{method:"GET",query:$.optional($.object({disableCookieCache:$.boolean().optional()})),requireHeaders:!0},async e=>{try{let t=await e.getSignedCookie(e.context.authCookies.sessionToken.name,e.context.secret);if(!t)return e.json(null,{status:401});let o=await e.getSignedCookie(e.context.authCookies.sessionData.name,e.context.secret),s=await e.getSignedCookie(e.context.authCookies.dontRememberToken.name,e.context.secret);if(o&&e.context.options.session?.cookieCache?.enabled&&!e.query?.disableCookieCache){let a=JSON.parse(o)?.session;if(a?.expiresAt>new Date)return e.json(a)}let r=await e.context.internalAdapter.findSession(t);if(!r||r.session.expiresAt<new Date)return _(e),r&&await e.context.internalAdapter.deleteSession(r.session.id),e.json(null,{status:401});if(s)return e.json(r);let n=e.context.sessionConfig.expiresIn,i=e.context.sessionConfig.updateAge;if(r.session.expiresAt.valueOf()-n*1e3+i*1e3<=Date.now()){let a=await e.context.internalAdapter.updateSession(r.session.id,{expiresAt:Q(e.context.sessionConfig.expiresIn,"sec")});if(!a)return _(e),e.json(null,{status:401});let l=(a.expiresAt.valueOf()-Date.now())/1e3;return await L(e,{session:a,user:r.user},!1,{maxAge:l}),e.json({session:a,user:r.user})}return e.json(r)}catch(t){return e.context.logger.error(t),e.json(null,{status:500})}}),K=async e=>await Y()({...e,_flag:"json",headers:e.headers}),E=B(async e=>{let t=await K(e);if(!t?.session)throw new V("UNAUTHORIZED");return{session:t}}),de=()=>p("/user/list-sessions",{method:"GET",use:[E],requireHeaders:!0},async e=>{let o=(await e.context.internalAdapter.listSessions(e.context.session.user.id)).filter(s=>s.expiresAt>new Date);return e.json(o)}),ce=p("/user/revoke-session",{method:"POST",body:$.object({id:$.string()}),use:[E],requireHeaders:!0},async e=>{let t=e.body.id,o=await e.context.internalAdapter.findSession(t);if(!o)throw new V("BAD_REQUEST",{message:"Session not found"});if(o.session.userId!==e.context.session.user.id)throw new V("UNAUTHORIZED");try{await e.context.internalAdapter.deleteSession(t)}catch(s){throw e.context.logger.error(s),new V("INTERNAL_SERVER_ERROR")}return e.json({status:!0})}),le=p("/user/revoke-sessions",{method:"POST",use:[E],requireHeaders:!0},async e=>{try{await e.context.internalAdapter.deleteSessions(e.context.session.user.id)}catch(t){throw e.context.logger.error(t),new V("INTERNAL_SERVER_ERROR")}return e.json({status:!0})});async function v(e,t,o){return await Ne("HS256",Buffer.from(e),{email:t.toLowerCase(),updateTo:o},{expiresIn:new $e(1,"h"),issuer:"better-auth",subject:"verify-email",audiences:[t],includeIssuedTimestamp:!0})}var ue=p("/send-verification-email",{method:"POST",query:I.object({currentURL:I.string().optional()}).optional(),body:I.object({email:I.string().email(),callbackURL:I.string().optional()}),use:[b]},async e=>{if(!e.context.options.emailVerification?.sendVerificationEmail)throw e.context.logger.error("Verification email isn't enabled."),new q("BAD_REQUEST",{message:"Verification email isn't enabled"});let{email:t}=e.body,o=await e.context.internalAdapter.findUserByEmail(t);if(!o)throw new q("BAD_REQUEST",{message:"User not found"});let s=await v(e.context.secret,t),r=`${e.context.baseURL}/verify-email?token=${s}&callbackURL=${e.body.callbackURL||e.query?.currentURL||"/"}`;return await e.context.options.emailVerification.sendVerificationEmail(o.user,r,s),e.json({status:!0})}),pe=p("/verify-email",{method:"GET",query:I.object({token:I.string(),callbackURL:I.string().optional()}),use:[b]},async e=>{let{token:t}=e.query,o;try{o=await Me("HS256",Buffer.from(e.context.secret),t)}catch(i){throw e.context.logger.error("Failed to verify email",i),new q("BAD_REQUEST",{message:"Invalid token"})}let r=I.object({email:I.string().email(),updateTo:I.string().optional()}).parse(o.payload);if(!await e.context.internalAdapter.findUserByEmail(r.email))throw new q("BAD_REQUEST",{message:"User not found"});if(r.updateTo){let i=await K(e);if(!i)throw e.query.callbackURL?e.redirect(`${e.query.callbackURL}?error=unauthorized`):new q("UNAUTHORIZED",{message:"Session not found"});if(i.user.email!==r.email)throw e.query.callbackURL?e.redirect(`${e.query.callbackURL}?error=unauthorized`):new q("UNAUTHORIZED",{message:"Invalid session"});let d=await e.context.internalAdapter.updateUserByEmail(r.email,{email:r.updateTo});if(await e.context.options.emailVerification?.sendVerificationEmail?.(d,`${e.context.baseURL}/verify-email?token=${t}`,t),e.query.callbackURL)throw e.redirect(e.query.callbackURL);return e.json({user:d,status:!0})}if(await e.context.internalAdapter.updateUserByEmail(r.email,{emailVerified:!0}),e.query.callbackURL)throw e.redirect(e.query.callbackURL);return e.json({user:null,status:!0})});var me=p("/sign-in/social",{method:"POST",requireHeaders:!0,query:S.object({currentURL:S.string().optional()}).optional(),body:S.object({callbackURL:S.string().optional(),provider:S.enum(Z)}),use:[b]},async e=>{let t=e.context.socialProviders.find(c=>c.id===e.body.provider);if(!t)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new O("NOT_FOUND",{message:"Provider not found"});let o=e.context.authCookies,s=e.query?.currentURL?new URL(e.query?.currentURL):null,r=e.body.callbackURL?.startsWith("http")?e.body.callbackURL:`${s?.origin}${e.body.callbackURL||""}`,n=await F(r||s?.origin||e.context.options.baseURL);await e.setSignedCookie(o.state.name,n.hash,e.context.secret,o.state.options);let i=Fe();await e.setSignedCookie(o.pkCodeVerifier.name,i,e.context.secret,o.pkCodeVerifier.options);let d=await t.createAuthorizationURL({state:n.raw,codeVerifier:i,redirectURI:`${e.context.baseURL}/callback/${t.id}`});return e.json({url:d.toString(),state:n,codeVerifier:i,redirect:!0})}),fe=p("/sign-in/email",{method:"POST",body:S.object({email:S.string(),password:S.string(),callbackURL:S.string().optional(),dontRememberMe:S.boolean().default(!1).optional()}),use:[b]},async e=>{if(!e.context.options?.emailAndPassword?.enabled)throw e.context.logger.error("Email and password is not enabled. Make sure to enable it in the options on you `auth.ts` file. Check `https://better-auth.com/docs/authentication/email-password` for more!"),new O("BAD_REQUEST",{message:"Email and password is not enabled"});let{email:t,password:o}=e.body;if(!S.string().email().safeParse(t).success)throw new O("BAD_REQUEST",{message:"Invalid email"});if(!S.string().email().safeParse(t).success)throw new O("BAD_REQUEST",{message:"Invalid email"});let n=await e.context.internalAdapter.findUserByEmail(t,{includeAccounts:!0});if(!n)throw await e.context.password.hash(o),e.context.logger.error("User not found",{email:t}),new O("UNAUTHORIZED",{message:"Invalid email or password"});let i=n.accounts.find(l=>l.providerId==="credential");if(!i)throw e.context.logger.error("Credential account not found",{email:t}),new O("UNAUTHORIZED",{message:"Invalid email or password"});let d=i?.password;if(!d)throw e.context.logger.error("Password not found",{email:t}),new O("UNAUTHORIZED",{message:"Unexpected error"});if(!await e.context.password.verify(d,o))throw e.context.logger.error("Invalid password"),new O("UNAUTHORIZED",{message:"Invalid email or password"});if(e.context.options?.emailAndPassword?.requireEmailVerification&&!n.user.emailVerified){if(!e.context.options?.emailVerification?.sendVerificationEmail)throw h.error("Email verification is required but no email verification handler is provided"),new O("INTERNAL_SERVER_ERROR",{message:"Email is not verified."});let l=await v(e.context.secret,n.user.email),w=`${e.context.options.baseURL}/verify-email?token=${l}`;throw await e.context.options.emailVerification.sendVerificationEmail(n.user,w,l),e.context.logger.error("Email not verified",{email:t}),new O("FORBIDDEN",{message:"Email is not verified. Check your email for a verification link"})}let a=await e.context.internalAdapter.createSession(n.user.id,e.headers,e.body.dontRememberMe);if(!a)throw e.context.logger.error("Failed to create session"),new O("UNAUTHORIZED",{message:"Failed to create session"});return await L(e,{session:a,user:n.user},e.body.dontRememberMe),e.json({user:n.user,session:a,redirect:!!e.body.callbackURL,url:e.body.callbackURL})});import{z}from"zod";import{z as m}from"zod";var Zt=m.object({id:m.string(),providerId:m.string(),accountId:m.string(),userId:m.string(),accessToken:m.string().nullable().optional(),refreshToken:m.string().nullable().optional(),idToken:m.string().nullable().optional(),expiresAt:m.date().nullable().optional(),password:m.string().optional().nullable()}),we=m.object({id:m.string(),email:m.string().transform(e=>e.toLowerCase()),emailVerified:m.boolean().default(!1),name:m.string(),image:m.string().optional(),createdAt:m.date().default(new Date),updatedAt:m.date().default(new Date)}),Ht=m.object({id:m.string(),userId:m.string(),expiresAt:m.date(),ipAddress:m.string().optional(),userAgent:m.string().optional()}),zt=m.object({id:m.string(),value:m.string(),expiresAt:m.date(),identifier:m.string()});function Qe(e,t){let o={...t==="user"?e.user?.additionalFields:{},...t==="session"?e.session?.additionalFields:{}};for(let s of e.plugins||[])s.schema&&s.schema[t]&&(o={...o,...s.schema[t].fields});return o}function Ze(e,t){let o=t.action||"create",s=t.fields,r={};for(let n in s){if(n in e){if(s[n].input===!1){if(s[n].defaultValue){r[n]=s[n].defaultValue;continue}continue}r[n]=e[n];continue}if(s[n].defaultValue&&o==="create"){r[n]=s[n].defaultValue;continue}}return r}function H(e,t,o){let s=Qe(e,"user");return Ze(t||{},{fields:s,action:o})}import{isDevelopment as He}from"std-env";var ge=p("/callback/:id",{method:"GET",query:z.object({state:z.string(),code:z.string().optional(),error:z.string().optional()}),metadata:C},async e=>{if(e.query.error||!e.query.code){let T=G(e.query.state).data?.callbackURL||`${e.context.baseURL}/error`;throw e.context.logger.error(e.query.error,e.params.id),e.redirect(`${T}?error=${e.query.error||"oAuth_code_missing"}`)}let t=e.context.socialProviders.find(f=>f.id===e.params.id);if(!t)throw e.context.logger.error("Oauth provider with id",e.params.id,"not found"),e.redirect(`${e.context.baseURL}/error?error=oauth_provider_not_found`);let o=G(e.query.state);if(!o.success)throw e.context.logger.error("Unable to parse state"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let{data:{callbackURL:s,currentURL:r,link:n}}=o,i=await e.getSignedCookie(e.context.authCookies.state.name,e.context.secret);if(!i)throw h.error("No stored state found"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(!await te(e.query.state,i))throw h.error("OAuth state mismatch"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let c=await e.getSignedCookie(e.context.authCookies.pkCodeVerifier.name,e.context.secret),a;try{a=await t.validateAuthorizationCode({code:e.query.code,codeVerifier:c,redirectURI:`${e.context.baseURL}/callback/${t.id}`})}catch(f){throw e.context.logger.error(f),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`)}let l=await t.getUserInfo(a).then(f=>f?.user),w=oe(),y=we.safeParse({...l,id:w});if(!l||y.success===!1)throw h.error("Unable to get user info",y.error),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(!s)throw h.error("No callback URL found"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(n){if(n.email!==l.email.toLowerCase())return u("email_doesn't_match");if(!await e.context.internalAdapter.createAccount({userId:n.userId,providerId:t.id,accountId:l.id}))return u("unable_to_link_account");throw e.redirect(s||r||e.context.options.baseURL)}function u(f){throw e.redirect(`${r||s||`${e.context.baseURL}/error`}?error=${f}`)}let A=await e.context.internalAdapter.findUserByEmail(l.email,{includeAccounts:!0}).catch(f=>{throw h.error(`Better auth was unable to query your database.
|
|
1
|
+
import{a as re}from"./chunk-NCRSY4BM.js";import{h as C,n as Z}from"./chunk-Q2P2HXYZ.js";import{b as h,c as oe}from"./chunk-ASMXGQJE.js";import{a as te,b as F,c as G}from"./chunk-MIF2W335.js";import{a as Q}from"./chunk-333I4LG2.js";import{h as X,i as ee,j as M}from"./chunk-RM4AH2KQ.js";import{c as L,d as _}from"./chunk-77SRGBR2.js";import{APIError as De,createRouter as ot,statusCode as rt}from"better-call";import{APIError as J}from"better-call";import{z as ie}from"zod";import{createEndpointCreator as qe,createMiddleware as se,createMiddlewareCreator as je}from"better-call";var ne=se(async()=>({})),B=je({use:[ne,se(async()=>({}))]}),p=qe({use:[ne]});var ae=B({body:ie.object({csrfToken:ie.string().optional()}).optional()},async e=>{if(e.request?.method!=="POST"||e.context.options.advanced?.disableCSRFCheck)return;let t=e.headers?.get("origin")||"";if(t){let d=new URL(t).origin;if(e.context.trustedOrigins.includes(d))return}let o=e.body?.csrfToken;if(!o)throw new J("UNAUTHORIZED",{message:"CSRF Token is required"});let s=await e.getSignedCookie(e.context.authCookies.csrfToken.name,e.context.secret),[r,n]=s?.split("!")||[null,null];if(!o||!r||!n||r!==o)throw new J("UNAUTHORIZED",{message:"Invalid CSRF Token"});let i=await M(e.context.secret,r);if(n!==i)throw e.setCookie(e.context.authCookies.csrfToken.name,"",{maxAge:0}),new J("UNAUTHORIZED",{message:"Invalid CSRF Token"})});import{APIError as O}from"better-call";import{generateCodeVerifier as Fe}from"oslo/oauth2";import{z as S}from"zod";import{APIError as Ve}from"better-call";var b=B(async e=>{let{body:t,query:o,context:s}=e,r=t?.callbackURL||o?.callbackURL||o?.redirectTo||t?.redirectTo,n=o?.currentURL,i=s.trustedOrigins,d=(c,a)=>{if(c?.startsWith("http")&&!i.some(w=>c.startsWith(w)))throw h.error(`Invalid ${a}: ${c}`),h.info(`If it's a valid URL, please add ${c} to trustedOrigins in your auth config
|
|
2
|
+
`,`Current list of trustedOrigins: ${i}`),new Ve("FORBIDDEN",{message:`Invalid ${a}`})};d(r,"callbackURL"),d(n,"currentURL")});import{TimeSpan as $e}from"oslo";import{createJWT as Ne,validateJWT as Me}from"oslo/jwt";import{z as I}from"zod";import{APIError as q}from"better-call";import{APIError as V}from"better-call";import{z as $}from"zod";var Y=()=>p("/get-session",{method:"GET",query:$.optional($.object({disableCookieCache:$.boolean().optional()})),requireHeaders:!0},async e=>{try{let t=await e.getSignedCookie(e.context.authCookies.sessionToken.name,e.context.secret);if(!t)return e.json(null,{status:401});let o=await e.getSignedCookie(e.context.authCookies.sessionData.name,e.context.secret),s=await e.getSignedCookie(e.context.authCookies.dontRememberToken.name,e.context.secret);if(o&&e.context.options.session?.cookieCache?.enabled&&!e.query?.disableCookieCache){let a=JSON.parse(o)?.session;if(a?.expiresAt>new Date)return e.json(a)}let r=await e.context.internalAdapter.findSession(t);if(!r||r.session.expiresAt<new Date)return _(e),r&&await e.context.internalAdapter.deleteSession(r.session.id),e.json(null,{status:401});if(s)return e.json(r);let n=e.context.sessionConfig.expiresIn,i=e.context.sessionConfig.updateAge;if(r.session.expiresAt.valueOf()-n*1e3+i*1e3<=Date.now()){let a=await e.context.internalAdapter.updateSession(r.session.id,{expiresAt:Q(e.context.sessionConfig.expiresIn,"sec")});if(!a)return _(e),e.json(null,{status:401});let l=(a.expiresAt.valueOf()-Date.now())/1e3;return await L(e,{session:a,user:r.user},!1,{maxAge:l}),e.json({session:a,user:r.user})}return e.json(r)}catch(t){return e.context.logger.error(t),e.json(null,{status:500})}}),K=async e=>await Y()({...e,_flag:"json",headers:e.headers}),E=B(async e=>{let t=await K(e);if(!t?.session)throw new V("UNAUTHORIZED");return{session:t}}),de=()=>p("/user/list-sessions",{method:"GET",use:[E],requireHeaders:!0},async e=>{let o=(await e.context.internalAdapter.listSessions(e.context.session.user.id)).filter(s=>s.expiresAt>new Date);return e.json(o)}),ce=p("/user/revoke-session",{method:"POST",body:$.object({id:$.string()}),use:[E],requireHeaders:!0},async e=>{let t=e.body.id,o=await e.context.internalAdapter.findSession(t);if(!o)throw new V("BAD_REQUEST",{message:"Session not found"});if(o.session.userId!==e.context.session.user.id)throw new V("UNAUTHORIZED");try{await e.context.internalAdapter.deleteSession(t)}catch(s){throw e.context.logger.error(s),new V("INTERNAL_SERVER_ERROR")}return e.json({status:!0})}),le=p("/user/revoke-sessions",{method:"POST",use:[E],requireHeaders:!0},async e=>{try{await e.context.internalAdapter.deleteSessions(e.context.session.user.id)}catch(t){throw e.context.logger.error(t),new V("INTERNAL_SERVER_ERROR")}return e.json({status:!0})});async function v(e,t,o){return await Ne("HS256",Buffer.from(e),{email:t.toLowerCase(),updateTo:o},{expiresIn:new $e(1,"h"),issuer:"better-auth",subject:"verify-email",audiences:[t],includeIssuedTimestamp:!0})}var ue=p("/send-verification-email",{method:"POST",query:I.object({currentURL:I.string().optional()}).optional(),body:I.object({email:I.string().email(),callbackURL:I.string().optional()}),use:[b]},async e=>{if(!e.context.options.emailVerification?.sendVerificationEmail)throw e.context.logger.error("Verification email isn't enabled."),new q("BAD_REQUEST",{message:"Verification email isn't enabled"});let{email:t}=e.body,o=await e.context.internalAdapter.findUserByEmail(t);if(!o)throw new q("BAD_REQUEST",{message:"User not found"});let s=await v(e.context.secret,t),r=`${e.context.baseURL}/verify-email?token=${s}&callbackURL=${e.body.callbackURL||e.query?.currentURL||"/"}`;return await e.context.options.emailVerification.sendVerificationEmail(o.user,r,s),e.json({status:!0})}),pe=p("/verify-email",{method:"GET",query:I.object({token:I.string(),callbackURL:I.string().optional()}),use:[b]},async e=>{let{token:t}=e.query,o;try{o=await Me("HS256",Buffer.from(e.context.secret),t)}catch(i){throw e.context.logger.error("Failed to verify email",i),new q("BAD_REQUEST",{message:"Invalid token"})}let r=I.object({email:I.string().email(),updateTo:I.string().optional()}).parse(o.payload);if(!await e.context.internalAdapter.findUserByEmail(r.email))throw new q("BAD_REQUEST",{message:"User not found"});if(r.updateTo){let i=await K(e);if(!i)throw e.query.callbackURL?e.redirect(`${e.query.callbackURL}?error=unauthorized`):new q("UNAUTHORIZED",{message:"Session not found"});if(i.user.email!==r.email)throw e.query.callbackURL?e.redirect(`${e.query.callbackURL}?error=unauthorized`):new q("UNAUTHORIZED",{message:"Invalid session"});let d=await e.context.internalAdapter.updateUserByEmail(r.email,{email:r.updateTo});if(await e.context.options.emailVerification?.sendVerificationEmail?.(d,`${e.context.baseURL}/verify-email?token=${t}`,t),e.query.callbackURL)throw e.redirect(e.query.callbackURL);return e.json({user:d,status:!0})}if(await e.context.internalAdapter.updateUserByEmail(r.email,{emailVerified:!0}),e.query.callbackURL)throw e.redirect(e.query.callbackURL);return e.json({user:null,status:!0})});var me=p("/sign-in/social",{method:"POST",requireHeaders:!0,query:S.object({currentURL:S.string().optional()}).optional(),body:S.object({callbackURL:S.string().optional(),provider:S.enum(Z)}),use:[b]},async e=>{let t=e.context.socialProviders.find(c=>c.id===e.body.provider);if(!t)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new O("NOT_FOUND",{message:"Provider not found"});let o=e.context.authCookies,s=e.query?.currentURL?new URL(e.query?.currentURL):null,r=e.body.callbackURL?.startsWith("http")?e.body.callbackURL:`${s?.origin}${e.body.callbackURL||""}`,n=await F(r||s?.origin||e.context.options.baseURL);await e.setSignedCookie(o.state.name,n.hash,e.context.secret,o.state.options);let i=Fe();await e.setSignedCookie(o.pkCodeVerifier.name,i,e.context.secret,o.pkCodeVerifier.options);let d=await t.createAuthorizationURL({state:n.raw,codeVerifier:i,redirectURI:`${e.context.baseURL}/callback/${t.id}`});return e.json({url:d.toString(),state:n,codeVerifier:i,redirect:!0})}),fe=p("/sign-in/email",{method:"POST",body:S.object({email:S.string(),password:S.string(),callbackURL:S.string().optional(),dontRememberMe:S.boolean().default(!1).optional()}),use:[b]},async e=>{if(!e.context.options?.emailAndPassword?.enabled)throw e.context.logger.error("Email and password is not enabled. Make sure to enable it in the options on you `auth.ts` file. Check `https://better-auth.com/docs/authentication/email-password` for more!"),new O("BAD_REQUEST",{message:"Email and password is not enabled"});let{email:t,password:o}=e.body;if(!S.string().email().safeParse(t).success)throw new O("BAD_REQUEST",{message:"Invalid email"});if(!S.string().email().safeParse(t).success)throw new O("BAD_REQUEST",{message:"Invalid email"});let n=await e.context.internalAdapter.findUserByEmail(t,{includeAccounts:!0});if(!n)throw await e.context.password.hash(o),e.context.logger.error("User not found",{email:t}),new O("UNAUTHORIZED",{message:"Invalid email or password"});let i=n.accounts.find(l=>l.providerId==="credential");if(!i)throw e.context.logger.error("Credential account not found",{email:t}),new O("UNAUTHORIZED",{message:"Invalid email or password"});let d=i?.password;if(!d)throw e.context.logger.error("Password not found",{email:t}),new O("UNAUTHORIZED",{message:"Unexpected error"});if(!await e.context.password.verify(d,o))throw e.context.logger.error("Invalid password"),new O("UNAUTHORIZED",{message:"Invalid email or password"});if(e.context.options?.emailAndPassword?.requireEmailVerification&&!n.user.emailVerified){if(!e.context.options?.emailVerification?.sendVerificationEmail)throw h.error("Email verification is required but no email verification handler is provided"),new O("INTERNAL_SERVER_ERROR",{message:"Email is not verified."});let l=await v(e.context.secret,n.user.email),w=`${e.context.options.baseURL}/verify-email?token=${l}`;throw await e.context.options.emailVerification.sendVerificationEmail(n.user,w,l),e.context.logger.error("Email not verified",{email:t}),new O("FORBIDDEN",{message:"Email is not verified. Check your email for a verification link"})}let a=await e.context.internalAdapter.createSession(n.user.id,e.headers,e.body.dontRememberMe);if(!a)throw e.context.logger.error("Failed to create session"),new O("UNAUTHORIZED",{message:"Failed to create session"});return await L(e,{session:a,user:n.user},e.body.dontRememberMe),e.json({user:n.user,session:a,redirect:!!e.body.callbackURL,url:e.body.callbackURL})});import{z}from"zod";import{z as m}from"zod";var Zt=m.object({id:m.string(),providerId:m.string(),accountId:m.string(),userId:m.string(),accessToken:m.string().nullable().optional(),refreshToken:m.string().nullable().optional(),idToken:m.string().nullable().optional(),expiresAt:m.date().nullable().optional(),password:m.string().optional().nullable()}),we=m.object({id:m.string(),email:m.string().transform(e=>e.toLowerCase()),emailVerified:m.boolean().default(!1),name:m.string(),image:m.string().optional(),createdAt:m.date().default(new Date),updatedAt:m.date().default(new Date)}),Ht=m.object({id:m.string(),userId:m.string(),expiresAt:m.date(),ipAddress:m.string().optional(),userAgent:m.string().optional()}),zt=m.object({id:m.string(),value:m.string(),expiresAt:m.date(),identifier:m.string()});function Qe(e,t){let o={...t==="user"?e.user?.additionalFields:{},...t==="session"?e.session?.additionalFields:{}};for(let s of e.plugins||[])s.schema&&s.schema[t]&&(o={...o,...s.schema[t].fields});return o}function Ze(e,t){let o=t.action||"create",s=t.fields,r={};for(let n in s){if(n in e){if(s[n].input===!1){if(s[n].defaultValue){r[n]=s[n].defaultValue;continue}continue}r[n]=e[n];continue}if(s[n].defaultValue&&o==="create"){r[n]=s[n].defaultValue;continue}}return r}function H(e,t,o){let s=Qe(e,"user");return Ze(t||{},{fields:s,action:o})}import{isDevelopment as He}from"std-env";var ge=p("/callback/:id",{method:"GET",query:z.object({state:z.string(),code:z.string().optional(),error:z.string().optional()}),metadata:C},async e=>{if(e.query.error||!e.query.code){let T=G(e.query.state).data?.callbackURL||`${e.context.baseURL}/error`;throw e.context.logger.error(e.query.error,e.params.id),e.redirect(`${T}?error=${e.query.error||"oAuth_code_missing"}`)}let t=e.context.socialProviders.find(f=>f.id===e.params.id);if(!t)throw e.context.logger.error("Oauth provider with id",e.params.id,"not found"),e.redirect(`${e.context.baseURL}/error?error=oauth_provider_not_found`);let o=G(e.query.state);if(!o.success)throw e.context.logger.error("Unable to parse state"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let{data:{callbackURL:s,currentURL:r,link:n}}=o,i=await e.getSignedCookie(e.context.authCookies.state.name,e.context.secret);if(!i)throw h.error("No stored state found"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(!await te(e.query.state,i))throw h.error("OAuth state mismatch"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let c=await e.getSignedCookie(e.context.authCookies.pkCodeVerifier.name,e.context.secret),a;try{a=await t.validateAuthorizationCode({code:e.query.code,codeVerifier:c,redirectURI:`${e.context.baseURL}/callback/${t.id}`})}catch(f){throw e.context.logger.error(f),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`)}let l=await t.getUserInfo(a).then(f=>f?.user),w=oe(),y=we.safeParse({...l,id:w});if(!l||y.success===!1)throw h.error("Unable to get user info",y.error),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(!s)throw h.error("No callback URL found"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(n){if(n.email!==l.email.toLowerCase())return u("email_doesn't_match");if(!await e.context.internalAdapter.createAccount({userId:n.userId,providerId:t.id,accountId:l.id}))return u("unable_to_link_account");throw e.redirect(s||r||e.context.options.baseURL)}function u(f){throw e.redirect(`${r||s||`${e.context.baseURL}/error`}?error=${f}`)}let A=await e.context.internalAdapter.findUserByEmail(l.email,{includeAccounts:!0}).catch(f=>{throw h.error(`Better auth was unable to query your database.
|
|
2
3
|
Error: `,f),e.redirect(`${e.context.baseURL}/error?error=internal_server_error`)}),R=A?.user;if(A){let f=A.accounts.find(T=>T.providerId===t.id);if(f)await e.context.internalAdapter.updateAccount(f.id,{accessToken:a.accessToken,idToken:a.idToken,refreshToken:a.refreshToken,expiresAt:a.accessTokenExpiresAt});else{(!e.context.options.account?.accountLinking?.trustedProviders?.includes(t.id)&&!l.emailVerified||!e.context.options.account?.accountLinking?.enabled)&&(He&&h.warn(`User already exist but account isn't linked to ${t.id}. To read more about how account linking works in Better Auth see https://www.better-auth.com/docs/concepts/users-accounts#account-linking.`),u("account_not_linked"));try{await e.context.internalAdapter.linkAccount({providerId:t.id,accountId:l.id.toString(),id:`${t.id}:${l.id}`,userId:A.user.id,accessToken:a.accessToken,idToken:a.idToken,refreshToken:a.refreshToken,expiresAt:a.accessTokenExpiresAt})}catch(Be){h.error("Unable to link account",Be),u("unable_to_link_account")}}}else try{let f=l.emailVerified||!1;if(R=await e.context.internalAdapter.createOAuthUser({...y.data,emailVerified:f},{accessToken:a.accessToken,idToken:a.idToken,refreshToken:a.refreshToken,expiresAt:a.accessTokenExpiresAt,providerId:t.id,accountId:l.id.toString()}).then(T=>T?.user),!f&&R&&e.context.options.emailVerification?.sendOnSignUp){let T=await v(e.context.secret,R.email),D=`${e.context.baseURL}/verify-email?token=${T}&callbackURL=${s}`;await e.context.options.emailVerification?.sendVerificationEmail?.(R,D,T)}}catch(f){h.error("Unable to create user",f),u("unable_to_create_user")}if(!R)return u("unable_to_create_user");let g=await e.context.internalAdapter.createSession(R.id,e.request);throw g||u("unable_to_create_session"),await L(e,{session:g,user:R}),e.redirect(s)});import"zod";import{APIError as ze}from"better-call";var he=p("/sign-out",{method:"POST"},async e=>{let t=await e.getSignedCookie(e.context.authCookies.sessionToken.name,e.context.secret);if(!t)throw new ze("BAD_REQUEST",{message:"Session not found"});return await e.context.internalAdapter.deleteSession(t),_(e),e.json({success:!0})});import{z as P}from"zod";import{APIError as W}from"better-call";var ye=p("/forget-password",{method:"POST",body:P.object({email:P.string().email(),redirectTo:P.string()}),use:[b]},async e=>{if(!e.context.options.emailAndPassword?.sendResetPassword)throw e.context.logger.error("Reset password isn't enabled.Please pass an emailAndPassword.sendResetPasswordToken function in your auth config!"),new W("BAD_REQUEST",{message:"Reset password isn't enabled"});let{email:t,redirectTo:o}=e.body,s=await e.context.internalAdapter.findUserByEmail(t,{includeAccounts:!0});if(!s)return e.context.logger.error("Reset Password: User not found",{email:t}),e.json({status:!1},{body:{status:!0}});let r=60*60*1,n=new Date(Date.now()+1e3*(e.context.options.emailAndPassword.resetPasswordTokenExpiresIn||r)),i=e.context.uuid();await e.context.internalAdapter.createVerificationValue({value:s.user.id,identifier:`reset-password:${i}`,expiresAt:n});let d=`${e.context.baseURL}/reset-password/${i}?callbackURL=${o}`;return await e.context.options.emailAndPassword.sendResetPassword(s.user,d),e.json({status:!0})}),Re=p("/reset-password/:token",{method:"GET",query:P.object({callbackURL:P.string()}),use:[b]},async e=>{let{token:t}=e.params,o=e.query.callbackURL,s=o.startsWith("http")?o:`${e.context.options.baseURL}${o}`;if(!t||!o)throw e.redirect(`${e.context.baseURL}/error?error=INVALID_TOKEN`);let r=await e.context.internalAdapter.findVerificationValue(`reset-password:${t}`);throw!r||r.expiresAt<new Date?e.redirect(`${s}?error=INVALID_TOKEN`):e.redirect(`${s}${s.includes("?")?"&":"?"}token=${t}`)}),Ae=p("/reset-password",{query:P.optional(P.object({token:P.string().optional(),currentURL:P.string().optional()})),method:"POST",body:P.object({newPassword:P.string()})},async e=>{let t=e.query?.token||(e.query?.currentURL?new URL(e.query.currentURL).searchParams.get("token"):"");if(!t)throw new W("BAD_REQUEST",{message:"Token not found"});let{newPassword:o}=e.body,s=`reset-password:${t}`,r=await e.context.internalAdapter.findVerificationValue(s);if(!r||r.expiresAt<new Date)throw new W("BAD_REQUEST",{message:"Invalid token"});await e.context.internalAdapter.deleteVerificationValue(r.id);let n=r.value,i=await e.context.password.hash(o);if(!(await e.context.internalAdapter.findAccounts(n)).find(l=>l.providerId==="credential"))return await e.context.internalAdapter.createAccount({userId:n,providerId:"credential",password:i,accountId:e.context.uuid()}),e.json({status:!0});if(!await e.context.internalAdapter.updatePassword(n,i))throw new W("BAD_REQUEST",{message:"Failed to update password"});return e.json({status:!0})});import{z as k}from"zod";import{APIError as U}from"better-call";var be=()=>p("/user/update",{method:"POST",body:k.record(k.string(),k.any()),use:[E,b]},async e=>{let t=e.body;if(t.email)throw new U("BAD_REQUEST",{message:"You can't update email"});let{name:o,image:s,...r}=t,n=e.context.session;if(!s&&!o&&Object.keys(r).length===0)return e.json({user:n.user});let i=H(e.context.options,r,"update"),d=await e.context.internalAdapter.updateUserByEmail(n.user.email,{name:o,image:s,...i});return await L(e,{session:n.session,user:d}),e.json({user:d})}),ke=p("/user/change-password",{method:"POST",body:k.object({newPassword:k.string(),currentPassword:k.string(),revokeOtherSessions:k.boolean().optional()}),use:[E]},async e=>{let{newPassword:t,currentPassword:o,revokeOtherSessions:s}=e.body,r=e.context.session,n=e.context.password.config.minPasswordLength;if(t.length<n)throw e.context.logger.error("Password is too short"),new U("BAD_REQUEST",{message:"Password is too short"});let i=e.context.password.config.maxPasswordLength;if(t.length>i)throw e.context.logger.error("Password is too long"),new U("BAD_REQUEST",{message:"Password too long"});let c=(await e.context.internalAdapter.findAccounts(r.user.id)).find(w=>w.providerId==="credential"&&w.password);if(!c||!c.password)throw new U("BAD_REQUEST",{message:"User does not have a password"});let a=await e.context.password.hash(t);if(!await e.context.password.verify(c.password,o))throw new U("BAD_REQUEST",{message:"Incorrect password"});if(await e.context.internalAdapter.updateAccount(c.id,{password:a}),s){await e.context.internalAdapter.deleteSessions(r.user.id);let w=await e.context.internalAdapter.createSession(r.user.id,e.headers);if(!w)throw new U("INTERNAL_SERVER_ERROR",{message:"Unable to create session"});await L(e,{session:w,user:r.user})}return e.json(r.user)}),Ue=p("/user/set-password",{method:"POST",body:k.object({newPassword:k.string()}),metadata:{SERVER_ONLY:!0},use:[E]},async e=>{let{newPassword:t}=e.body,o=e.context.session,s=e.context.password.config.minPasswordLength;if(t.length<s)throw e.context.logger.error("Password is too short"),new U("BAD_REQUEST",{message:"Password is too short"});let r=e.context.password.config.maxPasswordLength;if(t.length>r)throw e.context.logger.error("Password is too long"),new U("BAD_REQUEST",{message:"Password too long"});let i=(await e.context.internalAdapter.findAccounts(o.user.id)).find(c=>c.providerId==="credential"&&c.password),d=await e.context.password.hash(t);if(!i)return await e.context.internalAdapter.linkAccount({userId:o.user.id,providerId:"credential",accountId:o.user.id,password:d}),e.json(o.user);throw new U("BAD_REQUEST",{message:"user already has a password"})}),Ee=p("/user/delete",{method:"POST",body:k.object({password:k.string()}),use:[E]},async e=>{let{password:t}=e.body,o=e.context.session,r=(await e.context.internalAdapter.findAccounts(o.user.id)).find(i=>i.providerId==="credential"&&i.password);if(!r||!r.password)throw new U("BAD_REQUEST",{message:"User does not have a password"});if(!await e.context.password.verify(r.password,t))throw new U("BAD_REQUEST",{message:"Incorrect password"});return await e.context.internalAdapter.deleteUser(o.user.id),await e.context.internalAdapter.deleteSessions(o.user.id),_(e),e.json(null)}),Se=p("/user/change-email",{method:"POST",query:k.object({currentURL:k.string().optional()}).optional(),body:k.object({newEmail:k.string().email(),callbackURL:k.string().optional()}),use:[E,b]},async e=>{if(!e.context.options.user?.changeEmail?.enabled)throw e.context.logger.error("Change email is disabled."),new U("BAD_REQUEST",{message:"Change email is disabled"});if(e.body.newEmail===e.context.session.user.email)throw e.context.logger.error("Email is the same"),new U("BAD_REQUEST",{message:"Email is the same"});if(await e.context.internalAdapter.findUserByEmail(e.body.newEmail))throw e.context.logger.error("Email already exists"),new U("BAD_REQUEST",{message:"Couldn't update your email"});if(e.context.session.user.emailVerified!==!0){let r=await e.context.internalAdapter.updateUserByEmail(e.context.session.user.email,{email:e.body.newEmail});return e.json({user:r,status:!0})}if(!e.context.options.user.changeEmail.sendChangeEmailVerification)throw e.context.logger.error("Verification email isn't enabled."),new U("BAD_REQUEST",{message:"Verification email isn't enabled"});let o=await v(e.context.secret,e.context.session.user.email,e.body.newEmail),s=`${e.context.baseURL}/verify-email?token=${o}&callbackURL=${e.body.callbackURL||e.query?.currentURL||"/"}`;return await e.context.options.user.changeEmail.sendChangeEmailVerification(e.context.session.user,e.body.newEmail,s,o),e.json({user:null,status:!0})});var Te=p("/csrf",{method:"GET",metadata:C},async e=>{let t=await e.getSignedCookie(e.context.authCookies.csrfToken.name,e.context.secret);if(t){let[n,i]=t.split("!")||[null,null];return e.json({csrfToken:n})}let o=X(32,ee("a-z","0-9","A-Z")),s=await M(e.context.secret,o),r=`${o}!${s}`;return await e.setSignedCookie(e.context.authCookies.csrfToken.name,r,e.context.secret,e.context.authCookies.csrfToken.options),e.json({csrfToken:o})});var We=(e="Unknown")=>`<!DOCTYPE html>
|
|
3
4
|
<html lang="en">
|
|
4
5
|
<head>
|