@fusionauth/angular-sdk 0.1.7 → 1.0.1
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/README.md +41 -66
- package/esm2022/lib/components/fusionauth-login.button/fusion-auth-login-button.component.mjs +3 -3
- package/esm2022/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.mjs +3 -3
- package/esm2022/lib/components/fusionauth-register.button/fusion-auth-register-button.component.mjs +3 -3
- package/esm2022/lib/core.mjs +241 -0
- package/esm2022/lib/fusion-auth.module.mjs +4 -4
- package/esm2022/lib/fusion-auth.service.mjs +58 -94
- package/esm2022/lib/types.mjs +1 -1
- package/fesm2022/fusionauth-angular-sdk.mjs +309 -106
- package/fesm2022/fusionauth-angular-sdk.mjs.map +1 -1
- package/lib/core.d.ts +57 -0
- package/lib/fusion-auth.service.d.ts +26 -17
- package/lib/types.d.ts +44 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,23 +3,15 @@ An SDK for using FusionAuth in Angular applications.
|
|
|
3
3
|
# Table of Contents
|
|
4
4
|
|
|
5
5
|
- [Overview](#overview)
|
|
6
|
-
|
|
7
6
|
- [Getting Started](#getting-started)
|
|
8
|
-
|
|
9
7
|
- [Installation](#installation)
|
|
10
|
-
|
|
11
8
|
- [Usage](#usage)
|
|
12
|
-
|
|
9
|
+
- [FusionAuthService](#fusionauthservice)
|
|
13
10
|
- [Pre-built buttons](#pre-built-buttons)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- [Known issues](#known-issues)
|
|
18
|
-
|
|
11
|
+
- [State Parameter](#state-parameter)
|
|
12
|
+
- [Known issues](#known-issues)
|
|
19
13
|
- [Quickstart](#quickstart)
|
|
20
|
-
|
|
21
14
|
- [Documentation](#documentation)
|
|
22
|
-
|
|
23
15
|
- [Releases](#releases)
|
|
24
16
|
|
|
25
17
|
<!--
|
|
@@ -34,9 +26,7 @@ Please also use ``` instead of indenting for code blocks. The backticks are tran
|
|
|
34
26
|
tag::forDocSite[]
|
|
35
27
|
-->
|
|
36
28
|
|
|
37
|
-
This SDK
|
|
38
|
-
your Angular application. You can do this via pre-built buttons, or with
|
|
39
|
-
the FusionAuthService in your own components.
|
|
29
|
+
This SDK helps manage authentication state for your Angular app and provides functionality to login, register, and logout users. It also can be configured to automatically manage your refresh token.
|
|
40
30
|
|
|
41
31
|
Your users will be sent to FusionAuth’s themeable hosted login pages and
|
|
42
32
|
then log in. After that, they are sent back to your Angular application.
|
|
@@ -96,6 +86,7 @@ import { FusionAuthModule } from '@fusionauth/angular-sdk';
|
|
|
96
86
|
clientId: '', // Your FusionAuth client ID
|
|
97
87
|
serverUrl: '', // The base URL of the server that performs the token exchange
|
|
98
88
|
redirectUri: '', // The URI that the user is directed to after the login/register/logout action
|
|
89
|
+
shouldAutoRefresh: true // option to configure the SDK to automatically handle token refresh. Defaults to false if not specified here.
|
|
99
90
|
}),
|
|
100
91
|
],
|
|
101
92
|
providers: [],
|
|
@@ -106,6 +97,41 @@ export class AppModule { }
|
|
|
106
97
|
|
|
107
98
|
## Usage
|
|
108
99
|
|
|
100
|
+
### FusionAuthService
|
|
101
|
+
|
|
102
|
+
The injectable `FusionAuthService` class provides observable properties to which components may subscribe.
|
|
103
|
+
|
|
104
|
+
Note, you can also use the non-observable `getUserInfo` method if you wish to implement your observables.
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
class AppComponent implements OnInit, OnDestroy {
|
|
108
|
+
private fusionAuthService: FusionAuthService = inject(FusionAuthService);
|
|
109
|
+
|
|
110
|
+
isLoggedIn: boolean = this.fusionAuthService.isLoggedIn();
|
|
111
|
+
userInfo: UserInfo | null = null;
|
|
112
|
+
isGettingUserInfo: boolean = false;
|
|
113
|
+
subscription?: Subscription;
|
|
114
|
+
|
|
115
|
+
ngOnInit(): void {
|
|
116
|
+
if (this.isLoggedIn) {
|
|
117
|
+
this.subscription = this.fusionAuthService
|
|
118
|
+
.getUserInfoObservable({
|
|
119
|
+
onBegin: () => (this.isGettingUserInfo = true),
|
|
120
|
+
onDone: () => (this.isGettingUserInfo = false),
|
|
121
|
+
})
|
|
122
|
+
.subscribe({
|
|
123
|
+
next: (userInfo) => (this.userInfo = userInfo),
|
|
124
|
+
error: (error) => console.error(error),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
ngOnDestroy(): void {
|
|
130
|
+
this.subscription?.unsubscribe();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
109
135
|
### Pre-built buttons
|
|
110
136
|
|
|
111
137
|
There are three pre-styled buttons that are configured to perform
|
|
@@ -137,56 +163,6 @@ export class LogoutComponent {}
|
|
|
137
163
|
export class RegisterComponent {}
|
|
138
164
|
```
|
|
139
165
|
|
|
140
|
-
### Service usage
|
|
141
|
-
|
|
142
|
-
Alternatively, you may interact with the SDK Service by injecting the FusionAuthService into any component or service.
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
import { Component, OnInit } from '@angular/core';
|
|
146
|
-
import { FusionAuthService, UserInfo } from '@fusionauth/angular-sdk';
|
|
147
|
-
|
|
148
|
-
@Component({
|
|
149
|
-
selector: 'app-root',
|
|
150
|
-
templateUrl: './app.component.html',
|
|
151
|
-
styleUrls: ['./app.component.scss']
|
|
152
|
-
})
|
|
153
|
-
export class AppComponent implements OnInit {
|
|
154
|
-
private userInfo: UserInfo;
|
|
155
|
-
|
|
156
|
-
constructor(
|
|
157
|
-
private fusionAuth: FusionAuthService,
|
|
158
|
-
) {}
|
|
159
|
-
|
|
160
|
-
async ngOnInit(): Promise<void> {
|
|
161
|
-
this.fusionAuth.initAutoRefresh();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
login() {
|
|
165
|
-
this.fusionAuth.startLogin();
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
register() {
|
|
169
|
-
this.fusionAuth.startRegistration();
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
logout() {
|
|
173
|
-
this.fusionAuth.logout();
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
refreshToken() {
|
|
177
|
-
this.fusionAuth.refreshToken();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
async getUserInfo() {
|
|
181
|
-
this.userInfo = await this.fusionAuth.getUserInfo();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
isLoggedIn(): boolean {
|
|
185
|
-
return this.fusionAuth.isLoggedIn();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
166
|
#### State parameter
|
|
191
167
|
|
|
192
168
|
The `startLogin` and `startRegistration` functions both accept an optional string
|
|
@@ -208,8 +184,7 @@ See the [FusionAuth Angular Quickstart](https://fusionauth.io/docs/quickstarts/q
|
|
|
208
184
|
|
|
209
185
|
## Documentation
|
|
210
186
|
|
|
211
|
-
[Full library
|
|
212
|
-
documentation](https://github.com/FusionAuth/fusionauth-angular-sdk/blob/main/docs/documentation.md)
|
|
187
|
+
[Full library documentation](https://github.com/FusionAuth/fusionauth-javascript-sdk/tree/main/packages/sdk-angular/docs)
|
|
213
188
|
|
|
214
189
|
<!--
|
|
215
190
|
end::forDocSite[]
|
package/esm2022/lib/components/fusionauth-login.button/fusion-auth-login-button.component.mjs
CHANGED
|
@@ -8,10 +8,10 @@ export class FusionAuthLoginButtonComponent {
|
|
|
8
8
|
login() {
|
|
9
9
|
this.fusionAuth.startLogin(this.state);
|
|
10
10
|
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
12
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthLoginButtonComponent, deps: [{ token: i1.FusionAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.1", type: FusionAuthLoginButtonComponent, selector: "fa-login", inputs: { state: "state" }, ngImport: i0, template: "<button class=\"fa-button\" (click)=\"login()\">\n <span>Login</span>\n</button>\n", styles: [".fa-button{padding:16px 16px 13px;border-radius:8px;background-color:#083b94;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol;font-size:18px;font-weight:600;text-align:center;color:#fff;width:400px}.fa-button:hover{cursor:pointer}\n"] }); }
|
|
13
13
|
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthLoginButtonComponent, decorators: [{
|
|
15
15
|
type: Component,
|
|
16
16
|
args: [{ selector: 'fa-login', template: "<button class=\"fa-button\" (click)=\"login()\">\n <span>Login</span>\n</button>\n", styles: [".fa-button{padding:16px 16px 13px;border-radius:8px;background-color:#083b94;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol;font-size:18px;font-weight:600;text-align:center;color:#fff;width:400px}.fa-button:hover{cursor:pointer}\n"] }]
|
|
17
17
|
}], ctorParameters: () => [{ type: i1.FusionAuthService }], propDecorators: { state: [{
|
package/esm2022/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.mjs
CHANGED
|
@@ -8,10 +8,10 @@ export class FusionAuthLogoutButtonComponent {
|
|
|
8
8
|
logout() {
|
|
9
9
|
this.fusionAuth.logout();
|
|
10
10
|
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
12
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthLogoutButtonComponent, deps: [{ token: i1.FusionAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.1", type: FusionAuthLogoutButtonComponent, selector: "fa-logout", ngImport: i0, template: "<button class=\"fa-logout-button\" (click)=\"logout()\">\n <span>logout</span>\n</button>\n", styles: [".fa-logout-button{padding:7px 13px;border-radius:3px;display:block;border:solid 1px #083b94;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol;font-size:12px;text-align:center;color:#083b94}.fa-logout-button:hover{cursor:pointer}\n"] }); }
|
|
13
13
|
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthLogoutButtonComponent, decorators: [{
|
|
15
15
|
type: Component,
|
|
16
16
|
args: [{ selector: 'fa-logout', template: "<button class=\"fa-logout-button\" (click)=\"logout()\">\n <span>logout</span>\n</button>\n", styles: [".fa-logout-button{padding:7px 13px;border-radius:3px;display:block;border:solid 1px #083b94;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol;font-size:12px;text-align:center;color:#083b94}.fa-logout-button:hover{cursor:pointer}\n"] }]
|
|
17
17
|
}], ctorParameters: () => [{ type: i1.FusionAuthService }] });
|
package/esm2022/lib/components/fusionauth-register.button/fusion-auth-register-button.component.mjs
CHANGED
|
@@ -8,10 +8,10 @@ export class FusionAuthRegisterButtonComponent {
|
|
|
8
8
|
register() {
|
|
9
9
|
this.fusionAuth.startRegistration(this.state);
|
|
10
10
|
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
12
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthRegisterButtonComponent, deps: [{ token: i1.FusionAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.1", type: FusionAuthRegisterButtonComponent, selector: "fa-register", inputs: { state: "state" }, ngImport: i0, template: "<button class=\"fa-button\" (click)=\"register()\">\n <span>Register Now</span>\n</button>\n", styles: [".fa-button{padding:16px 16px 13px;border-radius:8px;background-color:#083b94;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol;font-size:18px;font-weight:600;text-align:center;color:#fff;width:400px}.fa-button:hover{cursor:pointer}\n"] }); }
|
|
13
13
|
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthRegisterButtonComponent, decorators: [{
|
|
15
15
|
type: Component,
|
|
16
16
|
args: [{ selector: 'fa-register', template: "<button class=\"fa-button\" (click)=\"register()\">\n <span>Register Now</span>\n</button>\n", styles: [".fa-button{padding:16px 16px 13px;border-radius:8px;background-color:#083b94;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol;font-size:18px;font-weight:600;text-align:center;color:#fff;width:400px}.fa-button:hover{cursor:pointer}\n"] }]
|
|
17
17
|
}], ctorParameters: () => [{ type: i1.FusionAuthService }], propDecorators: { state: [{
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
const u = Object.defineProperty;
|
|
3
|
+
const d = (r, e, t) => e in r
|
|
4
|
+
? u(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t })
|
|
5
|
+
: (r[e] = t);
|
|
6
|
+
const i = (r, e, t) => (d(r, typeof e != 'symbol' ? e + '' : e, t), t);
|
|
7
|
+
class g {
|
|
8
|
+
constructor(e) {
|
|
9
|
+
i(this, 'serverUrl');
|
|
10
|
+
i(this, 'clientId');
|
|
11
|
+
i(this, 'redirectUri');
|
|
12
|
+
i(this, 'scope');
|
|
13
|
+
i(this, 'mePath');
|
|
14
|
+
i(this, 'loginPath');
|
|
15
|
+
i(this, 'registerPath');
|
|
16
|
+
i(this, 'logoutPath');
|
|
17
|
+
i(this, 'tokenRefreshPath');
|
|
18
|
+
(this.serverUrl = e.serverUrl),
|
|
19
|
+
(this.clientId = e.clientId),
|
|
20
|
+
(this.redirectUri = e.redirectUri),
|
|
21
|
+
(this.scope = e.scope),
|
|
22
|
+
(this.mePath = e.mePath ?? '/app/me'),
|
|
23
|
+
(this.loginPath = e.loginPath ?? '/app/login'),
|
|
24
|
+
(this.registerPath = e.registerPath ?? '/app/register'),
|
|
25
|
+
(this.logoutPath = e.logoutPath ?? '/app/logout'),
|
|
26
|
+
(this.tokenRefreshPath = e.tokenRefreshPath ?? '/app/refresh');
|
|
27
|
+
}
|
|
28
|
+
getMeUrl() {
|
|
29
|
+
return this.generateUrl(this.mePath);
|
|
30
|
+
}
|
|
31
|
+
getLoginUrl(e) {
|
|
32
|
+
return this.generateUrl(this.loginPath, {
|
|
33
|
+
client_id: this.clientId,
|
|
34
|
+
redirect_uri: this.redirectUri,
|
|
35
|
+
scope: this.scope,
|
|
36
|
+
state: e,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
getRegisterUrl(e) {
|
|
40
|
+
return this.generateUrl(this.registerPath, {
|
|
41
|
+
client_id: this.clientId,
|
|
42
|
+
redirect_uri: this.redirectUri,
|
|
43
|
+
scope: this.scope,
|
|
44
|
+
state: e,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
getLogoutUrl() {
|
|
48
|
+
return this.generateUrl(this.logoutPath, {
|
|
49
|
+
client_id: this.clientId,
|
|
50
|
+
post_logout_redirect_uri: this.redirectUri,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
getTokenRefreshUrl() {
|
|
54
|
+
return this.generateUrl(this.tokenRefreshPath, {
|
|
55
|
+
client_id: this.clientId,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
generateUrl(e, t) {
|
|
59
|
+
const s = new URL(this.serverUrl);
|
|
60
|
+
if (((s.pathname = e), t)) {
|
|
61
|
+
const n = this.generateURLSearchParams(t);
|
|
62
|
+
s.search = n.toString();
|
|
63
|
+
}
|
|
64
|
+
return s;
|
|
65
|
+
}
|
|
66
|
+
generateURLSearchParams(e) {
|
|
67
|
+
const t = new URLSearchParams();
|
|
68
|
+
return (Object.entries(e).forEach(([s, n]) => {
|
|
69
|
+
n && t.append(s, n);
|
|
70
|
+
}),
|
|
71
|
+
t);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
class o {
|
|
75
|
+
/**
|
|
76
|
+
* Parses document.cookie for the access token expiration cookie value.
|
|
77
|
+
* @returns {(number | null)} The moment of expiration in milliseconds since epoch.
|
|
78
|
+
*/
|
|
79
|
+
static getAccessTokenExpirationMoment(e = 'app.at_exp') {
|
|
80
|
+
const t = document.cookie
|
|
81
|
+
.split('; ')
|
|
82
|
+
.map(n => n.split('='))
|
|
83
|
+
.find(([n]) => n === e), s = t == null ? void 0 : t[1];
|
|
84
|
+
return s ? parseInt(s) * 1e3 : null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
class p {
|
|
88
|
+
constructor(e) {
|
|
89
|
+
i(this, 'url');
|
|
90
|
+
this.url = e;
|
|
91
|
+
}
|
|
92
|
+
/** Refresh token a single time */
|
|
93
|
+
async refreshToken() {
|
|
94
|
+
const e = await fetch(this.url.href, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
credentials: 'include',
|
|
97
|
+
headers: {
|
|
98
|
+
'Content-Type': 'text/plain',
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
if (!(e.status >= 200 && e.status < 300))
|
|
102
|
+
throw new Error('error refreshing access token in fusionauth');
|
|
103
|
+
}
|
|
104
|
+
/** Initializes continuous automatic token refresh. */
|
|
105
|
+
initAutoRefresh(e = 10, t) {
|
|
106
|
+
const s = o.getAccessTokenExpirationMoment(t);
|
|
107
|
+
if (!s)
|
|
108
|
+
return;
|
|
109
|
+
const n = e * 1e3, a = /* @__PURE__ */ new Date().getTime(), h = s - n, c = Math.max(h - a, 0);
|
|
110
|
+
return setTimeout(async () => {
|
|
111
|
+
try {
|
|
112
|
+
await this.refreshToken(), this.initAutoRefresh(e);
|
|
113
|
+
}
|
|
114
|
+
catch (l) {
|
|
115
|
+
console.error(l);
|
|
116
|
+
}
|
|
117
|
+
}, c);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
class m {
|
|
121
|
+
/**
|
|
122
|
+
* Schedules a callback to be invoked at the given moment.
|
|
123
|
+
* @param expirationMoment - the access token expiration moment in milliseconds since the epoch.
|
|
124
|
+
* @param onExpiration - the callback to be invoked at the `expirationMoment`.
|
|
125
|
+
*/
|
|
126
|
+
static scheduleTokenExpirationCallback(e, t) {
|
|
127
|
+
const s = /* @__PURE__ */ new Date().getTime(), n = e - s;
|
|
128
|
+
n > 0 && setTimeout(t, n);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
class R {
|
|
132
|
+
constructor() {
|
|
133
|
+
i(this, 'REDIRECT_VALUE', 'fa-sdk-redirect-value');
|
|
134
|
+
}
|
|
135
|
+
handlePreRedirect(e) {
|
|
136
|
+
const t = `${this.generateRandomString()}:${e ?? ''}`;
|
|
137
|
+
localStorage.setItem(this.REDIRECT_VALUE, t);
|
|
138
|
+
}
|
|
139
|
+
handlePostRedirect(e) {
|
|
140
|
+
const t = this.stateValue ?? void 0;
|
|
141
|
+
e == null || e(t), localStorage.removeItem(this.REDIRECT_VALUE);
|
|
142
|
+
}
|
|
143
|
+
get didRedirect() {
|
|
144
|
+
return !!localStorage.getItem(this.REDIRECT_VALUE);
|
|
145
|
+
}
|
|
146
|
+
get stateValue() {
|
|
147
|
+
const e = localStorage.getItem(this.REDIRECT_VALUE);
|
|
148
|
+
if (!e)
|
|
149
|
+
return null;
|
|
150
|
+
const [, ...t] = e.split(':');
|
|
151
|
+
return t.join(':');
|
|
152
|
+
}
|
|
153
|
+
generateRandomString() {
|
|
154
|
+
const e = new Uint32Array(28);
|
|
155
|
+
return (window.crypto.getRandomValues(e),
|
|
156
|
+
Array.from(e, t => ('0' + t.toString(16)).substring(-2)).join(''));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
class T {
|
|
160
|
+
constructor(e) {
|
|
161
|
+
i(this, 'config');
|
|
162
|
+
i(this, 'urlHelper');
|
|
163
|
+
i(this, 'tokenRefresher');
|
|
164
|
+
i(this, 'redirectHelper', new R());
|
|
165
|
+
(this.config = e),
|
|
166
|
+
(this.urlHelper = new g({
|
|
167
|
+
serverUrl: e.serverUrl,
|
|
168
|
+
clientId: e.clientId,
|
|
169
|
+
redirectUri: e.redirectUri,
|
|
170
|
+
scope: e.scope,
|
|
171
|
+
mePath: e.mePath,
|
|
172
|
+
loginPath: e.loginPath,
|
|
173
|
+
registerPath: e.registerPath,
|
|
174
|
+
logoutPath: e.logoutPath,
|
|
175
|
+
tokenRefreshPath: e.tokenRefreshPath,
|
|
176
|
+
})),
|
|
177
|
+
(this.tokenRefresher = new p(this.urlHelper.getTokenRefreshUrl())),
|
|
178
|
+
this.scheduleTokenExpirationEvent();
|
|
179
|
+
}
|
|
180
|
+
startLogin(e) {
|
|
181
|
+
this.redirectHelper.handlePreRedirect(e),
|
|
182
|
+
window.location.assign(this.urlHelper.getLoginUrl(e));
|
|
183
|
+
}
|
|
184
|
+
startRegister(e) {
|
|
185
|
+
this.redirectHelper.handlePreRedirect(e),
|
|
186
|
+
window.location.assign(this.urlHelper.getRegisterUrl(e));
|
|
187
|
+
}
|
|
188
|
+
startLogout() {
|
|
189
|
+
window.location.assign(this.urlHelper.getLogoutUrl());
|
|
190
|
+
}
|
|
191
|
+
async fetchUserInfo() {
|
|
192
|
+
const e = await fetch(this.urlHelper.getMeUrl(), {
|
|
193
|
+
credentials: 'include',
|
|
194
|
+
});
|
|
195
|
+
if (!e.ok)
|
|
196
|
+
throw new Error(`Unable to fetch userInfo in fusionauth. Request failed with status code ${e == null ? void 0 : e.status}`);
|
|
197
|
+
return await e.json();
|
|
198
|
+
}
|
|
199
|
+
async refreshToken() {
|
|
200
|
+
return await this.tokenRefresher.refreshToken();
|
|
201
|
+
}
|
|
202
|
+
initAutoRefresh() {
|
|
203
|
+
return this.tokenRefresher.initAutoRefresh(this.config.autoRefreshSecondsBeforeExpiry, this.config.accessTokenExpireCookieName);
|
|
204
|
+
}
|
|
205
|
+
handlePostRedirect(e) {
|
|
206
|
+
this.isLoggedIn &&
|
|
207
|
+
this.redirectHelper.didRedirect &&
|
|
208
|
+
this.redirectHelper.handlePostRedirect(e);
|
|
209
|
+
}
|
|
210
|
+
get isLoggedIn() {
|
|
211
|
+
return this.accessTokenExpirationMoment
|
|
212
|
+
? this.accessTokenExpirationMoment > /* @__PURE__ */ new Date().getTime()
|
|
213
|
+
: !1;
|
|
214
|
+
}
|
|
215
|
+
get accessTokenExpirationMoment() {
|
|
216
|
+
return o.getAccessTokenExpirationMoment(this.config.accessTokenExpireCookieName);
|
|
217
|
+
}
|
|
218
|
+
scheduleTokenExpirationEvent() {
|
|
219
|
+
this.accessTokenExpirationMoment &&
|
|
220
|
+
this.config.onTokenExpiration &&
|
|
221
|
+
m.scheduleTokenExpirationCallback(this.accessTokenExpirationMoment, this.config.onTokenExpiration);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function U() {
|
|
225
|
+
const r = /* @__PURE__ */ new Date();
|
|
226
|
+
r.setHours(r.getHours() + 1);
|
|
227
|
+
const e = r.getTime() / 1e3;
|
|
228
|
+
document.cookie = `app.at_exp=${e}`;
|
|
229
|
+
}
|
|
230
|
+
function P() {
|
|
231
|
+
document.cookie = 'app.at_exp=;expires=Thu, 01 Jan 1970 00:00:00 GMT';
|
|
232
|
+
}
|
|
233
|
+
function E(r) {
|
|
234
|
+
const e = {
|
|
235
|
+
...window.location,
|
|
236
|
+
assign: r.fn(),
|
|
237
|
+
};
|
|
238
|
+
return r.spyOn(window, 'location', 'get').mockReturnValue(e), e;
|
|
239
|
+
}
|
|
240
|
+
export { o as CookieHelpers, T as SDKCore, p as TokenRefresher, g as UrlHelper, U as mockIsLoggedIn, E as mockWindowLocation, P as removeAt_expCookie, };
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Z1c2lvbmF1dGgtYW5ndWxhci1zZGsvc3JjL2xpYi9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWM7QUFDZCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNwQixDQUFDLElBQUksQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sQ0FBQztJQUNMLFlBQVksQ0FBQztRQUNYLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLElBQUksRUFB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QVMsQ0FBQztJQUNSLE1BQU0sQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDNUIsUUFBUSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFDRCxTQUFTLENBQUM7SUFDUixRQUFRLENBQUMsTUFBTSxHQUFHLG1EQUFtRCxDQUFDO0FBQ3hFLENBQUM7QUFDRCxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ1YsTUFBTSxDQUFDLEdBQUc7UUFDUixHQUFHLE1BQU0sQ0FBQyxRQUFRO1FBQ2xCLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0tBQ2YsQ0FBQztJQUNGLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUNELE9BQU8sRUFDTCxDQUFDLElBQUksYUFBYSxFQUNsQixDQUFDLElBQUksT0FBTyxFQUNaLENBQUMsSUFBSSxjQUFjLEVBQ25CLENBQUMsSUFBSSxTQUFTLEVBQ2QsQ0FBQyxJQUFJLGNBQWMsRUFDbkIsQ0FBQyxJQUFJLGtCQUFrQixFQUN2QixDQUFDLElBQUksa0JBQWtCLEdBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtbm9jaGVja1xuY29uc3QgdSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbmNvbnN0IGQgPSAociwgZSwgdCkgPT5cbiAgZSBpbiByXG4gICAgPyB1KHIsIGUsIHsgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCwgdmFsdWU6IHQgfSlcbiAgICA6IChyW2VdID0gdCk7XG5jb25zdCBpID0gKHIsIGUsIHQpID0+IChkKHIsIHR5cGVvZiBlICE9ICdzeW1ib2wnID8gZSArICcnIDogZSwgdCksIHQpO1xuY2xhc3MgZyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBpKHRoaXMsICdzZXJ2ZXJVcmwnKTtcbiAgICBpKHRoaXMsICdjbGllbnRJZCcpO1xuICAgIGkodGhpcywgJ3JlZGlyZWN0VXJpJyk7XG4gICAgaSh0aGlzLCAnc2NvcGUnKTtcbiAgICBpKHRoaXMsICdtZVBhdGgnKTtcbiAgICBpKHRoaXMsICdsb2dpblBhdGgnKTtcbiAgICBpKHRoaXMsICdyZWdpc3RlclBhdGgnKTtcbiAgICBpKHRoaXMsICdsb2dvdXRQYXRoJyk7XG4gICAgaSh0aGlzLCAndG9rZW5SZWZyZXNoUGF0aCcpO1xuICAgICh0aGlzLnNlcnZlclVybCA9IGUuc2VydmVyVXJsKSxcbiAgICAgICh0aGlzLmNsaWVudElkID0gZS5jbGllbnRJZCksXG4gICAgICAodGhpcy5yZWRpcmVjdFVyaSA9IGUucmVkaXJlY3RVcmkpLFxuICAgICAgKHRoaXMuc2NvcGUgPSBlLnNjb3BlKSxcbiAgICAgICh0aGlzLm1lUGF0aCA9IGUubWVQYXRoID8/ICcvYXBwL21lJyksXG4gICAgICAodGhpcy5sb2dpblBhdGggPSBlLmxvZ2luUGF0aCA/PyAnL2FwcC9sb2dpbicpLFxuICAgICAgKHRoaXMucmVnaXN0ZXJQYXRoID0gZS5yZWdpc3RlclBhdGggPz8gJy9hcHAvcmVnaXN0ZXInKSxcbiAgICAgICh0aGlzLmxvZ291dFBhdGggPSBlLmxvZ291dFBhdGggPz8gJy9hcHAvbG9nb3V0JyksXG4gICAgICAodGhpcy50b2tlblJlZnJlc2hQYXRoID0gZS50b2tlblJlZnJlc2hQYXRoID8/ICcvYXBwL3JlZnJlc2gnKTtcbiAgfVxuICBnZXRNZVVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVVybCh0aGlzLm1lUGF0aCk7XG4gIH1cbiAgZ2V0TG9naW5VcmwoZSkge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVXJsKHRoaXMubG9naW5QYXRoLCB7XG4gICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICByZWRpcmVjdF91cmk6IHRoaXMucmVkaXJlY3RVcmksXG4gICAgICBzY29wZTogdGhpcy5zY29wZSxcbiAgICAgIHN0YXRlOiBlLFxuICAgIH0pO1xuICB9XG4gIGdldFJlZ2lzdGVyVXJsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVVybCh0aGlzLnJlZ2lzdGVyUGF0aCwge1xuICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgcmVkaXJlY3RfdXJpOiB0aGlzLnJlZGlyZWN0VXJpLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG4gICAgICBzdGF0ZTogZSxcbiAgICB9KTtcbiAgfVxuICBnZXRMb2dvdXRVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVVcmwodGhpcy5sb2dvdXRQYXRoLCB7XG4gICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk6IHRoaXMucmVkaXJlY3RVcmksXG4gICAgfSk7XG4gIH1cbiAgZ2V0VG9rZW5SZWZyZXNoVXJsKCkge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVXJsKHRoaXMudG9rZW5SZWZyZXNoUGF0aCwge1xuICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgIH0pO1xuICB9XG4gIGdlbmVyYXRlVXJsKGUsIHQpIHtcbiAgICBjb25zdCBzID0gbmV3IFVSTCh0aGlzLnNlcnZlclVybCk7XG4gICAgaWYgKCgocy5wYXRobmFtZSA9IGUpLCB0KSkge1xuICAgICAgY29uc3QgbiA9IHRoaXMuZ2VuZXJhdGVVUkxTZWFyY2hQYXJhbXModCk7XG4gICAgICBzLnNlYXJjaCA9IG4udG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH1cbiAgZ2VuZXJhdGVVUkxTZWFyY2hQYXJhbXMoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtzLCBuXSkgPT4ge1xuICAgICAgICBuICYmIHQuYXBwZW5kKHMsIG4pO1xuICAgICAgfSksXG4gICAgICB0XG4gICAgKTtcbiAgfVxufVxuY2xhc3MgbyB7XG4gIC8qKlxuICAgKiBQYXJzZXMgZG9jdW1lbnQuY29va2llIGZvciB0aGUgYWNjZXNzIHRva2VuIGV4cGlyYXRpb24gY29va2llIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7KG51bWJlciB8IG51bGwpfSBUaGUgbW9tZW50IG9mIGV4cGlyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLlxuICAgKi9cbiAgc3RhdGljIGdldEFjY2Vzc1Rva2VuRXhwaXJhdGlvbk1vbWVudChlID0gJ2FwcC5hdF9leHAnKSB7XG4gICAgY29uc3QgdCA9IGRvY3VtZW50LmNvb2tpZVxuICAgICAgICAuc3BsaXQoJzsgJylcbiAgICAgICAgLm1hcChuID0+IG4uc3BsaXQoJz0nKSlcbiAgICAgICAgLmZpbmQoKFtuXSkgPT4gbiA9PT0gZSksXG4gICAgICBzID0gdCA9PSBudWxsID8gdm9pZCAwIDogdFsxXTtcbiAgICByZXR1cm4gcyA/IHBhcnNlSW50KHMpICogMWUzIDogbnVsbDtcbiAgfVxufVxuY2xhc3MgcCB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBpKHRoaXMsICd1cmwnKTtcbiAgICB0aGlzLnVybCA9IGU7XG4gIH1cbiAgLyoqIFJlZnJlc2ggdG9rZW4gYSBzaW5nbGUgdGltZSAqL1xuICBhc3luYyByZWZyZXNoVG9rZW4oKSB7XG4gICAgY29uc3QgZSA9IGF3YWl0IGZldGNoKHRoaXMudXJsLmhyZWYsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKCEoZS5zdGF0dXMgPj0gMjAwICYmIGUuc3RhdHVzIDwgMzAwKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgcmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gaW4gZnVzaW9uYXV0aCcpO1xuICB9XG4gIC8qKiBJbml0aWFsaXplcyBjb250aW51b3VzIGF1dG9tYXRpYyB0b2tlbiByZWZyZXNoLiAqL1xuICBpbml0QXV0b1JlZnJlc2goZSA9IDEwLCB0KSB7XG4gICAgY29uc3QgcyA9IG8uZ2V0QWNjZXNzVG9rZW5FeHBpcmF0aW9uTW9tZW50KHQpO1xuICAgIGlmICghcykgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSBlICogMWUzLFxuICAgICAgYSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgIGggPSBzIC0gbixcbiAgICAgIGMgPSBNYXRoLm1heChoIC0gYSwgMCk7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oKSwgdGhpcy5pbml0QXV0b1JlZnJlc2goZSk7XG4gICAgICB9IGNhdGNoIChsKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobCk7XG4gICAgICB9XG4gICAgfSwgYyk7XG4gIH1cbn1cbmNsYXNzIG0ge1xuICAvKipcbiAgICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhdCB0aGUgZ2l2ZW4gbW9tZW50LlxuICAgKiBAcGFyYW0gZXhwaXJhdGlvbk1vbWVudCAtIHRoZSBhY2Nlc3MgdG9rZW4gZXhwaXJhdGlvbiBtb21lbnQgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC5cbiAgICogQHBhcmFtIG9uRXhwaXJhdGlvbiAtIHRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGF0IHRoZSBgZXhwaXJhdGlvbk1vbWVudGAuXG4gICAqL1xuICBzdGF0aWMgc2NoZWR1bGVUb2tlbkV4cGlyYXRpb25DYWxsYmFjayhlLCB0KSB7XG4gICAgY29uc3QgcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgIG4gPSBlIC0gcztcbiAgICBuID4gMCAmJiBzZXRUaW1lb3V0KHQsIG4pO1xuICB9XG59XG5jbGFzcyBSIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaSh0aGlzLCAnUkVESVJFQ1RfVkFMVUUnLCAnZmEtc2RrLXJlZGlyZWN0LXZhbHVlJyk7XG4gIH1cbiAgaGFuZGxlUHJlUmVkaXJlY3QoZSkge1xuICAgIGNvbnN0IHQgPSBgJHt0aGlzLmdlbmVyYXRlUmFuZG9tU3RyaW5nKCl9OiR7ZSA/PyAnJ31gO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVESVJFQ1RfVkFMVUUsIHQpO1xuICB9XG4gIGhhbmRsZVBvc3RSZWRpcmVjdChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuc3RhdGVWYWx1ZSA/PyB2b2lkIDA7XG4gICAgZSA9PSBudWxsIHx8IGUodCksIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuUkVESVJFQ1RfVkFMVUUpO1xuICB9XG4gIGdldCBkaWRSZWRpcmVjdCgpIHtcbiAgICByZXR1cm4gISFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlJFRElSRUNUX1ZBTFVFKTtcbiAgfVxuICBnZXQgc3RhdGVWYWx1ZSgpIHtcbiAgICBjb25zdCBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5SRURJUkVDVF9WQUxVRSk7XG4gICAgaWYgKCFlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBbLCAuLi50XSA9IGUuc3BsaXQoJzonKTtcbiAgICByZXR1cm4gdC5qb2luKCc6Jyk7XG4gIH1cbiAgZ2VuZXJhdGVSYW5kb21TdHJpbmcoKSB7XG4gICAgY29uc3QgZSA9IG5ldyBVaW50MzJBcnJheSgyOCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpLFxuICAgICAgQXJyYXkuZnJvbShlLCB0ID0+ICgnMCcgKyB0LnRvU3RyaW5nKDE2KSkuc3Vic3RyaW5nKC0yKSkuam9pbignJylcbiAgICApO1xuICB9XG59XG5jbGFzcyBUIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIGkodGhpcywgJ2NvbmZpZycpO1xuICAgIGkodGhpcywgJ3VybEhlbHBlcicpO1xuICAgIGkodGhpcywgJ3Rva2VuUmVmcmVzaGVyJyk7XG4gICAgaSh0aGlzLCAncmVkaXJlY3RIZWxwZXInLCBuZXcgUigpKTtcbiAgICAodGhpcy5jb25maWcgPSBlKSxcbiAgICAgICh0aGlzLnVybEhlbHBlciA9IG5ldyBnKHtcbiAgICAgICAgc2VydmVyVXJsOiBlLnNlcnZlclVybCxcbiAgICAgICAgY2xpZW50SWQ6IGUuY2xpZW50SWQsXG4gICAgICAgIHJlZGlyZWN0VXJpOiBlLnJlZGlyZWN0VXJpLFxuICAgICAgICBzY29wZTogZS5zY29wZSxcbiAgICAgICAgbWVQYXRoOiBlLm1lUGF0aCxcbiAgICAgICAgbG9naW5QYXRoOiBlLmxvZ2luUGF0aCxcbiAgICAgICAgcmVnaXN0ZXJQYXRoOiBlLnJlZ2lzdGVyUGF0aCxcbiAgICAgICAgbG9nb3V0UGF0aDogZS5sb2dvdXRQYXRoLFxuICAgICAgICB0b2tlblJlZnJlc2hQYXRoOiBlLnRva2VuUmVmcmVzaFBhdGgsXG4gICAgICB9KSksXG4gICAgICAodGhpcy50b2tlblJlZnJlc2hlciA9IG5ldyBwKHRoaXMudXJsSGVscGVyLmdldFRva2VuUmVmcmVzaFVybCgpKSksXG4gICAgICB0aGlzLnNjaGVkdWxlVG9rZW5FeHBpcmF0aW9uRXZlbnQoKTtcbiAgfVxuICBzdGFydExvZ2luKGUpIHtcbiAgICB0aGlzLnJlZGlyZWN0SGVscGVyLmhhbmRsZVByZVJlZGlyZWN0KGUpLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih0aGlzLnVybEhlbHBlci5nZXRMb2dpblVybChlKSk7XG4gIH1cbiAgc3RhcnRSZWdpc3RlcihlKSB7XG4gICAgdGhpcy5yZWRpcmVjdEhlbHBlci5oYW5kbGVQcmVSZWRpcmVjdChlKSxcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odGhpcy51cmxIZWxwZXIuZ2V0UmVnaXN0ZXJVcmwoZSkpO1xuICB9XG4gIHN0YXJ0TG9nb3V0KCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odGhpcy51cmxIZWxwZXIuZ2V0TG9nb3V0VXJsKCkpO1xuICB9XG4gIGFzeW5jIGZldGNoVXNlckluZm8oKSB7XG4gICAgY29uc3QgZSA9IGF3YWl0IGZldGNoKHRoaXMudXJsSGVscGVyLmdldE1lVXJsKCksIHtcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfSk7XG4gICAgaWYgKCFlLm9rKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIGZldGNoIHVzZXJJbmZvIGluIGZ1c2lvbmF1dGguIFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJHtlID09IG51bGwgPyB2b2lkIDAgOiBlLnN0YXR1c31gLFxuICAgICAgKTtcbiAgICByZXR1cm4gYXdhaXQgZS5qc29uKCk7XG4gIH1cbiAgYXN5bmMgcmVmcmVzaFRva2VuKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuUmVmcmVzaGVyLnJlZnJlc2hUb2tlbigpO1xuICB9XG4gIGluaXRBdXRvUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlblJlZnJlc2hlci5pbml0QXV0b1JlZnJlc2goXG4gICAgICB0aGlzLmNvbmZpZy5hdXRvUmVmcmVzaFNlY29uZHNCZWZvcmVFeHBpcnksXG4gICAgICB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbkV4cGlyZUNvb2tpZU5hbWUsXG4gICAgKTtcbiAgfVxuICBoYW5kbGVQb3N0UmVkaXJlY3QoZSkge1xuICAgIHRoaXMuaXNMb2dnZWRJbiAmJlxuICAgICAgdGhpcy5yZWRpcmVjdEhlbHBlci5kaWRSZWRpcmVjdCAmJlxuICAgICAgdGhpcy5yZWRpcmVjdEhlbHBlci5oYW5kbGVQb3N0UmVkaXJlY3QoZSk7XG4gIH1cbiAgZ2V0IGlzTG9nZ2VkSW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW5FeHBpcmF0aW9uTW9tZW50XG4gICAgICA/IHRoaXMuYWNjZXNzVG9rZW5FeHBpcmF0aW9uTW9tZW50ID4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICA6ICExO1xuICB9XG4gIGdldCBhY2Nlc3NUb2tlbkV4cGlyYXRpb25Nb21lbnQoKSB7XG4gICAgcmV0dXJuIG8uZ2V0QWNjZXNzVG9rZW5FeHBpcmF0aW9uTW9tZW50KFxuICAgICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW5FeHBpcmVDb29raWVOYW1lLFxuICAgICk7XG4gIH1cbiAgc2NoZWR1bGVUb2tlbkV4cGlyYXRpb25FdmVudCgpIHtcbiAgICB0aGlzLmFjY2Vzc1Rva2VuRXhwaXJhdGlvbk1vbWVudCAmJlxuICAgICAgdGhpcy5jb25maWcub25Ub2tlbkV4cGlyYXRpb24gJiZcbiAgICAgIG0uc2NoZWR1bGVUb2tlbkV4cGlyYXRpb25DYWxsYmFjayhcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbkV4cGlyYXRpb25Nb21lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLm9uVG9rZW5FeHBpcmF0aW9uLFxuICAgICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gVSgpIHtcbiAgY29uc3QgciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuICByLnNldEhvdXJzKHIuZ2V0SG91cnMoKSArIDEpO1xuICBjb25zdCBlID0gci5nZXRUaW1lKCkgLyAxZTM7XG4gIGRvY3VtZW50LmNvb2tpZSA9IGBhcHAuYXRfZXhwPSR7ZX1gO1xufVxuZnVuY3Rpb24gUCgpIHtcbiAgZG9jdW1lbnQuY29va2llID0gJ2FwcC5hdF9leHA9O2V4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQnO1xufVxuZnVuY3Rpb24gRShyKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgIGFzc2lnbjogci5mbigpLFxuICB9O1xuICByZXR1cm4gci5zcHlPbih3aW5kb3csICdsb2NhdGlvbicsICdnZXQnKS5tb2NrUmV0dXJuVmFsdWUoZSksIGU7XG59XG5leHBvcnQge1xuICBvIGFzIENvb2tpZUhlbHBlcnMsXG4gIFQgYXMgU0RLQ29yZSxcbiAgcCBhcyBUb2tlblJlZnJlc2hlcixcbiAgZyBhcyBVcmxIZWxwZXIsXG4gIFUgYXMgbW9ja0lzTG9nZ2VkSW4sXG4gIEUgYXMgbW9ja1dpbmRvd0xvY2F0aW9uLFxuICBQIGFzIHJlbW92ZUF0X2V4cENvb2tpZSxcbn07XG4iXX0=
|
|
@@ -16,15 +16,15 @@ export class FusionAuthModule {
|
|
|
16
16
|
],
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
20
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.
|
|
19
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
20
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthModule, declarations: [FusionAuthLoginButtonComponent,
|
|
21
21
|
FusionAuthLogoutButtonComponent,
|
|
22
22
|
FusionAuthRegisterButtonComponent], exports: [FusionAuthLoginButtonComponent,
|
|
23
23
|
FusionAuthLogoutButtonComponent,
|
|
24
24
|
FusionAuthRegisterButtonComponent] }); }
|
|
25
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.
|
|
25
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthModule }); }
|
|
26
26
|
}
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthModule, decorators: [{
|
|
28
28
|
type: NgModule,
|
|
29
29
|
args: [{
|
|
30
30
|
declarations: [
|