@myrmidon/auth-jwt-admin 1.0.6 → 2.0.0
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/esm2022/lib/auth-jwt-admin.module.mjs +120 -0
- package/esm2022/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +165 -0
- package/esm2022/lib/components/confirm-dialog/confirm-dialog.component.mjs +30 -0
- package/esm2022/lib/components/password-strength-bar/password-strength-bar.component.mjs +81 -0
- package/esm2022/lib/components/state/user-list.repository.mjs +145 -0
- package/esm2022/lib/components/user-editor/user-editor.component.mjs +113 -0
- package/esm2022/lib/components/user-filter/user-filter.component.mjs +56 -0
- package/{esm2020 → esm2022}/lib/components/user-list/user-list.component.mjs +71 -70
- package/esm2022/lib/services/auth-jwt-account.service.mjs +182 -0
- package/esm2022/lib/services/dialog.service.mjs +38 -0
- package/{esm2020 → esm2022}/lib/validators/password.validators.mjs +48 -48
- package/{esm2020 → esm2022}/myrmidon-auth-jwt-admin.mjs +4 -4
- package/{esm2020 → esm2022}/public-api.mjs +11 -11
- package/{fesm2020 → fesm2022}/myrmidon-auth-jwt-admin.mjs +919 -919
- package/{fesm2020 → fesm2022}/myrmidon-auth-jwt-admin.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/auth-jwt-admin.module.d.ts +30 -30
- package/lib/components/auth-jwt-registration/auth-jwt-registration.component.d.ts +37 -37
- package/lib/components/confirm-dialog/confirm-dialog.component.d.ts +15 -15
- package/lib/components/password-strength-bar/password-strength-bar.component.d.ts +17 -17
- package/lib/components/state/user-list.repository.d.ts +36 -36
- package/lib/components/user-editor/user-editor.component.d.ts +29 -29
- package/lib/components/user-filter/user-filter.component.d.ts +21 -21
- package/lib/components/user-list/user-list.component.d.ts +29 -29
- package/lib/services/auth-jwt-account.service.d.ts +114 -114
- package/lib/services/dialog.service.d.ts +19 -19
- package/lib/validators/password.validators.d.ts +6 -6
- package/package.json +24 -17
- package/public-api.d.ts +8 -8
- package/esm2020/lib/auth-jwt-admin.module.mjs +0 -119
- package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +0 -164
- package/esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs +0 -29
- package/esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs +0 -80
- package/esm2020/lib/components/state/user-list.repository.mjs +0 -144
- package/esm2020/lib/components/user-editor/user-editor.component.mjs +0 -112
- package/esm2020/lib/components/user-filter/user-filter.component.mjs +0 -55
- package/esm2020/lib/services/auth-jwt-account.service.mjs +0 -181
- package/esm2020/lib/services/dialog.service.mjs +0 -37
- package/fesm2015/myrmidon-auth-jwt-admin.mjs +0 -998
- package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ValidatorFn } from '@angular/forms';
|
|
2
|
-
export declare class PasswordValidators {
|
|
3
|
-
/** "Standard" password validator for my API services. */
|
|
4
|
-
static standard(): ValidatorFn;
|
|
5
|
-
static areEqual(controlName: string, otherControlName: string): ValidatorFn;
|
|
6
|
-
}
|
|
1
|
+
import { ValidatorFn } from '@angular/forms';
|
|
2
|
+
export declare class PasswordValidators {
|
|
3
|
+
/** "Standard" password validator for my API services. */
|
|
4
|
+
static standard(): ValidatorFn;
|
|
5
|
+
static areEqual(controlName: string, otherControlName: string): ValidatorFn;
|
|
6
|
+
}
|
package/package.json
CHANGED
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myrmidon/auth-jwt-admin",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "JWT-based auth services accounts admin component.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"JWT",
|
|
7
|
+
"authentication"
|
|
8
|
+
],
|
|
9
|
+
"homepage": "https://github.com/Myrmex/auth-jwt",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/Myrmex/auth-jwt"
|
|
13
|
+
},
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "Daniele Fusi"
|
|
16
|
+
},
|
|
4
17
|
"peerDependencies": {
|
|
5
|
-
"@angular/common": "^
|
|
6
|
-
"@angular/core": "^
|
|
7
|
-
"@angular/material": "^
|
|
8
|
-
"@myrmidon/auth-jwt-login": "^
|
|
9
|
-
"@myrmidon/ng-tools": "^
|
|
18
|
+
"@angular/common": "^16.0.0",
|
|
19
|
+
"@angular/core": "^16.0.0",
|
|
20
|
+
"@angular/material": "^16.0.0",
|
|
21
|
+
"@myrmidon/auth-jwt-login": "^2.0.0",
|
|
22
|
+
"@myrmidon/ng-tools": "^2.0.0"
|
|
10
23
|
},
|
|
11
24
|
"dependencies": {
|
|
12
|
-
"tslib": "^2.
|
|
25
|
+
"tslib": "^2.5.0"
|
|
13
26
|
},
|
|
14
|
-
"module": "
|
|
15
|
-
"es2020": "fesm2020/myrmidon-auth-jwt-admin.mjs",
|
|
16
|
-
"esm2020": "esm2020/myrmidon-auth-jwt-admin.mjs",
|
|
17
|
-
"fesm2020": "fesm2020/myrmidon-auth-jwt-admin.mjs",
|
|
18
|
-
"fesm2015": "fesm2015/myrmidon-auth-jwt-admin.mjs",
|
|
27
|
+
"module": "fesm2022/myrmidon-auth-jwt-admin.mjs",
|
|
19
28
|
"typings": "index.d.ts",
|
|
20
29
|
"exports": {
|
|
21
30
|
"./package.json": {
|
|
@@ -23,11 +32,9 @@
|
|
|
23
32
|
},
|
|
24
33
|
".": {
|
|
25
34
|
"types": "./index.d.ts",
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"node": "./fesm2015/myrmidon-auth-jwt-admin.mjs",
|
|
30
|
-
"default": "./fesm2020/myrmidon-auth-jwt-admin.mjs"
|
|
35
|
+
"esm2022": "./esm2022/myrmidon-auth-jwt-admin.mjs",
|
|
36
|
+
"esm": "./esm2022/myrmidon-auth-jwt-admin.mjs",
|
|
37
|
+
"default": "./fesm2022/myrmidon-auth-jwt-admin.mjs"
|
|
31
38
|
}
|
|
32
39
|
},
|
|
33
40
|
"sideEffects": false
|
package/public-api.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';
|
|
2
|
-
export * from './lib/components/password-strength-bar/password-strength-bar.component';
|
|
3
|
-
export * from './lib/components/user-filter/user-filter.component';
|
|
4
|
-
export * from './lib/components/user-list/user-list.component';
|
|
5
|
-
export * from './lib/components/state/user-list.repository';
|
|
6
|
-
export * from './lib/services/auth-jwt-account.service';
|
|
7
|
-
export * from './lib/validators/password.validators';
|
|
8
|
-
export * from './lib/auth-jwt-admin.module';
|
|
1
|
+
export * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';
|
|
2
|
+
export * from './lib/components/password-strength-bar/password-strength-bar.component';
|
|
3
|
+
export * from './lib/components/user-filter/user-filter.component';
|
|
4
|
+
export * from './lib/components/user-list/user-list.component';
|
|
5
|
+
export * from './lib/components/state/user-list.repository';
|
|
6
|
+
export * from './lib/services/auth-jwt-account.service';
|
|
7
|
+
export * from './lib/validators/password.validators';
|
|
8
|
+
export * from './lib/auth-jwt-admin.module';
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { HttpClientModule } from '@angular/common/http';
|
|
3
|
-
import { NgModule } from '@angular/core';
|
|
4
|
-
import { RouterModule } from '@angular/router';
|
|
5
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import { MatCardModule } from '@angular/material/card';
|
|
7
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
-
import { MatInputModule } from '@angular/material/input';
|
|
9
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
10
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
11
|
-
import { MatExpansionModule } from '@angular/material/expansion';
|
|
12
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
13
|
-
import { MatPaginatorModule } from '@angular/material/paginator';
|
|
14
|
-
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
15
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
16
|
-
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
|
17
|
-
import { MatDialogModule } from '@angular/material/dialog';
|
|
18
|
-
import { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';
|
|
19
|
-
import { NgToolsModule } from '@myrmidon/ng-tools';
|
|
20
|
-
import { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';
|
|
21
|
-
import { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';
|
|
22
|
-
import { UserFilterComponent } from './components/user-filter/user-filter.component';
|
|
23
|
-
import { UserListComponent } from './components/user-list/user-list.component';
|
|
24
|
-
import { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';
|
|
25
|
-
import { UserEditorComponent } from './components/user-editor/user-editor.component';
|
|
26
|
-
import * as i0 from "@angular/core";
|
|
27
|
-
export class AuthJwtAdminModule {
|
|
28
|
-
}
|
|
29
|
-
AuthJwtAdminModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAdminModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
30
|
-
AuthJwtAdminModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAdminModule, declarations: [AuthJwtRegistrationComponent,
|
|
31
|
-
PasswordStrengthBarComponent,
|
|
32
|
-
UserFilterComponent,
|
|
33
|
-
UserListComponent,
|
|
34
|
-
ConfirmDialogComponent,
|
|
35
|
-
UserEditorComponent], imports: [CommonModule,
|
|
36
|
-
HttpClientModule,
|
|
37
|
-
FormsModule,
|
|
38
|
-
RouterModule,
|
|
39
|
-
ReactiveFormsModule,
|
|
40
|
-
// material
|
|
41
|
-
MatButtonModule,
|
|
42
|
-
MatCardModule,
|
|
43
|
-
MatCheckboxModule,
|
|
44
|
-
MatDialogModule,
|
|
45
|
-
MatExpansionModule,
|
|
46
|
-
MatIconModule,
|
|
47
|
-
MatInputModule,
|
|
48
|
-
MatPaginatorModule,
|
|
49
|
-
MatProgressBarModule,
|
|
50
|
-
MatProgressSpinnerModule,
|
|
51
|
-
MatSnackBarModule,
|
|
52
|
-
MatTooltipModule,
|
|
53
|
-
AuthJwtLoginModule,
|
|
54
|
-
NgToolsModule], exports: [AuthJwtRegistrationComponent,
|
|
55
|
-
PasswordStrengthBarComponent,
|
|
56
|
-
UserFilterComponent,
|
|
57
|
-
UserListComponent] });
|
|
58
|
-
AuthJwtAdminModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAdminModule, imports: [CommonModule,
|
|
59
|
-
HttpClientModule,
|
|
60
|
-
FormsModule,
|
|
61
|
-
RouterModule,
|
|
62
|
-
ReactiveFormsModule,
|
|
63
|
-
// material
|
|
64
|
-
MatButtonModule,
|
|
65
|
-
MatCardModule,
|
|
66
|
-
MatCheckboxModule,
|
|
67
|
-
MatDialogModule,
|
|
68
|
-
MatExpansionModule,
|
|
69
|
-
MatIconModule,
|
|
70
|
-
MatInputModule,
|
|
71
|
-
MatPaginatorModule,
|
|
72
|
-
MatProgressBarModule,
|
|
73
|
-
MatProgressSpinnerModule,
|
|
74
|
-
MatSnackBarModule,
|
|
75
|
-
MatTooltipModule,
|
|
76
|
-
AuthJwtLoginModule,
|
|
77
|
-
NgToolsModule] });
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAdminModule, decorators: [{
|
|
79
|
-
type: NgModule,
|
|
80
|
-
args: [{
|
|
81
|
-
declarations: [
|
|
82
|
-
AuthJwtRegistrationComponent,
|
|
83
|
-
PasswordStrengthBarComponent,
|
|
84
|
-
UserFilterComponent,
|
|
85
|
-
UserListComponent,
|
|
86
|
-
ConfirmDialogComponent,
|
|
87
|
-
UserEditorComponent,
|
|
88
|
-
],
|
|
89
|
-
imports: [
|
|
90
|
-
CommonModule,
|
|
91
|
-
HttpClientModule,
|
|
92
|
-
FormsModule,
|
|
93
|
-
RouterModule,
|
|
94
|
-
ReactiveFormsModule,
|
|
95
|
-
// material
|
|
96
|
-
MatButtonModule,
|
|
97
|
-
MatCardModule,
|
|
98
|
-
MatCheckboxModule,
|
|
99
|
-
MatDialogModule,
|
|
100
|
-
MatExpansionModule,
|
|
101
|
-
MatIconModule,
|
|
102
|
-
MatInputModule,
|
|
103
|
-
MatPaginatorModule,
|
|
104
|
-
MatProgressBarModule,
|
|
105
|
-
MatProgressSpinnerModule,
|
|
106
|
-
MatSnackBarModule,
|
|
107
|
-
MatTooltipModule,
|
|
108
|
-
AuthJwtLoginModule,
|
|
109
|
-
NgToolsModule
|
|
110
|
-
],
|
|
111
|
-
exports: [
|
|
112
|
-
AuthJwtRegistrationComponent,
|
|
113
|
-
PasswordStrengthBarComponent,
|
|
114
|
-
UserFilterComponent,
|
|
115
|
-
UserListComponent
|
|
116
|
-
],
|
|
117
|
-
}]
|
|
118
|
-
}] });
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtYWRtaW4ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9hdXRoLWp3dC1hZG1pbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNsSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNsSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7QUF3Q3JGLE1BQU0sT0FBTyxrQkFBa0I7OytHQUFsQixrQkFBa0I7Z0hBQWxCLGtCQUFrQixpQkFwQzNCLDRCQUE0QjtRQUM1Qiw0QkFBNEI7UUFDNUIsbUJBQW1CO1FBQ25CLGlCQUFpQjtRQUNqQixzQkFBc0I7UUFDdEIsbUJBQW1CLGFBR25CLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFlBQVk7UUFDWixtQkFBbUI7UUFDbkIsV0FBVztRQUNYLGVBQWU7UUFDZixhQUFhO1FBQ2IsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixrQkFBa0I7UUFDbEIsYUFBYTtRQUNiLGNBQWM7UUFDZCxrQkFBa0I7UUFDbEIsb0JBQW9CO1FBQ3BCLHdCQUF3QjtRQUN4QixpQkFBaUI7UUFDakIsZ0JBQWdCO1FBQ2hCLGtCQUFrQjtRQUNsQixhQUFhLGFBR2IsNEJBQTRCO1FBQzVCLDRCQUE0QjtRQUM1QixtQkFBbUI7UUFDbkIsaUJBQWlCO2dIQUdSLGtCQUFrQixZQTVCM0IsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixXQUFXO1FBQ1gsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixXQUFXO1FBQ1gsZUFBZTtRQUNmLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQixhQUFhO1FBQ2IsY0FBYztRQUNkLGtCQUFrQjtRQUNsQixvQkFBb0I7UUFDcEIsd0JBQXdCO1FBQ3hCLGlCQUFpQjtRQUNqQixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLGFBQWE7MkZBU0osa0JBQWtCO2tCQXRDOUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osNEJBQTRCO3dCQUM1Qiw0QkFBNEI7d0JBQzVCLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3dCQUNqQixzQkFBc0I7d0JBQ3RCLG1CQUFtQjtxQkFDcEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osZ0JBQWdCO3dCQUNoQixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLHdCQUF3Qjt3QkFDeEIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjt3QkFDbEIsYUFBYTtxQkFDZDtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsNEJBQTRCO3dCQUM1Qiw0QkFBNEI7d0JBQzVCLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3FCQUNsQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgTWF0Q2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHtNYXRFeHBhbnNpb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgQXV0aEp3dExvZ2luTW9kdWxlIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuaW1wb3J0IHsgTmdUb29sc01vZHVsZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBBdXRoSnd0UmVnaXN0cmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2F1dGgtand0LXJlZ2lzdHJhdGlvbi9hdXRoLWp3dC1yZWdpc3RyYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGFzc3dvcmRTdHJlbmd0aEJhckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wYXNzd29yZC1zdHJlbmd0aC1iYXIvcGFzc3dvcmQtc3RyZW5ndGgtYmFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVzZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdXNlci1maWx0ZXIvdXNlci1maWx0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVXNlckxpc3RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdXNlci1saXN0L3VzZXItbGlzdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVzZXJFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdXNlci1lZGl0b3IvdXNlci1lZGl0b3IuY29tcG9uZW50JztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBBdXRoSnd0UmVnaXN0cmF0aW9uQ29tcG9uZW50LFxyXG4gICAgUGFzc3dvcmRTdHJlbmd0aEJhckNvbXBvbmVudCxcclxuICAgIFVzZXJGaWx0ZXJDb21wb25lbnQsXHJcbiAgICBVc2VyTGlzdENvbXBvbmVudCxcclxuICAgIENvbmZpcm1EaWFsb2dDb21wb25lbnQsXHJcbiAgICBVc2VyRWRpdG9yQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgSHR0cENsaWVudE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUm91dGVyTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIC8vIG1hdGVyaWFsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDYXJkTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dNb2R1bGUsXHJcbiAgICBNYXRFeHBhbnNpb25Nb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgIE1hdFNuYWNrQmFyTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEF1dGhKd3RMb2dpbk1vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGVcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtcclxuICAgIEF1dGhKd3RSZWdpc3RyYXRpb25Db21wb25lbnQsXHJcbiAgICBQYXNzd29yZFN0cmVuZ3RoQmFyQ29tcG9uZW50LFxyXG4gICAgVXNlckZpbHRlckNvbXBvbmVudCxcclxuICAgIFVzZXJMaXN0Q29tcG9uZW50XHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhKd3RBZG1pbk1vZHVsZSB7fVxyXG4iXX0=
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Output } from '@angular/core';
|
|
2
|
-
import { Validators, } from '@angular/forms';
|
|
3
|
-
import { take } from 'rxjs/operators';
|
|
4
|
-
import { PasswordValidators } from '../../validators/password.validators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "@angular/material/snack-bar";
|
|
8
|
-
import * as i3 from "../../services/auth-jwt-account.service";
|
|
9
|
-
import * as i4 from "@angular/common";
|
|
10
|
-
import * as i5 from "@angular/material/button";
|
|
11
|
-
import * as i6 from "@angular/material/icon";
|
|
12
|
-
import * as i7 from "@angular/material/input";
|
|
13
|
-
import * as i8 from "@angular/material/form-field";
|
|
14
|
-
import * as i9 from "@angular/material/progress-spinner";
|
|
15
|
-
import * as i10 from "../password-strength-bar/password-strength-bar.component";
|
|
16
|
-
export class AuthJwtRegistrationComponent {
|
|
17
|
-
constructor(formBuilder, _snackbar, _accountService) {
|
|
18
|
-
this._snackbar = _snackbar;
|
|
19
|
-
this._accountService = _accountService;
|
|
20
|
-
this.registered = new EventEmitter();
|
|
21
|
-
// form
|
|
22
|
-
this.email = formBuilder.control('', {
|
|
23
|
-
validators: [Validators.required, Validators.email],
|
|
24
|
-
asyncValidators: this.getUniqueEmailValidator(this._accountService).bind(this),
|
|
25
|
-
nonNullable: true,
|
|
26
|
-
});
|
|
27
|
-
this.name = formBuilder.control('', {
|
|
28
|
-
validators: Validators.required,
|
|
29
|
-
asyncValidators: this.getUniqueNameValidator(this._accountService).bind(this),
|
|
30
|
-
nonNullable: true,
|
|
31
|
-
});
|
|
32
|
-
this.firstName = formBuilder.control('', {
|
|
33
|
-
validators: [Validators.required, Validators.maxLength(50)],
|
|
34
|
-
nonNullable: true,
|
|
35
|
-
});
|
|
36
|
-
this.lastName = formBuilder.control('', {
|
|
37
|
-
validators: [Validators.required, Validators.maxLength(50)],
|
|
38
|
-
nonNullable: true,
|
|
39
|
-
});
|
|
40
|
-
// http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password
|
|
41
|
-
this.password = formBuilder.control('', {
|
|
42
|
-
validators: [Validators.required, PasswordValidators.standard()],
|
|
43
|
-
nonNullable: true,
|
|
44
|
-
});
|
|
45
|
-
this.confirmPassword = formBuilder.control('', {
|
|
46
|
-
validators: Validators.required,
|
|
47
|
-
nonNullable: true,
|
|
48
|
-
});
|
|
49
|
-
this.form = formBuilder.group({
|
|
50
|
-
email: this.email,
|
|
51
|
-
name: this.name,
|
|
52
|
-
firstName: this.firstName,
|
|
53
|
-
lastName: this.lastName,
|
|
54
|
-
password: this.password,
|
|
55
|
-
confirmPassword: this.confirmPassword,
|
|
56
|
-
}, {
|
|
57
|
-
validators: [
|
|
58
|
-
PasswordValidators.areEqual('password', 'confirmPassword'),
|
|
59
|
-
],
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Creates a unique name validator. There is no dependency injection at this level,
|
|
64
|
-
* but we can use closures. As a matter of fact, we have access to the service instance
|
|
65
|
-
* from the component where we register validators. So we will implement a function
|
|
66
|
-
* that will accept the service as parameter, and create the actual validation function.
|
|
67
|
-
* This function will have access to the service when called during the validation process.
|
|
68
|
-
* See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.
|
|
69
|
-
*/
|
|
70
|
-
getUniqueNameValidator(service) {
|
|
71
|
-
return (control) => {
|
|
72
|
-
return new Promise((resolve, reject) => {
|
|
73
|
-
// avoid checking if empty
|
|
74
|
-
if (!control.value) {
|
|
75
|
-
resolve(null);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
service.isNameRegistered(control.value).subscribe({
|
|
79
|
-
next: (data) => {
|
|
80
|
-
if (!data.isExisting) {
|
|
81
|
-
resolve(null);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
resolve({ uniqueName: true });
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
error: (error) => {
|
|
88
|
-
console.error('Unique name validator error' +
|
|
89
|
-
(error ? JSON.stringify(error) : ''));
|
|
90
|
-
resolve({ uniqueName: true });
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
getUniqueEmailValidator(service) {
|
|
98
|
-
return (control) => {
|
|
99
|
-
return new Promise((resolve, reject) => {
|
|
100
|
-
// avoid checking if empty
|
|
101
|
-
if (!control.value) {
|
|
102
|
-
resolve(null);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
service.isEmailRegistered(control.value).subscribe({
|
|
106
|
-
next: (data) => {
|
|
107
|
-
if (!data.isExisting) {
|
|
108
|
-
resolve(null);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
resolve({ uniqueEmail: true });
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
error: (error) => {
|
|
115
|
-
console.error('Unique email validator error' +
|
|
116
|
-
(error ? JSON.stringify(error) : ''));
|
|
117
|
-
resolve({ uniqueEmail: true });
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
onSubmit() {
|
|
125
|
-
if (!this.form.valid ||
|
|
126
|
-
this.busy ||
|
|
127
|
-
this.name.pending ||
|
|
128
|
-
this.email.pending) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const model = {
|
|
132
|
-
email: this.email.value,
|
|
133
|
-
name: this.name.value,
|
|
134
|
-
firstName: this.firstName.value,
|
|
135
|
-
lastName: this.lastName.value,
|
|
136
|
-
password: this.password.value,
|
|
137
|
-
};
|
|
138
|
-
this.busy = true;
|
|
139
|
-
this._accountService
|
|
140
|
-
.register(model)
|
|
141
|
-
.pipe(take(1))
|
|
142
|
-
.subscribe({
|
|
143
|
-
next: () => {
|
|
144
|
-
this.busy = false;
|
|
145
|
-
this._snackbar.open($localize `Registration succeeded`, 'OK');
|
|
146
|
-
this.registered.emit();
|
|
147
|
-
},
|
|
148
|
-
error: (error) => {
|
|
149
|
-
this.busy = false;
|
|
150
|
-
console.error('Registration error' + (error ? JSON.stringify(error) : ''));
|
|
151
|
-
this._snackbar.open($localize `Registration error`, 'OK');
|
|
152
|
-
},
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
AuthJwtRegistrationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtRegistrationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatSnackBar }, { token: i3.AuthJwtAccountService }], target: i0.ɵɵFactoryTarget.Component });
|
|
157
|
-
AuthJwtRegistrationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: AuthJwtRegistrationComponent, selector: "auth-jwt-registration", outputs: { registered: "registered" }, ngImport: i0, template: "<div>\r\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\r\n <fieldset>\r\n <legend i18n>registration</legend>\r\n <!-- email -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>email</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n id=\"email\"\r\n maxlength=\"256\"\r\n required\r\n autofocus\r\n spellcheck=\"false\"\r\n [formControl]=\"email\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.required && (email.dirty || email.touched)\r\n \"\r\n >email required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(email).errors?.email && (email.dirty || email.touched)\"\r\n >invalid email</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.uniqueEmail && (email.dirty || email.touched)\r\n \"\r\n >email already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- name -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>username</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"name\"\r\n maxlength=\"50\"\r\n required\r\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\r\n spellcheck=\"false\"\r\n [formControl]=\"name\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >username required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.pattern && (name.dirty || name.touched)\"\r\n >invalid username</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(name).errors?.uniqueName && (name.dirty || name.touched)\r\n \"\r\n >username already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- first name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>first name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"firstName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"firstName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n firstName.hasError('required') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n first name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- last name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>last name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"lastName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"lastName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n lastName.hasError('required') &&\r\n (lastName.dirty || lastName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n last name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div [formGroup]=\"passwords\"> -->\r\n <!-- password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"password\"\r\n autocomplete=\"new-password\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"password\"\r\n />\r\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\r\n </auth-jwt-password-strength-bar>\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.required &&\r\n (password.dirty || password.touched)\r\n \"\r\n >password required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.passwordtooshort &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 8 characters</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.noupperinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 uppercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nolowerinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 lowercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nosymbolinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 punctuation/symbol</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- confirm password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>confirm password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"confirmPassword\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"confirmPassword\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div\r\n i18n\r\n *ngIf=\"form.errors?.areequal && confirmPassword.touched\"\r\n style=\"color: red\"\r\n >\r\n password differs from confirmation password\r\n </div>\r\n\r\n <button i18n\r\n mat-raised-button\r\n type=\"submit\"\r\n color=\"primary\"\r\n [disabled]=\"\r\n form.invalid || form.pristine || busy || name.pending || email.pending\r\n \"\r\n >\r\n register\r\n </button>\r\n <mat-progress-spinner diameter=\"20\" *ngIf=\"busy\"></mat-progress-spinner>\r\n </fieldset>\r\n </form>\r\n\r\n <details>\r\n <summary i18n>Hints</summary>\r\n <p i18n>\r\n To register a new user, you must provide his email address, choose a\r\n password, and choose a username, which must be unique (you will be\r\n notified if another user has already taken that name). The username must\r\n include only letters/digits, start with a letter, and be no shorter than 3\r\n characters, nor longer than 50.\r\n </p>\r\n <p i18n>\r\n To promote a decent security level, the password must include at least 8\r\n characters, uppercase and lowercase letters, digits, and punctuation (like\r\n dashes, stops, parentheses, etc.).\r\n </p>\r\n <p i18n>\r\n Once registered, if messaging is enabled on the server side the user will\r\n receive an email message to the email address you specified; he will have\r\n to click on the provided link to complete the registration process.\r\n Otherwise, you should edit the newly created user and confirm the email\r\n registration.\r\n </p>\r\n </details>\r\n</div>\r\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}details{margin:8px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i10.PasswordStrengthBarComponent, selector: "auth-jwt-password-strength-bar", inputs: ["passwordToCheck"], outputs: ["strengthChange"] }] });
|
|
158
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtRegistrationComponent, decorators: [{
|
|
159
|
-
type: Component,
|
|
160
|
-
args: [{ selector: 'auth-jwt-registration', template: "<div>\r\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\r\n <fieldset>\r\n <legend i18n>registration</legend>\r\n <!-- email -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>email</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n id=\"email\"\r\n maxlength=\"256\"\r\n required\r\n autofocus\r\n spellcheck=\"false\"\r\n [formControl]=\"email\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.required && (email.dirty || email.touched)\r\n \"\r\n >email required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(email).errors?.email && (email.dirty || email.touched)\"\r\n >invalid email</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.uniqueEmail && (email.dirty || email.touched)\r\n \"\r\n >email already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- name -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>username</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"name\"\r\n maxlength=\"50\"\r\n required\r\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\r\n spellcheck=\"false\"\r\n [formControl]=\"name\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >username required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.pattern && (name.dirty || name.touched)\"\r\n >invalid username</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(name).errors?.uniqueName && (name.dirty || name.touched)\r\n \"\r\n >username already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- first name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>first name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"firstName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"firstName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n firstName.hasError('required') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n first name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- last name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>last name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"lastName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"lastName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n lastName.hasError('required') &&\r\n (lastName.dirty || lastName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n last name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div [formGroup]=\"passwords\"> -->\r\n <!-- password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"password\"\r\n autocomplete=\"new-password\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"password\"\r\n />\r\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\r\n </auth-jwt-password-strength-bar>\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.required &&\r\n (password.dirty || password.touched)\r\n \"\r\n >password required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.passwordtooshort &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 8 characters</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.noupperinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 uppercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nolowerinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 lowercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nosymbolinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 punctuation/symbol</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- confirm password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>confirm password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"confirmPassword\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"confirmPassword\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div\r\n i18n\r\n *ngIf=\"form.errors?.areequal && confirmPassword.touched\"\r\n style=\"color: red\"\r\n >\r\n password differs from confirmation password\r\n </div>\r\n\r\n <button i18n\r\n mat-raised-button\r\n type=\"submit\"\r\n color=\"primary\"\r\n [disabled]=\"\r\n form.invalid || form.pristine || busy || name.pending || email.pending\r\n \"\r\n >\r\n register\r\n </button>\r\n <mat-progress-spinner diameter=\"20\" *ngIf=\"busy\"></mat-progress-spinner>\r\n </fieldset>\r\n </form>\r\n\r\n <details>\r\n <summary i18n>Hints</summary>\r\n <p i18n>\r\n To register a new user, you must provide his email address, choose a\r\n password, and choose a username, which must be unique (you will be\r\n notified if another user has already taken that name). The username must\r\n include only letters/digits, start with a letter, and be no shorter than 3\r\n characters, nor longer than 50.\r\n </p>\r\n <p i18n>\r\n To promote a decent security level, the password must include at least 8\r\n characters, uppercase and lowercase letters, digits, and punctuation (like\r\n dashes, stops, parentheses, etc.).\r\n </p>\r\n <p i18n>\r\n Once registered, if messaging is enabled on the server side the user will\r\n receive an email message to the email address you specified; he will have\r\n to click on the provided link to complete the registration process.\r\n Otherwise, you should edit the newly created user and confirm the email\r\n registration.\r\n </p>\r\n </details>\r\n</div>\r\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}details{margin:8px}\n"] }]
|
|
161
|
-
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.MatSnackBar }, { type: i3.AuthJwtAccountService }]; }, propDecorators: { registered: [{
|
|
162
|
-
type: Output
|
|
163
|
-
}] } });
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsVUFBVSxHQU1YLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPMUUsTUFBTSxPQUFPLDRCQUE0QjtJQW1CdkMsWUFDRSxXQUF3QixFQUNoQixTQUFzQixFQUN0QixlQUFzQztRQUR0QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUU5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsT0FBTztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDbkMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ25ELGVBQWUsRUFBRSxJQUFJLENBQUMsdUJBQXVC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cUJBQXFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUM3RCxDQUFDO2dCQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7eUhBMUxVLDRCQUE0Qjs2R0FBNUIsNEJBQTRCLG9HQ3pCekMsdTVQQXdQQTsyRkQvTmEsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLHVCQUF1QjtnS0FxQjFCLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBWYWxpZGF0b3JzLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIEZvcm1Hcm91cCxcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtQnVpbGRlcixcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXHJcbiAgRXhpc3RSZXN1bHQsXHJcbiAgUmVnaXN0cmF0aW9uTW9kZWwsXHJcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGFzc3dvcmRWYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9wYXNzd29yZC52YWxpZGF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtcmVnaXN0cmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdXRoLWp3dC1yZWdpc3RyYXRpb24uY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aEp3dFJlZ2lzdHJhdGlvbkNvbXBvbmVudCB7XHJcbiAgcHVibGljIGJ1c3k6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZm9ybVxyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGVtYWlsOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBuYW1lOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBmaXJzdE5hbWU6IEZvcm1Db250cm9sPHN0cmluZz47XHJcbiAgcHVibGljIGxhc3ROYW1lOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG4gIHB1YmxpYyBwYXNzd29yZDogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICBwdWJsaWMgY29uZmlybVBhc3N3b3JkOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gYSB1c2VyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4gVXN1YWxseVxyXG4gICAqIHlvdSBzaG91bGQgaGFuZGxlIHRoaXMgdG8gbW92ZSBhd2F5IGZyb20gdGhlIHJlZ2lzdHJhdGlvblxyXG4gICAqIHBhZ2UuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlZ2lzdGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgX3NuYWNrYmFyOiBNYXRTbmFja0JhcixcclxuICAgIHByaXZhdGUgX2FjY291bnRTZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucmVnaXN0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLy8gZm9ybVxyXG4gICAgdGhpcy5lbWFpbCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woJycsIHtcclxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdLFxyXG4gICAgICBhc3luY1ZhbGlkYXRvcnM6IHRoaXMuZ2V0VW5pcXVlRW1haWxWYWxpZGF0b3IodGhpcy5fYWNjb3VudFNlcnZpY2UpLmJpbmQoXHJcbiAgICAgICAgdGhpc1xyXG4gICAgICApLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woJycsIHtcclxuICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgYXN5bmNWYWxpZGF0b3JzOiB0aGlzLmdldFVuaXF1ZU5hbWVWYWxpZGF0b3IodGhpcy5fYWNjb3VudFNlcnZpY2UpLmJpbmQoXHJcbiAgICAgICAgdGhpc1xyXG4gICAgICApLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmlyc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMubGFzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU0NzQ5OTEvYW5ndWxhci0yLWZvcm0tdmFsaWRhdGluZy1mb3ItcmVwZWF0LXBhc3N3b3JkXHJcbiAgICB0aGlzLnBhc3N3b3JkID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgUGFzc3dvcmRWYWxpZGF0b3JzLnN0YW5kYXJkKCldLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jb25maXJtUGFzc3dvcmQgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoXHJcbiAgICAgIHtcclxuICAgICAgICBlbWFpbDogdGhpcy5lbWFpbCxcclxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZSxcclxuICAgICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZSxcclxuICAgICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcclxuICAgICAgICBjb25maXJtUGFzc3dvcmQ6IHRoaXMuY29uZmlybVBhc3N3b3JkLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsaWRhdG9yczogW1xyXG4gICAgICAgICAgUGFzc3dvcmRWYWxpZGF0b3JzLmFyZUVxdWFsKCdwYXNzd29yZCcsICdjb25maXJtUGFzc3dvcmQnKSxcclxuICAgICAgICBdLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIHVuaXF1ZSBuYW1lIHZhbGlkYXRvci4gVGhlcmUgaXMgbm8gZGVwZW5kZW5jeSBpbmplY3Rpb24gYXQgdGhpcyBsZXZlbCxcclxuICAgKiBidXQgd2UgY2FuIHVzZSBjbG9zdXJlcy4gQXMgYSBtYXR0ZXIgb2YgZmFjdCwgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2VcclxuICAgKiBmcm9tIHRoZSBjb21wb25lbnQgd2hlcmUgd2UgcmVnaXN0ZXIgdmFsaWRhdG9ycy4gU28gd2Ugd2lsbCBpbXBsZW1lbnQgYSBmdW5jdGlvblxyXG4gICAqIHRoYXQgd2lsbCBhY2NlcHQgdGhlIHNlcnZpY2UgYXMgcGFyYW1ldGVyLCBhbmQgY3JlYXRlIHRoZSBhY3R1YWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cclxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIHNlcnZpY2Ugd2hlbiBjYWxsZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MuXHJcbiAgICogU2VlIGh0dHA6Ly9yZXN0bGV0LmNvbS9ibG9nLzIwMTYvMDIvMTcvaW1wbGVtZW50aW5nLWFuZ3VsYXIyLWZvcm1zLWJleW9uZC1iYXNpY3MtcGFydC0yLy5cclxuICAgKi9cclxuICBwcml2YXRlIGdldFVuaXF1ZU5hbWVWYWxpZGF0b3Ioc2VydmljZTogQXV0aEp3dEFjY291bnRTZXJ2aWNlKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcclxuICAgICk6XHJcbiAgICAgIHwgUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD5cclxuICAgICAgfCBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gYXZvaWQgY2hlY2tpbmcgaWYgZW1wdHlcclxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNlcnZpY2UuaXNOYW1lUmVnaXN0ZXJlZChjb250cm9sLnZhbHVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAoZGF0YTogRXhpc3RSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIWRhdGEuaXNFeGlzdGluZykge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZU5hbWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgICAgICdVbmlxdWUgbmFtZSB2YWxpZGF0b3IgZXJyb3InICtcclxuICAgICAgICAgICAgICAgICAgKGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpIDogJycpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHsgdW5pcXVlTmFtZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRVbmlxdWVFbWFpbFZhbGlkYXRvcihzZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxyXG4gICAgKTpcclxuICAgICAgfCBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPlxyXG4gICAgICB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+ID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAvLyBhdm9pZCBjaGVja2luZyBpZiBlbXB0eVxyXG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VydmljZS5pc0VtYWlsUmVnaXN0ZXJlZChjb250cm9sLnZhbHVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAoZGF0YTogRXhpc3RSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIWRhdGEuaXNFeGlzdGluZykge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZUVtYWlsOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVW5pcXVlIGVtYWlsIHZhbGlkYXRvciBlcnJvcicgK1xyXG4gICAgICAgICAgICAgICAgICAoZXJyb3IgPyBKU09OLnN0cmluZ2lmeShlcnJvcikgOiAnJylcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVFbWFpbDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU3VibWl0KCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5mb3JtLnZhbGlkIHx8XHJcbiAgICAgIHRoaXMuYnVzeSB8fFxyXG4gICAgICB0aGlzLm5hbWUucGVuZGluZyB8fFxyXG4gICAgICB0aGlzLmVtYWlsLnBlbmRpbmdcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbW9kZWw6IFJlZ2lzdHJhdGlvbk1vZGVsID0ge1xyXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbC52YWx1ZSxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlLFxyXG4gICAgICBmaXJzdE5hbWU6IHRoaXMuZmlyc3ROYW1lLnZhbHVlLFxyXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZS52YWx1ZSxcclxuICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQudmFsdWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuYnVzeSA9IHRydWU7XHJcbiAgICB0aGlzLl9hY2NvdW50U2VydmljZVxyXG4gICAgICAucmVnaXN0ZXIobW9kZWwpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbigkbG9jYWxpemVgUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZGAsICdPSycpO1xyXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkLmVtaXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgJ1JlZ2lzdHJhdGlvbiAgZXJyb3InICsgKGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpIDogJycpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbigkbG9jYWxpemVgUmVnaXN0cmF0aW9uIGVycm9yYCwgJ09LJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXY+XHJcbiAgPGZvcm0gcm9sZT1cImZvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cIm9uU3VibWl0KClcIj5cclxuICAgIDxmaWVsZHNldD5cclxuICAgICAgPGxlZ2VuZCBpMThuPnJlZ2lzdHJhdGlvbjwvbGVnZW5kPlxyXG4gICAgICA8IS0tIGVtYWlsIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsIGkxOG4+ZW1haWw8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxyXG4gICAgICAgICAgICBpZD1cImVtYWlsXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjU2XCJcclxuICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgYXV0b2ZvY3VzXHJcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJlbWFpbFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICBpMThuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueShlbWFpbCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoZW1haWwuZGlydHkgfHwgZW1haWwudG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPmVtYWlsIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgaTE4blxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkoZW1haWwpLmVycm9ycz8uZW1haWwgJiYgKGVtYWlsLmRpcnR5IHx8IGVtYWlsLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPmludmFsaWQgZW1haWw8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICBpMThuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueShlbWFpbCkuZXJyb3JzPy51bmlxdWVFbWFpbCAmJiAoZW1haWwuZGlydHkgfHwgZW1haWwudG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPmVtYWlsIGFscmVhZHkgcmVnaXN0ZXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlbWFpbC5wZW5kaW5nXCI+aG91cmdsYXNzPC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIG5hbWUgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgaTE4bj51c2VybmFtZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgaWQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxyXG4gICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICBwYXR0ZXJuPVwiXlthLXpBLVpdW2EtekEtWjAtOV17Miw0OX0kXCJcclxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm5hbWVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgaTE4blxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkobmFtZSkuZXJyb3JzPy5yZXF1aXJlZCAmJiAobmFtZS5kaXJ0eSB8fCBuYW1lLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnVzZXJuYW1lIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgaTE4blxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkobmFtZSkuZXJyb3JzPy5wYXR0ZXJuICYmIChuYW1lLmRpcnR5IHx8IG5hbWUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+aW52YWxpZCB1c2VybmFtZTwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgIGkxOG5cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAkYW55KG5hbWUpLmVycm9ycz8udW5pcXVlTmFtZSAmJiAobmFtZS5kaXJ0eSB8fCBuYW1lLnRvdWNoZWQpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID51c2VybmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwibmFtZS5wZW5kaW5nXCI+aG91cmdsYXNzPC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIGZpcnN0IG5hbWUgLS0+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbCBpMThuPmZpcnN0IG5hbWU8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIGlkPVwiZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxyXG4gICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZmlyc3ROYW1lXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgIGkxOG5cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiZcclxuICAgICAgICAgICAgICAoZmlyc3ROYW1lLmRpcnR5IHx8IGZpcnN0TmFtZS50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIHNtYWxsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgZmlyc3QgbmFtZSByZXF1aXJlZFxyXG4gICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIGxhc3QgbmFtZSAtLT5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsIGkxOG4+bGFzdCBuYW1lPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBpZD1cImxhc3ROYW1lXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxyXG4gICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibGFzdE5hbWVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgaTE4blxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIGxhc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmXHJcbiAgICAgICAgICAgICAgKGxhc3ROYW1lLmRpcnR5IHx8IGxhc3ROYW1lLnRvdWNoZWQpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXIgc21hbGxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBsYXN0IG5hbWUgcmVxdWlyZWRcclxuICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSA8ZGl2IFtmb3JtR3JvdXBdPVwicGFzc3dvcmRzXCI+IC0tPlxyXG4gICAgICA8IS0tIHBhc3N3b3JkIC0tPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgaTE4bj5wYXNzd29yZDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXHJcbiAgICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXHJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcclxuICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInBhc3N3b3JkXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8YXV0aC1qd3QtcGFzc3dvcmQtc3RyZW5ndGgtYmFyIFtwYXNzd29yZFRvQ2hlY2tdPVwicGFzc3dvcmQudmFsdWVcIj5cclxuICAgICAgICAgIDwvYXV0aC1qd3QtcGFzc3dvcmQtc3RyZW5ndGgtYmFyPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICBpMThuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueShwYXNzd29yZCkuZXJyb3JzPy5yZXF1aXJlZCAmJlxyXG4gICAgICAgICAgICAgIChwYXNzd29yZC5kaXJ0eSB8fCBwYXNzd29yZC50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+cGFzc3dvcmQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICBpMThuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueShwYXNzd29yZCkuZXJyb3JzPy5wYXNzd29yZHRvb3Nob3J0ICYmXHJcbiAgICAgICAgICAgICAgKHBhc3N3b3JkLmRpcnR5IHx8IHBhc3N3b3JkLnRvdWNoZWQpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5hdCBsZWFzdCA4IGNoYXJhY3RlcnM8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICBpMThuXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueShwYXNzd29yZCkuZXJyb3JzPy5ub3VwcGVyaW5wYXNzd29yZCAmJlxyXG4gICAgICAgICAgICAgIChwYXNzd29yZC5kaXJ0eSB8fCBwYXNzd29yZC50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+YXQgbGVhc3QgMSB1cHBlcmNhc2UgbGV0dGVyPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgaTE4blxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICRhbnkocGFzc3dvcmQpLmVycm9ycz8ubm9sb3dlcmlucGFzc3dvcmQgJiZcclxuICAgICAgICAgICAgICAocGFzc3dvcmQuZGlydHkgfHwgcGFzc3dvcmQudG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPmF0IGxlYXN0IDEgbG93ZXJjYXNlIGxldHRlcjwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgIGkxOG5cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAkYW55KHBhc3N3b3JkKS5lcnJvcnM/Lm5vc3ltYm9saW5wYXNzd29yZCAmJlxyXG4gICAgICAgICAgICAgIChwYXNzd29yZC5kaXJ0eSB8fCBwYXNzd29yZC50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+YXQgbGVhc3QgMSBwdW5jdHVhdGlvbi9zeW1ib2w8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBjb25maXJtIHBhc3N3b3JkIC0tPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgaTE4bj5jb25maXJtIHBhc3N3b3JkPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcclxuICAgICAgICAgICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXHJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcclxuICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbmZpcm1QYXNzd29yZFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgaTE4blxyXG4gICAgICAgICpuZ0lmPVwiZm9ybS5lcnJvcnM/LmFyZWVxdWFsICYmIGNvbmZpcm1QYXNzd29yZC50b3VjaGVkXCJcclxuICAgICAgICBzdHlsZT1cImNvbG9yOiByZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgcGFzc3dvcmQgZGlmZmVycyBmcm9tIGNvbmZpcm1hdGlvbiBwYXNzd29yZFxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxidXR0b24gaTE4blxyXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICBmb3JtLmludmFsaWQgfHwgZm9ybS5wcmlzdGluZSB8fCBidXN5IHx8IG5hbWUucGVuZGluZyB8fCBlbWFpbC5wZW5kaW5nXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIHJlZ2lzdGVyXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiICpuZ0lmPVwiYnVzeVwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XHJcbiAgICA8L2ZpZWxkc2V0PlxyXG4gIDwvZm9ybT5cclxuXHJcbiAgPGRldGFpbHM+XHJcbiAgICA8c3VtbWFyeSBpMThuPkhpbnRzPC9zdW1tYXJ5PlxyXG4gICAgPHAgaTE4bj5cclxuICAgICAgVG8gcmVnaXN0ZXIgYSBuZXcgdXNlciwgeW91IG11c3QgcHJvdmlkZSBoaXMgZW1haWwgYWRkcmVzcywgY2hvb3NlIGFcclxuICAgICAgcGFzc3dvcmQsIGFuZCBjaG9vc2UgYSB1c2VybmFtZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgKHlvdSB3aWxsIGJlXHJcbiAgICAgIG5vdGlmaWVkIGlmIGFub3RoZXIgdXNlciBoYXMgYWxyZWFkeSB0YWtlbiB0aGF0IG5hbWUpLiBUaGUgdXNlcm5hbWUgbXVzdFxyXG4gICAgICBpbmNsdWRlIG9ubHkgbGV0dGVycy9kaWdpdHMsIHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBiZSBubyBzaG9ydGVyIHRoYW4gM1xyXG4gICAgICBjaGFyYWN0ZXJzLCBub3IgbG9uZ2VyIHRoYW4gNTAuXHJcbiAgICA8L3A+XHJcbiAgICA8cCBpMThuPlxyXG4gICAgICBUbyBwcm9tb3RlIGEgZGVjZW50IHNlY3VyaXR5IGxldmVsLCB0aGUgcGFzc3dvcmQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDhcclxuICAgICAgY2hhcmFjdGVycywgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzLCBhbmQgcHVuY3R1YXRpb24gKGxpa2VcclxuICAgICAgZGFzaGVzLCBzdG9wcywgcGFyZW50aGVzZXMsIGV0Yy4pLlxyXG4gICAgPC9wPlxyXG4gICAgPHAgaTE4bj5cclxuICAgICAgT25jZSByZWdpc3RlcmVkLCBpZiBtZXNzYWdpbmcgaXMgZW5hYmxlZCBvbiB0aGUgc2VydmVyIHNpZGUgdGhlIHVzZXIgd2lsbFxyXG4gICAgICByZWNlaXZlIGFuIGVtYWlsIG1lc3NhZ2UgdG8gdGhlIGVtYWlsIGFkZHJlc3MgeW91IHNwZWNpZmllZDsgaGUgd2lsbCBoYXZlXHJcbiAgICAgIHRvIGNsaWNrIG9uIHRoZSBwcm92aWRlZCBsaW5rIHRvIGNvbXBsZXRlIHRoZSByZWdpc3RyYXRpb24gcHJvY2Vzcy5cclxuICAgICAgT3RoZXJ3aXNlLCB5b3Ugc2hvdWxkIGVkaXQgdGhlIG5ld2x5IGNyZWF0ZWQgdXNlciBhbmQgY29uZmlybSB0aGUgZW1haWxcclxuICAgICAgcmVnaXN0cmF0aW9uLlxyXG4gICAgPC9wPlxyXG4gIDwvZGV0YWlscz5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, Optional } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/material/dialog";
|
|
5
|
-
import * as i2 from "@angular/material/button";
|
|
6
|
-
// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41
|
|
7
|
-
export class ConfirmDialogComponent {
|
|
8
|
-
constructor(dialogRef, data) {
|
|
9
|
-
this.dialogRef = dialogRef;
|
|
10
|
-
this.data = data;
|
|
11
|
-
this.title = $localize `Confirm`;
|
|
12
|
-
this.prompt = $localize `Confirm operation?`;
|
|
13
|
-
this.ok = $localize `yes`;
|
|
14
|
-
this.cancel = $localize `no`;
|
|
15
|
-
}
|
|
16
|
-
ngOnInit() { }
|
|
17
|
-
}
|
|
18
|
-
ConfirmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: ConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
19
|
-
ConfirmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: ConfirmDialogComponent, selector: "ng-component", ngImport: i0, template: "<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: ConfirmDialogComponent, decorators: [{
|
|
21
|
-
type: Component,
|
|
22
|
-
args: [{ template: "<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n" }]
|
|
23
|
-
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
24
|
-
type: Optional
|
|
25
|
-
}, {
|
|
26
|
-
type: Inject,
|
|
27
|
-
args: [MAT_DIALOG_DATA]
|
|
28
|
-
}] }]; } });
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQUV6RSx5RkFBeUY7QUFRekYsTUFBTSxPQUFPLHNCQUFzQjtJQU1qQyxZQUNTLFNBQStDLEVBQ1YsSUFBUztRQUQ5QyxjQUFTLEdBQVQsU0FBUyxDQUFzQztRQUNWLFNBQUksR0FBSixJQUFJLENBQUs7UUFFckQsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUEsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBLG9CQUFvQixDQUFDO1FBQzVDLElBQUksQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFBLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQSxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELFFBQVEsS0FBSSxDQUFDOzttSEFoQkYsc0JBQXNCLDhDQVFYLGVBQWU7dUdBUjFCLHNCQUFzQixvRENYbkMsMmFBaUJBOzJGRE5hLHNCQUFzQjtrQkFObEMsU0FBUzs7OzBCQWNMLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuXHJcbi8vIGh0dHBzOi8vbWVkaXVtLmNvbS9AdGFyaWsubnpsL21ha2luZy11c2Utb2YtZGlhbG9ncy1pbi1tYXRlcmlhbC0yLW1kZGlhbG9nLTc1MzNkMjdkZjQxXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy83NzE4XHJcbiAgLy8gc2VsZWN0b3I6ICdjYWRtdXMtY29uZmlybS1kaWFsb2cnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29uZmlybURpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XHJcbiAgcHVibGljIHByb21wdDogc3RyaW5nO1xyXG4gIHB1YmxpYyBvazogc3RyaW5nO1xyXG4gIHB1YmxpYyBjYW5jZWw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Q29uZmlybURpYWxvZ0NvbXBvbmVudD4sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy50aXRsZSA9ICRsb2NhbGl6ZWBDb25maXJtYDtcclxuICAgIHRoaXMucHJvbXB0ID0gJGxvY2FsaXplYENvbmZpcm0gb3BlcmF0aW9uP2A7XHJcbiAgICB0aGlzLm9rID0gJGxvY2FsaXplYHllc2A7XHJcbiAgICB0aGlzLmNhbmNlbCA9ICRsb2NhbGl6ZWBub2A7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcbn1cclxuIiwiPGgxIG1hdC1kaWFsb2ctdGl0bGU+e3sgdGl0bGUgfX08L2gxPlxyXG48bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIHt7IHByb21wdCB9fVxyXG48L21hdC1kaWFsb2ctY29udGVudD5cclxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICA8YnV0dG9uXHJcbiAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgKGNsaWNrKT1cImRpYWxvZ1JlZi5jbG9zZSh0cnVlKVwiXHJcbiAgPlxyXG4gICAge3sgb2sgfX1cclxuICA8L2J1dHRvbj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtYnV0dG9uIChjbGljayk9XCJkaWFsb2dSZWYuY2xvc2UoKVwiPlxyXG4gICAge3sgY2FuY2VsIH19XHJcbiAgPC9idXR0b24+XHJcbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4iXX0=
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class PasswordStrengthBarComponent {
|
|
4
|
-
constructor() {
|
|
5
|
-
this._colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];
|
|
6
|
-
this.strengthChange = new EventEmitter();
|
|
7
|
-
this.strengthChange = new EventEmitter();
|
|
8
|
-
this.bars = [];
|
|
9
|
-
}
|
|
10
|
-
measureStrength(p) {
|
|
11
|
-
let force = 0;
|
|
12
|
-
const regex = /[$-/:-?{-~!"^_`\[\]]/g; // "
|
|
13
|
-
const lowerLetters = /[a-z]+/.test(p);
|
|
14
|
-
const upperLetters = /[A-Z]+/.test(p);
|
|
15
|
-
const numbers = /[0-9]+/.test(p);
|
|
16
|
-
const symbols = regex.test(p);
|
|
17
|
-
const flags = [lowerLetters, upperLetters, numbers, symbols];
|
|
18
|
-
let passedMatches = 0;
|
|
19
|
-
for (const flag of flags) {
|
|
20
|
-
passedMatches += flag === true ? 1 : 0;
|
|
21
|
-
}
|
|
22
|
-
force += 2 * p.length + (p.length >= 10 ? 1 : 0);
|
|
23
|
-
force += passedMatches * 10;
|
|
24
|
-
// penalty (short password)
|
|
25
|
-
force = p.length <= 6 ? Math.min(force, 10) : force;
|
|
26
|
-
// penalty (poor letiety of characters)
|
|
27
|
-
force = passedMatches === 1 ? Math.min(force, 10) : force;
|
|
28
|
-
force = passedMatches === 2 ? Math.min(force, 20) : force;
|
|
29
|
-
force = passedMatches === 3 ? Math.min(force, 40) : force;
|
|
30
|
-
return force;
|
|
31
|
-
}
|
|
32
|
-
getColor(s) {
|
|
33
|
-
let idx = 0;
|
|
34
|
-
if (s <= 10) {
|
|
35
|
-
idx = 0;
|
|
36
|
-
}
|
|
37
|
-
else if (s <= 20) {
|
|
38
|
-
idx = 1;
|
|
39
|
-
}
|
|
40
|
-
else if (s <= 30) {
|
|
41
|
-
idx = 2;
|
|
42
|
-
}
|
|
43
|
-
else if (s <= 40) {
|
|
44
|
-
idx = 3;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
idx = 4;
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
idx: idx + 1,
|
|
51
|
-
col: this._colors[idx],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
ngOnChanges(changes) {
|
|
55
|
-
const password = changes['passwordToCheck'].currentValue;
|
|
56
|
-
this.setBarColors(5, '#DDD');
|
|
57
|
-
if (password) {
|
|
58
|
-
const strength = this.measureStrength(password);
|
|
59
|
-
const c = this.getColor(strength);
|
|
60
|
-
this.setBarColors(c.idx, c.col);
|
|
61
|
-
this.strengthChange.emit(strength);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
setBarColors(count, col) {
|
|
65
|
-
for (let n = 0; n < count; n++) {
|
|
66
|
-
this.bars[n] = col;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
PasswordStrengthBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: PasswordStrengthBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
71
|
-
PasswordStrengthBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: PasswordStrengthBarComponent, selector: "auth-jwt-password-strength-bar", inputs: { passwordToCheck: "passwordToCheck" }, outputs: { strengthChange: "strengthChange" }, usesOnChanges: true, ngImport: i0, template: "<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n", styles: ["ul#strengthBar{display:inline;list-style:none;margin:0 0 0 15px;padding:0;vertical-align:2px}li.point:last{margin:0!important}li.point{background:#ddd;border-radius:2px;display:inline-block;height:5px;margin-right:1px;width:20px}\n"] });
|
|
72
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: PasswordStrengthBarComponent, decorators: [{
|
|
73
|
-
type: Component,
|
|
74
|
-
args: [{ selector: 'auth-jwt-password-strength-bar', template: "<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n", styles: ["ul#strengthBar{display:inline;list-style:none;margin:0 0 0 15px;padding:0;vertical-align:2px}li.point:last{margin:0!important}li.point{background:#ddd;border-radius:2px;display:inline-block;height:5px;margin-right:1px;width:20px}\n"] }]
|
|
75
|
-
}], ctorParameters: function () { return []; }, propDecorators: { passwordToCheck: [{
|
|
76
|
-
type: Input
|
|
77
|
-
}], strengthChange: [{
|
|
78
|
-
type: Output
|
|
79
|
-
}] } });
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtc3RyZW5ndGgtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9wYXNzd29yZC1zdHJlbmd0aC1iYXIvcGFzc3dvcmQtc3RyZW5ndGgtYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9wYXNzd29yZC1zdHJlbmd0aC1iYXIvcGFzc3dvcmQtc3RyZW5ndGgtYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7O0FBT3ZCLE1BQU0sT0FBTyw0QkFBNEI7SUFTdkM7UUFSUSxZQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFJakQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBS3BELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sZUFBZSxDQUFDLENBQVM7UUFDL0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxJQUFJO1FBRTNDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8s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QyxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFhLEVBQUUsR0FBVztRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7eUhBOUVVLDRCQUE0Qjs2R0FBNUIsNEJBQTRCLDBMQ2R6QyxxYkFVQTsyRkRJYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0UsZ0NBQWdDOzBFQU9qQyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uQ2hhbmdlcyxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdXRoLWp3dC1wYXNzd29yZC1zdHJlbmd0aC1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFzc3dvcmQtc3RyZW5ndGgtYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFzc3dvcmQtc3RyZW5ndGgtYmFyLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRTdHJlbmd0aEJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgX2NvbG9ycyA9IFsnI0YwMCcsICcjRjkwJywgJyNGRjAnLCAnIzlGMCcsICcjMEYwJ107XG5cbiAgQElucHV0KCkgcGFzc3dvcmRUb0NoZWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgQE91dHB1dCgpIHN0cmVuZ3RoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcHVibGljIGJhcnM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RyZW5ndGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICB0aGlzLmJhcnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZVN0cmVuZ3RoKHA6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGZvcmNlID0gMDtcbiAgICBjb25zdCByZWdleCA9IC9bJC0vOi0/ey1+IVwiXl9gXFxbXFxdXS9nOyAvLyBcIlxuXG4gICAgY29uc3QgbG93ZXJMZXR0ZXJzID0gL1thLXpdKy8udGVzdChwKTtcbiAgICBjb25zdCB1cHBlckxldHRlcnMgPSAvW0EtWl0rLy50ZXN0KHApO1xuICAgIGNvbnN0IG51bWJlcnMgPSAvWzAtOV0rLy50ZXN0KHApO1xuICAgIGNvbnN0IHN5bWJvbHMgPSByZWdleC50ZXN0KHApO1xuXG4gICAgY29uc3QgZmxhZ3MgPSBbbG93ZXJMZXR0ZXJzLCB1cHBlckxldHRlcnMsIG51bWJlcnMsIHN5bWJvbHNdO1xuXG4gICAgbGV0IHBhc3NlZE1hdGNoZXMgPSAwO1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBmbGFncykge1xuICAgICAgcGFzc2VkTWF0Y2hlcyArPSBmbGFnID09PSB0cnVlID8gMSA6IDA7XG4gICAgfVxuXG4gICAgZm9yY2UgKz0gMiAqIHAubGVuZ3RoICsgKHAubGVuZ3RoID49IDEwID8gMSA6IDApO1xuICAgIGZvcmNlICs9IHBhc3NlZE1hdGNoZXMgKiAxMDtcblxuICAgIC8vIHBlbmFsdHkgKHNob3J0IHBhc3N3b3JkKVxuICAgIGZvcmNlID0gcC5sZW5ndGggPD0gNiA/IE1hdGgubWluKGZvcmNlLCAxMCkgOiBmb3JjZTtcblxuICAgIC8vIHBlbmFsdHkgKHBvb3IgbGV0aWV0eSBvZiBjaGFyYWN0ZXJzKVxuICAgIGZvcmNlID0gcGFzc2VkTWF0Y2hlcyA9PT0gMSA/IE1hdGgubWluKGZvcmNlLCAxMCkgOiBmb3JjZTtcbiAgICBmb3JjZSA9IHBhc3NlZE1hdGNoZXMgPT09IDIgPyBNYXRoLm1pbihmb3JjZSwgMjApIDogZm9yY2U7XG4gICAgZm9yY2UgPSBwYXNzZWRNYXRjaGVzID09PSAzID8gTWF0aC5taW4oZm9yY2UsIDQwKSA6IGZvcmNlO1xuXG4gICAgcmV0dXJuIGZvcmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2xvcihzOiBudW1iZXIpIHtcbiAgICBsZXQgaWR4ID0gMDtcbiAgICBpZiAocyA8PSAxMCkge1xuICAgICAgaWR4ID0gMDtcbiAgICB9IGVsc2UgaWYgKHMgPD0gMjApIHtcbiAgICAgIGlkeCA9IDE7XG4gICAgfSBlbHNlIGlmIChzIDw9IDMwKSB7XG4gICAgICBpZHggPSAyO1xuICAgIH0gZWxzZSBpZiAocyA8PSA0MCkge1xuICAgICAgaWR4ID0gMztcbiAgICB9IGVsc2Uge1xuICAgICAgaWR4ID0gNDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkeDogaWR4ICsgMSxcbiAgICAgIGNvbDogdGhpcy5fY29sb3JzW2lkeF0sXG4gICAgfTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BOYW1lOiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSk6IHZvaWQge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gY2hhbmdlc1sncGFzc3dvcmRUb0NoZWNrJ10uY3VycmVudFZhbHVlO1xuICAgIHRoaXMuc2V0QmFyQ29sb3JzKDUsICcjREREJyk7XG4gICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICBjb25zdCBzdHJlbmd0aCA9IHRoaXMubWVhc3VyZVN0cmVuZ3RoKHBhc3N3b3JkKTtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmdldENvbG9yKHN0cmVuZ3RoKTtcbiAgICAgIHRoaXMuc2V0QmFyQ29sb3JzKGMuaWR4LCBjLmNvbCk7XG4gICAgICB0aGlzLnN0cmVuZ3RoQ2hhbmdlLmVtaXQoc3RyZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0QmFyQ29sb3JzKGNvdW50OiBudW1iZXIsIGNvbDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBjb3VudDsgbisrKSB7XG4gICAgICB0aGlzLmJhcnNbbl0gPSBjb2w7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGlkPVwic3RyZW5ndGhcIj5cbiAgPHNtYWxsPnN0cmVuZ3RoOjwvc21hbGw+XG4gIDx1bCBpZD1cInN0cmVuZ3RoQmFyXCI+XG4gICAgPGxpIGNsYXNzPVwicG9pbnRcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJiYXJzWzBdXCI+PC9saT5cbiAgICA8bGkgY2xhc3M9XCJwb2ludFwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJhcnNbMV1cIj48L2xpPlxuICAgIDxsaSBjbGFzcz1cInBvaW50XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYmFyc1syXVwiPjwvbGk+XG4gICAgPGxpIGNsYXNzPVwicG9pbnRcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJiYXJzWzNdXCI+PC9saT5cbiAgICA8bGkgY2xhc3M9XCJwb2ludFwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJhcnNbNF1cIj48L2xpPlxuICA8L3VsPlxuPC9kaXY+XG4iXX0=
|