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

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,14 +218,14 @@ 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) {
225
225
  try {
226
226
  const storageEvent = event === "storage";
227
227
  if (storageEvent || !this.state.session) {
228
- this.state.getSession = await this.getSession;
228
+ this.state.getSession = this.getSession.bind(this);
229
229
  this.state.lastSync = now();
230
230
  }
231
231
  if (!event || this.state.session == null || now() < this.state.lastSync) {
@@ -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,45 +290,50 @@ 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) {
306
306
  const data = await res.json();
307
307
  this.state.loading = false;
308
- if (!res.ok) throw data;
309
308
  return Object.keys(data).length > 0 ? data : void 0;
309
+ } else {
310
+ const error = await errorHandler?.text();
311
+ if (error) {
312
+ const updatedUrl = new URL(url);
313
+ updatedUrl.searchParams.set("error", error);
314
+ return { url: updatedUrl.toString() };
315
+ }
310
316
  }
311
317
  } catch (error) {
312
318
  if (error instanceof Error) {
313
319
  if (!error.message.includes("is not valid JSON")) {
314
- this.logger.error("CLIENT_FETCH_ERROR", {
320
+ this.#logger.error("CLIENT_FETCH_ERROR", {
315
321
  error,
316
322
  url
317
323
  });
318
324
  } else {
319
325
  const error2 = await errorHandler?.text();
320
326
  if (error2) {
321
- if (errorHandler) {
322
- const urlSearchParams = new URLSearchParams({ error: error2 });
323
- return { url: `${url}?${urlSearchParams}` };
324
- }
327
+ const updatedUrl = new URL(url);
328
+ updatedUrl.searchParams.set("error", error2);
329
+ return { url: updatedUrl.toString() };
325
330
  }
326
331
  }
327
332
  }
328
333
  return void 0;
329
334
  }
330
335
  }
331
- async fetchFormData(url, init) {
336
+ async #fetchFormData(url, init) {
332
337
  try {
333
338
  const res = await fetch(url, {
334
339
  ...this.requestInit,
@@ -358,7 +363,7 @@ var Authorizer = class {
358
363
  } catch (error) {
359
364
  if (error instanceof Error) {
360
365
  if (!error.message.includes("is not valid JSON")) {
361
- this.logger.error("CLIENT_FETCH_ERROR", {
366
+ this.#logger.error("CLIENT_FETCH_ERROR", {
362
367
  error,
363
368
  url
364
369
  });
@@ -368,10 +373,10 @@ var Authorizer = class {
368
373
  }
369
374
  }
370
375
  async getProviders(url) {
371
- return await this.fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
376
+ return await this.#fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
372
377
  }
373
378
  async getCsrfToken(url) {
374
- const response = await this.fetchData(
379
+ const response = await this.#fetchData(
375
380
  url ?? `${this.apiBaseUrl}/auth/csrf`
376
381
  );
377
382
  return response?.csrfToken;
@@ -392,7 +397,7 @@ var Authorizer = class {
392
397
  return this.state.session;
393
398
  }
394
399
  this.state.loading = true;
395
- const session = await this.fetchData(
400
+ const session = await this.#fetchData(
396
401
  `${this.apiBaseUrl}/auth/session`
397
402
  );
398
403
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -406,7 +411,7 @@ var Authorizer = class {
406
411
  }
407
412
  async refreshSession() {
408
413
  this.state.loading = true;
409
- const session = await this.fetchData(
414
+ const session = await this.#fetchData(
410
415
  `${this.apiBaseUrl}/auth/session`
411
416
  );
412
417
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -443,7 +448,7 @@ var Authorizer = class {
443
448
  json: String(true)
444
449
  })
445
450
  };
446
- const res = await this.fetchFormData(
451
+ const res = await this.#fetchFormData(
447
452
  baseFetch,
448
453
  fetchOptions
449
454
  );
@@ -502,7 +507,7 @@ var Authorizer = class {
502
507
  const baseFetch = `${this.apiBaseUrl}/auth`;
503
508
  const signInUrl = fetchUrl ?? `${baseFetch}/${isCredentials ? "callback" : "signin"}/${provider}`;
504
509
  const _signInUrl = `${signInUrl}${authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ""}`;
505
- const data = await this.fetchFormData(_signInUrl, {
510
+ const data = await this.#fetchFormData(_signInUrl, {
506
511
  method: "post",
507
512
  body: new URLSearchParams({
508
513
  ...remaining,
@@ -578,7 +583,7 @@ var Authorizer = class {
578
583
  if (searchParams.size > 0) {
579
584
  signUpUrl += `?${searchParams}`;
580
585
  }
581
- const data = await this.fetchData(signUpUrl, {
586
+ const data = await this.#fetchData(signUpUrl, {
582
587
  method: "post",
583
588
  body: JSON.stringify({ email, password })
584
589
  });
@@ -605,7 +610,7 @@ var Authorizer = class {
605
610
  }
606
611
  async resetPassword(options) {
607
612
  const { password, fetchUrl, email, redirect, callbackUrl } = options;
608
- this._configureFetch(options);
613
+ this.#configureFetch(options);
609
614
  const resetPasswordUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;
610
615
  let resetPasswordWithParams = resetPasswordUrl;
611
616
  const searchParams = new URLSearchParams();
@@ -615,7 +620,7 @@ var Authorizer = class {
615
620
  if (searchParams.size > 0) {
616
621
  resetPasswordWithParams += `?${searchParams}`;
617
622
  }
618
- const data = await this.fetchData(resetPasswordWithParams, {
623
+ const data = await this.#sendData(resetPasswordWithParams, {
619
624
  method: "post",
620
625
  body: JSON.stringify({
621
626
  email,
@@ -624,17 +629,21 @@ var Authorizer = class {
624
629
  callbackUrl
625
630
  })
626
631
  });
632
+ if (!data?.ok) {
633
+ throw new Error(await data?.clone().text());
634
+ }
627
635
  if (redirect === false) {
628
- const { url: urlWithParams } = data;
636
+ const json = await data?.json();
637
+ const { url: urlWithParams } = json;
629
638
  resetPasswordWithParams = `${urlWithParams}&redirect=false`;
630
- await this.sendData(resetPasswordWithParams);
639
+ await this.#sendData(resetPasswordWithParams);
640
+ return await this.#sendData(resetPasswordWithParams, {
641
+ method: password ? "put" : "post",
642
+ body: JSON.stringify({ email, password })
643
+ });
631
644
  }
632
- return await this.sendData(resetPasswordWithParams, {
633
- method: password ? "put" : "post",
634
- body: JSON.stringify({ email, password })
635
- });
636
645
  }
637
- _configureFetch(params) {
646
+ #configureFetch(params) {
638
647
  const { baseUrl, init, auth: auth2 } = params;
639
648
  if (baseUrl) {
640
649
  this.baseUrl = baseUrl;
@@ -688,7 +697,7 @@ var getProviders = async function getProviders2() {
688
697
  var signOut = async function signOut2(options) {
689
698
  return auth.signOut(options);
690
699
  };
691
- var signIn = async function signOut3(provider, options, authParams) {
700
+ var signIn = async function signIn2(provider, options, authParams) {
692
701
  return auth.signIn(provider, options, authParams);
693
702
  };
694
703
  var signUp = async function signUp2(options) {
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":"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","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 = this.getSession.bind(this);\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n 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 signIn(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\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","signIn","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,14 +182,14 @@ 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) {
189
189
  try {
190
190
  const storageEvent = event === "storage";
191
191
  if (storageEvent || !this.state.session) {
192
- this.state.getSession = await this.getSession;
192
+ this.state.getSession = this.getSession.bind(this);
193
193
  this.state.lastSync = now();
194
194
  }
195
195
  if (!event || this.state.session == null || now() < this.state.lastSync) {
@@ -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,45 +254,50 @@ 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) {
270
270
  const data = await res.json();
271
271
  this.state.loading = false;
272
- if (!res.ok) throw data;
273
272
  return Object.keys(data).length > 0 ? data : void 0;
273
+ } else {
274
+ const error = await errorHandler?.text();
275
+ if (error) {
276
+ const updatedUrl = new URL(url);
277
+ updatedUrl.searchParams.set("error", error);
278
+ return { url: updatedUrl.toString() };
279
+ }
274
280
  }
275
281
  } catch (error) {
276
282
  if (error instanceof Error) {
277
283
  if (!error.message.includes("is not valid JSON")) {
278
- this.logger.error("CLIENT_FETCH_ERROR", {
284
+ this.#logger.error("CLIENT_FETCH_ERROR", {
279
285
  error,
280
286
  url
281
287
  });
282
288
  } else {
283
289
  const error2 = await errorHandler?.text();
284
290
  if (error2) {
285
- if (errorHandler) {
286
- const urlSearchParams = new URLSearchParams({ error: error2 });
287
- return { url: `${url}?${urlSearchParams}` };
288
- }
291
+ const updatedUrl = new URL(url);
292
+ updatedUrl.searchParams.set("error", error2);
293
+ return { url: updatedUrl.toString() };
289
294
  }
290
295
  }
291
296
  }
292
297
  return void 0;
293
298
  }
294
299
  }
295
- async fetchFormData(url, init) {
300
+ async #fetchFormData(url, init) {
296
301
  try {
297
302
  const res = await fetch(url, {
298
303
  ...this.requestInit,
@@ -322,7 +327,7 @@ var Authorizer = class {
322
327
  } catch (error) {
323
328
  if (error instanceof Error) {
324
329
  if (!error.message.includes("is not valid JSON")) {
325
- this.logger.error("CLIENT_FETCH_ERROR", {
330
+ this.#logger.error("CLIENT_FETCH_ERROR", {
326
331
  error,
327
332
  url
328
333
  });
@@ -332,10 +337,10 @@ var Authorizer = class {
332
337
  }
333
338
  }
334
339
  async getProviders(url) {
335
- return await this.fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
340
+ return await this.#fetchData(url ?? `${this.apiBaseUrl}/auth/providers`);
336
341
  }
337
342
  async getCsrfToken(url) {
338
- const response = await this.fetchData(
343
+ const response = await this.#fetchData(
339
344
  url ?? `${this.apiBaseUrl}/auth/csrf`
340
345
  );
341
346
  return response?.csrfToken;
@@ -356,7 +361,7 @@ var Authorizer = class {
356
361
  return this.state.session;
357
362
  }
358
363
  this.state.loading = true;
359
- const session = await this.fetchData(
364
+ const session = await this.#fetchData(
360
365
  `${this.apiBaseUrl}/auth/session`
361
366
  );
362
367
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -370,7 +375,7 @@ var Authorizer = class {
370
375
  }
371
376
  async refreshSession() {
372
377
  this.state.loading = true;
373
- const session = await this.fetchData(
378
+ const session = await this.#fetchData(
374
379
  `${this.apiBaseUrl}/auth/session`
375
380
  );
376
381
  broadcast.post({ event: "session", data: { trigger: "getSession" } });
@@ -407,7 +412,7 @@ var Authorizer = class {
407
412
  json: String(true)
408
413
  })
409
414
  };
410
- const res = await this.fetchFormData(
415
+ const res = await this.#fetchFormData(
411
416
  baseFetch,
412
417
  fetchOptions
413
418
  );
@@ -466,7 +471,7 @@ var Authorizer = class {
466
471
  const baseFetch = `${this.apiBaseUrl}/auth`;
467
472
  const signInUrl = fetchUrl ?? `${baseFetch}/${isCredentials ? "callback" : "signin"}/${provider}`;
468
473
  const _signInUrl = `${signInUrl}${authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ""}`;
469
- const data = await this.fetchFormData(_signInUrl, {
474
+ const data = await this.#fetchFormData(_signInUrl, {
470
475
  method: "post",
471
476
  body: new URLSearchParams({
472
477
  ...remaining,
@@ -542,7 +547,7 @@ var Authorizer = class {
542
547
  if (searchParams.size > 0) {
543
548
  signUpUrl += `?${searchParams}`;
544
549
  }
545
- const data = await this.fetchData(signUpUrl, {
550
+ const data = await this.#fetchData(signUpUrl, {
546
551
  method: "post",
547
552
  body: JSON.stringify({ email, password })
548
553
  });
@@ -569,7 +574,7 @@ var Authorizer = class {
569
574
  }
570
575
  async resetPassword(options) {
571
576
  const { password, fetchUrl, email, redirect, callbackUrl } = options;
572
- this._configureFetch(options);
577
+ this.#configureFetch(options);
573
578
  const resetPasswordUrl = fetchUrl ?? `${this.apiBaseUrl}/auth/reset-password`;
574
579
  let resetPasswordWithParams = resetPasswordUrl;
575
580
  const searchParams = new URLSearchParams();
@@ -579,7 +584,7 @@ var Authorizer = class {
579
584
  if (searchParams.size > 0) {
580
585
  resetPasswordWithParams += `?${searchParams}`;
581
586
  }
582
- const data = await this.fetchData(resetPasswordWithParams, {
587
+ const data = await this.#sendData(resetPasswordWithParams, {
583
588
  method: "post",
584
589
  body: JSON.stringify({
585
590
  email,
@@ -588,17 +593,21 @@ var Authorizer = class {
588
593
  callbackUrl
589
594
  })
590
595
  });
596
+ if (!data?.ok) {
597
+ throw new Error(await data?.clone().text());
598
+ }
591
599
  if (redirect === false) {
592
- const { url: urlWithParams } = data;
600
+ const json = await data?.json();
601
+ const { url: urlWithParams } = json;
593
602
  resetPasswordWithParams = `${urlWithParams}&redirect=false`;
594
- await this.sendData(resetPasswordWithParams);
603
+ await this.#sendData(resetPasswordWithParams);
604
+ return await this.#sendData(resetPasswordWithParams, {
605
+ method: password ? "put" : "post",
606
+ body: JSON.stringify({ email, password })
607
+ });
595
608
  }
596
- return await this.sendData(resetPasswordWithParams, {
597
- method: password ? "put" : "post",
598
- body: JSON.stringify({ email, password })
599
- });
600
609
  }
601
- _configureFetch(params) {
610
+ #configureFetch(params) {
602
611
  const { baseUrl, init, auth: auth2 } = params;
603
612
  if (baseUrl) {
604
613
  this.baseUrl = baseUrl;
@@ -652,7 +661,7 @@ var getProviders = async function getProviders2() {
652
661
  var signOut = async function signOut2(options) {
653
662
  return auth.signOut(options);
654
663
  };
655
- var signIn = async function signOut3(provider, options, authParams) {
664
+ var signIn = async function signIn2(provider, options, authParams) {
656
665
  return auth.signIn(provider, options, authParams);
657
666
  };
658
667
  var signUp = async function signUp2(options) {
@@ -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 = this.getSession.bind(this);\n this.state.lastSync = now();\n }\n if (!event || this.state.session == null || now() < this.state.lastSync) {\n return;\n }\n this.state.lastSync = Date.now();\n this.state.session = await this.getSession();\n } catch (error) {\n this.#logger.error('CLIENT_SESSION_ERROR', error as Error);\n }\n }\n\n set baseUrl(val: string) {\n this.state.baseUrl = val;\n this.#logger = logger(this);\n }\n\n get baseUrl() {\n this.#logger = logger(this);\n return this.state.baseUrl;\n }\n\n configure(config?: Config) {\n if (config?.basePath) this.state.basePath = parseUrl(config?.basePath).path;\n if (config?.baseUrl) this.baseUrl = config.baseUrl;\n if (config?.init) this.requestInit = config.init;\n\n return this;\n }\n sanitize(): PartialAuthorizer {\n return {\n state: {\n baseUrl: this.baseUrl,\n session: {\n user: {\n email: (this.state.session as ActiveSession)?.user?.email,\n },\n },\n },\n requestInit: this.requestInit,\n };\n }\n\n async initialize(params?: {\n baseUrl?: string;\n session?: NonErrorSession | null | undefined;\n event?: 'storage' | 'timer' | 'hidden' | 'poll' | 'visibilitychange';\n }) {\n const { baseUrl, session, event } = params ?? {};\n\n if (baseUrl) this.baseUrl = baseUrl;\n\n const hasInitialSession = session !== undefined;\n\n this.state.loading = !hasInitialSession;\n this.state.lastSync = hasInitialSession ? now() : 0;\n this.state.session = session;\n\n await this.sync(event);\n }\n\n get apiBaseUrl() {\n return `${this.baseUrl}${this.state.basePath}`;\n }\n\n async #sendData(\n url: string,\n init?: RequestInit\n ): Promise<Response | undefined> {\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n\n const filledUrl = !url.startsWith('http')\n ? `${window.location.origin}${url}`\n : url;\n\n const res = await fetch(filledUrl, options);\n this.state.loading = false;\n return res;\n } catch (error) {\n this.#logger.error('CLIENT_FETCH_ERROR', { error: error as Error, url });\n return undefined;\n }\n }\n async #fetchData<T = any>(\n url: string,\n init?: RequestInit\n ): Promise<T | undefined> {\n const options: RequestInit = {\n ...(this.requestInit ? this.requestInit : {}),\n ...init,\n };\n const res = await this.#sendData(url, options);\n\n const errorHandler = res?.clone();\n try {\n if (res?.ok) {\n const data = await res.json();\n this.state.loading = false;\n return Object.keys(data).length > 0 ? data : undefined;\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n } else {\n const error = await errorHandler?.text();\n if (error) {\n const updatedUrl = new URL(url);\n updatedUrl.searchParams.set('error', error);\n return { url: updatedUrl.toString() } as T;\n }\n }\n }\n return undefined;\n }\n }\n async #fetchFormData<T = { url: string }>(\n url: string,\n init: RequestInit\n ): Promise<\n | {\n data: T;\n status: number;\n ok: boolean;\n url: string;\n }\n | undefined\n > {\n try {\n const res = await fetch(url, {\n ...this.requestInit,\n ...init,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n if (res) {\n if (res.ok) {\n return {\n data: (await res.json()) as T,\n status: res.status,\n ok: res.ok,\n url: res.url,\n };\n }\n const { url: responseUrl } = await res.json();\n return {\n data: {} as T,\n status: res.status,\n ok: res?.ok,\n url: responseUrl,\n };\n }\n throw new Error(`Unable to fetch ${url}`);\n } catch (error) {\n if (error instanceof Error) {\n // this is fine\n if (!error.message.includes('is not valid JSON')) {\n this.#logger.error('CLIENT_FETCH_ERROR', {\n error: error as Error,\n url,\n });\n }\n }\n return undefined;\n }\n }\n\n async getProviders(url?: string) {\n return await this.#fetchData<\n Record<LiteralUnion<BuiltInProviderType>, ClientSafeProvider>\n >(url ?? `${this.apiBaseUrl}/auth/providers`);\n }\n\n async getCsrfToken(url?: string) {\n const response = await this.#fetchData<{ csrfToken: string }>(\n url ?? `${this.apiBaseUrl}/auth/csrf`\n );\n return response?.csrfToken;\n }\n\n async getSession(params?: GetSessionParams): Promise<NonErrorSession> {\n if (this.status === State.SESSION) {\n return;\n }\n this.status = State.SESSION;\n if (params?.init) {\n this.requestInit = params.init;\n }\n\n if (params?.baseUrl) {\n this.baseUrl = params.baseUrl;\n }\n\n if (this.state.session && now() < this.state.lastSync) {\n this.status = null;\n return this.state.session;\n }\n this.state.loading = true;\n\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.status = null;\n if (session) {\n this.state.session = session;\n await this.sync('storage');\n return { ...session, loading: this.state.loading };\n }\n return { loading: this.state.loading } as NonErrorSession;\n }\n\n async refreshSession() {\n this.state.loading = true;\n const session = await this.#fetchData<NonErrorSession | undefined>(\n `${this.apiBaseUrl}/auth/session`\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'getSession' } });\n this.state.session = session;\n await this.sync('storage');\n return session;\n }\n async signOut<R extends boolean = true>(\n options?: SignOutParams<R> & {\n baseUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n fetchUrl?: string;\n basePath?: string;\n }\n ): Promise<R extends true ? undefined : SignOutResponse> {\n const {\n callbackUrl = window.location.href,\n baseUrl,\n auth,\n fetchUrl,\n basePath,\n } = options ?? {};\n\n if (basePath) {\n this.state.basePath = basePath;\n }\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n this.requestInit = auth.requestInit;\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n const baseFetch = fetchUrl ?? `${this.apiBaseUrl}/auth/signout`;\n const fetchOptions: RequestInit = {\n method: 'post',\n body: new URLSearchParams({\n csrfToken: String(await this.getCsrfToken()),\n callbackUrl,\n json: String(true),\n }),\n };\n const res = await this.#fetchFormData<SignOutResponse>(\n baseFetch,\n fetchOptions\n );\n\n broadcast.post({ event: 'session', data: { trigger: 'signout' } });\n\n // in the case you are going x-origin, we don't want to trust the nile.callback-url, so we will not redirect and just refresh the page\n if (this.requestInit?.credentials) {\n window.location.href = callbackUrl;\n if (callbackUrl.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n if (options?.redirect ?? true) {\n const url = res?.data?.url ?? callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n return undefined as R extends true ? undefined : SignOutResponse;\n }\n\n await this.state.getSession({ event: 'storage' });\n\n return res?.data as R extends true ? undefined : SignOutResponse;\n }\n async signIn<P extends RedirectableProviderType | undefined = undefined>(\n provider?: LiteralUnion<\n P extends RedirectableProviderType\n ? P | BuiltInProviderType\n : BuiltInProviderType\n >,\n options?: SignInOptions & {\n baseUrl?: string;\n providersUrl?: string;\n csrfUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n resetUrl?: string;\n auth?: Authorizer | PartialAuthorizer;\n },\n authorizationParams?: SignInAuthorizationParams\n ): Promise<\n P extends RedirectableProviderType ? SignInResponse | undefined : undefined\n > {\n const {\n callbackUrl = window.location.href,\n resetUrl = window.location.href,\n providersUrl,\n csrfUrl,\n baseUrl,\n fetchUrl,\n init,\n auth,\n redirect = true,\n ...remaining\n } = options ?? {};\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n if (init) {\n this.requestInit = init;\n }\n\n const providers = await this.getProviders(providersUrl);\n\n if (!providers) {\n return { error: 'No providers enabled' } as any;\n }\n if (!provider || !(provider in providers)) {\n return { error: `Provider ${provider} not enabled` } as any;\n }\n\n const isCredentials = providers[provider].type === 'credentials';\n const isEmail = providers[provider].type === 'email';\n const isSupportingReturn = isCredentials || isEmail;\n\n const baseFetch = `${this.apiBaseUrl}/auth`;\n const signInUrl =\n fetchUrl ??\n `${baseFetch}/${isCredentials ? 'callback' : 'signin'}/${provider}`;\n\n const _signInUrl = `${signInUrl}${\n authorizationParams ? `?${new URLSearchParams(authorizationParams)}` : ''\n }`;\n\n const data = await this.#fetchFormData(_signInUrl, {\n method: 'post',\n body: new URLSearchParams({\n ...remaining,\n csrfToken: String(await this.getCsrfToken(csrfUrl)),\n callbackUrl,\n json: String(true),\n resetUrl,\n }),\n });\n\n if (data?.ok && this.requestInit?.credentials && isSupportingReturn) {\n window.location.reload();\n return;\n }\n\n if (data?.ok && (redirect || !isSupportingReturn)) {\n const url = data?.data.url ?? callbackUrl;\n window.location.href = url;\n if (url.includes('#')) window.location.reload();\n return;\n }\n\n const error = data?.data?.url\n ? new URL(String(data?.data?.url)).searchParams.get('error')\n : null;\n\n if (data?.ok) {\n await this.initialize();\n await this.getSession({ event: 'storage' });\n }\n return {\n error,\n status: data?.status,\n ok: data?.ok,\n url: error ? null : data?.url,\n } as any;\n }\n async signUp(options: {\n baseUrl?: string;\n init?: ResponseInit;\n fetchUrl?: string;\n newTenantName?: string;\n createTenant?: string | boolean;\n email: string;\n password: string;\n auth?: Authorizer | PartialAuthorizer;\n tenantId?: string;\n callbackUrl?: string;\n redirect?: boolean;\n }) {\n const {\n password,\n tenantId,\n fetchUrl,\n newTenantName,\n createTenant,\n baseUrl,\n init,\n email,\n auth,\n callbackUrl = window.location.href,\n } = options;\n\n if (baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n if (auth) {\n if (auth.requestInit) {\n this.requestInit = auth.requestInit;\n }\n if (auth.state?.baseUrl) {\n this.baseUrl = auth.state.baseUrl;\n }\n }\n\n if (init) {\n this.requestInit = init;\n }\n\n const searchParams = new URLSearchParams();\n\n if (newTenantName) {\n searchParams.set('newTenantName', newTenantName);\n } else if (createTenant) {\n if (typeof createTenant === 'boolean') {\n searchParams.set('newTenantName', email);\n } else if (typeof createTenant === 'string') {\n searchParams.set('newTenantName', createTenant);\n }\n }\n if (tenantId) {\n searchParams.set('tenantId', tenantId);\n }\n\n let signUpUrl = fetchUrl ?? `${this.apiBaseUrl}/signup`;\n if (searchParams.size > 0) {\n signUpUrl += `?${searchParams}`;\n }\n const data = await this.#fetchData(signUpUrl, {\n method: 'post',\n body: JSON.stringify({ email, password }),\n });\n\n const error = data?.url\n ? new URL(data.url).searchParams.get('error')\n : null;\n\n if (!error) {\n if (data) {\n await this.initialize({ event: 'storage' });\n await this.getSession({ event: 'storage' });\n }\n if (this.requestInit?.credentials) {\n window.location.reload();\n return;\n }\n\n if (options?.redirect ?? true) {\n const url = callbackUrl;\n window.location.href = url;\n // If url contains a hash, the browser does not reload the page. We reload manually\n if (url.includes('#')) window.location.reload();\n }\n }\n\n return {\n data,\n error,\n } as any;\n }\n 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 signIn(\n provider,\n options,\n authParams\n) {\n return auth.signIn(provider, options, authParams);\n};\n\nexport const signUp: typeof authorizer.signUp = async function signUp(options) {\n return auth.signUp(options);\n};\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","signIn","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.20",
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": "2a3f0ae99595ad6b16d196491df8ffda929d8111"
62
62
  }