@niledatabase/client 5.1.0 → 5.2.0-alpha.3

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/index.d.mts CHANGED
@@ -1,6 +1,14 @@
1
1
  import { IncomingMessage } from 'http';
2
2
 
3
3
  interface SignInResponse {
4
+ data?: {
5
+ expiresAt: Date;
6
+ method: 'authenticator' | 'email';
7
+ otpauthUrl: string;
8
+ scope: 'setup' | 'challenge';
9
+ secret: 'string';
10
+ token: 'string';
11
+ };
4
12
  error: string | null;
5
13
  status: number;
6
14
  ok: boolean;
@@ -112,6 +120,11 @@ type GetSessionParams = CtxOrReq & {
112
120
  baseUrl?: string;
113
121
  init?: RequestInit;
114
122
  };
123
+ type BaseFetchOptions = {
124
+ baseUrl?: string;
125
+ auth?: Authorizer | PartialAuthorizer;
126
+ init?: RequestInit;
127
+ };
115
128
  declare enum State {
116
129
  SESSION = "getSession"
117
130
  }
@@ -185,6 +198,14 @@ declare class Authorizer {
185
198
  callbackUrl?: string;
186
199
  redirect?: boolean;
187
200
  }): Promise<Response | undefined>;
201
+ mfa(options?: BaseFetchOptions & {
202
+ fetchUrl?: string;
203
+ token?: string;
204
+ scope?: 'setup' | 'challenge';
205
+ method?: 'authenticator' | 'email';
206
+ code?: string;
207
+ remove?: boolean;
208
+ }): Promise<any>;
188
209
  }
189
210
  declare const authorizer: Authorizer;
190
211
  declare const auth: Authorizer;
@@ -196,6 +217,7 @@ declare const signIn: typeof authorizer.signIn;
196
217
  declare const signUp: typeof authorizer.signUp;
197
218
  declare const resetPassword: typeof authorizer.resetPassword;
198
219
  declare const forgotPassword: typeof authorizer.forgotPassword;
220
+ declare const mfa: typeof authorizer.mfa;
199
221
 
200
222
  declare function getStatus(load: boolean, sess: NonErrorSession | null | undefined): "loading" | "authenticated" | "unauthenticated";
201
223
 
@@ -214,4 +236,4 @@ declare const broadcast: {
214
236
  post(message: Record<string, unknown>): void;
215
237
  };
216
238
 
217
- export { type ActiveSession, type AuthConfig, type AuthState, Authorizer, type BuiltInProviderType, type ClientSafeProvider, type Config, type CtxOrReq, type JWT, type Listener, type ListenerKeys, type ListenerParams, type LiteralUnion, type NileSession, type NonErrorSession, type PartialAuthorizer, type ProviderType, type RedirectableProviderType, type SignInAuthorizationParams, type SignInOptions, type SignInResponse, type SignOutParams, type SignOutResponse, auth, broadcast, forgotPassword, getCsrfToken, getProviders, getSession, getStatus, resetPassword, signIn, signOut, signUp };
239
+ export { type ActiveSession, type AuthConfig, type AuthState, Authorizer, type BuiltInProviderType, type ClientSafeProvider, type Config, type CtxOrReq, type JWT, type Listener, type ListenerKeys, type ListenerParams, type LiteralUnion, type NileSession, type NonErrorSession, type PartialAuthorizer, type ProviderType, type RedirectableProviderType, type SignInAuthorizationParams, type SignInOptions, type SignInResponse, type SignOutParams, type SignOutResponse, auth, broadcast, forgotPassword, getCsrfToken, getProviders, getSession, getStatus, mfa, resetPassword, signIn, signOut, signUp };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,14 @@
1
1
  import { IncomingMessage } from 'http';
2
2
 
3
3
  interface SignInResponse {
4
+ data?: {
5
+ expiresAt: Date;
6
+ method: 'authenticator' | 'email';
7
+ otpauthUrl: string;
8
+ scope: 'setup' | 'challenge';
9
+ secret: 'string';
10
+ token: 'string';
11
+ };
4
12
  error: string | null;
5
13
  status: number;
6
14
  ok: boolean;
@@ -112,6 +120,11 @@ type GetSessionParams = CtxOrReq & {
112
120
  baseUrl?: string;
113
121
  init?: RequestInit;
114
122
  };
123
+ type BaseFetchOptions = {
124
+ baseUrl?: string;
125
+ auth?: Authorizer | PartialAuthorizer;
126
+ init?: RequestInit;
127
+ };
115
128
  declare enum State {
116
129
  SESSION = "getSession"
117
130
  }
@@ -185,6 +198,14 @@ declare class Authorizer {
185
198
  callbackUrl?: string;
186
199
  redirect?: boolean;
187
200
  }): Promise<Response | undefined>;
201
+ mfa(options?: BaseFetchOptions & {
202
+ fetchUrl?: string;
203
+ token?: string;
204
+ scope?: 'setup' | 'challenge';
205
+ method?: 'authenticator' | 'email';
206
+ code?: string;
207
+ remove?: boolean;
208
+ }): Promise<any>;
188
209
  }
189
210
  declare const authorizer: Authorizer;
190
211
  declare const auth: Authorizer;
@@ -196,6 +217,7 @@ declare const signIn: typeof authorizer.signIn;
196
217
  declare const signUp: typeof authorizer.signUp;
197
218
  declare const resetPassword: typeof authorizer.resetPassword;
198
219
  declare const forgotPassword: typeof authorizer.forgotPassword;
220
+ declare const mfa: typeof authorizer.mfa;
199
221
 
200
222
  declare function getStatus(load: boolean, sess: NonErrorSession | null | undefined): "loading" | "authenticated" | "unauthenticated";
201
223
 
@@ -214,4 +236,4 @@ declare const broadcast: {
214
236
  post(message: Record<string, unknown>): void;
215
237
  };
216
238
 
217
- export { type ActiveSession, type AuthConfig, type AuthState, Authorizer, type BuiltInProviderType, type ClientSafeProvider, type Config, type CtxOrReq, type JWT, type Listener, type ListenerKeys, type ListenerParams, type LiteralUnion, type NileSession, type NonErrorSession, type PartialAuthorizer, type ProviderType, type RedirectableProviderType, type SignInAuthorizationParams, type SignInOptions, type SignInResponse, type SignOutParams, type SignOutResponse, auth, broadcast, forgotPassword, getCsrfToken, getProviders, getSession, getStatus, resetPassword, signIn, signOut, signUp };
239
+ export { type ActiveSession, type AuthConfig, type AuthState, Authorizer, type BuiltInProviderType, type ClientSafeProvider, type Config, type CtxOrReq, type JWT, type Listener, type ListenerKeys, type ListenerParams, type LiteralUnion, type NileSession, type NonErrorSession, type PartialAuthorizer, type ProviderType, type RedirectableProviderType, type SignInAuthorizationParams, type SignInOptions, type SignInResponse, type SignOutParams, type SignOutResponse, auth, broadcast, forgotPassword, getCsrfToken, getProviders, getSession, getStatus, mfa, resetPassword, signIn, signOut, signUp };
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ __export(index_exports, {
28
28
  getProviders: () => getProviders,
29
29
  getSession: () => getSession,
30
30
  getStatus: () => getStatus,
31
+ mfa: () => mfa,
31
32
  resetPassword: () => resetPassword,
32
33
  signIn: () => signIn,
33
34
  signOut: () => signOut,
@@ -314,6 +315,11 @@ var Authorizer = class {
314
315
  updatedUrl.searchParams.set("error", error);
315
316
  return { url: updatedUrl.toString() };
316
317
  }
318
+ if (res?.status === 404) {
319
+ const updatedUrl = new URL(url);
320
+ updatedUrl.searchParams.set("error", "Not found");
321
+ return { url: updatedUrl.toString() };
322
+ }
317
323
  }
318
324
  } catch (error) {
319
325
  if (error instanceof Error) {
@@ -352,12 +358,12 @@ var Authorizer = class {
352
358
  url: res.url
353
359
  };
354
360
  }
355
- const { url: responseUrl } = await res.json();
361
+ const data = await res.json();
356
362
  return {
357
- data: {},
363
+ data,
358
364
  status: res.status,
359
365
  ok: res?.ok,
360
- url: responseUrl
366
+ url: data.url
361
367
  };
362
368
  }
363
369
  throw new Error(`Unable to fetch ${url}`);
@@ -522,6 +528,15 @@ var Authorizer = class {
522
528
  window.location.reload();
523
529
  return;
524
530
  }
531
+ if (data?.status === 401 && "scope" in data.data && (redirect || !isSupportingReturn)) {
532
+ const url = data?.data.url ?? callbackUrl;
533
+ const error2 = data?.data?.url ? new URL(String(data?.data?.url)).searchParams.get("error") : null;
534
+ if (!error2) {
535
+ window.location.href = url;
536
+ if (url.includes("#")) window.location.reload();
537
+ return;
538
+ }
539
+ }
525
540
  if (data?.ok && (redirect || !isSupportingReturn)) {
526
541
  const url = data?.data.url ?? callbackUrl;
527
542
  window.location.href = url;
@@ -533,12 +548,18 @@ var Authorizer = class {
533
548
  await this.initialize();
534
549
  await this.getSession({ event: "storage" });
535
550
  }
536
- return {
551
+ const providerData = data?.data;
552
+ const shouldIncludeData = !!providerData && Object.keys(providerData).some((key) => key !== "url");
553
+ const response = {
537
554
  error,
538
555
  status: data?.status,
539
- ok: data?.ok,
556
+ ok: Boolean(data?.ok),
540
557
  url: error ? null : data?.url
541
558
  };
559
+ if (shouldIncludeData) {
560
+ response.data = data?.data;
561
+ }
562
+ return response;
542
563
  }
543
564
  async signUp(options) {
544
565
  const {
@@ -668,6 +689,34 @@ var Authorizer = class {
668
689
  });
669
690
  }
670
691
  }
692
+ async mfa(options) {
693
+ const {
694
+ token,
695
+ scope = "challenge",
696
+ method = "authenticator",
697
+ code,
698
+ fetchUrl
699
+ } = options ?? {};
700
+ if (options) {
701
+ this.#configureFetch(options);
702
+ }
703
+ const overrideMethod = options?.init?.method;
704
+ const baseMethod = token ? "put" : "post";
705
+ const mfaUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/mfa`;
706
+ const init = {
707
+ method: overrideMethod ?? baseMethod
708
+ };
709
+ if (init.method === "put") {
710
+ init.body = JSON.stringify({ token, scope, method, code });
711
+ } else if (init.method === "post") {
712
+ init.body = JSON.stringify({ method, scope });
713
+ }
714
+ if (options?.remove) {
715
+ init.method = "delete";
716
+ }
717
+ const res = await this.#fetchData(mfaUrl, init);
718
+ return res;
719
+ }
671
720
  #configureFetch(params) {
672
721
  const { baseUrl, init, auth: auth2 } = params;
673
722
  if (baseUrl) {
@@ -734,6 +783,9 @@ var resetPassword = async function resetPassword2(options) {
734
783
  var forgotPassword = async function forgotPassword2(options) {
735
784
  return auth.forgotPassword(options);
736
785
  };
786
+ var mfa = async function setupMfa(options) {
787
+ return auth.mfa(options);
788
+ };
737
789
 
738
790
  // src/status.ts
739
791
  function getStatus(load, sess) {
@@ -755,6 +807,7 @@ function getStatus(load, sess) {
755
807
  getProviders,
756
808
  getSession,
757
809
  getStatus,
810
+ mfa,
758
811
  resetPassword,
759
812
  signIn,
760
813
  signOut,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["export {\n auth,\n getSession,\n getCsrfToken,\n signOut,\n signIn,\n signUp,\n resetPassword,\n forgotPassword,\n getProviders,\n default as Authorizer,\n} from './Authorizer';\nexport { getStatus } from './status';\nexport { broadcast } from './broadcast';\nexport * from './types';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = this.getSession.bind(this);\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n\n async forgotPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'put',\n body: JSON.stringify({\n password,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n return data;\n }\n\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\n\nexport const signIn: typeof authorizer.signIn = async function signIn(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\n\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n\nexport const forgotPassword: typeof authorizer.forgotPassword =\n async function forgotPassword(options) {\n return auth.forgotPassword(options);\n };\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC;AAAA,EACA,YAAY,OAAuB;AAEjC,UAAO,OAAiB,WAAW,KAAK;AACxC,SAAK,OAAO;AACZ,SAAK,OAAQ,MAAc;AAC3B,QAAI,iBAAiB,OAAO;AAC1B,WAAK,QAAQ,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAIA,SAAS,YAAY,GAAqB;AACxC,MAAI,aAAa,SAAS,EAAE,aAAa,eAAe;AACtD,WAAO,KAAK,UAAU,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,CAAC;AAAA,EAC5E;AACA,MAAI,iBAAiB,CAAC,GAAG;AACvB,MAAE,QAAQ,YAAY,EAAE,KAAK;AAC7B,MAAE,UAAU,EAAE,WAAW,EAAE,MAAM;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,iBACP,GAC+C;AAC/C,SAAO,CAAC,CAAE,GAAW;AACvB;AA2BA,IAAM,UAA0B;AAAA,EAC9B,MAAM,MAAM,UAAU;AACpB,eAAW,YAAY,QAAQ;AAC/B,YAAQ,MAAM,sBAAsB,IAAI,KAAK,SAAS,SAAS,QAAQ;AAAA,EACzE;AAAA,EACA,KAAK,MAAM;AACT,YAAQ,KAAK,qBAAqB,IAAI,GAAG;AAAA,EAC3C;AAAA,EACA,MAAM,MAAM,UAAU;AACpB,YAAQ,IAAI,sBAAsB,IAAI,KAAK,QAAQ;AAAA,EACrD;AACF;AAqBO,SAAS,YACdA,UAAyB,SACzBC,aACgB;AAChB,MAAI;AACF,QAAI,OAAO,WAAW,aAAa;AACjC,aAAOD;AAAA,IACT;AAEA,UAAM,eAAwC,CAAC;AAC/C,eAAW,SAASA,SAAQ;AAC1B,mBAAa,KAAK,IAAI,CAAC,MAAc,aAAoB;AACvD,gBAAQ,KAAK,EAAE,MAAM,QAAQ;AAE7B,YAAI,UAAU,SAAS;AACrB,qBAAW,YAAY,QAAQ;AAAA,QACjC;AACA,QAAC,SAAiB,SAAS;AAC3B,cAAM,MAAM,GAAGC,YAAW,MAAM,QAAQ;AACxC,cAAM,OAAO,IAAI,gBAAgB,EAAE,OAAO,MAAM,GAAI,SAAiB,CAAC;AACtE,YAAI,UAAU,YAAY;AACxB,iBAAO,UAAU,WAAW,KAAK,IAAI;AAAA,QACvC;AACA,eAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,SAAS,CAACA,gBACrB,YAAY,SAASA,WAAU;;;ACtI1B,SAAS,MAAM;AACpB,SAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACrC;AAeO,SAAS,iBAAiB,OAAO,oBAAoB;AAC1D,SAAO;AAAA;AAAA,IAEL,QAAQ,WAAgD;AACtD,YAAM,UAAU,CAAC,UAAwB;AACvC,YAAI,MAAM,QAAQ,KAAM;AACxB,cAAM,UAA4B,KAAK,MAAM,MAAM,YAAY,IAAI;AACnE,YAAI,SAAS,UAAU,aAAa,CAAC,SAAS,KAAM;AAEpD,kBAAU,OAAO;AAAA,MACnB;AACA,aAAO,iBAAiB,WAAW,OAAO;AAC1C,aAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,IAC5D;AAAA;AAAA,IAEA,KAAK,SAAkC;AACrC,UAAI,OAAO,WAAW,YAAa;AACnC,UAAI;AACF,qBAAa;AAAA,UACX;AAAA,UACA,KAAK,UAAU,EAAE,GAAG,SAAS,WAAW,IAAI,EAAE,CAAC;AAAA,QACjD;AAAA,MACF,QAAQ;AAAA,MAMR;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,YAAY,iBAAiB;;;AClD1C,SAAS,QAAQ,GAAQ,GAAiB;AACxC,MAAI,MAAM,EAAG,QAAO;AAEpB,MACE,OAAO,MAAM,YACb,OAAO,MAAM,YACb,MAAM,QACN,MAAM,MACN;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,EAAG,QAAO;AAElD,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,QAAM,QAAQ,OAAO,KAAK,CAAC;AAE3B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG;AACpD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAIO,SAAS,uBACd,KACA,eAAe,CAAC,WAAW,SAAS,GACpC,YAAY,gBACZ;AACA,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,YAAY,oBAAI,IAAI;AAG1B,QAAM,UAA6B;AAAA,IACjC,IAAI,QAAQ,KAAK,OAAO;AACtB,YAAM,OAAO,OAAO,GAAG;AACvB,aAAO,GAAG,IAAI;AACd,UAAI,QAAQ,MAAM,KAAK,EAAG,QAAO;AAGjC,UAAI,aAAa,SAAS,OAAO,GAAG,CAAC,GAAG;AACtC,oBAAY;AAAA,UACV,IAAI,YAAY,WAAW;AAAA,YACzB,QAAQ,EAAE,KAAK,MAAM,MAAM,MAAM;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,IAAI,MAAM,KAAK,OAAO;AAAA,IAC7B;AAAA,IACA,YAAY,UAAoB;AAC9B,UAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B;AAAA,MACF;AACA,YAAM,kBAAkB,CAAC,MAAa,SAAU,EAAkB,MAAM;AACxE,gBAAU,IAAI,UAAU,eAAe;AAEvC,kBAAY,iBAAiB,WAAW,eAAe;AAAA,IACzD;AAAA,IACA,eAAe,UAAoB;AACjC,YAAM,kBAAkB,UAAU,IAAI,QAAQ;AAC9C,UAAI,iBAAiB;AACnB,oBAAY,oBAAoB,WAAW,eAAe;AAC1D,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACzCA,IAAqB,aAArB,MAAgC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,QAAqB;AAC/B,UAAM,EAAE,OAAO,aAAa,eAAe,IACzC;AAAA,MACE;AAAA,QACE,UAAU,SAAS,QAAQ,QAAQ,EAAE;AAAA,QACrC,SAAS,SAAS,QAAQ,OAAO,EAAE;AAAA,QACnC,UAAU;AAAA,QACV,YAAY,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF;AACF,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,iBAAiB;AACtB,SAAK,UAAU,OAAO,IAAI;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KACJ,OACA;AACA,QAAI;AACF,YAAM,eAAe,UAAU;AAC/B,UAAI,gBAAgB,CAAC,KAAK,MAAM,SAAS;AACvC,aAAK,MAAM,aAAa,KAAK,WAAW,KAAK,IAAI;AACjD,aAAK,MAAM,WAAW,IAAI;AAAA,MAC5B;AACA,UAAI,CAAC,SAAS,KAAK,MAAM,WAAW,QAAQ,IAAI,IAAI,KAAK,MAAM,UAAU;AACvE;AAAA,MACF;AACA,WAAK,MAAM,WAAW,KAAK,IAAI;AAC/B,WAAK,MAAM,UAAU,MAAM,KAAK,WAAW;AAAA,IAC7C,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,wBAAwB,KAAc;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,KAAa;AACvB,SAAK,MAAM,UAAU;AACrB,SAAK,UAAU,OAAO,IAAI;AAAA,EAC5B;AAAA,EAEA,IAAI,UAAU;AACZ,SAAK,UAAU,OAAO,IAAI;AAC1B,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,UAAU,QAAiB;AACzB,QAAI,QAAQ,SAAU,MAAK,MAAM,WAAW,SAAS,QAAQ,QAAQ,EAAE;AACvE,QAAI,QAAQ,QAAS,MAAK,UAAU,OAAO;AAC3C,QAAI,QAAQ,KAAM,MAAK,cAAc,OAAO;AAE5C,WAAO;AAAA,EACT;AAAA,EACA,WAA8B;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,UACP,MAAM;AAAA,YACJ,OAAQ,KAAK,MAAM,SAA2B,MAAM;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAId;AACD,UAAM,EAAE,SAAS,SAAS,MAAM,IAAI,UAAU,CAAC;AAE/C,QAAI,QAAS,MAAK,UAAU;AAE5B,UAAM,oBAAoB,YAAY;AAEtC,SAAK,MAAM,UAAU,CAAC;AACtB,SAAK,MAAM,WAAW,oBAAoB,IAAI,IAAI;AAClD,SAAK,MAAM,UAAU;AAErB,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,GAAG,KAAK,OAAO,GAAG,KAAK,MAAM,QAAQ;AAAA,EAC9C;AAAA,EAEA,MAAM,UACJ,KACA,MAC+B;AAC/B,QAAI;AACF,YAAM,UAAuB;AAAA,QAC3B,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,GAAI,KAAK,cAAc,KAAK,cAAc,CAAC;AAAA,QAC3C,GAAG;AAAA,MACL;AAEA,YAAM,YAAY,CAAC,IAAI,WAAW,MAAM,IACpC,GAAG,OAAO,SAAS,MAAM,GAAG,GAAG,KAC/B;AAEJ,YAAM,MAAM,MAAM,MAAM,WAAW,OAAO;AAC1C,WAAK,MAAM,UAAU;AACrB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,sBAAsB,EAAE,OAAuB,IAAI,CAAC;AACvE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,WACJ,KACA,MACwB;AACxB,UAAM,UAAuB;AAAA,MAC3B,GAAI,KAAK,cAAc,KAAK,cAAc,CAAC;AAAA,MAC3C,GAAG;AAAA,IACL;AACA,UAAM,MAAM,MAAM,KAAK,UAAU,KAAK,OAAO;AAE7C,UAAM,eAAe,KAAK,MAAM;AAChC,QAAI;AACF,UAAI,KAAK,IAAI;AACX,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAK,MAAM,UAAU;AACrB,eAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAAA,MAC/C,OAAO;AACL,cAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,YAAI,OAAO;AACT,gBAAM,aAAa,IAAI,IAAI,GAAG;AAC9B,qBAAW,aAAa,IAAI,SAAS,KAAK;AAC1C,iBAAO,EAAE,KAAK,WAAW,SAAS,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAE1B,YAAI,CAAC,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AAChD,eAAK,QAAQ,MAAM,sBAAsB;AAAA,YACvC;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,gBAAMC,SAAQ,MAAM,cAAc,KAAK;AACvC,cAAIA,QAAO;AACT,kBAAM,aAAa,IAAI,IAAI,GAAG;AAC9B,uBAAW,aAAa,IAAI,SAASA,MAAK;AAC1C,mBAAO,EAAE,KAAK,WAAW,SAAS,EAAE;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,eACJ,KACA,MASA;AACA,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,QACH,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AACD,UAAI,KAAK;AACP,YAAI,IAAI,IAAI;AACV,iBAAO;AAAA,YACL,MAAO,MAAM,IAAI,KAAK;AAAA,YACtB,QAAQ,IAAI;AAAA,YACZ,IAAI,IAAI;AAAA,YACR,KAAK,IAAI;AAAA,UACX;AAAA,QACF;AACA,cAAM,EAAE,KAAK,YAAY,IAAI,MAAM,IAAI,KAAK;AAC5C,eAAO;AAAA,UACL,MAAM,CAAC;AAAA,UACP,QAAQ,IAAI;AAAA,UACZ,IAAI,KAAK;AAAA,UACT,KAAK;AAAA,QACP;AAAA,MACF;AACA,YAAM,IAAI,MAAM,mBAAmB,GAAG,EAAE;AAAA,IAC1C,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAE1B,YAAI,CAAC,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AAChD,eAAK,QAAQ,MAAM,sBAAsB;AAAA,YACvC;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,KAAc;AAC/B,WAAO,MAAM,KAAK,WAEhB,OAAO,GAAG,KAAK,UAAU,iBAAiB;AAAA,EAC9C;AAAA,EAEA,MAAM,aAAa,KAAc;AAC/B,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,OAAO,GAAG,KAAK,UAAU;AAAA,IAC3B;AACA,WAAO,UAAU;AAAA,EACnB;AAAA,EAEA,MAAM,WAAW,QAAqD;AACpE,QAAI,KAAK,WAAW,4BAAe;AACjC;AAAA,IACF;AACA,SAAK,SAAS;AACd,QAAI,QAAQ,MAAM;AAChB,WAAK,cAAc,OAAO;AAAA,IAC5B;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,UAAU,OAAO;AAAA,IACxB;AAEA,QAAI,KAAK,MAAM,WAAW,IAAI,IAAI,KAAK,MAAM,UAAU;AACrD,WAAK,SAAS;AACd,aAAO,KAAK,MAAM;AAAA,IACpB;AACA,SAAK,MAAM,UAAU;AAErB,UAAM,UAAU,MAAM,KAAK;AAAA,MACzB,GAAG,KAAK,UAAU;AAAA,IACpB;AAEA,cAAU,KAAK,EAAE,OAAO,WAAW,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;AACpE,SAAK,SAAS;AACd,QAAI,SAAS;AACX,WAAK,MAAM,UAAU;AACrB,YAAM,KAAK,KAAK,SAAS;AACzB,aAAO,EAAE,GAAG,SAAS,SAAS,KAAK,MAAM,QAAQ;AAAA,IACnD;AACA,WAAO,EAAE,SAAS,KAAK,MAAM,QAAQ;AAAA,EACvC;AAAA,EAEA,MAAM,iBAAiB;AACrB,SAAK,MAAM,UAAU;AACrB,UAAM,UAAU,MAAM,KAAK;AAAA,MACzB,GAAG,KAAK,UAAU;AAAA,IACpB;AAEA,cAAU,KAAK,EAAE,OAAO,WAAW,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;AACpE,SAAK,MAAM,UAAU;AACrB,UAAM,KAAK,KAAK,SAAS;AACzB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,QACJ,SAMuD;AACvD,UAAM;AAAA,MACJ,cAAc,OAAO,SAAS;AAAA,MAC9B;AAAA,MACA,MAAAC;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,WAAW,CAAC;AAEhB,QAAI,UAAU;AACZ,WAAK,MAAM,WAAW;AAAA,IACxB;AAEA,QAAI,SAAS;AACX,WAAK,UAAU;AAAA,IACjB;AAEA,QAAIA,OAAM;AACR,WAAK,cAAcA,MAAK;AACxB,UAAIA,MAAK,OAAO,SAAS;AACvB,aAAK,UAAUA,MAAK,MAAM;AAAA,MAC5B;AAAA,IACF;AACA,UAAM,YAAY,YAAY,GAAG,KAAK,UAAU;AAChD,UAAM,eAA4B;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,IAAI,gBAAgB;AAAA,QACxB,WAAW,OAAO,MAAM,KAAK,aAAa,CAAC;AAAA,QAC3C;AAAA,QACA,MAAM,OAAO,IAAI;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAEA,cAAU,KAAK,EAAE,OAAO,WAAW,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;AAGjE,QAAI,KAAK,aAAa,aAAa;AACjC,aAAO,SAAS,OAAO;AACvB,UAAI,YAAY,SAAS,GAAG,EAAG,QAAO,SAAS,OAAO;AACtD,aAAO;AAAA,IACT;AACA,QAAI,SAAS,YAAY,MAAM;AAC7B,YAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,aAAO,SAAS,OAAO;AAEvB,UAAI,IAAI,SAAS,GAAG,EAAG,QAAO,SAAS,OAAO;AAC9C,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,MAAM,WAAW,EAAE,OAAO,UAAU,CAAC;AAEhD,WAAO,KAAK;AAAA,EACd;AAAA,EACA,MAAM,OACJ,UAKA,SASA,qBAGA;AACA,UAAM;AAAA,MACJ,cAAc,OAAO,SAAS;AAAA,MAC9B,WAAW,OAAO,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAAA;AAAA,MACA,WAAW;AAAA,MACX,GAAG;AAAA,IACL,IAAI,WAAW,CAAC;AAEhB,QAAI,SAAS;AACX,WAAK,UAAU;AAAA,IACjB;AACA,QAAIA,OAAM;AACR,UAAIA,MAAK,aAAa;AACpB,aAAK,cAAcA,MAAK;AAAA,MAC1B;AACA,UAAIA,MAAK,OAAO,SAAS;AACvB,aAAK,UAAUA,MAAK,MAAM;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,MAAM;AACR,WAAK,cAAc;AAAA,IACrB;AAEA,UAAM,YAAY,MAAM,KAAK,aAAa,YAAY;AAEtD,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,OAAO,uBAAuB;AAAA,IACzC;AACA,QAAI,CAAC,YAAY,EAAE,YAAY,YAAY;AACzC,aAAO,EAAE,OAAO,YAAY,QAAQ,eAAe;AAAA,IACrD;AAEA,UAAM,gBAAgB,UAAU,QAAQ,EAAE,SAAS;AACnD,UAAM,UAAU,UAAU,QAAQ,EAAE,SAAS;AAC7C,UAAM,qBAAqB,iBAAiB;AAE5C,UAAM,YAAY,GAAG,KAAK,UAAU;AACpC,UAAM,YACJ,YACA,GAAG,SAAS,IAAI,gBAAgB,aAAa,QAAQ,IAAI,QAAQ;AAEnE,UAAM,aAAa,GAAG,SAAS,GAC7B,sBAAsB,IAAI,IAAI,gBAAgB,mBAAmB,CAAC,KAAK,EACzE;AAEA,UAAM,OAAO,MAAM,KAAK,eAAe,YAAY;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,IAAI,gBAAgB;AAAA,QACxB,GAAG;AAAA,QACH,WAAW,OAAO,MAAM,KAAK,aAAa,OAAO,CAAC;AAAA,QAClD;AAAA,QACA,MAAM,OAAO,IAAI;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,MAAM,KAAK,aAAa,eAAe,oBAAoB;AACnE,aAAO,SAAS,OAAO;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,OAAO,YAAY,CAAC,qBAAqB;AACjD,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,aAAO,SAAS,OAAO;AACvB,UAAI,IAAI,SAAS,GAAG,EAAG,QAAO,SAAS,OAAO;AAC9C;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,MAAM,MACtB,IAAI,IAAI,OAAO,MAAM,MAAM,GAAG,CAAC,EAAE,aAAa,IAAI,OAAO,IACzD;AAEJ,QAAI,MAAM,IAAI;AACZ,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,WAAW,EAAE,OAAO,UAAU,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,IAAI,MAAM;AAAA,MACV,KAAK,QAAQ,OAAO,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,MAAM,OAAO,SAYV;AACD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAAA;AAAA,MACA,cAAc,OAAO,SAAS;AAAA,IAChC,IAAI;AAEJ,QAAI,SAAS;AACX,WAAK,UAAU;AAAA,IACjB;AAEA,QAAIA,OAAM;AACR,UAAIA,MAAK,aAAa;AACpB,aAAK,cAAcA,MAAK;AAAA,MAC1B;AACA,UAAIA,MAAK,OAAO,SAAS;AACvB,aAAK,UAAUA,MAAK,MAAM;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,MAAM;AACR,WAAK,cAAc;AAAA,IACrB;AAEA,UAAM,eAAe,IAAI,gBAAgB;AAEzC,QAAI,eAAe;AACjB,mBAAa,IAAI,iBAAiB,aAAa;AAAA,IACjD,WAAW,cAAc;AACvB,UAAI,OAAO,iBAAiB,WAAW;AACrC,qBAAa,IAAI,iBAAiB,KAAK;AAAA,MACzC,WAAW,OAAO,iBAAiB,UAAU;AAC3C,qBAAa,IAAI,iBAAiB,YAAY;AAAA,MAChD;AAAA,IACF;AACA,QAAI,UAAU;AACZ,mBAAa,IAAI,YAAY,QAAQ;AAAA,IACvC;AAEA,QAAI,YAAY,YAAY,GAAG,KAAK,UAAU;AAC9C,QAAI,aAAa,OAAO,GAAG;AACzB,mBAAa,IAAI,YAAY;AAAA,IAC/B;AACA,UAAM,OAAO,MAAM,KAAK,WAAW,WAAW;AAAA,MAC5C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,CAAC;AAAA,IAC1C,CAAC;AAED,UAAM,QAAQ,MAAM,MAChB,IAAI,IAAI,KAAK,GAAG,EAAE,aAAa,IAAI,OAAO,IAC1C;AAEJ,QAAI,CAAC,OAAO;AACV,UAAI,MAAM;AACR,cAAM,KAAK,WAAW,EAAE,OAAO,UAAU,CAAC;AAC1C,cAAM,KAAK,WAAW,EAAE,OAAO,UAAU,CAAC;AAAA,MAC5C;AACA,UAAI,KAAK,aAAa,aAAa;AACjC,eAAO,SAAS,OAAO;AACvB;AAAA,MACF;AAEA,UAAI,SAAS,YAAY,MAAM;AAC7B,cAAM,MAAM;AACZ,eAAO,SAAS,OAAO;AAEvB,YAAI,IAAI,SAAS,GAAG,EAAG,QAAO,SAAS,OAAO;AAAA,MAChD;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,SAQlB;AACD,UAAM,EAAE,UAAU,UAAU,UAAU,cAAc,IAAI,IAAI;AAE5D,SAAK,gBAAgB,OAAO;AAE5B,UAAM,mBACJ,YAAY,GAAG,KAAK,UAAU;AAEhC,QAAI,0BAA0B;AAE9B,UAAM,eAAe,IAAI,gBAAgB;AAEzC,QAAI,aAAa,OAAO;AACtB,mBAAa,IAAI,QAAQ,MAAM;AAAA,IACjC;AACA,QAAI,aAAa,OAAO,GAAG;AACzB,iCAA2B,IAAI,YAAY;AAAA,IAC7C;AAEA,UAAM,OAAO,MAAM,KAAK,UAAU,yBAAyB;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,MAAM,IAAI;AACb,YAAM,IAAI,MAAM,MAAM,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,SASjB;AACD,UAAM,EAAE,UAAU,UAAU,OAAO,UAAU,cAAc,IAAI,IAAI;AAEnE,SAAK,gBAAgB,OAAO;AAE5B,UAAM,mBACJ,YAAY,GAAG,KAAK,UAAU;AAEhC,QAAI,0BAA0B;AAE9B,UAAM,eAAe,IAAI,gBAAgB;AAEzC,QAAI,aAAa,OAAO;AACtB,mBAAa,IAAI,QAAQ,MAAM;AAAA,IACjC;AACA,QAAI,aAAa,OAAO,GAAG;AACzB,iCAA2B,IAAI,YAAY;AAAA,IAC7C;AAEA,UAAM,OAAO,MAAM,KAAK,UAAU,yBAAyB;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,MAAM,IAAI;AACb,YAAM,IAAI,MAAM,MAAM,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,IAC5C;AACA,QAAI,aAAa,OAAO;AACtB,YAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,YAAM,EAAE,KAAK,cAAc,IAAI;AAC/B,gCAA0B,GAAG,aAAa;AAC1C,YAAM,KAAK,UAAU,uBAAuB;AAE5C,aAAO,MAAM,KAAK,UAAU,yBAAyB;AAAA,QACnD,QAAQ,WAAW,QAAQ;AAAA,QAC3B,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,CAAC;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,gBAAgB,QAIb;AACD,UAAM,EAAE,SAAS,MAAM,MAAAA,MAAK,IAAI;AAChC,QAAI,SAAS;AACX,WAAK,UAAU;AAAA,IACjB;AAEA,QAAIA,OAAM;AACR,UAAIA,MAAK,aAAa;AACpB,aAAK,cAAcA,MAAK;AAAA,MAC1B;AACA,UAAIA,MAAK,OAAO,SAAS;AACvB,aAAK,UAAUA,MAAK,MAAM;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,MAAM;AACR,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AACF;AAcA,SAAS,SAAS,KAA2B;AAC3C,MAAI,aAAa,IAAI,IAAI,uBAAuB;AAChD,MAAI,OAAO,WAAW,aAAa;AACjC,iBAAa,IAAI,IAAI,GAAG,OAAO,SAAS,MAAM,MAAM;AAAA,EACtD;AAEA,MAAI,OAAO,CAAC,IAAI,WAAW,MAAM,GAAG;AAClC,UAAM,WAAW,GAAG;AAAA,EACtB;AAEA,QAAM,OAAO,IAAI,IAAI,OAAO,UAAU;AACtC,QAAM,QAAQ,KAAK,aAAa,MAAM,WAAW,WAAW,KAAK,UAE9D,QAAQ,OAAO,EAAE;AAEpB,QAAM,OAAO,GAAG,KAAK,MAAM,GAAG,IAAI;AAElC,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,IACA,UAAU,MAAM;AAAA,EAClB;AACF;AAEO,IAAM,aAAa,IAAI,WAAW;AAEzC,IAAM,QAAQ,MAAM;AAClB,SAAO;AACT;AAEO,IAAM,OAAmB,MAAM;AAE/B,IAAM,aAAa,eAAeC,YAAW,QAA2B;AAC7E,SAAO,MAAM,KAAK,WAAW,MAAM;AACrC;AAEO,IAAM,eAAe,eAAeC,cAAa,KAAc;AACpE,SAAO,KAAK,aAAa,GAAG;AAC9B;AAEO,IAAM,eAAe,eAAeC,gBAAe;AACxD,SAAO,KAAK,aAAa;AAC3B;AAEO,IAAM,UAAqC,eAAeC,SAC/D,SACA;AACA,SAAO,KAAK,QAAQ,OAAO;AAC7B;AAEO,IAAM,SAAmC,eAAeC,QAC7D,UACA,SACA,YACA;AACA,SAAO,KAAK,OAAO,UAAU,SAAS,UAAU;AAClD;AAEO,IAAM,SAAmC,eAAeC,QAAO,SAAS;AAC7E,SAAO,KAAK,OAAO,OAAO;AAC5B;AAEO,IAAM,gBACX,eAAeC,eAAc,SAAS;AACpC,SAAO,KAAK,cAAc,OAAO;AACnC;AAEK,IAAM,iBACX,eAAeC,gBAAe,SAAS;AACrC,SAAO,KAAK,eAAe,OAAO;AACpC;;;AC7wBK,SAAS,UACd,MACA,MACA;AACA,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AACA,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signIn","signUp","resetPassword","forgotPassword"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["export {\n auth,\n getSession,\n getCsrfToken,\n signOut,\n signIn,\n signUp,\n resetPassword,\n forgotPassword,\n getProviders,\n default as Authorizer,\n mfa,\n} from './Authorizer';\nexport { getStatus } from './status';\nexport { broadcast } from './broadcast';\nexport * from './types';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\ntype BaseFetchOptions = {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = this.getSession.bind(this);\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n if (res?.status === 404) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', 'Not found');\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const data = await res.json();\n return {\n data: data as T,\n status: res.status,\n ok: res?.ok,\n url: data.url,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n // check for MFA stuff\n if (\n data?.status === 401 &&\n 'scope' in data.data &&\n (redirect || !isSupportingReturn)\n ) {\n const url = data?.data.url ?? callbackUrl;\n // if it's got an error, don't do anything.\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (!error) {\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n const providerData = data?.data as Record<string, unknown> | undefined;\n const shouldIncludeData =\n !!providerData && Object.keys(providerData).some((key) => key !== 'url');\n\n const response: SignInResponse = {\n error,\n status: data?.status,\n ok: Boolean(data?.ok),\n url: error ? null : data?.url,\n } as SignInResponse;\n\n if (shouldIncludeData) {\n response.data = data?.data as SignInResponse['data'];\n }\n\n return response as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n\n async forgotPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'put',\n body: JSON.stringify({\n password,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n return data;\n }\n\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n async mfa(\n options?: BaseFetchOptions & {\n fetchUrl?: string;\n token?: string;\n scope?: 'setup' | 'challenge';\n method?: 'authenticator' | 'email';\n code?: string;\n remove?: boolean;\n }\n ) {\n const {\n token,\n scope = 'challenge',\n method = 'authenticator',\n code,\n fetchUrl,\n } = options ?? {};\n if (options) {\n this.#configureFetch(options);\n }\n const overrideMethod = options?.init?.method;\n const baseMethod = token ? 'put' : 'post';\n\n const mfaUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/mfa`;\n const init: RequestInit = {\n method: overrideMethod ?? baseMethod,\n };\n if (init.method === 'put') {\n init.body = JSON.stringify({ token, scope, method, code });\n } else if (init.method === 'post') {\n init.body = JSON.stringify({ method, scope });\n }\n if (options?.remove) {\n init.method = 'delete';\n }\n const res = await this.#fetchData(mfaUrl, init);\n return res;\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\n\nexport const signIn: typeof authorizer.signIn = async function signIn(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\n\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n\nexport const forgotPassword: typeof authorizer.forgotPassword =\n async function forgotPassword(options) {\n return auth.forgotPassword(options);\n };\n\nexport const mfa: typeof authorizer.mfa = async function setupMfa(options) {\n return auth.mfa(options);\n};\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signIn","signUp","resetPassword","forgotPassword"]}
package/dist/index.mjs CHANGED
@@ -277,6 +277,11 @@ var Authorizer = class {
277
277
  updatedUrl.searchParams.set("error", error);
278
278
  return { url: updatedUrl.toString() };
279
279
  }
280
+ if (res?.status === 404) {
281
+ const updatedUrl = new URL(url);
282
+ updatedUrl.searchParams.set("error", "Not found");
283
+ return { url: updatedUrl.toString() };
284
+ }
280
285
  }
281
286
  } catch (error) {
282
287
  if (error instanceof Error) {
@@ -315,12 +320,12 @@ var Authorizer = class {
315
320
  url: res.url
316
321
  };
317
322
  }
318
- const { url: responseUrl } = await res.json();
323
+ const data = await res.json();
319
324
  return {
320
- data: {},
325
+ data,
321
326
  status: res.status,
322
327
  ok: res?.ok,
323
- url: responseUrl
328
+ url: data.url
324
329
  };
325
330
  }
326
331
  throw new Error(`Unable to fetch ${url}`);
@@ -485,6 +490,15 @@ var Authorizer = class {
485
490
  window.location.reload();
486
491
  return;
487
492
  }
493
+ if (data?.status === 401 && "scope" in data.data && (redirect || !isSupportingReturn)) {
494
+ const url = data?.data.url ?? callbackUrl;
495
+ const error2 = data?.data?.url ? new URL(String(data?.data?.url)).searchParams.get("error") : null;
496
+ if (!error2) {
497
+ window.location.href = url;
498
+ if (url.includes("#")) window.location.reload();
499
+ return;
500
+ }
501
+ }
488
502
  if (data?.ok && (redirect || !isSupportingReturn)) {
489
503
  const url = data?.data.url ?? callbackUrl;
490
504
  window.location.href = url;
@@ -496,12 +510,18 @@ var Authorizer = class {
496
510
  await this.initialize();
497
511
  await this.getSession({ event: "storage" });
498
512
  }
499
- return {
513
+ const providerData = data?.data;
514
+ const shouldIncludeData = !!providerData && Object.keys(providerData).some((key) => key !== "url");
515
+ const response = {
500
516
  error,
501
517
  status: data?.status,
502
- ok: data?.ok,
518
+ ok: Boolean(data?.ok),
503
519
  url: error ? null : data?.url
504
520
  };
521
+ if (shouldIncludeData) {
522
+ response.data = data?.data;
523
+ }
524
+ return response;
505
525
  }
506
526
  async signUp(options) {
507
527
  const {
@@ -631,6 +651,34 @@ var Authorizer = class {
631
651
  });
632
652
  }
633
653
  }
654
+ async mfa(options) {
655
+ const {
656
+ token,
657
+ scope = "challenge",
658
+ method = "authenticator",
659
+ code,
660
+ fetchUrl
661
+ } = options ?? {};
662
+ if (options) {
663
+ this.#configureFetch(options);
664
+ }
665
+ const overrideMethod = options?.init?.method;
666
+ const baseMethod = token ? "put" : "post";
667
+ const mfaUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/mfa`;
668
+ const init = {
669
+ method: overrideMethod ?? baseMethod
670
+ };
671
+ if (init.method === "put") {
672
+ init.body = JSON.stringify({ token, scope, method, code });
673
+ } else if (init.method === "post") {
674
+ init.body = JSON.stringify({ method, scope });
675
+ }
676
+ if (options?.remove) {
677
+ init.method = "delete";
678
+ }
679
+ const res = await this.#fetchData(mfaUrl, init);
680
+ return res;
681
+ }
634
682
  #configureFetch(params) {
635
683
  const { baseUrl, init, auth: auth2 } = params;
636
684
  if (baseUrl) {
@@ -697,6 +745,9 @@ var resetPassword = async function resetPassword2(options) {
697
745
  var forgotPassword = async function forgotPassword2(options) {
698
746
  return auth.forgotPassword(options);
699
747
  };
748
+ var mfa = async function setupMfa(options) {
749
+ return auth.mfa(options);
750
+ };
700
751
 
701
752
  // src/status.ts
702
753
  function getStatus(load, sess) {
@@ -717,6 +768,7 @@ export {
717
768
  getProviders,
718
769
  getSession,
719
770
  getStatus,
771
+ mfa,
720
772
  resetPassword,
721
773
  signIn,
722
774
  signOut,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = this.getSession.bind(this);\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n\n async forgotPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'put',\n body: JSON.stringify({\n password,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n return data;\n }\n\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\n\nexport const signIn: typeof authorizer.signIn = async function signIn(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\n\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n\nexport const forgotPassword: typeof authorizer.forgotPassword =\n async function forgotPassword(options) {\n return auth.forgotPassword(options);\n };\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signIn","signUp","resetPassword","forgotPassword"]}
1
+ {"version":3,"sources":["../src/logger.ts","../src/broadcast.ts","../src/observable.ts","../src/Authorizer.ts","../src/status.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport Authorizer from './Authorizer';\n\n/* eslint-disable no-console */\nexport class UnknownError extends Error {\n code: string;\n constructor(error: Error | string) {\n // Support passing error or string\n super((error as Error)?.message ?? error);\n this.name = 'UnknownError';\n this.code = (error as any).code;\n if (error instanceof Error) {\n this.stack = error.stack;\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n };\n }\n}\n\n// TODO: better typing\n/** Makes sure that error is always serializable */\nfunction formatError(o: unknown): unknown {\n if (o instanceof Error && !(o instanceof UnknownError)) {\n return JSON.stringify({ message: o.message, stack: o.stack, name: o.name });\n }\n if (hasErrorProperty(o)) {\n o.error = formatError(o.error) as Error;\n o.message = o.message ?? o.error.message;\n }\n return o;\n}\n\nfunction hasErrorProperty(\n x: unknown\n): x is { error: Error; [key: string]: unknown } {\n return !!(x as any)?.error;\n}\n\nexport type WarningCode =\n | 'NEXTAUTH_URL'\n | 'NO_SECRET'\n | 'TWITTER_OAUTH_2_BETA'\n | 'DEBUG_ENABLED';\n\n/**\n * Override any of the methods, and the rest will use the default logger.\n *\n * [Documentation](https://next-auth.js.org/configuration/options#logger)\n */\nexport interface LoggerInstance extends Record<string, (...args: any) => any> {\n warn: (code: WarningCode) => void;\n error: (\n code: string,\n /**\n * Either an instance of (JSON serializable) Error\n * or an object that contains some debug information.\n * (Error is still available through `metadata.error`)\n */\n metadata: Error | { error: Error; [key: string]: unknown }\n ) => void;\n debug: (code: string, metadata: unknown) => void;\n}\n\nconst _logger: LoggerInstance = {\n error(code, metadata) {\n metadata = formatError(metadata) as Error;\n console.error(`[nile-auth][error][${code}]`, metadata.message, metadata);\n },\n warn(code) {\n console.warn(`[nile-auth][warn][${code}]`);\n },\n debug(code, metadata) {\n console.log(`[next-auth][debug][${code}]`, metadata);\n },\n};\n\n/**\n * Override the built-in logger with user's implementation.\n * Any `undefined` level will use the default logger.\n */\nexport function setLogger(\n newLogger: Partial<LoggerInstance> = {},\n debug?: boolean\n) {\n // Turn off debug logging if `debug` isn't set to `true`\n if (!debug) _logger.debug = () => undefined;\n\n if (newLogger.error) _logger.error = newLogger.error;\n if (newLogger.warn) _logger.warn = newLogger.warn;\n if (newLogger.debug) _logger.debug = newLogger.debug;\n}\n\nexport default _logger;\n\n/** Serializes client-side log messages and sends them to the server */\nexport function proxyLogger(\n logger: LoggerInstance = _logger,\n authorizer: Authorizer\n): LoggerInstance {\n try {\n if (typeof window === 'undefined') {\n return logger;\n }\n\n const clientLogger: Record<string, unknown> = {};\n for (const level in logger) {\n clientLogger[level] = (code: string, metadata: Error) => {\n _logger[level](code, metadata); // Logs to console\n\n if (level === 'error') {\n metadata = formatError(metadata) as Error;\n }\n (metadata as any).client = true;\n const url = `${authorizer.state.basePath}/_log`;\n const body = new URLSearchParams({ level, code, ...(metadata as any) });\n if (navigator.sendBeacon) {\n return navigator.sendBeacon(url, body);\n }\n return fetch(url, { method: 'POST', body, keepalive: true });\n };\n }\n return clientLogger as unknown as LoggerInstance;\n } catch {\n return _logger;\n }\n}\n\nexport const logger = (authorizer: Authorizer) =>\n proxyLogger(_logger, authorizer);\n","/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */\nexport function now() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport interface BroadcastMessage {\n event?: 'session';\n data?: { trigger?: 'signout' | 'getSession' };\n clientId: string;\n timestamp: number;\n}\n\n/**\n * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)\n * Only not using it directly, because Safari does not support it.\n *\n * https://caniuse.com/?search=broadcastchannel\n */\nexport function BroadcastChannel(name = 'nextauth.message') {\n return {\n /** Get notified by other tabs/windows. */\n receive(onReceive: (message: BroadcastMessage) => void) {\n const handler = (event: StorageEvent) => {\n if (event.key !== name) return;\n const message: BroadcastMessage = JSON.parse(event.newValue ?? '{}');\n if (message?.event !== 'session' || !message?.data) return;\n\n onReceive(message);\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n },\n /** Notify other tabs/windows. */\n post(message: Record<string, unknown>) {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(\n name,\n JSON.stringify({ ...message, timestamp: now() })\n );\n } catch {\n /**\n * The localStorage API isn't always available.\n * It won't work in private mode prior to Safari 11 for example.\n * Notifications are simply dropped if an error is encountered.\n */\n }\n },\n };\n}\n\nexport const broadcast = BroadcastChannel();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(a: any, b: any): boolean {\n if (a === b) return true; // Same reference or primitive value\n\n if (\n typeof a !== 'object' ||\n typeof b !== 'object' ||\n a === null ||\n b === null\n ) {\n return false; // If one of them is not an object (or is null), return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false; // One is an array, the other isn't\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false; // Different number of keys\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !isEqual(a[key], b[key])) {\n return false; // Key missing or values are not deeply equal\n }\n }\n\n return true;\n}\n\nimport { Listener } from './types';\n\nexport function createObservableObject<T = Record<string, unknown>>(\n obj: T,\n listenerKeys = ['loading', 'session'],\n eventName = 'objectChange'\n) {\n const eventTarget = new EventTarget();\n const listeners = new Map();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: ProxyHandler<any> = {\n set(target, key, value) {\n const prev = target[key];\n target[key] = value;\n if (isEqual(prev, value)) return true;\n\n // only fire on these two for now\n if (listenerKeys.includes(String(key))) {\n eventTarget.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, prev, next: value },\n })\n );\n }\n return true;\n },\n };\n\n return {\n proxy: new Proxy(obj, handler),\n eventTarget,\n addListener(callback: Listener) {\n if (listeners.has(callback)) {\n return;\n }\n const wrappedCallback = (e: Event) => callback((e as CustomEvent).detail);\n listeners.set(callback, wrappedCallback);\n\n eventTarget.addEventListener(eventName, wrappedCallback);\n },\n removeListener(callback: Listener) {\n const wrappedCallback = listeners.get(callback);\n if (wrappedCallback) {\n eventTarget.removeEventListener(eventName, wrappedCallback);\n listeners.delete(callback);\n }\n },\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ActiveSession,\n AuthConfig,\n AuthState,\n Config,\n CtxOrReq,\n BuiltInProviderType,\n RedirectableProviderType,\n ClientSafeProvider,\n SignInAuthorizationParams,\n SignInOptions,\n LiteralUnion,\n SignInResponse,\n Listener,\n NonErrorSession,\n PartialAuthorizer,\n SignOutParams,\n SignOutResponse,\n} from './types';\nimport { logger, LoggerInstance } from './logger';\nimport { broadcast, now } from './broadcast';\nimport { createObservableObject } from './observable';\n\nexport type GetSessionParams = CtxOrReq & {\n event?: 'storage' | 'timer' | 'hidden' | string;\n triggerEvent?: boolean;\n broadcast?: boolean;\n baseUrl?: string;\n init?: RequestInit;\n};\ntype BaseFetchOptions = {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n};\n\nenum State {\n SESSION = 'getSession',\n}\n\nexport default class Authorizer {\n state: AuthState;\n #logger: LoggerInstance;\n requestInit?: RequestInit;\n addListener: (cb: Listener) => void;\n removeListener: (cb: Listener) => void;\n status: null | State;\n constructor(config?: AuthConfig) {\n const { proxy, addListener, removeListener } =\n createObservableObject<AuthState>(\n {\n basePath: parseUrl(config?.basePath).path,\n baseUrl: parseUrl(config?.baseUrl).origin,\n lastSync: 0,\n getSession: () => undefined,\n session: undefined,\n loading: true,\n },\n config?.listenerKeys,\n 'auth'\n );\n this.state = proxy;\n this.addListener = addListener;\n this.removeListener = removeListener;\n this.#logger = logger(this);\n this.status = null;\n }\n\n async sync(\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange'\n ) {\n try {\n const storageEvent = event === 'storage';\n if (storageEvent || !this.state.session) {\n this.state.getSession = this.getSession.bind(this);\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n if (res?.status === 404) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', 'Not found');\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const data = await res.json();\n return {\n data: data as T,\n status: res.status,\n ok: res?.ok,\n url: data.url,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n // check for MFA stuff\n if (\n data?.status === 401 &&\n 'scope' in data.data &&\n (redirect || !isSupportingReturn)\n ) {\n const url = data?.data.url ?? callbackUrl;\n // if it's got an error, don't do anything.\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (!error) {\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n const providerData = data?.data as Record<string, unknown> | undefined;\n const shouldIncludeData =\n !!providerData && Object.keys(providerData).some((key) => key !== 'url');\n\n const response: SignInResponse = {\n error,\n status: data?.status,\n ok: Boolean(data?.ok),\n url: error ? null : data?.url,\n } as SignInResponse;\n\n if (shouldIncludeData) {\n response.data = data?.data as SignInResponse['data'];\n }\n\n return response as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n\n async forgotPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'put',\n body: JSON.stringify({\n password,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n return data;\n }\n\n async resetPassword(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const { password, fetchUrl, email, redirect, callbackUrl = '/' } = options;\n\n this.#configureFetch(options);\n\n const resetPasswordUrl =\n fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;\n\n let resetPasswordWithParams = resetPasswordUrl;\n\n const searchParams = new URLSearchParams();\n\n if (redirect === false) {\n searchParams.set('json', 'true');\n }\n if (searchParams.size > 0) {\n resetPasswordWithParams += `?${searchParams}`;\n }\n\n const data = await this.#sendData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (!data?.ok) {\n throw new Error(await data?.clone().text());\n }\n if (redirect === false) {\n const json = await data?.json();\n const { url: urlWithParams } = json;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.#sendData(resetPasswordWithParams);\n\n return await this.#sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\n });\n }\n }\n\n async mfa(\n options?: BaseFetchOptions & {\n fetchUrl?: string;\n token?: string;\n scope?: 'setup' | 'challenge';\n method?: 'authenticator' | 'email';\n code?: string;\n remove?: boolean;\n }\n ) {\n const {\n token,\n scope = 'challenge',\n method = 'authenticator',\n code,\n fetchUrl,\n } = options ?? {};\n if (options) {\n this.#configureFetch(options);\n }\n const overrideMethod = options?.init?.method;\n const baseMethod = token ? 'put' : 'post';\n\n const mfaUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/mfa`;\n const init: RequestInit = {\n method: overrideMethod ?? baseMethod,\n };\n if (init.method === 'put') {\n init.body = JSON.stringify({ token, scope, method, code });\n } else if (init.method === 'post') {\n init.body = JSON.stringify({ method, scope });\n }\n if (options?.remove) {\n init.method = 'delete';\n }\n const res = await this.#fetchData(mfaUrl, init);\n return res;\n }\n\n #configureFetch(params: {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n init?: RequestInit;\n }) {\n const { baseUrl, init, auth } = params;\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n }\n}\nexport interface InternalUrl {\n /** @default \"http://localhost:3000\" */\n origin: string;\n /** @default \"localhost:3000\" */\n host: string;\n /** @default \"/api/auth\" */\n path: string;\n /** @default \"http://localhost:3000/api/auth\" */\n base: string;\n /** @default \"http://localhost:3000/api/auth\" */\n toString: () => string;\n}\n\nfunction parseUrl(url?: string): InternalUrl {\n let defaultUrl = new URL('http://localhost:3000');\n if (typeof window !== 'undefined') {\n defaultUrl = new URL(`${window.location.origin}/api`);\n }\n\n if (url && !url.startsWith('http')) {\n url = `https://${url}`;\n }\n\n const _url = new URL(url ?? defaultUrl);\n const path = (_url.pathname === '/' ? defaultUrl.pathname : _url.pathname)\n // Remove trailing slash\n .replace(/\\/$/, '');\n\n const base = `${_url.origin}${path}`;\n\n return {\n origin: _url.origin,\n host: _url.host,\n path,\n base,\n toString: () => base,\n };\n}\n\nexport const authorizer = new Authorizer();\n\nconst _auth = () => {\n return authorizer;\n};\n\nexport const auth: Authorizer = _auth();\n\nexport const getSession = async function getSession(params?: GetSessionParams) {\n return await auth.getSession(params);\n};\n\nexport const getCsrfToken = async function getCsrfToken(url?: string) {\n return auth.getCsrfToken(url);\n};\n\nexport const getProviders = async function getProviders() {\n return auth.getProviders();\n};\n\nexport const signOut: typeof authorizer.signOut = async function signOut(\n options\n) {\n return auth.signOut(options);\n};\n\nexport const signIn: typeof authorizer.signIn = async function signIn(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\n\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(options);\n };\n\nexport const forgotPassword: typeof authorizer.forgotPassword =\n async function forgotPassword(options) {\n return auth.forgotPassword(options);\n };\n\nexport const mfa: typeof authorizer.mfa = async function setupMfa(options) {\n return auth.mfa(options);\n};\n","import { NonErrorSession } from './types';\n\nexport function getStatus(\n load: boolean,\n sess: NonErrorSession | null | undefined\n) {\n if (load) {\n return 'loading';\n }\n if (sess) {\n return 'authenticated';\n }\n return 'unauthenticated';\n}\n"],"mappings":"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","names":["logger","authorizer","error","auth","getSession","getCsrfToken","getProviders","signOut","signIn","signUp","resetPassword","forgotPassword"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@niledatabase/client",
3
- "version": "5.1.0",
3
+ "version": "5.2.0-alpha.3",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -58,5 +58,5 @@
58
58
  "tsup": "^8.3.0",
59
59
  "typescript": "^5.3.2"
60
60
  },
61
- "gitHead": "783f757d79b6bd689a5e8ac597335832e793fae9"
61
+ "gitHead": "8cbfc2a045871f694edf6965f930cec1ee2192bf"
62
62
  }