@triangular/password-checker 7.0.0 → 9.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,8 @@ 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.1 |
20
+ | 14.x | 9.0.0 |
19
21
 
20
22
  ### Step 1: Install
21
23
 
@@ -170,6 +172,12 @@ We use [SemVer](http://semver.org/) for versioning.
170
172
  - 1.0.0: Initial Release
171
173
  - 2.2.0: Code Improvements and Angular 7.x
172
174
  - 3.0.0: Angular 8.x
175
+ - 4.0.0: Angular 9.x
176
+ - 5.0.0: Angular 10.x
177
+ - 6.0.0: Angular 11.x
178
+ - 7.0.0: Angular 12.x
179
+ - 8.0.0: Angular 13.x
180
+ - 8.0.1: Upgrade rxjs to 7.4
173
181
 
174
182
  ## Authors
175
183
 
@@ -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: "14.0.3", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
47
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.3", 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: "14.0.3", 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: "14.0.3", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
21
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, imports: [HttpClientModule] });
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, decorators: [{
23
23
  type: NgModule,
24
24
  args: [{
25
25
  declarations: [PasswordCheckerLibDirective],
@@ -27,4 +27,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0", ngImpor
27
27
  exports: [PasswordCheckerLibDirective]
28
28
  }]
29
29
  }] });
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFrQywwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQU92RyxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBeUMsRUFBRTtRQUN4RCxPQUFPO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLDBCQUEwQjtvQkFDbkMsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7a0hBWFUscUJBQXFCO21IQUFyQixxQkFBcUIsaUJBSmpCLDJCQUEyQixhQUNoQyxnQkFBZ0IsYUFDaEIsMkJBQTJCO21IQUUxQixxQkFBcUIsWUFIdkIsQ0FBQyxnQkFBZ0IsQ0FBQzsyRkFHaEIscUJBQXFCO2tCQUxqQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLDJCQUEyQixDQUFDO29CQUMzQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDM0IsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci1saWIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBQYXJ0aWFsLCBQYXNzd29yZENoZWNrZXJDb25maWcsIFBhc3N3b3JkQ2hlY2tlckNvbmZpZ1ZhbHVlIH0gZnJvbSAnLi9wYXNzd29yZC1jaGVja2VyLmNvbmZpZyc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1Bhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZV0sXG4gIGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSxcbiAgZXhwb3J0czogW1Bhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVja2VyTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoY29uZmlnOiBQYXJ0aWFsPFBhc3N3b3JkQ2hlY2tlckNvbmZpZz4gPSB7fSk6IE1vZHVsZVdpdGhQcm92aWRlcnM8UGFzc3dvcmRDaGVja2VyTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBQYXNzd29yZENoZWNrZXJNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFBhc3N3b3JkQ2hlY2tlckNvbmZpZ1ZhbHVlLFxuICAgICAgICAgIHVzZVZhbHVlOiBjb25maWcsXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG59XG4iXX0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFrQywwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQU92RyxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBeUMsRUFBRTtRQUN4RCxPQUFPO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLDBCQUEwQjtvQkFDbkMsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7a0hBWFUscUJBQXFCO21IQUFyQixxQkFBcUIsaUJBSmpCLDJCQUEyQixhQUNoQyxnQkFBZ0IsYUFDaEIsMkJBQTJCO21IQUUxQixxQkFBcUIsWUFIdEIsZ0JBQWdCOzJGQUdmLHFCQUFxQjtrQkFMakMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztvQkFDM0MsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLE9BQU8sRUFBRSxDQUFDLDJCQUEyQixDQUFDO2lCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmUgfSBmcm9tICcuL3Bhc3N3b3JkLWNoZWNrZXItbGliLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUGFydGlhbCwgUGFzc3dvcmRDaGVja2VyQ29uZmlnLCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci5jb25maWcnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmVdLFxuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkQ2hlY2tlck1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogUGFydGlhbDxQYXNzd29yZENoZWNrZXJDb25maWc+ID0ge30pOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFBhc3N3b3JkQ2hlY2tlck1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogUGFzc3dvcmRDaGVja2VyTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSxcbiAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -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: "14.0.3", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.3", 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: "14.0.3", 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: "14.0.3", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
99
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
100
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, imports: [HttpClientModule] });
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", 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: "14.0.3", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.3", 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: "14.0.3", 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: "14.0.3", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
97
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
98
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: PasswordCheckerModule, imports: [HttpClientModule] });
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", 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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"}
File without changes
@@ -12,5 +12,5 @@ export declare class PasswordCheckerLibDirective implements AsyncValidator {
12
12
  constructor(http: HttpClient, config: Partial<PasswordCheckerConfig>);
13
13
  validate(control: AbstractControl): Observable<ValidationErrors | null>;
14
14
  static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerLibDirective, [null, { optional: true; }]>;
15
- static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordCheckerLibDirective, "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", never, { "pwnedPasswordApi": "pwnedPasswordApi"; "pwnedPasswordMinimumOccurrenceForError": "pwnedPasswordMinimumOccurrenceForError"; "pwnedPasswordApiCallDebounceTime": "pwnedPasswordApiCallDebounceTime"; }, {}, never>;
15
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordCheckerLibDirective, "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", never, { "pwnedPasswordApi": "pwnedPasswordApi"; "pwnedPasswordMinimumOccurrenceForError": "pwnedPasswordMinimumOccurrenceForError"; "pwnedPasswordApiCallDebounceTime": "pwnedPasswordApiCallDebounceTime"; }, {}, never, never, false>;
16
16
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@triangular/password-checker",
3
- "version": "7.0.0",
3
+ "version": "9.0.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^12.0.0",
6
- "@angular/core": "^12.0.0",
7
- "crypto-js": "^3.3.0"
5
+ "@angular/common": "^14.0.0",
6
+ "@angular/core": "^14.0.0",
7
+ "crypto-js": "^4.1.1"
8
8
  },
9
9
  "homepage": "https://password.akehir.com",
10
10
  "license": "MIT",
@@ -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",
32
- "typings": "triangular-password-checker.d.ts",
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
+ "typings": "index.d.ts",
33
+ "exports": {
34
+ "./package.json": {
35
+ "default": "./package.json"
36
+ },
37
+ ".": {
38
+ "types": "./index.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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"}