@triangular/password-checker 7.0.0 → 8.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/README.md CHANGED
@@ -16,6 +16,7 @@ Supported Angular Versions
16
16
  | 10.x | 5.0.0 |
17
17
  | 11.x | 6.0.0 |
18
18
  | 12.x | 7.0.0 |
19
+ | 13.x | 8.0.0 |
19
20
 
20
21
  ### Step 1: Install
21
22
 
@@ -170,6 +171,11 @@ We use [SemVer](http://semver.org/) for versioning.
170
171
  - 1.0.0: Initial Release
171
172
  - 2.2.0: Code Improvements and Angular 7.x
172
173
  - 3.0.0: Angular 8.x
174
+ - 4.0.0: Angular 9.x
175
+ - 5.0.0: Angular 10.x
176
+ - 6.0.0: Angular 11.x
177
+ - 7.0.0: Angular 12.x
178
+ - 8.0.0: Angular 13.x
173
179
 
174
180
  ## Authors
175
181
 
@@ -43,15 +43,15 @@ export class PasswordCheckerLibDirective {
43
43
  : null));
44
44
  }
45
45
  }
46
- PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
47
- PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.0", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
46
+ PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
47
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
48
48
  {
49
49
  provide: NG_ASYNC_VALIDATORS,
50
50
  useExisting: PasswordCheckerLibDirective,
51
51
  multi: true,
52
52
  },
53
53
  ], ngImport: i0 });
54
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
55
55
  type: Directive,
56
56
  args: [{
57
57
  // eslint-disable-next-line @angular-eslint/directive-selector
@@ -16,10 +16,10 @@ export class PasswordCheckerModule {
16
16
  };
17
17
  }
18
18
  }
19
- PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
- PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
21
- PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, decorators: [{
19
+ PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
21
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
23
23
  type: NgModule,
24
24
  args: [{
25
25
  declarations: [PasswordCheckerLibDirective],
@@ -0,0 +1,119 @@
1
+ import { timer } from 'rxjs';
2
+ import { map, switchMap } from 'rxjs/operators';
3
+ import { NG_ASYNC_VALIDATORS } from '@angular/forms';
4
+ import * as i0 from '@angular/core';
5
+ import { InjectionToken, Directive, Optional, Inject, Input, NgModule } from '@angular/core';
6
+ import sha1 from 'crypto-js/sha1';
7
+ import * as i1 from '@angular/common/http';
8
+ import { HttpClientModule } from '@angular/common/http';
9
+
10
+ const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
11
+
12
+ class PasswordCheckerLibDirective {
13
+ constructor(http, config) {
14
+ this.http = http;
15
+ if (!config) {
16
+ // default initialization in constructor didn't work.
17
+ // conflict with @Optional()?
18
+ config = {};
19
+ }
20
+ this.pwnedPasswordApi =
21
+ config.pwnedPasswordApi
22
+ || 'https://api.pwnedpasswords.com/range/';
23
+ this.pwnedPasswordMinimumOccurrenceForError =
24
+ config.pwnedPasswordMinimumOccurrenceForError
25
+ || 1;
26
+ this.pwnedPasswordApiCallDebounceTime =
27
+ config.pwnedPasswordApiCallDebounceTime
28
+ || 400;
29
+ }
30
+ validate(control) {
31
+ const pw = ''.concat(control.value);
32
+ return timer(this.pwnedPasswordApiCallDebounceTime).pipe(map(() => {
33
+ const pwSha1 = sha1(pw).toString().toUpperCase();
34
+ return {
35
+ firstPart: pwSha1.substring(0, 5),
36
+ lastPart: pwSha1.substring(5),
37
+ };
38
+ }), switchMap((hash) => this.http.get(`${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }).pipe(map(passwords => passwords.split(/[\r\n]+/)), map(passwords => passwords.map((password) => {
39
+ const split = password.split(':');
40
+ return {
41
+ hash: split[0],
42
+ count: parseInt(split[1], 10),
43
+ };
44
+ })), map(passwords => passwords.find(password => password.hash === hash.lastPart)))), map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError
45
+ ? { pwnedPasswordOccurrence: password.count }
46
+ : null));
47
+ }
48
+ }
49
+ PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
51
+ {
52
+ provide: NG_ASYNC_VALIDATORS,
53
+ useExisting: PasswordCheckerLibDirective,
54
+ multi: true,
55
+ },
56
+ ], ngImport: i0 });
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
58
+ type: Directive,
59
+ args: [{
60
+ // eslint-disable-next-line @angular-eslint/directive-selector
61
+ selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
62
+ providers: [
63
+ {
64
+ provide: NG_ASYNC_VALIDATORS,
65
+ useExisting: PasswordCheckerLibDirective,
66
+ multi: true,
67
+ },
68
+ ]
69
+ }]
70
+ }], ctorParameters: function () {
71
+ return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
72
+ type: Optional
73
+ }, {
74
+ type: Inject,
75
+ args: [PasswordCheckerConfigValue]
76
+ }] }];
77
+ }, propDecorators: { pwnedPasswordApi: [{
78
+ type: Input
79
+ }], pwnedPasswordMinimumOccurrenceForError: [{
80
+ type: Input
81
+ }], pwnedPasswordApiCallDebounceTime: [{
82
+ type: Input
83
+ }] } });
84
+
85
+ class PasswordCheckerModule {
86
+ static forRoot(config = {}) {
87
+ return {
88
+ ngModule: PasswordCheckerModule,
89
+ providers: [
90
+ {
91
+ provide: PasswordCheckerConfigValue,
92
+ useValue: config,
93
+ }
94
+ ]
95
+ };
96
+ }
97
+ }
98
+ PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
99
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
100
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
102
+ type: NgModule,
103
+ args: [{
104
+ declarations: [PasswordCheckerLibDirective],
105
+ imports: [HttpClientModule],
106
+ exports: [PasswordCheckerLibDirective]
107
+ }]
108
+ }] });
109
+
110
+ /*
111
+ * Public API Surface of password-checker-lib
112
+ */
113
+
114
+ /**
115
+ * Generated bundle index. Do not edit.
116
+ */
117
+
118
+ export { PasswordCheckerLibDirective, PasswordCheckerModule };
119
+ //# sourceMappingURL=triangular-password-checker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triangular-password-checker.mjs","sources":["../../../projects/password-checker-lib/src/lib/password-checker.config.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.directive.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.module.ts","../../../projects/password-checker-lib/src/public_api.ts","../../../projects/password-checker-lib/src/triangular-password-checker.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type Partial<T> = {\n [P in keyof T]?: T[P];\n};\n\nexport interface PasswordCheckerConfig {\n pwnedPasswordApi: string;\n pwnedPasswordMinimumOccurrenceForError: number;\n pwnedPasswordApiCallDebounceTime: number;\n}\n\nexport const PasswordCheckerConfigValue = new InjectionToken<Partial<PasswordCheckerConfig>>('PASSWORD_CHECKER_CONFIG');\n","import { Observable, timer } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';\nimport { Directive, Inject, Input, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport sha1 from 'crypto-js/sha1';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: PasswordCheckerLibDirective,\n multi: true,\n },\n ]\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\n private pwnedPasswordMinimumOccurrenceForErrorValue: number;\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PasswordCheckerConfigValue) config: Partial<PasswordCheckerConfig>,\n ) {\n\n if (!config) {\n // default initialization in constructor didn't work.\n // conflict with @Optional()?\n config = {};\n }\n\n this.pwnedPasswordApi =\n config.pwnedPasswordApi\n || 'https://api.pwnedpasswords.com/range/';\n this.pwnedPasswordMinimumOccurrenceForError =\n config.pwnedPasswordMinimumOccurrenceForError\n || 1;\n this.pwnedPasswordApiCallDebounceTime =\n config.pwnedPasswordApiCallDebounceTime\n || 400;\n }\n\n validate(control: AbstractControl): Observable<ValidationErrors|null> {\n const pw = ''.concat(control.value);\n\n return timer(this.pwnedPasswordApiCallDebounceTime).pipe(\n map(() => {\n const pwSha1 = sha1(pw).toString().toUpperCase();\n\n return {\n firstPart: pwSha1.substring(0, 5),\n lastPart: pwSha1.substring(5),\n };\n }),\n switchMap(\n (hash) => this.http.get(\n `${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }\n ).pipe(\n map(passwords => passwords.split(/[\\r\\n]+/)),\n map(passwords => passwords.map((password) => {\n const split = password.split(':');\n\n return {\n hash: split[0],\n count: parseInt(split[1], 10),\n };\n }\n )),\n map(passwords => passwords.find(password => password.hash === hash.lastPart)),\n ),\n ),\n map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError\n ? { pwnedPasswordOccurrence: password.count }\n : null),\n );\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { PasswordCheckerLibDirective } from './password-checker-lib.directive';\nimport { HttpClientModule } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({\n declarations: [PasswordCheckerLibDirective],\n imports: [HttpClientModule],\n exports: [PasswordCheckerLibDirective]\n})\nexport class PasswordCheckerModule {\n static forRoot(config: Partial<PasswordCheckerConfig> = {}): ModuleWithProviders<PasswordCheckerModule> {\n return {\n ngModule: PasswordCheckerModule,\n providers: [\n {\n provide: PasswordCheckerConfigValue,\n useValue: config,\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of password-checker-lib\n */\n\nexport * from './lib/password-checker-lib.directive';\nexport * from './lib/password-checker-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -46,15 +46,15 @@ class PasswordCheckerLibDirective {
46
46
  : null));
47
47
  }
48
48
  }
49
- PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
- PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.0", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
49
+ PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
51
51
  {
52
52
  provide: NG_ASYNC_VALIDATORS,
53
53
  useExisting: PasswordCheckerLibDirective,
54
54
  multi: true,
55
55
  },
56
56
  ], ngImport: i0 });
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
58
58
  type: Directive,
59
59
  args: [{
60
60
  // eslint-disable-next-line @angular-eslint/directive-selector
@@ -93,10 +93,10 @@ class PasswordCheckerModule {
93
93
  };
94
94
  }
95
95
  }
96
- PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
97
- PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
98
- PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0, type: PasswordCheckerModule, decorators: [{
96
+ PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
97
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
98
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
100
100
  type: NgModule,
101
101
  args: [{
102
102
  declarations: [PasswordCheckerLibDirective],
@@ -114,4 +114,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImpor
114
114
  */
115
115
 
116
116
  export { PasswordCheckerLibDirective, PasswordCheckerModule };
117
- //# sourceMappingURL=triangular-password-checker.js.map
117
+ //# sourceMappingURL=triangular-password-checker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triangular-password-checker.mjs","sources":["../../../projects/password-checker-lib/src/lib/password-checker.config.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.directive.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.module.ts","../../../projects/password-checker-lib/src/public_api.ts","../../../projects/password-checker-lib/src/triangular-password-checker.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type Partial<T> = {\n [P in keyof T]?: T[P];\n};\n\nexport interface PasswordCheckerConfig {\n pwnedPasswordApi: string;\n pwnedPasswordMinimumOccurrenceForError: number;\n pwnedPasswordApiCallDebounceTime: number;\n}\n\nexport const PasswordCheckerConfigValue = new InjectionToken<Partial<PasswordCheckerConfig>>('PASSWORD_CHECKER_CONFIG');\n","import { Observable, timer } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';\nimport { Directive, Inject, Input, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport sha1 from 'crypto-js/sha1';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: PasswordCheckerLibDirective,\n multi: true,\n },\n ]\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\n private pwnedPasswordMinimumOccurrenceForErrorValue: number;\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PasswordCheckerConfigValue) config: Partial<PasswordCheckerConfig>,\n ) {\n\n if (!config) {\n // default initialization in constructor didn't work.\n // conflict with @Optional()?\n config = {};\n }\n\n this.pwnedPasswordApi =\n config.pwnedPasswordApi\n || 'https://api.pwnedpasswords.com/range/';\n this.pwnedPasswordMinimumOccurrenceForError =\n config.pwnedPasswordMinimumOccurrenceForError\n || 1;\n this.pwnedPasswordApiCallDebounceTime =\n config.pwnedPasswordApiCallDebounceTime\n || 400;\n }\n\n validate(control: AbstractControl): Observable<ValidationErrors|null> {\n const pw = ''.concat(control.value);\n\n return timer(this.pwnedPasswordApiCallDebounceTime).pipe(\n map(() => {\n const pwSha1 = sha1(pw).toString().toUpperCase();\n\n return {\n firstPart: pwSha1.substring(0, 5),\n lastPart: pwSha1.substring(5),\n };\n }),\n switchMap(\n (hash) => this.http.get(\n `${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }\n ).pipe(\n map(passwords => passwords.split(/[\\r\\n]+/)),\n map(passwords => passwords.map((password) => {\n const split = password.split(':');\n\n return {\n hash: split[0],\n count: parseInt(split[1], 10),\n };\n }\n )),\n map(passwords => passwords.find(password => password.hash === hash.lastPart)),\n ),\n ),\n map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError\n ? { pwnedPasswordOccurrence: password.count }\n : null),\n );\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { PasswordCheckerLibDirective } from './password-checker-lib.directive';\nimport { HttpClientModule } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({\n declarations: [PasswordCheckerLibDirective],\n imports: [HttpClientModule],\n exports: [PasswordCheckerLibDirective]\n})\nexport class PasswordCheckerModule {\n static forRoot(config: Partial<PasswordCheckerConfig> = {}): ModuleWithProviders<PasswordCheckerModule> {\n return {\n ngModule: PasswordCheckerModule,\n providers: [\n {\n provide: PasswordCheckerConfigValue,\n useValue: config,\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of password-checker-lib\n */\n\nexport * from './lib/password-checker-lib.directive';\nexport * from './lib/password-checker-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@triangular/password-checker",
3
- "version": "7.0.0",
3
+ "version": "8.0.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^12.0.0",
6
- "@angular/core": "^12.0.0",
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0",
7
7
  "crypto-js": "^3.3.0"
8
8
  },
9
9
  "homepage": "https://password.akehir.com",
@@ -24,11 +24,24 @@
24
24
  "dependencies": {
25
25
  "tslib": "^2.0.0"
26
26
  },
27
- "main": "bundles/triangular-password-checker.umd.js",
28
- "module": "fesm2015/triangular-password-checker.js",
29
- "es2015": "fesm2015/triangular-password-checker.js",
30
- "esm2015": "esm2015/triangular-password-checker.js",
31
- "fesm2015": "fesm2015/triangular-password-checker.js",
27
+ "module": "fesm2015/triangular-password-checker.mjs",
28
+ "es2020": "fesm2020/triangular-password-checker.mjs",
29
+ "esm2020": "esm2020/triangular-password-checker.mjs",
30
+ "fesm2020": "fesm2020/triangular-password-checker.mjs",
31
+ "fesm2015": "fesm2015/triangular-password-checker.mjs",
32
32
  "typings": "triangular-password-checker.d.ts",
33
+ "exports": {
34
+ "./package.json": {
35
+ "default": "./package.json"
36
+ },
37
+ ".": {
38
+ "types": "./triangular-password-checker.d.ts",
39
+ "esm2020": "./esm2020/triangular-password-checker.mjs",
40
+ "es2020": "./fesm2020/triangular-password-checker.mjs",
41
+ "es2015": "./fesm2015/triangular-password-checker.mjs",
42
+ "node": "./fesm2015/triangular-password-checker.mjs",
43
+ "default": "./fesm2020/triangular-password-checker.mjs"
44
+ }
45
+ },
33
46
  "sideEffects": false
34
47
  }
@@ -1,153 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('rxjs/operators'), require('@angular/forms'), require('@angular/core'), require('crypto-js/sha1'), require('@angular/common/http')) :
3
- typeof define === 'function' && define.amd ? define('@triangular/password-checker', ['exports', 'rxjs', 'rxjs/operators', '@angular/forms', '@angular/core', 'crypto-js/sha1', '@angular/common/http'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.triangular = global.triangular || {}, global.triangular['password-checker'] = {}), global.rxjs, global.rxjs.operators, global.ng.forms, global.ng.core, global.sha1, global.ng.common.http));
5
- }(this, (function (exports, rxjs, operators, forms, i0, sha1, i1) { 'use strict';
6
-
7
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
-
9
- function _interopNamespace(e) {
10
- if (e && e.__esModule) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () {
19
- return e[k];
20
- }
21
- });
22
- }
23
- });
24
- }
25
- n['default'] = e;
26
- return Object.freeze(n);
27
- }
28
-
29
- var i0__namespace = /*#__PURE__*/_interopNamespace(i0);
30
- var sha1__default = /*#__PURE__*/_interopDefaultLegacy(sha1);
31
- var i1__namespace = /*#__PURE__*/_interopNamespace(i1);
32
-
33
- var PasswordCheckerConfigValue = new i0.InjectionToken('PASSWORD_CHECKER_CONFIG');
34
-
35
- var PasswordCheckerLibDirective = /** @class */ (function () {
36
- function PasswordCheckerLibDirective(http, config) {
37
- this.http = http;
38
- if (!config) {
39
- // default initialization in constructor didn't work.
40
- // conflict with @Optional()?
41
- config = {};
42
- }
43
- this.pwnedPasswordApi =
44
- config.pwnedPasswordApi
45
- || 'https://api.pwnedpasswords.com/range/';
46
- this.pwnedPasswordMinimumOccurrenceForError =
47
- config.pwnedPasswordMinimumOccurrenceForError
48
- || 1;
49
- this.pwnedPasswordApiCallDebounceTime =
50
- config.pwnedPasswordApiCallDebounceTime
51
- || 400;
52
- }
53
- PasswordCheckerLibDirective.prototype.validate = function (control) {
54
- var _this = this;
55
- var pw = ''.concat(control.value);
56
- return rxjs.timer(this.pwnedPasswordApiCallDebounceTime).pipe(operators.map(function () {
57
- var pwSha1 = sha1__default['default'](pw).toString().toUpperCase();
58
- return {
59
- firstPart: pwSha1.substring(0, 5),
60
- lastPart: pwSha1.substring(5),
61
- };
62
- }), operators.switchMap(function (hash) { return _this.http.get("" + _this.pwnedPasswordApi + hash.firstPart, { responseType: 'text' }).pipe(operators.map(function (passwords) { return passwords.split(/[\r\n]+/); }), operators.map(function (passwords) { return passwords.map(function (password) {
63
- var split = password.split(':');
64
- return {
65
- hash: split[0],
66
- count: parseInt(split[1], 10),
67
- };
68
- }); }), operators.map(function (passwords) { return passwords.find(function (password) { return password.hash === hash.lastPart; }); })); }), operators.map(function (password) { return password && password.count >= _this.pwnedPasswordMinimumOccurrenceForError
69
- ? { pwnedPasswordOccurrence: password.count }
70
- : null; }));
71
- };
72
- return PasswordCheckerLibDirective;
73
- }());
74
- PasswordCheckerLibDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0__namespace, type: PasswordCheckerLibDirective, deps: [{ token: i1__namespace.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive });
75
- PasswordCheckerLibDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.0", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
76
- {
77
- provide: forms.NG_ASYNC_VALIDATORS,
78
- useExisting: PasswordCheckerLibDirective,
79
- multi: true,
80
- },
81
- ], ngImport: i0__namespace });
82
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0__namespace, type: PasswordCheckerLibDirective, decorators: [{
83
- type: i0.Directive,
84
- args: [{
85
- // eslint-disable-next-line @angular-eslint/directive-selector
86
- selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
87
- providers: [
88
- {
89
- provide: forms.NG_ASYNC_VALIDATORS,
90
- useExisting: PasswordCheckerLibDirective,
91
- multi: true,
92
- },
93
- ]
94
- }]
95
- }], ctorParameters: function () {
96
- return [{ type: i1__namespace.HttpClient }, { type: undefined, decorators: [{
97
- type: i0.Optional
98
- }, {
99
- type: i0.Inject,
100
- args: [PasswordCheckerConfigValue]
101
- }] }];
102
- }, propDecorators: { pwnedPasswordApi: [{
103
- type: i0.Input
104
- }], pwnedPasswordMinimumOccurrenceForError: [{
105
- type: i0.Input
106
- }], pwnedPasswordApiCallDebounceTime: [{
107
- type: i0.Input
108
- }] } });
109
-
110
- var PasswordCheckerModule = /** @class */ (function () {
111
- function PasswordCheckerModule() {
112
- }
113
- PasswordCheckerModule.forRoot = function (config) {
114
- if (config === void 0) { config = {}; }
115
- return {
116
- ngModule: PasswordCheckerModule,
117
- providers: [
118
- {
119
- provide: PasswordCheckerConfigValue,
120
- useValue: config,
121
- }
122
- ]
123
- };
124
- };
125
- return PasswordCheckerModule;
126
- }());
127
- PasswordCheckerModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0__namespace, type: PasswordCheckerModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
128
- PasswordCheckerModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0__namespace, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [i1.HttpClientModule], exports: [PasswordCheckerLibDirective] });
129
- PasswordCheckerModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0__namespace, type: PasswordCheckerModule, imports: [[i1.HttpClientModule]] });
130
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImport: i0__namespace, type: PasswordCheckerModule, decorators: [{
131
- type: i0.NgModule,
132
- args: [{
133
- declarations: [PasswordCheckerLibDirective],
134
- imports: [i1.HttpClientModule],
135
- exports: [PasswordCheckerLibDirective]
136
- }]
137
- }] });
138
-
139
- /*
140
- * Public API Surface of password-checker-lib
141
- */
142
-
143
- /**
144
- * Generated bundle index. Do not edit.
145
- */
146
-
147
- exports.PasswordCheckerLibDirective = PasswordCheckerLibDirective;
148
- exports.PasswordCheckerModule = PasswordCheckerModule;
149
-
150
- Object.defineProperty(exports, '__esModule', { value: true });
151
-
152
- })));
153
- //# sourceMappingURL=triangular-password-checker.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"triangular-password-checker.umd.js","sources":["../../../projects/password-checker-lib/src/lib/password-checker.config.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.directive.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.module.ts","../../../projects/password-checker-lib/src/public_api.ts","../../../projects/password-checker-lib/src/triangular-password-checker.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type Partial<T> = {\n [P in keyof T]?: T[P];\n};\n\nexport interface PasswordCheckerConfig {\n pwnedPasswordApi: string;\n pwnedPasswordMinimumOccurrenceForError: number;\n pwnedPasswordApiCallDebounceTime: number;\n}\n\nexport const PasswordCheckerConfigValue = new InjectionToken<Partial<PasswordCheckerConfig>>('PASSWORD_CHECKER_CONFIG');\n","import { Observable, timer } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';\nimport { Directive, Inject, Input, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport sha1 from 'crypto-js/sha1';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: PasswordCheckerLibDirective,\n multi: true,\n },\n ]\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\n private pwnedPasswordMinimumOccurrenceForErrorValue: number;\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PasswordCheckerConfigValue) config: Partial<PasswordCheckerConfig>,\n ) {\n\n if (!config) {\n // default initialization in constructor didn't work.\n // conflict with @Optional()?\n config = {};\n }\n\n this.pwnedPasswordApi =\n config.pwnedPasswordApi\n || 'https://api.pwnedpasswords.com/range/';\n this.pwnedPasswordMinimumOccurrenceForError =\n config.pwnedPasswordMinimumOccurrenceForError\n || 1;\n this.pwnedPasswordApiCallDebounceTime =\n config.pwnedPasswordApiCallDebounceTime\n || 400;\n }\n\n validate(control: AbstractControl): Observable<ValidationErrors|null> {\n const pw = ''.concat(control.value);\n\n return timer(this.pwnedPasswordApiCallDebounceTime).pipe(\n map(() => {\n const pwSha1 = sha1(pw).toString().toUpperCase();\n\n return {\n firstPart: pwSha1.substring(0, 5),\n lastPart: pwSha1.substring(5),\n };\n }),\n switchMap(\n (hash) => this.http.get(\n `${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }\n ).pipe(\n map(passwords => passwords.split(/[\\r\\n]+/)),\n map(passwords => passwords.map((password) => {\n const split = password.split(':');\n\n return {\n hash: split[0],\n count: parseInt(split[1], 10),\n };\n }\n )),\n map(passwords => passwords.find(password => password.hash === hash.lastPart)),\n ),\n ),\n map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError\n ? { pwnedPasswordOccurrence: password.count }\n : null),\n );\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { PasswordCheckerLibDirective } from './password-checker-lib.directive';\nimport { HttpClientModule } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({\n declarations: [PasswordCheckerLibDirective],\n imports: [HttpClientModule],\n exports: [PasswordCheckerLibDirective]\n})\nexport class PasswordCheckerModule {\n static forRoot(config: Partial<PasswordCheckerConfig> = {}): ModuleWithProviders<PasswordCheckerModule> {\n return {\n ngModule: PasswordCheckerModule,\n providers: [\n {\n provide: PasswordCheckerConfigValue,\n useValue: config,\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of password-checker-lib\n */\n\nexport * from './lib/password-checker-lib.directive';\nexport * from './lib/password-checker-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["InjectionToken","timer","map","sha1","switchMap","NG_ASYNC_VALIDATORS","Directive","Optional","Inject","Input","HttpClientModule","NgModule"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"triangular-password-checker.js","sources":["../../../projects/password-checker-lib/src/lib/password-checker.config.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.directive.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.module.ts","../../../projects/password-checker-lib/src/public_api.ts","../../../projects/password-checker-lib/src/triangular-password-checker.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type Partial<T> = {\n [P in keyof T]?: T[P];\n};\n\nexport interface PasswordCheckerConfig {\n pwnedPasswordApi: string;\n pwnedPasswordMinimumOccurrenceForError: number;\n pwnedPasswordApiCallDebounceTime: number;\n}\n\nexport const PasswordCheckerConfigValue = new InjectionToken<Partial<PasswordCheckerConfig>>('PASSWORD_CHECKER_CONFIG');\n","import { Observable, timer } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';\nimport { Directive, Inject, Input, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport sha1 from 'crypto-js/sha1';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: PasswordCheckerLibDirective,\n multi: true,\n },\n ]\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\n private pwnedPasswordMinimumOccurrenceForErrorValue: number;\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PasswordCheckerConfigValue) config: Partial<PasswordCheckerConfig>,\n ) {\n\n if (!config) {\n // default initialization in constructor didn't work.\n // conflict with @Optional()?\n config = {};\n }\n\n this.pwnedPasswordApi =\n config.pwnedPasswordApi\n || 'https://api.pwnedpasswords.com/range/';\n this.pwnedPasswordMinimumOccurrenceForError =\n config.pwnedPasswordMinimumOccurrenceForError\n || 1;\n this.pwnedPasswordApiCallDebounceTime =\n config.pwnedPasswordApiCallDebounceTime\n || 400;\n }\n\n validate(control: AbstractControl): Observable<ValidationErrors|null> {\n const pw = ''.concat(control.value);\n\n return timer(this.pwnedPasswordApiCallDebounceTime).pipe(\n map(() => {\n const pwSha1 = sha1(pw).toString().toUpperCase();\n\n return {\n firstPart: pwSha1.substring(0, 5),\n lastPart: pwSha1.substring(5),\n };\n }),\n switchMap(\n (hash) => this.http.get(\n `${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }\n ).pipe(\n map(passwords => passwords.split(/[\\r\\n]+/)),\n map(passwords => passwords.map((password) => {\n const split = password.split(':');\n\n return {\n hash: split[0],\n count: parseInt(split[1], 10),\n };\n }\n )),\n map(passwords => passwords.find(password => password.hash === hash.lastPart)),\n ),\n ),\n map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError\n ? { pwnedPasswordOccurrence: password.count }\n : null),\n );\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { PasswordCheckerLibDirective } from './password-checker-lib.directive';\nimport { HttpClientModule } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({\n declarations: [PasswordCheckerLibDirective],\n imports: [HttpClientModule],\n exports: [PasswordCheckerLibDirective]\n})\nexport class PasswordCheckerModule {\n static forRoot(config: Partial<PasswordCheckerConfig> = {}): ModuleWithProviders<PasswordCheckerModule> {\n return {\n ngModule: PasswordCheckerModule,\n providers: [\n {\n provide: PasswordCheckerConfigValue,\n useValue: config,\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of password-checker-lib\n */\n\nexport * from './lib/password-checker-lib.directive';\nexport * from './lib/password-checker-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}