@fusionauth/angular-sdk 0.1.5 → 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.
Files changed (27) hide show
  1. package/README.md +42 -69
  2. package/{esm2020 → esm2022}/lib/components/fusionauth-login.button/fusion-auth-login-button.component.mjs +5 -5
  3. package/esm2022/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.mjs +18 -0
  4. package/esm2022/lib/components/fusionauth-register.button/fusion-auth-register-button.component.mjs +20 -0
  5. package/esm2022/lib/core.mjs +241 -0
  6. package/esm2022/lib/fusion-auth.module.mjs +43 -0
  7. package/esm2022/lib/fusion-auth.service.mjs +91 -0
  8. package/esm2022/lib/types.mjs +2 -0
  9. package/fesm2022/fusionauth-angular-sdk.mjs +429 -0
  10. package/fesm2022/fusionauth-angular-sdk.mjs.map +1 -0
  11. package/lib/components/fusionauth-login.button/fusion-auth-login-button.component.d.ts +1 -1
  12. package/lib/components/fusionauth-register.button/fusion-auth-register-button.component.d.ts +1 -1
  13. package/lib/core.d.ts +57 -0
  14. package/lib/fusion-auth.service.d.ts +26 -17
  15. package/lib/types.d.ts +44 -2
  16. package/package.json +9 -21
  17. package/esm2020/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.mjs +0 -18
  18. package/esm2020/lib/components/fusionauth-register.button/fusion-auth-register-button.component.mjs +0 -20
  19. package/esm2020/lib/fusion-auth.module.mjs +0 -40
  20. package/esm2020/lib/fusion-auth.service.mjs +0 -126
  21. package/esm2020/lib/types.mjs +0 -2
  22. package/fesm2015/fusionauth-angular-sdk.mjs +0 -228
  23. package/fesm2015/fusionauth-angular-sdk.mjs.map +0 -1
  24. package/fesm2020/fusionauth-angular-sdk.mjs +0 -222
  25. package/fesm2020/fusionauth-angular-sdk.mjs.map +0 -1
  26. /package/{esm2020 → esm2022}/fusionauth-angular-sdk.mjs +0 -0
  27. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
package/README.md CHANGED
@@ -3,25 +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
- - [Service usage](#service-usage)
16
-
17
- - [Known issues](#known-issues)
18
-
19
- - [Example App](#example-app)
20
-
11
+ - [State Parameter](#state-parameter)
12
+ - [Known issues](#known-issues)
21
13
  - [Quickstart](#quickstart)
22
-
23
14
  - [Documentation](#documentation)
24
-
25
15
  - [Releases](#releases)
26
16
 
27
17
  <!--
@@ -36,9 +26,7 @@ Please also use ``` instead of indenting for code blocks. The backticks are tran
36
26
  tag::forDocSite[]
37
27
  -->
38
28
 
39
- This SDK allows you to add login, logout, and registration buttons to
40
- your Angular application. You can do this via pre-built buttons, or with
41
- 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.
42
30
 
43
31
  Your users will be sent to FusionAuth’s themeable hosted login pages and
44
32
  then log in. After that, they are sent back to your Angular application.
@@ -98,6 +86,7 @@ import { FusionAuthModule } from '@fusionauth/angular-sdk';
98
86
  clientId: '', // Your FusionAuth client ID
99
87
  serverUrl: '', // The base URL of the server that performs the token exchange
100
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.
101
90
  }),
102
91
  ],
103
92
  providers: [],
@@ -108,6 +97,41 @@ export class AppModule { }
108
97
 
109
98
  ## Usage
110
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
+
111
135
  ### Pre-built buttons
112
136
 
113
137
  There are three pre-styled buttons that are configured to perform
@@ -139,56 +163,6 @@ export class LogoutComponent {}
139
163
  export class RegisterComponent {}
140
164
  ```
141
165
 
142
- ### Service usage
143
-
144
- Alternatively, you may interact with the SDK Service by injecting the FusionAuthService into any component or service.
145
-
146
- ```typescript
147
- import { Component, OnInit } from '@angular/core';
148
- import { FusionAuthService, UserInfo } from '@fusionauth/angular-sdk';
149
-
150
- @Component({
151
- selector: 'app-root',
152
- templateUrl: './app.component.html',
153
- styleUrls: ['./app.component.scss']
154
- })
155
- export class AppComponent implements OnInit {
156
- private userInfo: UserInfo;
157
-
158
- constructor(
159
- private fusionAuth: FusionAuthService,
160
- ) {}
161
-
162
- async ngOnInit(): Promise<void> {
163
- this.fusionAuth.initAutoRefresh();
164
- }
165
-
166
- login() {
167
- this.fusionAuth.startLogin();
168
- }
169
-
170
- register() {
171
- this.fusionAuth.startRegistration();
172
- }
173
-
174
- logout() {
175
- this.fusionAuth.logout();
176
- }
177
-
178
- refreshToken() {
179
- this.fusionAuth.refreshToken();
180
- }
181
-
182
- async getUserInfo() {
183
- this.userInfo = await this.fusionAuth.getUserInfo();
184
- }
185
-
186
- isLoggedIn(): boolean {
187
- return this.fusionAuth.isLoggedIn();
188
- }
189
- }
190
- ```
191
-
192
166
  #### State parameter
193
167
 
194
168
  The `startLogin` and `startRegistration` functions both accept an optional string
@@ -210,8 +184,7 @@ See the [FusionAuth Angular Quickstart](https://fusionauth.io/docs/quickstarts/q
210
184
 
211
185
  ## Documentation
212
186
 
213
- [Full library
214
- 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)
215
188
 
216
189
  <!--
217
190
  end::forDocSite[]
@@ -221,4 +194,4 @@ Use backticks for code in this readme. This readme is included on the FusionAuth
221
194
 
222
195
  ## Releases
223
196
 
224
- To perform a release to NPM, create a release on GitHub. That will automatically publish a release to GitHub.
197
+ To perform a release to NPM, create a release on GitHub. That will automatically publish a release to GitHub.
@@ -8,13 +8,13 @@ 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.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"] }); }
11
13
  }
12
- FusionAuthLoginButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FusionAuthLoginButtonComponent, deps: [{ token: i1.FusionAuthService }], target: i0.ɵɵFactoryTarget.Component });
13
- FusionAuthLoginButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", 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"] });
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FusionAuthLoginButtonComponent, decorators: [{
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
- }], ctorParameters: function () { return [{ type: i1.FusionAuthService }]; }, propDecorators: { state: [{
17
+ }], ctorParameters: () => [{ type: i1.FusionAuthService }], propDecorators: { state: [{
18
18
  type: Input
19
19
  }] } });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzaW9uLWF1dGgtbG9naW4tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z1c2lvbmF1dGgtYW5ndWxhci1zZGsvc3JjL2xpYi9jb21wb25lbnRzL2Z1c2lvbmF1dGgtbG9naW4uYnV0dG9uL2Z1c2lvbi1hdXRoLWxvZ2luLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdXNpb25hdXRoLWFuZ3VsYXItc2RrL3NyYy9saWIvY29tcG9uZW50cy9mdXNpb25hdXRoLWxvZ2luLmJ1dHRvbi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVFqRCxNQUFNLE9BQU8sOEJBQThCO0lBR3pDLFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQUcsQ0FBQztJQUVyRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7OzRIQVBVLDhCQUE4QjtnSEFBOUIsOEJBQThCLDRFQ1IzQyxxRkFHQTs0RkRLYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsVUFBVTt3R0FLWCxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGdXNpb25BdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2Z1c2lvbi1hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmYS1sb2dpbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGdXNpb25BdXRoTG9naW5CdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnVzaW9uQXV0aDogRnVzaW9uQXV0aFNlcnZpY2UpIHt9XG5cbiAgbG9naW4oKSB7XG4gICAgdGhpcy5mdXNpb25BdXRoLnN0YXJ0TG9naW4odGhpcy5zdGF0ZSk7XG4gIH1cbn1cbiIsIjxidXR0b24gY2xhc3M9XCJmYS1idXR0b25cIiAoY2xpY2spPVwibG9naW4oKVwiPlxuICA8c3Bhbj5Mb2dpbjwvc3Bhbj5cbjwvYnV0dG9uPlxuIl19
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzaW9uLWF1dGgtbG9naW4tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z1c2lvbmF1dGgtYW5ndWxhci1zZGsvc3JjL2xpYi9jb21wb25lbnRzL2Z1c2lvbmF1dGgtbG9naW4uYnV0dG9uL2Z1c2lvbi1hdXRoLWxvZ2luLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdXNpb25hdXRoLWFuZ3VsYXItc2RrL3NyYy9saWIvY29tcG9uZW50cy9mdXNpb25hdXRoLWxvZ2luLmJ1dHRvbi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVFqRCxNQUFNLE9BQU8sOEJBQThCO0lBR3pDLFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQUcsQ0FBQztJQUVyRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7OEdBUFUsOEJBQThCO2tHQUE5Qiw4QkFBOEIsNEVDUjNDLHFGQUdBOzsyRkRLYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsVUFBVTtzRkFLWCxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGdXNpb25BdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2Z1c2lvbi1hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmYS1sb2dpbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRnVzaW9uQXV0aExvZ2luQnV0dG9uQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZ1c2lvbkF1dGg6IEZ1c2lvbkF1dGhTZXJ2aWNlKSB7fVxuXG4gIGxvZ2luKCkge1xuICAgIHRoaXMuZnVzaW9uQXV0aC5zdGFydExvZ2luKHRoaXMuc3RhdGUpO1xuICB9XG59XG4iLCI8YnV0dG9uIGNsYXNzPVwiZmEtYnV0dG9uXCIgKGNsaWNrKT1cImxvZ2luKClcIj5cbiAgPHNwYW4+TG9naW48L3NwYW4+XG48L2J1dHRvbj5cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../fusion-auth.service";
4
+ export class FusionAuthLogoutButtonComponent {
5
+ constructor(fusionAuth) {
6
+ this.fusionAuth = fusionAuth;
7
+ }
8
+ logout() {
9
+ this.fusionAuth.logout();
10
+ }
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
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthLogoutButtonComponent, decorators: [{
15
+ type: Component,
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
+ }], ctorParameters: () => [{ type: i1.FusionAuthService }] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzaW9uLWF1dGgtbG9nb3V0LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdXNpb25hdXRoLWFuZ3VsYXItc2RrL3NyYy9saWIvY29tcG9uZW50cy9mdXNpb25hdXRoLWxvZ291dC5idXR0b24vZnVzaW9uLWF1dGgtbG9nb3V0LWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdXNpb25hdXRoLWFuZ3VsYXItc2RrL3NyYy9saWIvY29tcG9uZW50cy9mdXNpb25hdXRoLWxvZ291dC5idXR0b24vZnVzaW9uLWF1dGgtbG9nb3V0LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFRMUMsTUFBTSxPQUFPLCtCQUErQjtJQUMxQyxZQUFvQixVQUE2QjtRQUE3QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtJQUFHLENBQUM7SUFFckQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs4R0FMVSwrQkFBK0I7a0dBQS9CLCtCQUErQixpRENSNUMsOEZBR0E7OzJGREthLCtCQUErQjtrQkFMM0MsU0FBUzsrQkFDRSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGdXNpb25BdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2Z1c2lvbi1hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmYS1sb2dvdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZnVzaW9uLWF1dGgtbG9nb3V0LWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Z1c2lvbi1hdXRoLWxvZ291dC1idXR0b24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRnVzaW9uQXV0aExvZ291dEJ1dHRvbkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnVzaW9uQXV0aDogRnVzaW9uQXV0aFNlcnZpY2UpIHt9XG5cbiAgbG9nb3V0KCkge1xuICAgIHRoaXMuZnVzaW9uQXV0aC5sb2dvdXQoKTtcbiAgfVxufVxuIiwiPGJ1dHRvbiBjbGFzcz1cImZhLWxvZ291dC1idXR0b25cIiAoY2xpY2spPVwibG9nb3V0KClcIj5cbiAgPHNwYW4+bG9nb3V0PC9zcGFuPlxuPC9idXR0b24+XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../fusion-auth.service";
4
+ export class FusionAuthRegisterButtonComponent {
5
+ constructor(fusionAuth) {
6
+ this.fusionAuth = fusionAuth;
7
+ }
8
+ register() {
9
+ this.fusionAuth.startRegistration(this.state);
10
+ }
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
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthRegisterButtonComponent, decorators: [{
15
+ type: Component,
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
+ }], ctorParameters: () => [{ type: i1.FusionAuthService }], propDecorators: { state: [{
18
+ type: Input
19
+ }] } });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzaW9uLWF1dGgtcmVnaXN0ZXItYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z1c2lvbmF1dGgtYW5ndWxhci1zZGsvc3JjL2xpYi9jb21wb25lbnRzL2Z1c2lvbmF1dGgtcmVnaXN0ZXIuYnV0dG9uL2Z1c2lvbi1hdXRoLXJlZ2lzdGVyLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdXNpb25hdXRoLWFuZ3VsYXItc2RrL3NyYy9saWIvY29tcG9uZW50cy9mdXNpb25hdXRoLXJlZ2lzdGVyLmJ1dHRvbi9mdXNpb24tYXV0aC1yZWdpc3Rlci1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVFqRCxNQUFNLE9BQU8saUNBQWlDO0lBRzVDLFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQUcsQ0FBQztJQUVyRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs4R0FQVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQywrRUNSOUMsK0ZBR0E7OzJGREthLGlDQUFpQztrQkFMN0MsU0FBUzsrQkFDRSxhQUFhO3NGQUtkLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZ1c2lvbkF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZnVzaW9uLWF1dGguc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZhLXJlZ2lzdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Z1c2lvbi1hdXRoLXJlZ2lzdGVyLWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Z1c2lvbi1hdXRoLXJlZ2lzdGVyLWJ1dHRvbi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGdXNpb25BdXRoUmVnaXN0ZXJCdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnVzaW9uQXV0aDogRnVzaW9uQXV0aFNlcnZpY2UpIHt9XG5cbiAgcmVnaXN0ZXIoKSB7XG4gICAgdGhpcy5mdXNpb25BdXRoLnN0YXJ0UmVnaXN0cmF0aW9uKHRoaXMuc3RhdGUpO1xuICB9XG59XG4iLCI8YnV0dG9uIGNsYXNzPVwiZmEtYnV0dG9uXCIgKGNsaWNrKT1cInJlZ2lzdGVyKClcIj5cbiAgPHNwYW4+UmVnaXN0ZXIgTm93PC9zcGFuPlxuPC9idXR0b24+XG4iXX0=
@@ -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=
@@ -0,0 +1,43 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { FusionAuthService } from './fusion-auth.service';
3
+ import { FusionAuthLoginButtonComponent } from './components/fusionauth-login.button/fusion-auth-login-button.component';
4
+ import { FusionAuthLogoutButtonComponent } from './components/fusionauth-logout.button/fusion-auth-logout-button.component';
5
+ import { FusionAuthRegisterButtonComponent } from './components/fusionauth-register.button/fusion-auth-register-button.component';
6
+ import * as i0 from "@angular/core";
7
+ export class FusionAuthModule {
8
+ static forRoot(fusionAuthConfig) {
9
+ return {
10
+ ngModule: FusionAuthModule,
11
+ providers: [
12
+ {
13
+ provide: FusionAuthService,
14
+ useValue: new FusionAuthService(fusionAuthConfig),
15
+ },
16
+ ],
17
+ };
18
+ }
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
+ FusionAuthLogoutButtonComponent,
22
+ FusionAuthRegisterButtonComponent], exports: [FusionAuthLoginButtonComponent,
23
+ FusionAuthLogoutButtonComponent,
24
+ FusionAuthRegisterButtonComponent] }); }
25
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthModule }); }
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthModule, decorators: [{
28
+ type: NgModule,
29
+ args: [{
30
+ declarations: [
31
+ FusionAuthLoginButtonComponent,
32
+ FusionAuthLogoutButtonComponent,
33
+ FusionAuthRegisterButtonComponent,
34
+ ],
35
+ imports: [],
36
+ exports: [
37
+ FusionAuthLoginButtonComponent,
38
+ FusionAuthLogoutButtonComponent,
39
+ FusionAuthRegisterButtonComponent,
40
+ ],
41
+ }]
42
+ }] });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzaW9uLWF1dGgubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZnVzaW9uYXV0aC1hbmd1bGFyLXNkay9zcmMvbGliL2Z1c2lvbi1hdXRoLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUN6SCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwyRUFBMkUsQ0FBQztBQUM1SCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrRUFBK0UsQ0FBQzs7QUFlbEksTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixNQUFNLENBQUMsT0FBTyxDQUNaLGdCQUFrQztRQUVsQyxPQUFPO1lBQ0wsUUFBUSxFQUFFLGdCQUFnQjtZQUMxQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsUUFBUSxFQUFFLElBQUksaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7aUJBQ2xEO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs4R0FiVSxnQkFBZ0I7K0dBQWhCLGdCQUFnQixpQkFYekIsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixpQ0FBaUMsYUFJakMsOEJBQThCO1lBQzlCLCtCQUErQjtZQUMvQixpQ0FBaUM7K0dBR3hCLGdCQUFnQjs7MkZBQWhCLGdCQUFnQjtrQkFiNUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osOEJBQThCO3dCQUM5QiwrQkFBK0I7d0JBQy9CLGlDQUFpQztxQkFDbEM7b0JBQ0QsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFO3dCQUNQLDhCQUE4Qjt3QkFDOUIsK0JBQStCO3dCQUMvQixpQ0FBaUM7cUJBQ2xDO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZ1c2lvbkF1dGhDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEZ1c2lvbkF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9mdXNpb24tYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZ1c2lvbkF1dGhMb2dpbkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mdXNpb25hdXRoLWxvZ2luLmJ1dHRvbi9mdXNpb24tYXV0aC1sb2dpbi1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZ1c2lvbkF1dGhMb2dvdXRCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZnVzaW9uYXV0aC1sb2dvdXQuYnV0dG9uL2Z1c2lvbi1hdXRoLWxvZ291dC1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZ1c2lvbkF1dGhSZWdpc3RlckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mdXNpb25hdXRoLXJlZ2lzdGVyLmJ1dHRvbi9mdXNpb24tYXV0aC1yZWdpc3Rlci1idXR0b24uY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRnVzaW9uQXV0aExvZ2luQnV0dG9uQ29tcG9uZW50LFxuICAgIEZ1c2lvbkF1dGhMb2dvdXRCdXR0b25Db21wb25lbnQsXG4gICAgRnVzaW9uQXV0aFJlZ2lzdGVyQnV0dG9uQ29tcG9uZW50LFxuICBdLFxuICBpbXBvcnRzOiBbXSxcbiAgZXhwb3J0czogW1xuICAgIEZ1c2lvbkF1dGhMb2dpbkJ1dHRvbkNvbXBvbmVudCxcbiAgICBGdXNpb25BdXRoTG9nb3V0QnV0dG9uQ29tcG9uZW50LFxuICAgIEZ1c2lvbkF1dGhSZWdpc3RlckJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnVzaW9uQXV0aE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIGZ1c2lvbkF1dGhDb25maWc6IEZ1c2lvbkF1dGhDb25maWcsXG4gICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8RnVzaW9uQXV0aE1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogRnVzaW9uQXV0aE1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogRnVzaW9uQXV0aFNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IG5ldyBGdXNpb25BdXRoU2VydmljZShmdXNpb25BdXRoQ29uZmlnKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl19