better-auth 0.0.2-beta.7 → 0.0.2

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.
Files changed (96) hide show
  1. package/dist/access.d.ts +4 -0
  2. package/dist/access.js +126 -0
  3. package/dist/access.js.map +1 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +553 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client/plugins.d.ts +2436 -0
  8. package/dist/client/plugins.js +411 -0
  9. package/dist/client/plugins.js.map +1 -0
  10. package/dist/client-A2Mt04KQ.d.ts +3503 -0
  11. package/dist/client.d.ts +1433 -0
  12. package/dist/client.js +693 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/helper-B5_2Vzba.d.ts +14 -0
  15. package/dist/index-Dg4eEXZW.d.ts +24 -0
  16. package/dist/index-W5nXvJ-p.d.ts +1498 -0
  17. package/dist/index.d.ts +6 -4
  18. package/dist/index.js +2195 -1191
  19. package/dist/index.js.map +1 -1
  20. package/dist/next-js.d.ts +14 -0
  21. package/dist/next-js.js +14 -0
  22. package/dist/next-js.js.map +1 -0
  23. package/dist/plugins.d.ts +892 -49
  24. package/dist/plugins.js +3951 -253
  25. package/dist/plugins.js.map +1 -1
  26. package/dist/preact.d.ts +8 -0
  27. package/dist/preact.js +294 -0
  28. package/dist/preact.js.map +1 -0
  29. package/dist/react.d.ts +14 -0
  30. package/dist/react.js +314 -0
  31. package/dist/react.js.map +1 -0
  32. package/dist/schema-BOszzrbQ.d.ts +792 -0
  33. package/dist/social.d.ts +4 -0
  34. package/dist/social.js +509 -0
  35. package/dist/social.js.map +1 -0
  36. package/dist/solid-start.d.ts +18 -0
  37. package/dist/solid-start.js +14 -0
  38. package/dist/solid-start.js.map +1 -0
  39. package/dist/solid.d.ts +2790 -0
  40. package/dist/solid.js +306 -0
  41. package/dist/solid.js.map +1 -0
  42. package/dist/statement-COylZd3J.d.ts +81 -0
  43. package/dist/svelte-kit.d.ts +10 -7
  44. package/dist/svelte-kit.js +12 -17
  45. package/dist/svelte-kit.js.map +1 -1
  46. package/dist/svelte.d.ts +2791 -0
  47. package/dist/svelte.js +304 -0
  48. package/dist/svelte.js.map +1 -0
  49. package/dist/type-DbMyI3b5.d.ts +5724 -0
  50. package/dist/types.d.ts +7 -0
  51. package/dist/types.js +1 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/vue.d.ts +14 -0
  54. package/dist/vue.js +311 -0
  55. package/dist/vue.js.map +1 -0
  56. package/package.json +80 -54
  57. package/LICENSE +0 -21
  58. package/dist/actions.d.ts +0 -33
  59. package/dist/actions.js +0 -1373
  60. package/dist/actions.js.map +0 -1
  61. package/dist/adapters/drizzle-adapter.d.ts +0 -10
  62. package/dist/adapters/drizzle-adapter.js +0 -1095
  63. package/dist/adapters/drizzle-adapter.js.map +0 -1
  64. package/dist/adapters/memory.d.ts +0 -8
  65. package/dist/adapters/memory.js +0 -136
  66. package/dist/adapters/memory.js.map +0 -1
  67. package/dist/adapters/mongodb-adapter.d.ts +0 -9
  68. package/dist/adapters/mongodb-adapter.js +0 -97
  69. package/dist/adapters/mongodb-adapter.js.map +0 -1
  70. package/dist/adapters/prisma-adapter.d.ts +0 -7
  71. package/dist/adapters/prisma-adapter.js +0 -144
  72. package/dist/adapters/prisma-adapter.js.map +0 -1
  73. package/dist/adapters/redis-adapter.d.ts +0 -7
  74. package/dist/adapters/redis-adapter.js +0 -65
  75. package/dist/adapters/redis-adapter.js.map +0 -1
  76. package/dist/adapters.d.ts +0 -3
  77. package/dist/adapters.js +0 -206
  78. package/dist/adapters.js.map +0 -1
  79. package/dist/h3.d.ts +0 -10
  80. package/dist/h3.js +0 -326
  81. package/dist/h3.js.map +0 -1
  82. package/dist/hono.d.ts +0 -10
  83. package/dist/hono.js +0 -25
  84. package/dist/hono.js.map +0 -1
  85. package/dist/index-UcTu1vUg.d.ts +0 -107
  86. package/dist/next.d.ts +0 -17
  87. package/dist/next.js +0 -26
  88. package/dist/next.js.map +0 -1
  89. package/dist/options-CH15FEBw.d.ts +0 -1562
  90. package/dist/providers.d.ts +0 -3
  91. package/dist/providers.js +0 -653
  92. package/dist/providers.js.map +0 -1
  93. package/dist/routes/session.d.ts +0 -39
  94. package/dist/routes/session.js +0 -128
  95. package/dist/routes/session.js.map +0 -1
  96. package/dist/types-DAxaMWCy.d.ts +0 -136
package/dist/solid.js ADDED
@@ -0,0 +1,306 @@
1
+ // src/client/base.ts
2
+ import { createFetch } from "@better-fetch/fetch";
3
+
4
+ // src/error/better-auth-error.ts
5
+ var BetterAuthError = class extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ }
9
+ };
10
+
11
+ // src/utils/base-url.ts
12
+ function checkHasPath(url) {
13
+ try {
14
+ const parsedUrl = new URL(url);
15
+ return parsedUrl.pathname !== "/";
16
+ } catch (error) {
17
+ console.error("Invalid URL:", error);
18
+ return false;
19
+ }
20
+ }
21
+ function withPath(url, path = "/api/auth") {
22
+ const hasPath = checkHasPath(url);
23
+ if (hasPath) {
24
+ return {
25
+ baseURL: new URL(url).origin,
26
+ withPath: url
27
+ };
28
+ }
29
+ path = path.startsWith("/") ? path : `/${path}`;
30
+ return {
31
+ baseURL: url,
32
+ withPath: `${url}${path}`
33
+ };
34
+ }
35
+ function getBaseURL(url, path) {
36
+ if (url) {
37
+ return withPath(url, path);
38
+ }
39
+ const env = typeof process !== "undefined" ? process.env : typeof import.meta !== "undefined" ? (
40
+ //@ts-ignore
41
+ import.meta.env
42
+ ) : {};
43
+ const fromEnv = env.BETTER_AUTH_URL || env.AUTH_URL || env.NEXT_PUBLIC_AUTH_URL || env.NEXT_PUBLIC_BETTER_AUTH_URL || env.PUBLIC_AUTH_URL || env.PUBLIC_BETTER_AUTH_URL || env.NUXT_PUBLIC_BETTER_AUTH_URL || env.NUXT_PUBLIC_AUTH_URL;
44
+ if (fromEnv) {
45
+ return withPath(fromEnv, path);
46
+ }
47
+ const isDev = !fromEnv && (env.NODE_ENV === "development" || env.NODE_ENV === "test");
48
+ if (isDev) {
49
+ return {
50
+ baseURL: "http://localhost:3000",
51
+ withPath: "http://localhost:3000/api/auth"
52
+ };
53
+ }
54
+ throw new BetterAuthError(
55
+ "Could not infer baseURL from environment variables"
56
+ );
57
+ }
58
+
59
+ // src/client/fetch-plugins.ts
60
+ import { betterFetch } from "@better-fetch/fetch";
61
+ var redirectPlugin = {
62
+ id: "redirect",
63
+ name: "Redirect",
64
+ hooks: {
65
+ onSuccess(context) {
66
+ if (context.data?.url && context.data?.redirect) {
67
+ window.location.href = context.data.url;
68
+ }
69
+ }
70
+ }
71
+ };
72
+ var addCurrentURL = {
73
+ id: "add-current-url",
74
+ name: "Add current URL",
75
+ hooks: {
76
+ onRequest(context) {
77
+ if (typeof window !== "undefined") {
78
+ const url = new URL(context.url);
79
+ url.searchParams.set("currentURL", window.location.href);
80
+ context.url = url;
81
+ }
82
+ return context;
83
+ }
84
+ }
85
+ };
86
+ var csrfPlugin = {
87
+ id: "csrf",
88
+ name: "CSRF Check",
89
+ async init(url, options) {
90
+ if (options?.method !== "GET") {
91
+ options = options || {};
92
+ const { data, error } = await betterFetch("/csrf", {
93
+ body: void 0,
94
+ baseURL: options.baseURL,
95
+ plugins: [],
96
+ method: "GET",
97
+ credentials: "include"
98
+ });
99
+ if (error?.status === 404) {
100
+ throw new BetterAuthError(
101
+ "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)."
102
+ );
103
+ }
104
+ if (error) {
105
+ throw new BetterAuthError(error.message || "Failed to get CSRF token.");
106
+ }
107
+ options.body = {
108
+ ...options?.body,
109
+ csrfToken: data.csrfToken
110
+ };
111
+ }
112
+ options.credentials = "include";
113
+ return { url, options };
114
+ }
115
+ };
116
+
117
+ // src/client/proxy.ts
118
+ function getMethod(path, knownPathMethods, args) {
119
+ const method = knownPathMethods[path];
120
+ const { options, query, ...body } = args || {};
121
+ if (method) {
122
+ return method;
123
+ }
124
+ if (options?.method) {
125
+ return options.method;
126
+ }
127
+ if (body && Object.keys(body).length > 0) {
128
+ return "POST";
129
+ }
130
+ return "GET";
131
+ }
132
+ function createDynamicPathProxy(routes, client, knownPathMethods, $signal, $signals) {
133
+ function createProxy(path = []) {
134
+ return new Proxy(function() {
135
+ }, {
136
+ get(target, prop) {
137
+ const fullPath = [...path, prop];
138
+ let current = routes;
139
+ for (const segment of fullPath) {
140
+ if (current && typeof current === "object" && segment in current) {
141
+ current = current[segment];
142
+ } else {
143
+ current = void 0;
144
+ break;
145
+ }
146
+ }
147
+ if (typeof current === "function") {
148
+ return current;
149
+ }
150
+ return createProxy(fullPath);
151
+ },
152
+ apply: async (_, __, args) => {
153
+ const routePath = "/" + path.map(
154
+ (segment) => segment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)
155
+ ).join("/");
156
+ const arg = args[0] || {};
157
+ const method = getMethod(routePath, knownPathMethods, arg);
158
+ const { query, options, ...body } = arg;
159
+ return await client(routePath, {
160
+ ...options,
161
+ body: method === "GET" ? void 0 : body,
162
+ query,
163
+ method,
164
+ async onSuccess(context) {
165
+ const signal = $signal?.find((s) => s.matcher(routePath));
166
+ if (!signal) return;
167
+ const signalAtom = $signals?.[signal.atom];
168
+ if (!signalAtom) return;
169
+ signalAtom.set(!signalAtom.get());
170
+ await options?.onSuccess?.(context);
171
+ }
172
+ });
173
+ }
174
+ });
175
+ }
176
+ return createProxy();
177
+ }
178
+
179
+ // src/client/session-atom.ts
180
+ import { atom, computed, task } from "nanostores";
181
+ function getSessionAtom(client) {
182
+ const $signal = atom(false);
183
+ const $session = computed(
184
+ $signal,
185
+ () => task(async () => {
186
+ const session = await client("/session", {
187
+ credentials: "include",
188
+ method: "GET"
189
+ });
190
+ return session.data;
191
+ })
192
+ );
193
+ return { $session, $sessionSignal: $signal };
194
+ }
195
+
196
+ // src/client/base.ts
197
+ var createAuthFetch = (options) => {
198
+ const $baseFetch = createFetch();
199
+ return createFetch({
200
+ method: "GET",
201
+ ...options,
202
+ baseURL: getBaseURL(options?.baseURL).withPath,
203
+ plugins: [
204
+ ...options?.plugins || [],
205
+ ...options?.authPlugins?.flatMap((plugin) => plugin($baseFetch).fetchPlugins).filter((plugin) => plugin !== void 0) || [],
206
+ ...options?.csrfPlugin !== false ? [csrfPlugin] : [],
207
+ redirectPlugin,
208
+ addCurrentURL
209
+ ]
210
+ });
211
+ };
212
+ var createAuthClient = (options, additionalActions = {}) => {
213
+ const $fetch = createAuthFetch(options);
214
+ const { $session, $sessionSignal } = getSessionAtom($fetch);
215
+ let pluginsActions = {};
216
+ const pluginProxySignals = [];
217
+ let pluginSignals = {};
218
+ let pluginPathMethods = {};
219
+ for (const plugin of options?.authPlugins || []) {
220
+ const pl = plugin($fetch);
221
+ if (pl.authProxySignal) {
222
+ pluginProxySignals.push(...pl.authProxySignal);
223
+ }
224
+ if (pl.actions) {
225
+ pluginsActions = {
226
+ ...pluginsActions,
227
+ ...pl.actions
228
+ };
229
+ }
230
+ if (pl.signals) {
231
+ pluginSignals = {
232
+ ...pluginSignals,
233
+ ...pl.signals
234
+ };
235
+ }
236
+ if (pl.pathMethods) {
237
+ pluginPathMethods = {
238
+ ...pluginPathMethods,
239
+ ...pl.pathMethods
240
+ };
241
+ }
242
+ }
243
+ const actions = {
244
+ $atoms: {
245
+ $session
246
+ },
247
+ $fetch,
248
+ ...pluginsActions,
249
+ ...additionalActions
250
+ };
251
+ const proxy = createDynamicPathProxy(
252
+ actions,
253
+ $fetch,
254
+ {
255
+ ...pluginPathMethods,
256
+ "/sign-out": "POST"
257
+ },
258
+ [
259
+ {
260
+ matcher: (path) => path === "/organization/create",
261
+ atom: "$listOrg"
262
+ },
263
+ {
264
+ matcher: (path) => path.startsWith("/organization"),
265
+ atom: "$activeOrgSignal"
266
+ },
267
+ {
268
+ matcher: (path) => path === "/sign-out" || path.startsWith("/sign-up") || path.startsWith("/sign-in"),
269
+ atom: "$sessionSignal"
270
+ },
271
+ ...pluginProxySignals
272
+ ],
273
+ {
274
+ $sessionSignal,
275
+ ...pluginSignals
276
+ }
277
+ );
278
+ return proxy;
279
+ };
280
+
281
+ // src/client/solid.ts
282
+ import { useStore } from "@nanostores/solid";
283
+ var createAuthClient2 = (options) => {
284
+ const $fetch = createAuthFetch(options);
285
+ const hooks = options?.authPlugins?.reduce(
286
+ (acc, plugin) => {
287
+ return {
288
+ ...acc,
289
+ ...plugin($fetch).integrations?.solid?.(useStore) || {}
290
+ };
291
+ },
292
+ {}
293
+ );
294
+ const client = createAuthClient(options, hooks);
295
+ function useSession() {
296
+ return useStore(client.$atoms.$session);
297
+ }
298
+ const obj = Object.assign(client, {
299
+ useSession
300
+ });
301
+ return obj;
302
+ };
303
+ export {
304
+ createAuthClient2 as createAuthClient
305
+ };
306
+ //# sourceMappingURL=solid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/base.ts","../src/error/better-auth-error.ts","../src/utils/base-url.ts","../src/client/fetch-plugins.ts","../src/client/proxy.ts","../src/client/session-atom.ts","../src/client/solid.ts"],"sourcesContent":["import { createFetch } from \"@better-fetch/fetch\";\nimport type { Auth } from \"../auth\";\nimport { getBaseURL } from \"../utils/base-url\";\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\nimport type { InferRoutes } from \"./path-to-object\";\nimport { createDynamicPathProxy, type AuthProxySignal } from \"./proxy\";\nimport { getSessionAtom } from \"./session-atom\";\nimport type { AuthPlugin, ClientOptions } from \"./type\";\nimport type { UnionToIntersection } from \"../types/helper\";\nimport type { PreinitializedWritableAtom } from \"nanostores\";\nimport type { BetterAuthPlugin } from \"../types/plugins\";\n\n/**\n * used for plugins only\n */\n\nexport const createAuthFetch = (options?: ClientOptions) => {\n\tconst $baseFetch = createFetch();\n\treturn createFetch({\n\t\tmethod: \"GET\",\n\t\t...options,\n\t\tbaseURL: getBaseURL(options?.baseURL).withPath,\n\t\tplugins: [\n\t\t\t...(options?.plugins || []),\n\t\t\t...(options?.authPlugins\n\t\t\t\t?.flatMap((plugin) => plugin($baseFetch).fetchPlugins)\n\t\t\t\t.filter((plugin) => plugin !== undefined) || []),\n\t\t\t...(options?.csrfPlugin !== false ? [csrfPlugin] : []),\n\t\t\tredirectPlugin,\n\t\t\taddCurrentURL,\n\t\t],\n\t});\n};\n\nexport const createAuthClient = <\n\tO extends ClientOptions = ClientOptions,\n\tAT extends Record<string, any> = {},\n>(\n\toptions?: O,\n\tadditionalActions = {} as AT,\n) => {\n\ttype API = O[\"authPlugins\"] extends Array<any>\n\t\t? (O[\"authPlugins\"] extends Array<infer Pl>\n\t\t\t\t? UnionToIntersection<\n\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\tReturnType<Pl> extends {\n\t\t\t\t\t\t\tplugin: infer Plug;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t? Plug extends BetterAuthPlugin\n\t\t\t\t\t\t\t\t? Plug[\"endpoints\"]\n\t\t\t\t\t\t\t\t: {}\n\t\t\t\t\t\t\t: {}\n\t\t\t\t\t>\n\t\t\t\t: {}) &\n\t\t\t\tAuth[\"api\"]\n\t\t: Auth[\"api\"];\n\n\tconst $fetch = createAuthFetch(options);\n\n\ttype Plugins = O[\"authPlugins\"] extends Array<AuthPlugin>\n\t\t? Array<ReturnType<O[\"authPlugins\"][number]>[\"plugin\"]>\n\t\t: undefined;\n\t//@ts-expect-error\n\tconst { $session, $sessionSignal } = getSessionAtom<{\n\t\thandler: any;\n\t\tapi: any;\n\t\toptions: {\n\t\t\tdatabase: any;\n\t\t\tplugins: Plugins;\n\t\t};\n\t}>($fetch);\n\n\tlet pluginsActions = {} as Record<string, any>;\n\ttype PluginActions = UnionToIntersection<\n\t\tO[\"authPlugins\"] extends Array<infer Pl>\n\t\t\t? //@ts-expect-error\n\t\t\t\tReturnType<Pl> extends {\n\t\t\t\t\tactions?: infer R;\n\t\t\t\t}\n\t\t\t\t? R\n\t\t\t\t: {}\n\t\t\t: {}\n\t>;\n\n\tconst pluginProxySignals: AuthProxySignal[] = [];\n\tlet pluginSignals: Record<string, PreinitializedWritableAtom<boolean>> = {};\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {};\n\n\tfor (const plugin of options?.authPlugins || []) {\n\t\tconst pl = plugin($fetch);\n\t\tif (pl.authProxySignal) {\n\t\t\tpluginProxySignals.push(...pl.authProxySignal);\n\t\t}\n\t\tif (pl.actions) {\n\t\t\tpluginsActions = {\n\t\t\t\t...pluginsActions,\n\t\t\t\t...pl.actions,\n\t\t\t};\n\t\t}\n\t\tif (pl.signals) {\n\t\t\tpluginSignals = {\n\t\t\t\t...pluginSignals,\n\t\t\t\t...pl.signals,\n\t\t\t};\n\t\t}\n\t\tif (pl.pathMethods) {\n\t\t\tpluginPathMethods = {\n\t\t\t\t...pluginPathMethods,\n\t\t\t\t...pl.pathMethods,\n\t\t\t};\n\t\t}\n\t}\n\n\tconst actions = {\n\t\t$atoms: {\n\t\t\t$session,\n\t\t},\n\t\t$fetch,\n\t\t...(pluginsActions as object),\n\t\t...additionalActions,\n\t};\n\n\ttype Actions = typeof actions & PluginActions;\n\n\tconst proxy = createDynamicPathProxy(\n\t\tactions,\n\t\t$fetch,\n\t\t{\n\t\t\t...pluginPathMethods,\n\t\t\t\"/sign-out\": \"POST\",\n\t\t},\n\t\t[\n\t\t\t{\n\t\t\t\tmatcher: (path) => path === \"/organization/create\",\n\t\t\t\tatom: \"$listOrg\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tmatcher: (path) => path.startsWith(\"/organization\"),\n\t\t\t\tatom: \"$activeOrgSignal\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tmatcher: (path) =>\n\t\t\t\t\tpath === \"/sign-out\" ||\n\t\t\t\t\tpath.startsWith(\"/sign-up\") ||\n\t\t\t\t\tpath.startsWith(\"/sign-in\"),\n\t\t\t\tatom: \"$sessionSignal\",\n\t\t\t},\n\t\t\t...pluginProxySignals,\n\t\t],\n\t\t{\n\t\t\t$sessionSignal,\n\t\t\t...pluginSignals,\n\t\t},\n\t) as unknown as InferRoutes<API> & Actions;\n\treturn proxy;\n};\n","export class BetterAuthError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t}\n}\n","import { BetterAuthError } from \"../error/better-auth-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\tconsole.error(\"Invalid URL:\", error);\n\t\treturn false;\n\t}\n}\n\nfunction withPath(url: string, path = \"/api/auth\") {\n\tconst hasPath = checkHasPath(url);\n\tif (hasPath) {\n\t\treturn {\n\t\t\tbaseURL: new URL(url).origin,\n\t\t\twithPath: url,\n\t\t};\n\t}\n\tpath = path.startsWith(\"/\") ? path : `/${path}`;\n\treturn {\n\t\tbaseURL: url,\n\t\twithPath: `${url}${path}`,\n\t};\n}\n\nexport function getBaseURL(url?: string, path?: string) {\n\tif (url) {\n\t\treturn withPath(url, path);\n\t}\n\t//@ts-ignore\n\tconst env: any =\n\t\ttypeof process !== \"undefined\"\n\t\t\t? process.env\n\t\t\t: typeof import.meta !== \"undefined\"\n\t\t\t\t? //@ts-ignore\n\t\t\t\t\timport.meta.env\n\t\t\t\t: {};\n\tconst fromEnv =\n\t\tenv.BETTER_AUTH_URL ||\n\t\tenv.AUTH_URL ||\n\t\tenv.NEXT_PUBLIC_AUTH_URL ||\n\t\tenv.NEXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.PUBLIC_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\tif (fromEnv) {\n\t\treturn withPath(fromEnv, path);\n\t}\n\n\tconst isDev =\n\t\t!fromEnv && (env.NODE_ENV === \"development\" || env.NODE_ENV === \"test\");\n\tif (isDev) {\n\t\treturn {\n\t\t\tbaseURL: \"http://localhost:3000\",\n\t\t\twithPath: \"http://localhost:3000/api/auth\",\n\t\t};\n\t}\n\tthrow new BetterAuthError(\n\t\t\"Could not infer baseURL from environment variables\",\n\t);\n}\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error/better-auth-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\twindow.location.href = context.data.url;\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});\n\t\t\tif (error?.status === 404) {\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"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);\n\t\t\t}\n\t\t\tif (error) {\n\t\t\t\tthrow new BetterAuthError(error.message || \"Failed to get CSRF token.\");\n\t\t\t}\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: data.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 } from \"@better-fetch/fetch\";\nimport type { PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { LiteralUnion } from \"../types/helper\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs?: ProxyRequest,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { options, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (options?.method) {\n\t\treturn options.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: LiteralUnion<string, \"$sessionSignal\">;\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\t$signal?: AuthProxySignal[],\n\t$signals?: Record<string, PreinitializedWritableAtom<boolean>>,\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\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\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\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\t\t\t\tconst { query, options, ...body } = arg;\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody: method === \"GET\" ? undefined : body,\n\t\t\t\t\tquery: query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tconst signal = $signal?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\tconst signalAtom = $signals?.[signal.atom];\n\t\t\t\t\t\tif (!signalAtom) return;\n\t\t\t\t\t\tsignalAtom.set(!signalAtom.get());\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\treturn createProxy() as T;\n}\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport { atom, computed, task } from \"nanostores\";\nimport type { Auth as BetterAuth } from \"../auth\";\nimport type { Prettify } from \"../types/helper\";\nimport type { InferSession, InferUser } from \"../types/models\";\n\nexport function getSessionAtom<Auth extends BetterAuth>(client: BetterFetch) {\n\ttype UserWithAdditionalFields = InferUser<Auth[\"options\"]>;\n\ttype SessionWithAdditionalFields = InferSession<Auth[\"options\"]>;\n\tconst $signal = atom<boolean>(false);\n\tconst $session = computed($signal, () =>\n\t\ttask(async () => {\n\t\t\tconst session = await client(\"/session\", {\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\t\t\treturn session.data as {\n\t\t\t\tuser: Prettify<UserWithAdditionalFields>;\n\t\t\t\tsession: Prettify<SessionWithAdditionalFields>;\n\t\t\t} | null;\n\t\t}),\n\t);\n\treturn { $session, $sessionSignal: $signal };\n}\n","import type { AuthPlugin, ClientOptions } from \"./type\";\nimport { createAuthFetch, createAuthClient as createClient } from \"./base\";\nimport { useStore } from \"@nanostores/solid\";\nimport type * as SolidJS from \"solid-js\"; //to fix ts error: This is likely not portable. A type annotation is necessary.\nimport type { UnionToIntersection } from \"../types/helper\";\nexport const createAuthClient = <Option extends ClientOptions>(\n\toptions?: Option,\n) => {\n\tconst $fetch = createAuthFetch(options);\n\tconst hooks = options?.authPlugins?.reduce(\n\t\t(acc, plugin) => {\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t...(plugin($fetch).integrations?.solid?.(useStore) || {}),\n\t\t\t};\n\t\t},\n\t\t{} as Record<string, any>,\n\t) as Option[\"authPlugins\"] extends Array<infer Pl>\n\t\t? Pl extends AuthPlugin\n\t\t\t? UnionToIntersection<\n\t\t\t\t\tReturnType<Pl>[\"integrations\"] extends\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\treact?: (useStore: any) => infer R;\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| undefined\n\t\t\t\t\t\t? R\n\t\t\t\t\t\t: {}\n\t\t\t\t>\n\t\t\t: {}\n\t\t: {};\n\n\tconst client = createClient(options, hooks);\n\n\tfunction useSession() {\n\t\treturn useStore(client.$atoms.$session);\n\t}\n\tconst obj = Object.assign(client, {\n\t\tuseSession,\n\t});\n\treturn obj;\n};\n"],"mappings":"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","names":["createAuthClient"]}
@@ -0,0 +1,81 @@
1
+ import { L as LiteralString } from './helper-B5_2Vzba.js';
2
+
3
+ type SubArray<T extends unknown[] | readonly unknown[] | any[]> = T[number][];
4
+ type Subset<K extends keyof R, R extends Record<string | LiteralString, readonly string[] | readonly LiteralString[]>> = {
5
+ [P in K]: SubArray<R[P]>;
6
+ };
7
+ type StatementsPrimitive = {
8
+ readonly [resource: string]: readonly LiteralString[];
9
+ };
10
+
11
+ declare class ParsingError extends Error {
12
+ readonly path: string;
13
+ constructor(message: string, path: string);
14
+ }
15
+ type Connector = "OR" | "AND";
16
+ declare class AccessControl<TStatements extends StatementsPrimitive = StatementsPrimitive> {
17
+ private readonly s;
18
+ private readonly statements;
19
+ constructor(s: TStatements);
20
+ newRole<K extends keyof TStatements>(statements: Subset<K, TStatements>): Role<Subset<K, TStatements>>;
21
+ }
22
+ type AuthortizeResponse = {
23
+ success: false;
24
+ error: string;
25
+ } | {
26
+ success: true;
27
+ error?: never;
28
+ };
29
+ declare class Role<TStatements extends StatementsPrimitive> {
30
+ readonly statements: TStatements;
31
+ constructor(statements: TStatements);
32
+ authorize<K extends keyof TStatements>(request: Subset<K, TStatements>, connector?: Connector): AuthortizeResponse;
33
+ static fromString<TStatements extends StatementsPrimitive>(s: string): Role<TStatements>;
34
+ toString(): string;
35
+ }
36
+
37
+ declare const createAccessControl: <S extends StatementsPrimitive>(statements: S) => AccessControl<S>;
38
+ declare const defaultStatements: {
39
+ readonly organization: readonly ["update", "delete"];
40
+ readonly member: readonly ["create", "update", "delete"];
41
+ readonly invitation: readonly ["create", "cancel"];
42
+ };
43
+ declare const defaultAc: AccessControl<{
44
+ readonly organization: readonly ["update", "delete"];
45
+ readonly member: readonly ["create", "update", "delete"];
46
+ readonly invitation: readonly ["create", "cancel"];
47
+ }>;
48
+ declare const adminAc: Role<Subset<"member" | "organization" | "invitation", {
49
+ readonly organization: readonly ["update", "delete"];
50
+ readonly member: readonly ["create", "update", "delete"];
51
+ readonly invitation: readonly ["create", "cancel"];
52
+ }>>;
53
+ declare const ownerAc: Role<Subset<"member" | "organization" | "invitation", {
54
+ readonly organization: readonly ["update", "delete"];
55
+ readonly member: readonly ["create", "update", "delete"];
56
+ readonly invitation: readonly ["create", "cancel"];
57
+ }>>;
58
+ declare const memberAc: Role<Subset<"member" | "organization" | "invitation", {
59
+ readonly organization: readonly ["update", "delete"];
60
+ readonly member: readonly ["create", "update", "delete"];
61
+ readonly invitation: readonly ["create", "cancel"];
62
+ }>>;
63
+ declare const defaultRoles: {
64
+ admin: Role<Subset<"member" | "organization" | "invitation", {
65
+ readonly organization: readonly ["update", "delete"];
66
+ readonly member: readonly ["create", "update", "delete"];
67
+ readonly invitation: readonly ["create", "cancel"];
68
+ }>>;
69
+ owner: Role<Subset<"member" | "organization" | "invitation", {
70
+ readonly organization: readonly ["update", "delete"];
71
+ readonly member: readonly ["create", "update", "delete"];
72
+ readonly invitation: readonly ["create", "cancel"];
73
+ }>>;
74
+ member: Role<Subset<"member" | "organization" | "invitation", {
75
+ readonly organization: readonly ["update", "delete"];
76
+ readonly member: readonly ["create", "update", "delete"];
77
+ readonly invitation: readonly ["create", "cancel"];
78
+ }>>;
79
+ };
80
+
81
+ export { AccessControl as A, ParsingError as P, Role as R, type StatementsPrimitive as S, type AuthortizeResponse as a, type SubArray as b, type Subset as c, adminAc as d, createAccessControl as e, defaultAc as f, defaultRoles as g, defaultStatements as h, memberAc as m, ownerAc as o };
@@ -1,19 +1,22 @@
1
- import { B as BetterAuthHandler, a as BetterAuth } from './index-UcTu1vUg.js';
2
- import 'node:http';
3
- import './options-CH15FEBw.js';
4
- import './types-DAxaMWCy.js';
1
+ import { A as Auth, a as BetterAuthOptions } from './index-W5nXvJ-p.js';
2
+ import 'better-call';
5
3
  import 'zod';
4
+ import './helper-B5_2Vzba.js';
5
+ import './schema-BOszzrbQ.js';
6
+ import 'arctic';
7
+ import 'kysely';
6
8
 
7
- declare const toSvelteKitHandler: (handler: BetterAuthHandler) => (event: {
9
+ declare const toSvelteKitHandler: (auth: Auth) => (event: {
8
10
  request: Request;
9
11
  }) => Promise<Response>;
10
12
  declare const svelteKitHandler: ({ auth, event, resolve, }: {
11
- auth: BetterAuth;
13
+ auth: Auth;
12
14
  event: {
13
15
  request: Request;
14
16
  url: URL;
15
17
  };
16
18
  resolve: (event: any) => any;
17
19
  }) => any;
20
+ declare function isAuthPath(url: string, options: BetterAuthOptions): boolean;
18
21
 
19
- export { svelteKitHandler, toSvelteKitHandler };
22
+ export { isAuthPath, svelteKitHandler, toSvelteKitHandler };
@@ -1,22 +1,7 @@
1
1
  // src/integrations/svelte-kit.ts
2
2
  import { building } from "$app/environment";
3
-
4
- // src/utils/request.ts
5
- import { z } from "zod";
6
- function isAuthPath(url, options) {
7
- const _url = new URL(url);
8
- const baseURL = new URL(options.baseURL || _url.origin);
9
- const basePath = options.basePath || "/api/auth";
10
- if (_url.origin !== baseURL.origin)
11
- return false;
12
- if (!_url.pathname.startsWith(basePath))
13
- return false;
14
- return true;
15
- }
16
-
17
- // src/integrations/svelte-kit.ts
18
- var toSvelteKitHandler = (handler) => {
19
- return (event) => handler(event.request);
3
+ var toSvelteKitHandler = (auth) => {
4
+ return (event) => auth.handler(event.request);
20
5
  };
21
6
  var svelteKitHandler = ({
22
7
  auth,
@@ -28,11 +13,21 @@ var svelteKitHandler = ({
28
13
  }
29
14
  const { request, url } = event;
30
15
  if (isAuthPath(url.toString(), auth.options)) {
16
+ console.log("here");
31
17
  return auth.handler(request);
32
18
  }
33
19
  return resolve(event);
34
20
  };
21
+ function isAuthPath(url, options) {
22
+ const _url = new URL(url);
23
+ const baseURL = new URL(options.baseURL || _url.origin);
24
+ const basePath = options.basePath || "/api/auth";
25
+ if (_url.origin !== baseURL.origin) return false;
26
+ if (!_url.pathname.startsWith(basePath)) return false;
27
+ return true;
28
+ }
35
29
  export {
30
+ isAuthPath,
36
31
  svelteKitHandler,
37
32
  toSvelteKitHandler
38
33
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/integrations/svelte-kit.ts","../src/utils/request.ts"],"sourcesContent":["//@ts-expect-error\nimport { building } from \"$app/environment\";\nimport type { BetterAuth, BetterAuthHandler } from \"..\";\nimport { isAuthPath } from \"../utils/request\";\n\nexport const toSvelteKitHandler = (handler: BetterAuthHandler) => {\n\treturn (event: { request: Request }) => handler(event.request);\n};\n\nexport const svelteKitHandler = ({\n\tauth,\n\tevent,\n\tresolve,\n}: {\n\tauth: BetterAuth;\n\tevent: { request: Request; url: URL };\n\tresolve: (event: any) => any;\n}) => {\n\tif (building) {\n\t\treturn resolve(event);\n\t}\n\tconst { request, url } = event;\n\tif (isAuthPath(url.toString(), auth.options)) {\n\t\treturn auth.handler(request);\n\t}\n\treturn resolve(event);\n};\n","import { type IncomingHttpHeaders, IncomingMessage } from \"node:http\";\nimport { InvalidRequest, InvalidURL } from \"@better-auth/shared/error\";\nimport { z } from \"zod\";\nimport type { BetterAuthOptions } from \"../options\";\n\nexport async function getBody<T>(request: IncomingMessage | Request) {\n\ttry {\n\t\tif (request instanceof Request) return await request.json();\n\t\treturn new Promise<T>((resolve) => {\n\t\t\tconst bodyParts: any[] = [];\n\t\t\tlet body: string;\n\t\t\trequest\n\t\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\t\tbodyParts.push(chunk);\n\t\t\t\t})\n\t\t\t\t.on(\"end\", () => {\n\t\t\t\t\tbody = Buffer.concat(bodyParts).toString();\n\t\t\t\t\tresolve(JSON.parse(body));\n\t\t\t\t});\n\t\t});\n\t} catch {\n\t\tthrow new InvalidRequest();\n\t}\n}\n\nexport const toRequestHeader = (\n\tincomingHeaders: IncomingHttpHeaders | Headers,\n): Headers => {\n\tif (incomingHeaders instanceof Headers) return incomingHeaders;\n\tconst headers = new Headers();\n\tfor (const [key, value] of Object.entries(incomingHeaders)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const val of value) {\n\t\t\t\theaders.append(key, val);\n\t\t\t}\n\t\t} else if (value) {\n\t\t\theaders.append(key, value);\n\t\t}\n\t}\n\treturn headers;\n};\nfunction getUrl(request: IncomingMessage | Request) {\n\tconst url =\n\t\trequest instanceof IncomingMessage\n\t\t\t? `${request.headers.host}${(request as any).originalUrl}`\n\t\t\t: request.url;\n\treturn new URL(url);\n}\n\nexport function isValidHttpMethod(method?: string) {\n\tif (method?.toUpperCase() !== \"POST\" && method?.toUpperCase() !== \"GET\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport type InternalURL = {\n\torigin: string;\n\thost: string;\n\tpath: string;\n\tbase: string;\n\ttoString: () => string;\n};\nexport function parseUrl(\n\trequest: IncomingMessage | Request,\n\toptions: BetterAuthOptions,\n) {\n\tlet requestStringURL =\n\t\trequest instanceof IncomingMessage\n\t\t\t? `${request.headers.host}${request.url}`\n\t\t\t: request.url;\n\tif (!requestStringURL.startsWith(\"http\")) {\n\t\tif (requestStringURL.startsWith(\"localhost\")) {\n\t\t\trequestStringURL = `http://${requestStringURL}`;\n\t\t} else {\n\t\t\trequestStringURL = `https://${requestStringURL}`;\n\t\t}\n\t}\n\tconst requestURL = new URL(requestStringURL);\n\tconst baseURL = requestURL.origin;\n\tconst basePath = options.basePath || \"/api/auth\";\n\tlet urlString = `${baseURL}${basePath}`;\n\tif (!urlString.startsWith(\"http\")) {\n\t\turlString = `https://${urlString}`;\n\t}\n\tconst isValidURL = z.string().url().safeParse(urlString);\n\tlet action = requestURL.pathname.split(basePath)[1] || \"\";\n\t//replace the first / in the action\n\taction = action.replace(\"/\", \"\");\n\tif (isValidURL.error) {\n\t\tthrow new InvalidURL();\n\t}\n\t/**\n\t * If the action is a callback, we need to extract the\n\t * provider form the URL.\n\t */\n\tif (action.startsWith(\"callback\")) {\n\t\tconst provider = action.split(\"/\")[1];\n\t\tif (!provider) throw new InvalidURL(\"Provider is missing in the URL.\");\n\t\taction = \"callback\";\n\t\trequestURL.searchParams.set(\"provider\", provider);\n\t}\n\tconst url = new URL(urlString);\n\trequestURL.searchParams.forEach((value, key) => {\n\t\turl.searchParams.set(key, value);\n\t});\n\treturn {\n\t\turl,\n\t\taction,\n\t};\n}\n\nexport function isAuthPath(url: string, options: BetterAuthOptions) {\n\tconst _url = new URL(url);\n\tconst baseURL = new URL(options.baseURL || _url.origin);\n\tconst basePath = options.basePath || \"/api/auth\";\n\tif (_url.origin !== baseURL.origin) return false;\n\tif (!_url.pathname.startsWith(basePath)) return false;\n\treturn true;\n}\n"],"mappings":";AACA,SAAS,gBAAgB;;;ACCzB,SAAS,SAAS;AA8GX,SAAS,WAAW,KAAa,SAA4B;AACnE,QAAM,OAAO,IAAI,IAAI,GAAG;AACxB,QAAM,UAAU,IAAI,IAAI,QAAQ,WAAW,KAAK,MAAM;AACtD,QAAM,WAAW,QAAQ,YAAY;AACrC,MAAI,KAAK,WAAW,QAAQ;AAAQ,WAAO;AAC3C,MAAI,CAAC,KAAK,SAAS,WAAW,QAAQ;AAAG,WAAO;AAChD,SAAO;AACR;;;ADlHO,IAAM,qBAAqB,CAAC,YAA+B;AACjE,SAAO,CAAC,UAAgC,QAAQ,MAAM,OAAO;AAC9D;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACD,MAIM;AACL,MAAI,UAAU;AACb,WAAO,QAAQ,KAAK;AAAA,EACrB;AACA,QAAM,EAAE,SAAS,IAAI,IAAI;AACzB,MAAI,WAAW,IAAI,SAAS,GAAG,KAAK,OAAO,GAAG;AAC7C,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC5B;AACA,SAAO,QAAQ,KAAK;AACrB;","names":[]}
1
+ {"version":3,"sources":["../src/integrations/svelte-kit.ts"],"sourcesContent":["//@ts-expect-error\nimport { building } from \"$app/environment\";\nimport type { Auth } from \"../auth\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport const toSvelteKitHandler = (auth: Auth) => {\n\treturn (event: { request: Request }) => auth.handler(event.request);\n};\n\nexport const svelteKitHandler = ({\n\tauth,\n\tevent,\n\tresolve,\n}: {\n\tauth: Auth;\n\tevent: { request: Request; url: URL };\n\tresolve: (event: any) => any;\n}) => {\n\tif (building) {\n\t\treturn resolve(event);\n\t}\n\tconst { request, url } = event;\n\tif (isAuthPath(url.toString(), auth.options)) {\n\t\tconsole.log(\"here\");\n\t\treturn auth.handler(request);\n\t}\n\treturn resolve(event);\n};\n\nexport function isAuthPath(url: string, options: BetterAuthOptions) {\n\tconst _url = new URL(url);\n\tconst baseURL = new URL(options.baseURL || _url.origin);\n\tconst basePath = options.basePath || \"/api/auth\";\n\tif (_url.origin !== baseURL.origin) return false;\n\tif (!_url.pathname.startsWith(basePath)) return false;\n\treturn true;\n}\n"],"mappings":";AACA,SAAS,gBAAgB;AAIlB,IAAM,qBAAqB,CAAC,SAAe;AACjD,SAAO,CAAC,UAAgC,KAAK,QAAQ,MAAM,OAAO;AACnE;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACD,MAIM;AACL,MAAI,UAAU;AACb,WAAO,QAAQ,KAAK;AAAA,EACrB;AACA,QAAM,EAAE,SAAS,IAAI,IAAI;AACzB,MAAI,WAAW,IAAI,SAAS,GAAG,KAAK,OAAO,GAAG;AAC7C,YAAQ,IAAI,MAAM;AAClB,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC5B;AACA,SAAO,QAAQ,KAAK;AACrB;AAEO,SAAS,WAAW,KAAa,SAA4B;AACnE,QAAM,OAAO,IAAI,IAAI,GAAG;AACxB,QAAM,UAAU,IAAI,IAAI,QAAQ,WAAW,KAAK,MAAM;AACtD,QAAM,WAAW,QAAQ,YAAY;AACrC,MAAI,KAAK,WAAW,QAAQ,OAAQ,QAAO;AAC3C,MAAI,CAAC,KAAK,SAAS,WAAW,QAAQ,EAAG,QAAO;AAChD,SAAO;AACR;","names":[]}