@niledatabase/client 5.0.0-alpha.2 → 5.0.0-alpha.4

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
@@ -106,27 +106,6 @@ interface SignOutResponse {
106
106
  url: string;
107
107
  }
108
108
 
109
- type WarningCode = 'NEXTAUTH_URL' | 'NO_SECRET' | 'TWITTER_OAUTH_2_BETA' | 'DEBUG_ENABLED';
110
- /**
111
- * Override any of the methods, and the rest will use the default logger.
112
- *
113
- * [Documentation](https://next-auth.js.org/configuration/options#logger)
114
- */
115
- interface LoggerInstance extends Record<string, (...args: any) => any> {
116
- warn: (code: WarningCode) => void;
117
- error: (code: string,
118
- /**
119
- * Either an instance of (JSON serializable) Error
120
- * or an object that contains some debug information.
121
- * (Error is still available through `metadata.error`)
122
- */
123
- metadata: Error | {
124
- error: Error;
125
- [key: string]: unknown;
126
- }) => void;
127
- debug: (code: string, metadata: unknown) => void;
128
- }
129
-
130
109
  type GetSessionParams = CtxOrReq & {
131
110
  event?: 'storage' | 'timer' | 'hidden' | string;
132
111
  triggerEvent?: boolean;
@@ -138,8 +117,8 @@ declare enum State {
138
117
  SESSION = "getSession"
139
118
  }
140
119
  declare class Authorizer {
120
+ #private;
141
121
  state: AuthState;
142
- logger: LoggerInstance;
143
122
  requestInit?: RequestInit;
144
123
  addListener: (cb: Listener) => void;
145
124
  removeListener: (cb: Listener) => void;
@@ -156,16 +135,6 @@ declare class Authorizer {
156
135
  event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';
157
136
  }): Promise<void>;
158
137
  get apiBaseUrl(): string;
159
- sendData(url: string, init?: RequestInit): Promise<Response | undefined>;
160
- fetchData<T = any>(url: string, init?: RequestInit): Promise<T | undefined>;
161
- fetchFormData<T = {
162
- url: string;
163
- }>(url: string, init: RequestInit): Promise<{
164
- data: T;
165
- status: number;
166
- ok: boolean;
167
- url: string;
168
- } | undefined>;
169
138
  getProviders(url?: string): Promise<Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider> | undefined>;
170
139
  getCsrfToken(url?: string): Promise<string | undefined>;
171
140
  getSession(params?: GetSessionParams): Promise<NonErrorSession>;
@@ -208,11 +177,6 @@ declare class Authorizer {
208
177
  callbackUrl?: string;
209
178
  redirect?: boolean;
210
179
  }): Promise<Response | undefined>;
211
- _configureFetch(params: {
212
- baseUrl?: string;
213
- auth?: Authorizer | PartialAuthorizer;
214
- init?: RequestInit;
215
- }): void;
216
180
  }
217
181
  declare const authorizer: Authorizer;
218
182
  declare const auth: Authorizer;
package/dist/index.d.ts CHANGED
@@ -106,27 +106,6 @@ interface SignOutResponse {
106
106
  url: string;
107
107
  }
108
108
 
109
- type WarningCode = 'NEXTAUTH_URL' | 'NO_SECRET' | 'TWITTER_OAUTH_2_BETA' | 'DEBUG_ENABLED';
110
- /**
111
- * Override any of the methods, and the rest will use the default logger.
112
- *
113
- * [Documentation](https://next-auth.js.org/configuration/options#logger)
114
- */
115
- interface LoggerInstance extends Record<string, (...args: any) => any> {
116
- warn: (code: WarningCode) => void;
117
- error: (code: string,
118
- /**
119
- * Either an instance of (JSON serializable) Error
120
- * or an object that contains some debug information.
121
- * (Error is still available through `metadata.error`)
122
- */
123
- metadata: Error | {
124
- error: Error;
125
- [key: string]: unknown;
126
- }) => void;
127
- debug: (code: string, metadata: unknown) => void;
128
- }
129
-
130
109
  type GetSessionParams = CtxOrReq & {
131
110
  event?: 'storage' | 'timer' | 'hidden' | string;
132
111
  triggerEvent?: boolean;
@@ -138,8 +117,8 @@ declare enum State {
138
117
  SESSION = "getSession"
139
118
  }
140
119
  declare class Authorizer {
120
+ #private;
141
121
  state: AuthState;
142
- logger: LoggerInstance;
143
122
  requestInit?: RequestInit;
144
123
  addListener: (cb: Listener) => void;
145
124
  removeListener: (cb: Listener) => void;
@@ -156,16 +135,6 @@ declare class Authorizer {
156
135
  event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';
157
136
  }): Promise<void>;
158
137
  get apiBaseUrl(): string;
159
- sendData(url: string, init?: RequestInit): Promise<Response | undefined>;
160
- fetchData<T = any>(url: string, init?: RequestInit): Promise<T | undefined>;
161
- fetchFormData<T = {
162
- url: string;
163
- }>(url: string, init: RequestInit): Promise<{
164
- data: T;
165
- status: number;
166
- ok: boolean;
167
- url: string;
168
- } | undefined>;
169
138
  getProviders(url?: string): Promise<Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider> | undefined>;
170
139
  getCsrfToken(url?: string): Promise<string | undefined>;
171
140
  getSession(params?: GetSessionParams): Promise<NonErrorSession>;
@@ -208,11 +177,6 @@ declare class Authorizer {
208
177
  callbackUrl?: string;
209
178
  redirect?: boolean;
210
179
  }): Promise<Response | undefined>;
211
- _configureFetch(params: {
212
- baseUrl?: string;
213
- auth?: Authorizer | PartialAuthorizer;
214
- init?: RequestInit;
215
- }): void;
216
180
  }
217
181
  declare const authorizer: Authorizer;
218
182
  declare const auth: Authorizer;
package/dist/index.js CHANGED
@@ -197,7 +197,7 @@ function createObservableObject(obj, listenerKeys = ["loading", "session"], even
197
197
  // src/Authorizer.ts
198
198
  var Authorizer = class {
199
199
  state;
200
- logger;
200
+ #logger;
201
201
  requestInit;
202
202
  addListener;
203
203
  removeListener;
@@ -218,7 +218,7 @@ var Authorizer = class {
218
218
  this.state = proxy;
219
219
  this.addListener = addListener;
220
220
  this.removeListener = removeListener;
221
- this.logger = logger(this);
221
+ this.#logger = logger(this);
222
222
  this.status = null;
223
223
  }
224
224
  async sync(event) {
@@ -234,15 +234,15 @@ var Authorizer = class {
234
234
  this.state.lastSync = Date.now();
235
235
  this.state.session = await this.getSession();
236
236
  } catch (error) {
237
- this.logger.error("CLIENT_SESSION_ERROR", error);
237
+ this.#logger.error("CLIENT_SESSION_ERROR", error);
238
238
  }
239
239
  }
240
240
  set baseUrl(val) {
241
241
  this.state.baseUrl = val;
242
- this.logger = logger(this);
242
+ this.#logger = logger(this);
243
243
  }
244
244
  get baseUrl() {
245
- this.logger = logger(this);
245
+ this.#logger = logger(this);
246
246
  return this.state.baseUrl;
247
247
  }
248
248
  configure(config) {
@@ -276,7 +276,7 @@ var Authorizer = class {
276
276
  get apiBaseUrl() {
277
277
  return `${this.baseUrl}${this.state.basePath}`;
278
278
  }
279
- async sendData(url, init) {
279
+ async #sendData(url, init) {
280
280
  try {
281
281
  const options = {
282
282
  headers: {
@@ -290,16 +290,16 @@ var Authorizer = class {
290
290
  this.state.loading = false;
291
291
  return res;
292
292
  } catch (error) {
293
- this.logger.error("CLIENT_FETCH_ERROR", { error, url });
293
+ this.#logger.error("CLIENT_FETCH_ERROR", { error, url });
294
294
  return void 0;
295
295
  }
296
296
  }
297
- async fetchData(url, init) {
297
+ async #fetchData(url, init) {
298
298
  const options = {
299
299
  ...this.requestInit ? this.requestInit : {},
300
300
  ...init
301
301
  };
302
- const res = await this.sendData(url, options);
302
+ const res = await this.#sendData(url, options);
303
303
  const errorHandler = res?.clone();
304
304
  try {
305
305
  if (res?.ok) {
@@ -311,7 +311,7 @@ var Authorizer = class {
311
311
  } catch (error) {
312
312
  if (error instanceof Error) {
313
313
  if (!error.message.includes("is not valid JSON")) {
314
- this.logger.error("CLIENT_FETCH_ERROR", {
314
+ this.#logger.error("CLIENT_FETCH_ERROR", {
315
315
  error,
316
316
  url
317
317
  });
@@ -328,7 +328,7 @@ var Authorizer = class {
328
328
  return void 0;
329
329
  }
330
330
  }
331
- async fetchFormData(url, init) {
331
+ async #fetchFormData(url, init) {
332
332
  try {
333
333
  const res = await fetch(url, {
334
334
  ...this.requestInit,
@@ -358,7 +358,7 @@ var Authorizer = class {
358
358
  } catch (error) {
359
359
  if (error instanceof Error) {
360
360
  if (!error.message.includes("is not valid JSON")) {
361
- this.logger.error("CLIENT_FETCH_ERROR", {
361
+ this.#logger.error("CLIENT_FETCH_ERROR", {
362
362
  error,
363
363
  url
364
364
  });
@@ -368,10 +368,10 @@ var Authorizer = class {
368
368
  }
369
369
  }
370
370
  async getProviders(url) {
371
- return await this.fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
371
+ return await this.#fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
372
372
  }
373
373
  async getCsrfToken(url) {
374
- const response = await this.fetchData(
374
+ const response = await this.#fetchData(
375
375
  url ?? `${this.apiBaseUrl}/auth/csrf`
376
376
  );
377
377
  return response?.csrfToken;
@@ -392,7 +392,7 @@ var Authorizer = class {
392
392
  return this.state.session;
393
393
  }
394
394
  this.state.loading = true;
395
- const session = await this.fetchData(
395
+ const session = await this.#fetchData(
396
396
  `${this.apiBaseUrl}/auth/session`
397
397
  );
398
398
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -406,7 +406,7 @@ var Authorizer = class {
406
406
  }
407
407
  async refreshSession() {
408
408
  this.state.loading = true;
409
- const session = await this.fetchData(
409
+ const session = await this.#fetchData(
410
410
  `${this.apiBaseUrl}/auth/session`
411
411
  );
412
412
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -443,7 +443,7 @@ var Authorizer = class {
443
443
  json: String(true)
444
444
  })
445
445
  };
446
- const res = await this.fetchFormData(
446
+ const res = await this.#fetchFormData(
447
447
  baseFetch,
448
448
  fetchOptions
449
449
  );
@@ -502,7 +502,7 @@ var Authorizer = class {
502
502
  const baseFetch = `${this.apiBaseUrl}/auth`;
503
503
  const signInUrl = fetchUrl ?? `${baseFetch}/${isCredentials ? "callback" : "signin"}/${provider}`;
504
504
  const _signInUrl = `${signInUrl}${authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ""}`;
505
- const data = await this.fetchFormData(_signInUrl, {
505
+ const data = await this.#fetchFormData(_signInUrl, {
506
506
  method: "post",
507
507
  body: new URLSearchParams({
508
508
  ...remaining,
@@ -578,7 +578,7 @@ var Authorizer = class {
578
578
  if (searchParams.size > 0) {
579
579
  signUpUrl += `?${searchParams}`;
580
580
  }
581
- const data = await this.fetchData(signUpUrl, {
581
+ const data = await this.#fetchData(signUpUrl, {
582
582
  method: "post",
583
583
  body: JSON.stringify({ email, password })
584
584
  });
@@ -605,7 +605,7 @@ var Authorizer = class {
605
605
  }
606
606
  async resetPassword(options) {
607
607
  const { password, fetchUrl, email, redirect, callbackUrl } = options;
608
- this._configureFetch(options);
608
+ this.#configureFetch(options);
609
609
  const resetPasswordUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;
610
610
  let resetPasswordWithParams = resetPasswordUrl;
611
611
  const searchParams = new URLSearchParams();
@@ -615,7 +615,7 @@ var Authorizer = class {
615
615
  if (searchParams.size > 0) {
616
616
  resetPasswordWithParams += `?${searchParams}`;
617
617
  }
618
- const data = await this.fetchData(resetPasswordWithParams, {
618
+ const data = await this.#sendData(resetPasswordWithParams, {
619
619
  method: "post",
620
620
  body: JSON.stringify({
621
621
  email,
@@ -624,17 +624,21 @@ var Authorizer = class {
624
624
  callbackUrl
625
625
  })
626
626
  });
627
+ if (!data?.ok) {
628
+ throw new Error(await data?.clone().text());
629
+ }
627
630
  if (redirect === false) {
628
- const { url: urlWithParams } = data;
631
+ const json = await data?.json();
632
+ const { url: urlWithParams } = json;
629
633
  resetPasswordWithParams = `${urlWithParams}&redirect=false`;
630
- await this.sendData(resetPasswordWithParams);
634
+ await this.#sendData(resetPasswordWithParams);
635
+ return await this.#sendData(resetPasswordWithParams, {
636
+ method: password ? "put" : "post",
637
+ body: JSON.stringify({ email, password })
638
+ });
631
639
  }
632
- return await this.sendData(resetPasswordWithParams, {
633
- method: password ? "put" : "post",
634
- body: JSON.stringify({ email, password })
635
- });
636
640
  }
637
- _configureFetch(params) {
641
+ #configureFetch(params) {
638
642
  const { baseUrl, init, auth: auth2 } = params;
639
643
  if (baseUrl) {
640
644
  this.baseUrl = baseUrl;
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 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 = await this.getSession;\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 if (!res.ok) throw data;\n return Object.keys(data).length > 0 ? data : undefined;\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 if (errorHandler) {\n const urlSearchParams = new URLSearchParams({ error });\n return { url: `${url}?${urlSearchParams}` } as T;\n }\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 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.fetchData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (redirect === false) {\n const { url: urlWithParams } = data;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.sendData(resetPasswordWithParams);\n }\n\n return await this.sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\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};\nexport const signIn: typeof authorizer.signIn = async function signOut(\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};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(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;;;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,SAAS,OAAO,IAAI;AACzB,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,MAAM,KAAK;AACnC,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,OAAO,MAAM,wBAAwB,KAAc;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,KAAa;AACvB,SAAK,MAAM,UAAU;AACrB,SAAK,SAAS,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,IAAI,UAAU;AACZ,SAAK,SAAS,OAAO,IAAI;AACzB,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,SACJ,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,OAAO,MAAM,sBAAsB,EAAE,OAAuB,IAAI,CAAC;AACtE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,UACJ,KACA,MACwB;AACxB,UAAM,UAAuB;AAAA,MAC3B,GAAI,KAAK,cAAc,KAAK,cAAc,CAAC;AAAA,MAC3C,GAAG;AAAA,IACL;AACA,UAAM,MAAM,MAAM,KAAK,SAAS,KAAK,OAAO;AAE5C,UAAM,eAAe,KAAK,MAAM;AAChC,QAAI;AACF,UAAI,KAAK,IAAI;AACX,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAK,MAAM,UAAU;AACrB,YAAI,CAAC,IAAI,GAAI,OAAM;AACnB,eAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAAA,MAC/C;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAE1B,YAAI,CAAC,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AAChD,eAAK,OAAO,MAAM,sBAAsB;AAAA,YACtC;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,gBAAMC,SAAQ,MAAM,cAAc,KAAK;AACvC,cAAIA,QAAO;AACT,gBAAI,cAAc;AAChB,oBAAM,kBAAkB,IAAI,gBAAgB,EAAE,OAAAA,OAAM,CAAC;AACrD,qBAAO,EAAE,KAAK,GAAG,GAAG,IAAI,eAAe,GAAG;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,cACJ,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,OAAO,MAAM,sBAAsB;AAAA,YACtC;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,UAEhB,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,cAAc,YAAY;AAAA,MAChD,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,UAAU,WAAW;AAAA,MAC3C,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,EACA,MAAM,cAAc,SASjB;AACD,UAAM,EAAE,UAAU,UAAU,OAAO,UAAU,YAAY,IAAI;AAE7D,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,aAAa,OAAO;AACtB,YAAM,EAAE,KAAK,cAAc,IAAI;AAC/B,gCAA0B,GAAG,aAAa;AAC1C,YAAM,KAAK,SAAS,uBAAuB;AAAA,IAC7C;AAEA,WAAO,MAAM,KAAK,SAAS,yBAAyB;AAAA,MAClD,QAAQ,WAAW,QAAQ;AAAA,MAC3B,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH;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;AACO,IAAM,SAAmC,eAAeA,SAC7D,UACA,SACA,YACA;AACA,SAAO,KAAK,OAAO,UAAU,SAAS,UAAU;AAClD;AAEO,IAAM,SAAmC,eAAeC,QAAO,SAAS;AAC7E,SAAO,KAAK,OAAO,OAAO;AAC5B;AACO,IAAM,gBACX,eAAeC,eAAc,SAAS;AACpC,SAAO,KAAK,cAAc,OAAO;AACnC;;;ACptBK,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","signUp","resetPassword"]}
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 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 = await this.getSession;\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 if (!res.ok) throw data;\n return Object.keys(data).length > 0 ? data : undefined;\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 if (errorHandler) {\n const urlSearchParams = new URLSearchParams({ error });\n return { url: `${url}?${urlSearchParams}` } as T;\n }\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 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};\nexport const signIn: typeof authorizer.signIn = async function signOut(\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};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(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;;;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,MAAM,KAAK;AACnC,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,YAAI,CAAC,IAAI,GAAI,OAAM;AACnB,eAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAAA,MAC/C;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,gBAAI,cAAc;AAChB,oBAAM,kBAAkB,IAAI,gBAAgB,EAAE,OAAAA,OAAM,CAAC;AACrD,qBAAO,EAAE,KAAK,GAAG,GAAG,IAAI,eAAe,GAAG;AAAA,YAC5C;AAAA,UACF;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,EACA,MAAM,cAAc,SASjB;AACD,UAAM,EAAE,UAAU,UAAU,OAAO,UAAU,YAAY,IAAI;AAE7D,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;AACO,IAAM,SAAmC,eAAeA,SAC7D,UACA,SACA,YACA;AACA,SAAO,KAAK,OAAO,UAAU,SAAS,UAAU;AAClD;AAEO,IAAM,SAAmC,eAAeC,QAAO,SAAS;AAC7E,SAAO,KAAK,OAAO,OAAO;AAC5B;AACO,IAAM,gBACX,eAAeC,eAAc,SAAS;AACpC,SAAO,KAAK,cAAc,OAAO;AACnC;;;ACxtBK,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","signUp","resetPassword"]}
package/dist/index.mjs CHANGED
@@ -161,7 +161,7 @@ function createObservableObject(obj, listenerKeys = ["loading", "session"], even
161
161
  // src/Authorizer.ts
162
162
  var Authorizer = class {
163
163
  state;
164
- logger;
164
+ #logger;
165
165
  requestInit;
166
166
  addListener;
167
167
  removeListener;
@@ -182,7 +182,7 @@ var Authorizer = class {
182
182
  this.state = proxy;
183
183
  this.addListener = addListener;
184
184
  this.removeListener = removeListener;
185
- this.logger = logger(this);
185
+ this.#logger = logger(this);
186
186
  this.status = null;
187
187
  }
188
188
  async sync(event) {
@@ -198,15 +198,15 @@ var Authorizer = class {
198
198
  this.state.lastSync = Date.now();
199
199
  this.state.session = await this.getSession();
200
200
  } catch (error) {
201
- this.logger.error("CLIENT_SESSION_ERROR", error);
201
+ this.#logger.error("CLIENT_SESSION_ERROR", error);
202
202
  }
203
203
  }
204
204
  set baseUrl(val) {
205
205
  this.state.baseUrl = val;
206
- this.logger = logger(this);
206
+ this.#logger = logger(this);
207
207
  }
208
208
  get baseUrl() {
209
- this.logger = logger(this);
209
+ this.#logger = logger(this);
210
210
  return this.state.baseUrl;
211
211
  }
212
212
  configure(config) {
@@ -240,7 +240,7 @@ var Authorizer = class {
240
240
  get apiBaseUrl() {
241
241
  return `${this.baseUrl}${this.state.basePath}`;
242
242
  }
243
- async sendData(url, init) {
243
+ async #sendData(url, init) {
244
244
  try {
245
245
  const options = {
246
246
  headers: {
@@ -254,16 +254,16 @@ var Authorizer = class {
254
254
  this.state.loading = false;
255
255
  return res;
256
256
  } catch (error) {
257
- this.logger.error("CLIENT_FETCH_ERROR", { error, url });
257
+ this.#logger.error("CLIENT_FETCH_ERROR", { error, url });
258
258
  return void 0;
259
259
  }
260
260
  }
261
- async fetchData(url, init) {
261
+ async #fetchData(url, init) {
262
262
  const options = {
263
263
  ...this.requestInit ? this.requestInit : {},
264
264
  ...init
265
265
  };
266
- const res = await this.sendData(url, options);
266
+ const res = await this.#sendData(url, options);
267
267
  const errorHandler = res?.clone();
268
268
  try {
269
269
  if (res?.ok) {
@@ -275,7 +275,7 @@ var Authorizer = class {
275
275
  } catch (error) {
276
276
  if (error instanceof Error) {
277
277
  if (!error.message.includes("is not valid JSON")) {
278
- this.logger.error("CLIENT_FETCH_ERROR", {
278
+ this.#logger.error("CLIENT_FETCH_ERROR", {
279
279
  error,
280
280
  url
281
281
  });
@@ -292,7 +292,7 @@ var Authorizer = class {
292
292
  return void 0;
293
293
  }
294
294
  }
295
- async fetchFormData(url, init) {
295
+ async #fetchFormData(url, init) {
296
296
  try {
297
297
  const res = await fetch(url, {
298
298
  ...this.requestInit,
@@ -322,7 +322,7 @@ var Authorizer = class {
322
322
  } catch (error) {
323
323
  if (error instanceof Error) {
324
324
  if (!error.message.includes("is not valid JSON")) {
325
- this.logger.error("CLIENT_FETCH_ERROR", {
325
+ this.#logger.error("CLIENT_FETCH_ERROR", {
326
326
  error,
327
327
  url
328
328
  });
@@ -332,10 +332,10 @@ var Authorizer = class {
332
332
  }
333
333
  }
334
334
  async getProviders(url) {
335
- return await this.fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
335
+ return await this.#fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
336
336
  }
337
337
  async getCsrfToken(url) {
338
- const response = await this.fetchData(
338
+ const response = await this.#fetchData(
339
339
  url ?? `${this.apiBaseUrl}/auth/csrf`
340
340
  );
341
341
  return response?.csrfToken;
@@ -356,7 +356,7 @@ var Authorizer = class {
356
356
  return this.state.session;
357
357
  }
358
358
  this.state.loading = true;
359
- const session = await this.fetchData(
359
+ const session = await this.#fetchData(
360
360
  `${this.apiBaseUrl}/auth/session`
361
361
  );
362
362
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -370,7 +370,7 @@ var Authorizer = class {
370
370
  }
371
371
  async refreshSession() {
372
372
  this.state.loading = true;
373
- const session = await this.fetchData(
373
+ const session = await this.#fetchData(
374
374
  `${this.apiBaseUrl}/auth/session`
375
375
  );
376
376
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -407,7 +407,7 @@ var Authorizer = class {
407
407
  json: String(true)
408
408
  })
409
409
  };
410
- const res = await this.fetchFormData(
410
+ const res = await this.#fetchFormData(
411
411
  baseFetch,
412
412
  fetchOptions
413
413
  );
@@ -466,7 +466,7 @@ var Authorizer = class {
466
466
  const baseFetch = `${this.apiBaseUrl}/auth`;
467
467
  const signInUrl = fetchUrl ?? `${baseFetch}/${isCredentials ? "callback" : "signin"}/${provider}`;
468
468
  const _signInUrl = `${signInUrl}${authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ""}`;
469
- const data = await this.fetchFormData(_signInUrl, {
469
+ const data = await this.#fetchFormData(_signInUrl, {
470
470
  method: "post",
471
471
  body: new URLSearchParams({
472
472
  ...remaining,
@@ -542,7 +542,7 @@ var Authorizer = class {
542
542
  if (searchParams.size > 0) {
543
543
  signUpUrl += `?${searchParams}`;
544
544
  }
545
- const data = await this.fetchData(signUpUrl, {
545
+ const data = await this.#fetchData(signUpUrl, {
546
546
  method: "post",
547
547
  body: JSON.stringify({ email, password })
548
548
  });
@@ -569,7 +569,7 @@ var Authorizer = class {
569
569
  }
570
570
  async resetPassword(options) {
571
571
  const { password, fetchUrl, email, redirect, callbackUrl } = options;
572
- this._configureFetch(options);
572
+ this.#configureFetch(options);
573
573
  const resetPasswordUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;
574
574
  let resetPasswordWithParams = resetPasswordUrl;
575
575
  const searchParams = new URLSearchParams();
@@ -579,7 +579,7 @@ var Authorizer = class {
579
579
  if (searchParams.size > 0) {
580
580
  resetPasswordWithParams += `?${searchParams}`;
581
581
  }
582
- const data = await this.fetchData(resetPasswordWithParams, {
582
+ const data = await this.#sendData(resetPasswordWithParams, {
583
583
  method: "post",
584
584
  body: JSON.stringify({
585
585
  email,
@@ -588,17 +588,21 @@ var Authorizer = class {
588
588
  callbackUrl
589
589
  })
590
590
  });
591
+ if (!data?.ok) {
592
+ throw new Error(await data?.clone().text());
593
+ }
591
594
  if (redirect === false) {
592
- const { url: urlWithParams } = data;
595
+ const json = await data?.json();
596
+ const { url: urlWithParams } = json;
593
597
  resetPasswordWithParams = `${urlWithParams}&redirect=false`;
594
- await this.sendData(resetPasswordWithParams);
598
+ await this.#sendData(resetPasswordWithParams);
599
+ return await this.#sendData(resetPasswordWithParams, {
600
+ method: password ? "put" : "post",
601
+ body: JSON.stringify({ email, password })
602
+ });
595
603
  }
596
- return await this.sendData(resetPasswordWithParams, {
597
- method: password ? "put" : "post",
598
- body: JSON.stringify({ email, password })
599
- });
600
604
  }
601
- _configureFetch(params) {
605
+ #configureFetch(params) {
602
606
  const { baseUrl, init, auth: auth2 } = params;
603
607
  if (baseUrl) {
604
608
  this.baseUrl = baseUrl;
@@ -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 = await this.getSession;\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 if (!res.ok) throw data;\n return Object.keys(data).length > 0 ? data : undefined;\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 if (errorHandler) {\n const urlSearchParams = new URLSearchParams({ error });\n return { url: `${url}?${urlSearchParams}` } as T;\n }\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 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.fetchData(resetPasswordWithParams, {\n method: 'post',\n body: JSON.stringify({\n email,\n password,\n redirectUrl: resetPasswordUrl,\n callbackUrl,\n }),\n });\n if (redirect === false) {\n const { url: urlWithParams } = data;\n resetPasswordWithParams = `${urlWithParams}&redirect=false`;\n await this.sendData(resetPasswordWithParams);\n }\n\n return await this.sendData(resetPasswordWithParams, {\n method: password ? 'put' : 'post',\n body: JSON.stringify({ email, password }),\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};\nexport const signIn: typeof authorizer.signIn = async function signOut(\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};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(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","signUp","resetPassword"]}
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 = await this.getSession;\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 if (!res.ok) throw data;\n return Object.keys(data).length > 0 ? data : undefined;\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 if (errorHandler) {\n const urlSearchParams = new URLSearchParams({ error });\n return { url: `${url}?${urlSearchParams}` } as T;\n }\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 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};\nexport const signIn: typeof authorizer.signIn = async function signOut(\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};\nexport const resetPassword: typeof authorizer.resetPassword =\n async function resetPassword(options) {\n return auth.resetPassword(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","signUp","resetPassword"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@niledatabase/client",
3
- "version": "5.0.0-alpha.2",
3
+ "version": "5.0.0-alpha.4",
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": "d7ab2e95efda7664c3308301323359356ba69faa"
61
+ "gitHead": "29f1ac308f3d044534470bcf5418971ac9858eb2"
62
62
  }