@plitzi/sdk-auth 0.30.19

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.
@@ -0,0 +1,3 @@
1
+ import { AuthContextValue } from '@plitzi/sdk-shared';
2
+ export declare const AuthContext: import('react').Context<AuthContextValue>;
3
+ export default AuthContext;
@@ -0,0 +1,5 @@
1
+ import { createContext as e } from "react";
2
+ var t = e({});
3
+ t.displayName = "AuthContext";
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,12 @@
1
+ import { Environment, Server } from '@plitzi/sdk-shared';
2
+ import { ReactNode } from 'react';
3
+ export type AuthContextProviderProps = {
4
+ children?: ReactNode;
5
+ isHydrating?: boolean;
6
+ previewMode?: boolean;
7
+ offlineMode?: boolean;
8
+ server: Server;
9
+ environment?: Environment;
10
+ };
11
+ declare const AuthContextProvider: ({ previewMode, isHydrating, children, server, environment }: AuthContextProviderProps) => import("react/jsx-runtime").JSX.Element;
12
+ export default AuthContextProvider;
@@ -0,0 +1,98 @@
1
+ import e from "./hooks/useAuth/index.mjs";
2
+ import t from "./AuthContext.mjs";
3
+ import { useMemo as n } from "react";
4
+ import { QueryBuilderEvaluator as r } from "@plitzi/plitzi-ui/QueryBuilder";
5
+ import i from "@plitzi/sdk-navigation/hooks/useNavigation";
6
+ import { processTwig as a } from "@plitzi/sdk-shared/helpers/twigWrapper";
7
+ import { createStoreHook as o } from "@plitzi/sdk-store/createStore";
8
+ import { jsx as s } from "react/jsx-runtime";
9
+ //#region src/AuthContextProvider.tsx
10
+ var c = ({ previewMode: c = !0, isHydrating: l = !1, children: u, server: d, environment: f = "production" }) => {
11
+ let { useStore: p } = o(), [[{ userProvider: m, loginUrl: h, userUrl: g, refreshUrl: _, logoutUrl: v, tokenStorage: y = "localStorage", detailsPath: b = "details", tokenPath: x = "access_token", expirationTimePath: S = "expire_at" }, C]] = p(["schema.settings", "schema.variables"]), { queryParams: w, hostname: T } = i({ server: d }), E = n(() => ({
12
+ queryParams: w,
13
+ hostname: T,
14
+ environment: f
15
+ }), [
16
+ w,
17
+ T,
18
+ f
19
+ ]), D = n(() => Array.isArray(C) ? C.reduce((e, t) => {
20
+ let { name: n, value: i, subValues: a } = t;
21
+ if (!Array.isArray(a) || a.length === 0) return {
22
+ ...e,
23
+ [n]: i
24
+ };
25
+ let o = a.find((e) => r(e.when, E));
26
+ return o ? {
27
+ ...e,
28
+ [n]: o.value
29
+ } : {
30
+ ...e,
31
+ [n]: i
32
+ };
33
+ }, {}) : {}, [C, E]), O = n(() => {
34
+ try {
35
+ return JSON.parse(a(JSON.stringify({
36
+ loginUrl: h,
37
+ userUrl: g,
38
+ refreshUrl: _,
39
+ logoutUrl: v,
40
+ detailsPath: b,
41
+ tokenPath: x,
42
+ expirationTimePath: S
43
+ }), D));
44
+ } catch {
45
+ return {
46
+ loginUrl: h,
47
+ userUrl: g,
48
+ refreshUrl: _,
49
+ logoutUrl: v,
50
+ detailsPath: b,
51
+ tokenPath: x,
52
+ expirationTimePath: S
53
+ };
54
+ }
55
+ }, [
56
+ h,
57
+ g,
58
+ _,
59
+ v,
60
+ b,
61
+ x,
62
+ S,
63
+ D
64
+ ]), { manager: k, loading: A, authenticated: j } = e({
65
+ server: d,
66
+ isHydrating: l,
67
+ tokenStorage: y,
68
+ provider: m,
69
+ loginUrl: O.loginUrl,
70
+ userUrl: O.userUrl,
71
+ refreshUrl: O.refreshUrl,
72
+ logoutUrl: O.logoutUrl,
73
+ detailsPath: O.detailsPath,
74
+ tokenPath: O.tokenPath,
75
+ expirationTimePath: O.expirationTimePath
76
+ });
77
+ return /* @__PURE__ */ s(t, {
78
+ value: n(() => ({
79
+ manager: k,
80
+ login: k.login.bind(k),
81
+ refresh: k.refresh.bind(k),
82
+ can: k.can.bind(k),
83
+ logout: k.logout.bind(k),
84
+ authenticated: j || !c,
85
+ user: k.getProvider() ? {
86
+ details: k.getProvider()?.user,
87
+ accessToken: k.getProvider()?.token?.accessToken
88
+ } : void 0
89
+ }), [
90
+ k,
91
+ j,
92
+ c
93
+ ]),
94
+ children: !A && u
95
+ });
96
+ };
97
+ //#endregion
98
+ export { c as default };
@@ -0,0 +1,24 @@
1
+ import { default as Auth0Provider } from './providers/Auth0Provider';
2
+ import { default as BasicAuthProvider } from './providers/BasicAuthProvider';
3
+ import { default as AuthProvider, AuthEventListener, AuthProviderWithCache } from './AuthProvider';
4
+ import { TokenResult } from '@plitzi/sdk-shared';
5
+ declare const providers: {
6
+ auth0: typeof Auth0Provider;
7
+ basic: typeof BasicAuthProvider;
8
+ };
9
+ export type Providers = keyof typeof providers;
10
+ export declare class AuthManager<U = Record<string, unknown>, T extends Providers = 'basic'> {
11
+ private providerType;
12
+ private provider?;
13
+ constructor(providerType: Providers | undefined, listeners: AuthEventListener | AuthEventListener[], ...args: ConstructorParameters<(typeof providers)[T]>);
14
+ getProviderType(): Providers;
15
+ getProvider(): AuthProviderWithCache<U> | undefined;
16
+ init(user?: U, skipAuth?: boolean): Promise<void> | undefined;
17
+ login(...args: Parameters<AuthProvider['login']>): Promise<TokenResult | undefined>;
18
+ refresh(): Promise<TokenResult | undefined>;
19
+ getUser(): Promise<U | undefined> | undefined;
20
+ can(permission: string): boolean;
21
+ logout(): Promise<void>;
22
+ on(listener: AuthEventListener): (() => void) | undefined;
23
+ }
24
+ export {};
@@ -0,0 +1,42 @@
1
+ import e from "./providers/Auth0Provider.mjs";
2
+ import t from "./providers/BasicAuthProvider.mjs";
3
+ //#region src/AuthManager.ts
4
+ var n = {
5
+ auth0: e,
6
+ basic: t
7
+ }, r = class {
8
+ providerType = "basic";
9
+ provider = void 0;
10
+ constructor(e = "basic", t, ...r) {
11
+ this.providerType = e, n[e] && (this.provider = new n[e](...r), this.provider.on(t));
12
+ }
13
+ getProviderType() {
14
+ return this.providerType;
15
+ }
16
+ getProvider() {
17
+ return this.provider;
18
+ }
19
+ init(e, t) {
20
+ return this.provider?.init(e, t);
21
+ }
22
+ login(...e) {
23
+ return this.provider?.login(...e) ?? Promise.resolve(void 0);
24
+ }
25
+ refresh() {
26
+ return this.provider?.refresh() ?? Promise.resolve(void 0);
27
+ }
28
+ getUser() {
29
+ return this.provider?.getUser();
30
+ }
31
+ can(e) {
32
+ return this.provider?.can(e) ?? !1;
33
+ }
34
+ logout() {
35
+ return this.provider?.logout() ?? Promise.resolve();
36
+ }
37
+ on(e) {
38
+ return this.provider?.on(e);
39
+ }
40
+ };
41
+ //#endregion
42
+ export { r as AuthManager };
@@ -0,0 +1,54 @@
1
+ import { Schema, TokenResult } from '@plitzi/sdk-shared';
2
+ export type AuthProviderCache<U = Record<string, unknown>> = {
3
+ token?: TokenResult;
4
+ user?: U;
5
+ };
6
+ export type AuthState = 'init' | 'initLoading' | 'authenticating' | 'authenticated' | 'guest';
7
+ export type AuthEvent = {
8
+ type: 'state';
9
+ state: AuthState;
10
+ } | {
11
+ type: 'login';
12
+ token: TokenResult;
13
+ } | {
14
+ type: 'logout';
15
+ } | {
16
+ type: 'expired';
17
+ };
18
+ export type AuthEventListener = (event: AuthEvent) => void;
19
+ export type AuthProviderWithCache<U> = AuthProvider<U> & Readonly<AuthProviderCache<U>>;
20
+ export type AuthProviderProps = {
21
+ enableRefresh?: boolean;
22
+ tokenStorage?: Schema['settings']['tokenStorage'];
23
+ };
24
+ declare abstract class AuthProvider<U = Record<string, unknown>> {
25
+ abstract readonly name: string;
26
+ protected cache?: AuthProviderCache<U>;
27
+ protected enableRefresh: boolean;
28
+ protected tokenStorage: Schema['settings']['tokenStorage'];
29
+ protected state: AuthState;
30
+ private listeners;
31
+ constructor({ enableRefresh, tokenStorage }?: AuthProviderProps);
32
+ abstract init(user?: U, skipAuth?: boolean): Promise<void>;
33
+ abstract login(...args: unknown[]): Promise<TokenResult | undefined>;
34
+ abstract getUser(): Promise<U | undefined>;
35
+ abstract refresh(): Promise<TokenResult | undefined>;
36
+ abstract can(permission: string): boolean;
37
+ abstract logout(): Promise<void>;
38
+ protected internalRefresh(token?: TokenResult): void;
39
+ protected internalGetUser(user?: U): void;
40
+ protected internalLogin(user?: U, token?: TokenResult): void;
41
+ protected internalLogout(): void;
42
+ protected isExpired(): boolean;
43
+ protected setCache<T extends keyof AuthProviderCache>(cacheKey: T | undefined, cache: AuthProviderCache<U>[T]): void;
44
+ protected clearCache(cacheKey?: keyof AuthProviderCache<U>): void;
45
+ on(listeners: AuthEventListener | AuthEventListener[]): () => void;
46
+ protected emit(event: AuthEvent): void;
47
+ protected setState(state: AuthState): void;
48
+ getState(): AuthState;
49
+ protected request<T>(input: RequestInfo, init?: RequestInit): Promise<{
50
+ data?: T;
51
+ status: number;
52
+ }>;
53
+ }
54
+ export default AuthProvider;
@@ -0,0 +1,90 @@
1
+ //#region src/AuthProvider.ts
2
+ var e = class {
3
+ cache;
4
+ enableRefresh = !1;
5
+ tokenStorage = "localStorage";
6
+ state = "init";
7
+ listeners = /* @__PURE__ */ new Set();
8
+ constructor({ enableRefresh: e = !1, tokenStorage: t = "localStorage" } = {}) {
9
+ this.enableRefresh = e, this.tokenStorage = t;
10
+ try {
11
+ let e = null;
12
+ t === "localStorage" ? e = localStorage.getItem("user_state") : t === "sessionStorage" && (e = sessionStorage.getItem("user_state")), e && this.setCache("token", JSON.parse(e));
13
+ } catch {}
14
+ return new Proxy(this, { get: (e, n, r) => {
15
+ if (n in e) return Reflect.get(e, n, r);
16
+ if (!(e.cache && n in e.cache && n === "token" && t === "") && e.cache && n in e.cache) return e.cache[n];
17
+ } });
18
+ }
19
+ internalRefresh(e) {
20
+ e || (this.setState("guest"), this.setCache(void 0, void 0)), this.setCache("token", e);
21
+ }
22
+ internalGetUser(e) {
23
+ this.setCache("user", e), e ? this.setState("authenticated") : (this.setState("guest"), this.isExpired() && this.clearCache());
24
+ }
25
+ internalLogin(e, t) {
26
+ this.setCache("user", e), this.setCache("token", t), e ? this.setState("authenticated") : this.setState("guest");
27
+ }
28
+ internalLogout() {
29
+ this.clearCache(), this.setState("guest"), this.emit({ type: "logout" });
30
+ }
31
+ isExpired() {
32
+ return !this.cache || !this.cache.token || !this.cache.token.expiresAt || Date.now() >= this.cache.token.expiresAt;
33
+ }
34
+ setCache(e, t) {
35
+ if (!e) {
36
+ this.cache = t, typeof localStorage < "u" && this.tokenStorage === "localStorage" && this.cache.token ? localStorage.setItem("user_state", JSON.stringify(this.cache.token)) : typeof sessionStorage < "u" && this.tokenStorage === "sessionStorage" && this.cache.token && sessionStorage.setItem("user_state", JSON.stringify(this.cache.token));
37
+ return;
38
+ }
39
+ this.cache ||= {}, this.cache[e] = t, this.cache.token && (typeof localStorage < "u" && this.tokenStorage === "localStorage" ? localStorage.setItem("user_state", JSON.stringify(this.cache.token)) : typeof sessionStorage < "u" && this.tokenStorage === "sessionStorage" && sessionStorage.setItem("user_state", JSON.stringify(this.cache.token)));
40
+ }
41
+ clearCache(e) {
42
+ if (e && this.cache) {
43
+ delete this.cache[e], e === "token" && (typeof localStorage < "u" && this.tokenStorage === "localStorage" ? localStorage.removeItem("user_state") : typeof sessionStorage < "u" && this.tokenStorage === "sessionStorage" && sessionStorage.removeItem("user_state"));
44
+ return;
45
+ }
46
+ typeof localStorage < "u" && this.tokenStorage === "localStorage" ? localStorage.removeItem("user_state") : typeof sessionStorage < "u" && this.tokenStorage === "sessionStorage" && sessionStorage.removeItem("user_state"), this.cache = void 0;
47
+ }
48
+ on(e) {
49
+ return Array.isArray(e) ? (e.forEach((e) => this.listeners.add(e)), () => e.forEach((e) => this.listeners.delete(e))) : (this.listeners.add(e), () => this.listeners.delete(e));
50
+ }
51
+ emit(e) {
52
+ for (let t of this.listeners) t(e);
53
+ }
54
+ setState(e) {
55
+ this.state !== e && (this.state = e, this.emit({
56
+ type: "state",
57
+ state: e
58
+ }));
59
+ }
60
+ getState() {
61
+ return this.state;
62
+ }
63
+ async request(e, t) {
64
+ let n;
65
+ try {
66
+ n = await fetch(e, t);
67
+ } catch {
68
+ return Promise.resolve({
69
+ data: void 0,
70
+ status: 500
71
+ });
72
+ }
73
+ if (!n.ok) return Promise.resolve({
74
+ data: void 0,
75
+ status: n.status
76
+ });
77
+ let r;
78
+ try {
79
+ r = await n.json();
80
+ } catch {
81
+ r = void 0;
82
+ }
83
+ return {
84
+ data: r,
85
+ status: n.status
86
+ };
87
+ }
88
+ };
89
+ //#endregion
90
+ export { e as default };
@@ -0,0 +1,3 @@
1
+ import { default as useAuth } from './useAuth';
2
+ export * from './useAuth';
3
+ export default useAuth;
@@ -0,0 +1,5 @@
1
+ import e from "./useAuth.mjs";
2
+ //#region src/hooks/useAuth/index.ts
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,28 @@
1
+ import { AuthManager } from '../../AuthManager';
2
+ import { Schema, Server } from '@plitzi/sdk-shared';
3
+ export type UseAuthProps = {
4
+ server?: Server;
5
+ isHydrating?: boolean;
6
+ tokenStorage?: Schema['settings']['tokenStorage'];
7
+ provider?: Schema['settings']['userProvider'];
8
+ loginUrl?: Schema['settings']['loginUrl'];
9
+ userUrl?: Schema['settings']['userUrl'];
10
+ refreshUrl?: Schema['settings']['refreshUrl'];
11
+ logoutUrl?: Schema['settings']['logoutUrl'];
12
+ detailsPath?: Schema['settings']['detailsPath'];
13
+ tokenPath?: Schema['settings']['tokenPath'];
14
+ expirationTimePath?: Schema['settings']['expirationTimePath'];
15
+ };
16
+ declare const useAuth: ({ server, isHydrating, tokenStorage, provider, loginUrl, userUrl, refreshUrl, logoutUrl, detailsPath, tokenPath, expirationTimePath }: UseAuthProps) => {
17
+ manager: AuthManager<{
18
+ id: number;
19
+ username: string;
20
+ email: string;
21
+ verified: boolean;
22
+ permissions: string[];
23
+ roles: string[];
24
+ }, "basic">;
25
+ loading: boolean;
26
+ authenticated: boolean;
27
+ };
28
+ export default useAuth;
@@ -0,0 +1,59 @@
1
+ import { AuthManager as e } from "../../AuthManager.mjs";
2
+ import { useCallback as t, useEffect as n, useMemo as r, useState as i } from "react";
3
+ //#region src/hooks/useAuth/useAuth.ts
4
+ var a = ({ server: a, isHydrating: o = !1, tokenStorage: s = "localStorage", provider: c = "", loginUrl: l = "", userUrl: u = "", refreshUrl: d = "", logoutUrl: f = "", detailsPath: p = "details", tokenPath: m = "access_token", expirationTimePath: h = "expire_at" }) => {
5
+ let g = typeof window > "u" || o || !!a?.user && a.authenticated, [_, v] = i(!!u && !g), [y, b] = i(!1), x = t((e) => {
6
+ e.type === "state" && (v(e.state === "initLoading"), b(e.state === "authenticated"));
7
+ }, []), S = r(() => {
8
+ let t = {};
9
+ c === "basic" && (t = {
10
+ tokenStorage: s,
11
+ loginUrl: l,
12
+ userUrl: u,
13
+ refreshUrl: d,
14
+ logoutUrl: f,
15
+ detailsPath: p,
16
+ tokenPath: m,
17
+ expirationTimePath: h,
18
+ isSSR: g
19
+ });
20
+ let n = new e(c, x, t);
21
+ return n.init(a?.authenticated ? a.user?.details : void 0, a?.skipAuth), n;
22
+ }, [
23
+ c,
24
+ x,
25
+ a?.authenticated,
26
+ a?.user?.details,
27
+ a?.skipAuth,
28
+ s,
29
+ l,
30
+ u,
31
+ d,
32
+ f,
33
+ p,
34
+ m,
35
+ h,
36
+ g
37
+ ]);
38
+ return n(() => {
39
+ let e = S.getProvider();
40
+ if (!e || !e.token?.expiresAt) return;
41
+ let t = Math.floor(Date.now() / 1e3);
42
+ if (e.token.expiresAt) {
43
+ let n = setTimeout(() => {
44
+ S.logout();
45
+ }, Math.abs(t - e.token.expiresAt) * 1e3);
46
+ return () => clearTimeout(n);
47
+ }
48
+ }, [S, y]), r(() => ({
49
+ manager: S,
50
+ loading: _,
51
+ authenticated: y
52
+ }), [
53
+ S,
54
+ _,
55
+ y
56
+ ]);
57
+ };
58
+ //#endregion
59
+ export { a as default };
@@ -0,0 +1,8 @@
1
+ import { default as AuthContext } from './AuthContext';
2
+ import { default as AuthContextProvider } from './AuthContextProvider';
3
+ import { default as useAuth } from './hooks/useAuth';
4
+ export * from './hooks/useAuth';
5
+ export * from './AuthContext';
6
+ export * from './AuthProvider';
7
+ export * from './AuthManager';
8
+ export { useAuth, AuthContext, AuthContextProvider };
package/dist/index.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { AuthManager as e } from "./AuthManager.mjs";
2
+ import t from "./hooks/useAuth/index.mjs";
3
+ import n from "./AuthContext.mjs";
4
+ import r from "./AuthContextProvider.mjs";
5
+ export { n as AuthContext, r as AuthContextProvider, e as AuthManager, t as useAuth };
@@ -0,0 +1,22 @@
1
+ import { default as AuthProvider, AuthProviderProps } from '../AuthProvider';
2
+ import { Schema, TokenResult } from '@plitzi/sdk-shared';
3
+ export type Auth0ProviderProps = AuthProviderProps & {
4
+ tokenStorage?: Schema['settings']['tokenStorage'];
5
+ loginUrl?: string;
6
+ userUrl?: string;
7
+ refreshUrl?: string;
8
+ logoutUrl?: string;
9
+ detailsPath?: string;
10
+ tokenPath?: string;
11
+ expirationTimePath?: string;
12
+ };
13
+ declare class Auth0Provider<T = Record<string, unknown>> extends AuthProvider<T> {
14
+ readonly name = "auth0";
15
+ init(): Promise<void>;
16
+ login(...args: unknown[]): Promise<TokenResult | undefined>;
17
+ getUser(): Promise<T | undefined>;
18
+ refresh(): Promise<TokenResult | undefined>;
19
+ can(permission: string): boolean;
20
+ logout(): Promise<void>;
21
+ }
22
+ export default Auth0Provider;
@@ -0,0 +1,25 @@
1
+ import e from "../AuthProvider.mjs";
2
+ //#region src/providers/Auth0Provider.ts
3
+ var t = class extends e {
4
+ name = "auth0";
5
+ init() {
6
+ throw Error("Method not implemented.");
7
+ }
8
+ login(...e) {
9
+ throw console.log(e), Error("Method not implemented.");
10
+ }
11
+ getUser() {
12
+ throw Error("Method not implemented.");
13
+ }
14
+ refresh() {
15
+ throw Error("Method not implemented.");
16
+ }
17
+ can(e) {
18
+ throw console.log(e), Error("Method not implemented.");
19
+ }
20
+ logout() {
21
+ throw Error("Method not implemented.");
22
+ }
23
+ };
24
+ //#endregion
25
+ export { t as default };
@@ -0,0 +1,39 @@
1
+ import { default as AuthProvider, AuthProviderProps } from '../AuthProvider';
2
+ import { Schema, TokenResult } from '@plitzi/sdk-shared';
3
+ export type BasicAuthProviderProps = AuthProviderProps & {
4
+ tokenStorage?: Schema['settings']['tokenStorage'];
5
+ loginUrl?: string;
6
+ userUrl?: string;
7
+ refreshUrl?: string;
8
+ logoutUrl?: string;
9
+ detailsPath?: string;
10
+ tokenPath?: string;
11
+ refreshTokenPath?: string;
12
+ expirationTimePath?: string;
13
+ isSSR?: boolean;
14
+ };
15
+ declare class BasicAuthProvider<T = Record<string, unknown>> extends AuthProvider<T> {
16
+ readonly name = "basic";
17
+ protected baseUrl?: string;
18
+ protected options: {
19
+ tokenStorage: Exclude<Schema['settings']['tokenStorage'], undefined>;
20
+ loginUrl: string;
21
+ userUrl: string;
22
+ refreshUrl: string;
23
+ logoutUrl: string;
24
+ detailsPath: string;
25
+ tokenPath: string;
26
+ refreshTokenPath: string;
27
+ expirationTimePath: string;
28
+ isSSR: boolean;
29
+ };
30
+ constructor({ tokenStorage, enableRefresh, loginUrl, userUrl, refreshUrl, logoutUrl, detailsPath, tokenPath, refreshTokenPath, expirationTimePath, isSSR }?: BasicAuthProviderProps);
31
+ init(user?: T, skipAuth?: boolean): Promise<void>;
32
+ login(authParams: Record<string, string>): Promise<TokenResult | undefined>;
33
+ getUser(): Promise<T | undefined>;
34
+ refresh(): Promise<TokenResult | undefined>;
35
+ can(permission: string): boolean;
36
+ logout(): Promise<void>;
37
+ private getTokenFromResponse;
38
+ }
39
+ export default BasicAuthProvider;
@@ -0,0 +1,94 @@
1
+ import e from "../AuthProvider.mjs";
2
+ import { get as t } from "@plitzi/plitzi-ui/helpers";
3
+ //#region src/providers/BasicAuthProvider.ts
4
+ var n = class extends e {
5
+ name = "basic";
6
+ baseUrl;
7
+ options;
8
+ constructor({ tokenStorage: e = "localStorage", enableRefresh: t = !0, loginUrl: n = "", userUrl: r = "", refreshUrl: i = "", logoutUrl: a = "", detailsPath: o = "", tokenPath: s = "", refreshTokenPath: c = "", expirationTimePath: l = "", isSSR: u = !1 } = {}) {
9
+ super({
10
+ enableRefresh: t,
11
+ tokenStorage: e
12
+ }), this.options = {
13
+ tokenStorage: e,
14
+ loginUrl: n,
15
+ userUrl: r,
16
+ refreshUrl: i,
17
+ logoutUrl: a,
18
+ detailsPath: o,
19
+ tokenPath: s,
20
+ refreshTokenPath: c,
21
+ expirationTimePath: l,
22
+ isSSR: u
23
+ };
24
+ }
25
+ async init(e, t) {
26
+ if (t) {
27
+ this.setState("guest");
28
+ return;
29
+ }
30
+ if (this.setState("initLoading"), !this.options.isSSR) {
31
+ await this.getUser();
32
+ return;
33
+ }
34
+ e ? super.internalGetUser(e) : this.setState("guest");
35
+ }
36
+ async login(e) {
37
+ let { username: n = "", password: r = "" } = e;
38
+ super.setState("authenticating");
39
+ let i = await this.request(this.options.loginUrl, {
40
+ credentials: "include",
41
+ method: "POST",
42
+ headers: { "Content-Type": "application/json" },
43
+ body: JSON.stringify({
44
+ username: n,
45
+ password: r
46
+ })
47
+ }), a = this.getTokenFromResponse(i);
48
+ return super.internalLogin(t(i.data, this.options.detailsPath), a), a;
49
+ }
50
+ async getUser() {
51
+ if (this.cache?.user && this.state !== "init") return this.cache.user;
52
+ if (!this.options.userUrl) {
53
+ super.internalGetUser(void 0);
54
+ return;
55
+ }
56
+ let e = await this.request(this.options.userUrl, {
57
+ method: "GET",
58
+ credentials: "include",
59
+ headers: { "Content-Type": "application/json" }
60
+ });
61
+ return super.internalGetUser(t(e.data, this.options.detailsPath)), e.data;
62
+ }
63
+ async refresh() {
64
+ let e = await this.request(this.options.refreshUrl, {
65
+ method: "POST",
66
+ credentials: "include",
67
+ headers: { "Content-Type": "application/json" },
68
+ body: JSON.stringify({ refreshToken: this.cache?.token?.refreshToken ?? "" })
69
+ }), t = this.getTokenFromResponse(e);
70
+ return super.internalRefresh(t), t;
71
+ }
72
+ can(e) {
73
+ return this.cache?.user ? t(this.cache.user, "permissions", []).includes(e) : !1;
74
+ }
75
+ async logout() {
76
+ await this.request(this.options.logoutUrl, {
77
+ method: "POST",
78
+ credentials: "include",
79
+ headers: { "Content-Type": "application/json" }
80
+ }), super.internalLogout();
81
+ }
82
+ getTokenFromResponse(e) {
83
+ if (e.status >= 400) return;
84
+ let n = {
85
+ errors: t(e.data, "errors", {}),
86
+ accessToken: t(e.data, this.options.tokenPath, ""),
87
+ refreshToken: t(e.data, this.options.refreshTokenPath, ""),
88
+ expiresAt: t(e.data, this.options.expirationTimePath, 0)
89
+ };
90
+ return e.data && !("errors" in e.data) && delete n.errors, n;
91
+ }
92
+ };
93
+ //#endregion
94
+ export { n as default };