@triangular/password-checker 13.0.0 → 20.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 +3 -1
- package/fesm2022/triangular-password-checker.mjs +8 -8
- package/fesm2022/triangular-password-checker.mjs.map +1 -1
- package/index.d.ts +34 -5
- package/package.json +3 -5
- package/esm2022/lib/password-checker-lib.directive.mjs +0 -80
- package/esm2022/lib/password-checker-lib.module.mjs +0 -27
- package/esm2022/lib/password-checker.config.mjs +0 -3
- package/esm2022/public_api.mjs +0 -6
- package/esm2022/triangular-password-checker.mjs +0 -5
- package/lib/password-checker-lib.directive.d.ts +0 -15
- package/lib/password-checker-lib.module.d.ts +0 -10
- package/lib/password-checker.config.d.ts +0 -10
- package/public_api.d.ts +0 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@ import { timer } from 'rxjs';
|
|
|
2
2
|
import { switchMap, map } from 'rxjs/operators';
|
|
3
3
|
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
4
4
|
import * as i0 from '@angular/core';
|
|
5
|
-
import { InjectionToken,
|
|
5
|
+
import { InjectionToken, Input, Optional, Inject, Directive, NgModule } from '@angular/core';
|
|
6
6
|
import * as i1 from '@angular/common/http';
|
|
7
7
|
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
|
8
8
|
|
|
@@ -45,8 +45,8 @@ class PasswordCheckerLibDirective {
|
|
|
45
45
|
? { pwnedPasswordOccurrence: password.count }
|
|
46
46
|
: null));
|
|
47
47
|
}
|
|
48
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
49
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
48
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
49
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.0", type: PasswordCheckerLibDirective, isStandalone: true, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
|
|
50
50
|
{
|
|
51
51
|
provide: NG_ASYNC_VALIDATORS,
|
|
52
52
|
useExisting: PasswordCheckerLibDirective,
|
|
@@ -54,7 +54,7 @@ class PasswordCheckerLibDirective {
|
|
|
54
54
|
},
|
|
55
55
|
], ngImport: i0 }); }
|
|
56
56
|
}
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
|
|
58
58
|
type: Directive,
|
|
59
59
|
args: [{
|
|
60
60
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -93,11 +93,11 @@ class PasswordCheckerModule {
|
|
|
93
93
|
]
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
97
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
98
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
96
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
97
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.0.0", ngImport: i0, type: PasswordCheckerModule, imports: [PasswordCheckerLibDirective], exports: [PasswordCheckerLibDirective] }); }
|
|
98
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: PasswordCheckerModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
|
|
99
99
|
}
|
|
100
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
100
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: PasswordCheckerModule, decorators: [{
|
|
101
101
|
type: NgModule,
|
|
102
102
|
args: [{ declarations: [],
|
|
103
103
|
exports: [PasswordCheckerLibDirective], imports: [PasswordCheckerLibDirective], providers: [provideHttpClient(withInterceptorsFromDi())] }]
|
|
@@ -1 +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 { 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 standalone: true\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\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 switchMap(() => crypto.subtle.digest('SHA-1', new TextEncoder().encode(pw))),\n map((pwSha1 => Array.from(new Uint8Array(pwSha1))\n .map(v => v.toString(16).padStart(2, '0'))\n .join(''))),\n map(pwSha1 => pwSha1.toUpperCase()),\n map((pwSha1) => {\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 { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({ declarations: [],\n exports: [PasswordCheckerLibDirective], imports: [PasswordCheckerLibDirective], providers: [provideHttpClient(withInterceptorsFromDi())] })\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":";;;;;;;;AAYO,MAAM,0BAA0B,GAAG,IAAI,cAAc,CAAiC,yBAAyB,CAAC;;MCO1G,2BAA2B,CAAA;IAKtC,WACU,CAAA,IAAgB,EACwB,MAAsC,EAAA;QAD9E,IAAI,CAAA,IAAA,GAAJ,IAAI
|
|
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 { 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 standalone: true\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\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 switchMap(() => crypto.subtle.digest('SHA-1', new TextEncoder().encode(pw))),\n map((pwSha1 => Array.from(new Uint8Array(pwSha1))\n .map(v => v.toString(16).padStart(2, '0'))\n .join(''))),\n map(pwSha1 => pwSha1.toUpperCase()),\n map((pwSha1) => {\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 { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({ declarations: [],\n exports: [PasswordCheckerLibDirective], imports: [PasswordCheckerLibDirective], providers: [provideHttpClient(withInterceptorsFromDi())] })\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/index.d.ts
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { AsyncValidator, AbstractControl, ValidationErrors } from '@angular/forms';
|
|
3
|
+
import { HttpClient } from '@angular/common/http';
|
|
4
|
+
import * as i0 from '@angular/core';
|
|
5
|
+
import { ModuleWithProviders } from '@angular/core';
|
|
6
|
+
|
|
7
|
+
type Partial<T> = {
|
|
8
|
+
[P in keyof T]?: T[P];
|
|
9
|
+
};
|
|
10
|
+
interface PasswordCheckerConfig {
|
|
11
|
+
pwnedPasswordApi: string;
|
|
12
|
+
pwnedPasswordMinimumOccurrenceForError: number;
|
|
13
|
+
pwnedPasswordApiCallDebounceTime: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare class PasswordCheckerLibDirective implements AsyncValidator {
|
|
17
|
+
private http;
|
|
18
|
+
pwnedPasswordApi: string;
|
|
19
|
+
pwnedPasswordMinimumOccurrenceForError: number;
|
|
20
|
+
pwnedPasswordApiCallDebounceTime: number;
|
|
21
|
+
constructor(http: HttpClient, config: Partial<PasswordCheckerConfig>);
|
|
22
|
+
validate(control: AbstractControl): Observable<ValidationErrors | null>;
|
|
23
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerLibDirective, [null, { optional: true; }]>;
|
|
24
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordCheckerLibDirective, "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", never, { "pwnedPasswordApi": { "alias": "pwnedPasswordApi"; "required": false; }; "pwnedPasswordMinimumOccurrenceForError": { "alias": "pwnedPasswordMinimumOccurrenceForError"; "required": false; }; "pwnedPasswordApiCallDebounceTime": { "alias": "pwnedPasswordApiCallDebounceTime"; "required": false; }; }, {}, never, never, true, never>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class PasswordCheckerModule {
|
|
28
|
+
static forRoot(config?: Partial<PasswordCheckerConfig>): ModuleWithProviders<PasswordCheckerModule>;
|
|
29
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerModule, never>;
|
|
30
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<PasswordCheckerModule, never, [typeof PasswordCheckerLibDirective], [typeof PasswordCheckerLibDirective]>;
|
|
31
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<PasswordCheckerModule>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { PasswordCheckerLibDirective, PasswordCheckerModule };
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@triangular/password-checker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "20.0.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/common": "^
|
|
6
|
-
"@angular/core": "^
|
|
5
|
+
"@angular/common": "^20.0.0",
|
|
6
|
+
"@angular/core": "^20.0.0"
|
|
7
7
|
},
|
|
8
8
|
"homepage": "https://password.akehir.com",
|
|
9
9
|
"license": "MIT",
|
|
@@ -31,8 +31,6 @@
|
|
|
31
31
|
},
|
|
32
32
|
".": {
|
|
33
33
|
"types": "./index.d.ts",
|
|
34
|
-
"esm2022": "./esm2022/triangular-password-checker.mjs",
|
|
35
|
-
"esm": "./esm2022/triangular-password-checker.mjs",
|
|
36
34
|
"default": "./fesm2022/triangular-password-checker.mjs"
|
|
37
35
|
}
|
|
38
36
|
},
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { timer } from 'rxjs';
|
|
2
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
3
|
-
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
4
|
-
import { Directive, Inject, Input, Optional } from '@angular/core';
|
|
5
|
-
import { PasswordCheckerConfigValue } from './password-checker.config';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
export class PasswordCheckerLibDirective {
|
|
9
|
-
constructor(http, config) {
|
|
10
|
-
this.http = http;
|
|
11
|
-
if (!config) {
|
|
12
|
-
// default initialization in constructor didn't work.
|
|
13
|
-
// conflict with @Optional()?
|
|
14
|
-
config = {};
|
|
15
|
-
}
|
|
16
|
-
this.pwnedPasswordApi =
|
|
17
|
-
config.pwnedPasswordApi
|
|
18
|
-
|| 'https://api.pwnedpasswords.com/range/';
|
|
19
|
-
this.pwnedPasswordMinimumOccurrenceForError =
|
|
20
|
-
config.pwnedPasswordMinimumOccurrenceForError
|
|
21
|
-
|| 1;
|
|
22
|
-
this.pwnedPasswordApiCallDebounceTime =
|
|
23
|
-
config.pwnedPasswordApiCallDebounceTime
|
|
24
|
-
|| 400;
|
|
25
|
-
}
|
|
26
|
-
validate(control) {
|
|
27
|
-
const pw = ''.concat(control.value);
|
|
28
|
-
return timer(this.pwnedPasswordApiCallDebounceTime).pipe(switchMap(() => crypto.subtle.digest('SHA-1', new TextEncoder().encode(pw))), map((pwSha1 => Array.from(new Uint8Array(pwSha1))
|
|
29
|
-
.map(v => v.toString(16).padStart(2, '0'))
|
|
30
|
-
.join(''))), map(pwSha1 => pwSha1.toUpperCase()), map((pwSha1) => {
|
|
31
|
-
return {
|
|
32
|
-
firstPart: pwSha1.substring(0, 5),
|
|
33
|
-
lastPart: pwSha1.substring(5),
|
|
34
|
-
};
|
|
35
|
-
}), switchMap((hash) => this.http.get(`${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }).pipe(map(passwords => passwords.split(/[\r\n]+/)), map(passwords => passwords.map((password) => {
|
|
36
|
-
const split = password.split(':');
|
|
37
|
-
return {
|
|
38
|
-
hash: split[0],
|
|
39
|
-
count: parseInt(split[1], 10),
|
|
40
|
-
};
|
|
41
|
-
})), map(passwords => passwords.find(password => password.hash === hash.lastPart)))), map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError
|
|
42
|
-
? { pwnedPasswordOccurrence: password.count }
|
|
43
|
-
: null));
|
|
44
|
-
}
|
|
45
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
46
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.2", type: PasswordCheckerLibDirective, isStandalone: true, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
|
|
47
|
-
{
|
|
48
|
-
provide: NG_ASYNC_VALIDATORS,
|
|
49
|
-
useExisting: PasswordCheckerLibDirective,
|
|
50
|
-
multi: true,
|
|
51
|
-
},
|
|
52
|
-
], ngImport: i0 }); }
|
|
53
|
-
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
|
|
55
|
-
type: Directive,
|
|
56
|
-
args: [{
|
|
57
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
58
|
-
selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
|
|
59
|
-
providers: [
|
|
60
|
-
{
|
|
61
|
-
provide: NG_ASYNC_VALIDATORS,
|
|
62
|
-
useExisting: PasswordCheckerLibDirective,
|
|
63
|
-
multi: true,
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
standalone: true
|
|
67
|
-
}]
|
|
68
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
69
|
-
type: Optional
|
|
70
|
-
}, {
|
|
71
|
-
type: Inject,
|
|
72
|
-
args: [PasswordCheckerConfigValue]
|
|
73
|
-
}] }], propDecorators: { pwnedPasswordApi: [{
|
|
74
|
-
type: Input
|
|
75
|
-
}], pwnedPasswordMinimumOccurrenceForError: [{
|
|
76
|
-
type: Input
|
|
77
|
-
}], pwnedPasswordApiCallDebounceTime: [{
|
|
78
|
-
type: Input
|
|
79
|
-
}] } });
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBbUMsbUJBQW1CLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLEVBQWtDLDBCQUEwQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQWN2RyxNQUFNLE9BQU8sMkJBQTJCO0lBS3RDLFlBQ1UsSUFBZ0IsRUFDd0IsTUFBc0M7UUFEOUUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUl4QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixxREFBcUQ7WUFDckQsNkJBQTZCO1lBQzdCLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQjtZQUNuQixNQUFNLENBQUMsZ0JBQWdCO21CQUNwQix1Q0FBdUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsc0NBQXNDO1lBQ3pDLE1BQU0sQ0FBQyxzQ0FBc0M7bUJBQzFDLENBQUMsQ0FBQztRQUNQLElBQUksQ0FBQyxnQ0FBZ0M7WUFDbkMsTUFBTSxDQUFDLGdDQUFnQzttQkFDcEMsR0FBRyxDQUFDO0lBQ1gsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUF3QjtRQUMvQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENB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UUksUUFBUTs7MEJBQUksTUFBTTsyQkFBQywwQkFBMEI7eUNBTnZDLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxzQ0FBc0M7c0JBQTlDLEtBQUs7Z0JBQ0csZ0NBQWdDO3NCQUF4QyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBBc3luY1ZhbGlkYXRvciwgTkdfQVNZTkNfVkFMSURBVE9SUywgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBQYXJ0aWFsLCBQYXNzd29yZENoZWNrZXJDb25maWcsIFBhc3N3b3JkQ2hlY2tlckNvbmZpZ1ZhbHVlIH0gZnJvbSAnLi9wYXNzd29yZC1jaGVja2VyLmNvbmZpZyc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbcHduZWRQYXNzd29yZFZhbGlkYXRvcl1bZm9ybUNvbnRyb2xOYW1lXSwgW3B3bmVkUGFzc3dvcmRWYWxpZGF0b3JdW25nTW9kZWxdLFtwd25lZFBhc3N3b3JkVmFsaWRhdG9yXVtmb3JtQ29udHJvbF0nLFxuICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICAgICAgdXNlRXhpc3Rpbmc6IFBhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVja2VyTGliRGlyZWN0aXZlIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3Ige1xuICBASW5wdXQoKSBwd25lZFBhc3N3b3JkQXBpOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB3bmVkUGFzc3dvcmRBcGlDYWxsRGVib3VuY2VUaW1lOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUGFzc3dvcmRDaGVja2VyQ29uZmlnVmFsdWUpIGNvbmZpZzogUGFydGlhbDxQYXNzd29yZENoZWNrZXJDb25maWc+LFxuICAgICkge1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIC8vIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gaW4gY29uc3RydWN0b3IgZGlkbid0IHdvcmsuXG4gICAgICAvLyBjb25mbGljdCB3aXRoIEBPcHRpb25hbCgpP1xuICAgICAgY29uZmlnID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5wd25lZFBhc3N3b3JkQXBpID1cbiAgICAgIGNvbmZpZy5wd25lZFBhc3N3b3JkQXBpXG4gICAgICB8fCAnaHR0cHM6Ly9hcGkucHduZWRwYXNzd29yZHMuY29tL3JhbmdlLyc7XG4gICAgdGhpcy5wd25lZFBhc3N3b3JkTWluaW11bU9jY3VycmVuY2VGb3JFcnJvciA9XG4gICAgICBjb25maWcucHduZWRQYXNzd29yZE1pbmltdW1PY2N1cnJlbmNlRm9yRXJyb3JcbiAgICAgIHx8IDE7XG4gICAgdGhpcy5wd25lZFBhc3N3b3JkQXBpQ2FsbERlYm91bmNlVGltZSA9XG4gICAgICBjb25maWcucHduZWRQYXNzd29yZEFwaUNhbGxEZWJvdW5jZVRpbWVcbiAgICAgIHx8IDQwMDtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9yc3xudWxsPiB7XG4gICAgY29uc3QgcHcgPSAnJy5jb25jYXQoY29udHJvbC52YWx1ZSk7XG5cbiAgICByZXR1cm4gdGltZXIodGhpcy5wd25lZFBhc3N3b3JkQXBpQ2FsbERlYm91bmNlVGltZSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTEnLCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocHcpKSksXG4gICAgICBtYXAoKHB3U2hhMSA9PiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KHB3U2hhMSkpXG4gICAgICAgIC5tYXAodiA9PiB2LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKVxuICAgICAgICAuam9pbignJykpKSxcbiAgICAgIG1hcChwd1NoYTEgPT4gcHdTaGExLnRvVXBwZXJDYXNlKCkpLFxuICAgICAgbWFwKChwd1NoYTEpID0+IHtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpcnN0UGFydDogcHdTaGExLnN1YnN0cmluZygwLCA1KSxcbiAgICAgICAgICBsYXN0UGFydDogcHdTaGExLnN1YnN0cmluZyg1KSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAoaGFzaCkgPT4gdGhpcy5odHRwLmdldChcbiAgICAgICAgICBgJHt0aGlzLnB3bmVkUGFzc3dvcmRBcGl9JHtoYXNoLmZpcnN0UGFydH1gLCAgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9XG4gICAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcChwYXNzd29yZHMgPT4gcGFzc3dvcmRzLnNwbGl0KC9bXFxyXFxuXSsvKSksXG4gICAgICAgICAgbWFwKHBhc3N3b3JkcyA9PiBwYXNzd29yZHMubWFwKChwYXNzd29yZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzcGxpdCA9ICBwYXNzd29yZC5zcGxpdCgnOicpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaGFzaDogc3BsaXRbMF0sXG4gICAgICAgICAgICAgICAgY291bnQ6IHBhcnNlSW50KHNwbGl0WzFdLCAxMCksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKSksXG4gICAgICAgICAgbWFwKHBhc3N3b3JkcyA9PiBwYXNzd29yZHMuZmluZChwYXNzd29yZCA9PiBwYXNzd29yZC5oYXNoID09PSBoYXNoLmxhc3RQYXJ0KSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgbWFwKHBhc3N3b3JkID0+IHBhc3N3b3JkICYmIHBhc3N3b3JkLmNvdW50ID49IHRoaXMucHduZWRQYXNzd29yZE1pbmltdW1PY2N1cnJlbmNlRm9yRXJyb3JcbiAgICAgICAgPyB7IHB3bmVkUGFzc3dvcmRPY2N1cnJlbmNlOiBwYXNzd29yZC5jb3VudCB9XG4gICAgICAgIDogbnVsbCksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { PasswordCheckerLibDirective } from './password-checker-lib.directive';
|
|
3
|
-
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
|
4
|
-
import { PasswordCheckerConfigValue } from './password-checker.config';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class PasswordCheckerModule {
|
|
7
|
-
static forRoot(config = {}) {
|
|
8
|
-
return {
|
|
9
|
-
ngModule: PasswordCheckerModule,
|
|
10
|
-
providers: [
|
|
11
|
-
{
|
|
12
|
-
provide: PasswordCheckerConfigValue,
|
|
13
|
-
useValue: config,
|
|
14
|
-
}
|
|
15
|
-
]
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
19
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [PasswordCheckerLibDirective], exports: [PasswordCheckerLibDirective] }); }
|
|
20
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PasswordCheckerModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
|
|
21
|
-
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
|
|
23
|
-
type: NgModule,
|
|
24
|
-
args: [{ declarations: [],
|
|
25
|
-
exports: [PasswordCheckerLibDirective], imports: [PasswordCheckerLibDirective], providers: [provideHttpClient(withInterceptorsFromDi())] }]
|
|
26
|
-
}] });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUFrQywwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUl2RyxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBeUMsRUFBRTtRQUN4RCxPQUFPO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLDBCQUEwQjtvQkFDbkMsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs4R0FYVSxxQkFBcUI7K0dBQXJCLHFCQUFxQixZQURvQiwyQkFBMkIsYUFBbkUsMkJBQTJCOytHQUM1QixxQkFBcUIsYUFENkQsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7OzJGQUMvSCxxQkFBcUI7a0JBRmpDLFFBQVE7bUJBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRTtvQkFDeEIsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci1saWIuZGlyZWN0aXZlJztcbmltcG9ydCB7IHByb3ZpZGVIdHRwQ2xpZW50LCB3aXRoSW50ZXJjZXB0b3JzRnJvbURpIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUGFydGlhbCwgUGFzc3dvcmRDaGVja2VyQ29uZmlnLCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci5jb25maWcnO1xuXG5ATmdNb2R1bGUoeyBkZWNsYXJhdGlvbnM6IFtdLFxuICAgIGV4cG9ydHM6IFtQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmVdLCBpbXBvcnRzOiBbUGFzc3dvcmRDaGVja2VyTGliRGlyZWN0aXZlXSwgcHJvdmlkZXJzOiBbcHJvdmlkZUh0dHBDbGllbnQod2l0aEludGVyY2VwdG9yc0Zyb21EaSgpKV0gfSlcbmV4cG9ydCBjbGFzcyBQYXNzd29yZENoZWNrZXJNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IFBhcnRpYWw8UGFzc3dvcmRDaGVja2VyQ29uZmlnPiA9IHt9KTogTW9kdWxlV2l0aFByb3ZpZGVyczxQYXNzd29yZENoZWNrZXJNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IFBhc3N3b3JkQ2hlY2tlck1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogUGFzc3dvcmRDaGVja2VyQ29uZmlnVmFsdWUsXG4gICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
export const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXNzd29yZC1jaGVja2VyLWxpYi9zcmMvbGliL3Bhc3N3b3JkLWNoZWNrZXIuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFZN0MsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxjQUFjLENBQWlDLHlCQUF5QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGFydGlhbDxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiBUW1BdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZENoZWNrZXJDb25maWcge1xuICBwd25lZFBhc3N3b3JkQXBpOiBzdHJpbmc7XG4gIHB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yOiBudW1iZXI7XG4gIHB3bmVkUGFzc3dvcmRBcGlDYWxsRGVib3VuY2VUaW1lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPFBhc3N3b3JkQ2hlY2tlckNvbmZpZz4+KCdQQVNTV09SRF9DSEVDS0VSX0NPTkZJRycpO1xuIl19
|
package/esm2022/public_api.mjs
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of password-checker-lib
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/password-checker-lib.directive';
|
|
5
|
-
export * from './lib/password-checker-lib.module';
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3Bhc3N3b3JkLWNoZWNrZXItbGliL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBwYXNzd29yZC1jaGVja2VyLWxpYlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3Bhc3N3b3JkLWNoZWNrZXItbGliLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUnO1xuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public_api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpYW5ndWxhci1wYXNzd29yZC1jaGVja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL3RyaWFuZ3VsYXItcGFzc3dvcmQtY2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuIl19
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { AbstractControl, AsyncValidator, ValidationErrors } from '@angular/forms';
|
|
3
|
-
import { HttpClient } from '@angular/common/http';
|
|
4
|
-
import { Partial, PasswordCheckerConfig } from './password-checker.config';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class PasswordCheckerLibDirective implements AsyncValidator {
|
|
7
|
-
private http;
|
|
8
|
-
pwnedPasswordApi: string;
|
|
9
|
-
pwnedPasswordMinimumOccurrenceForError: number;
|
|
10
|
-
pwnedPasswordApiCallDebounceTime: number;
|
|
11
|
-
constructor(http: HttpClient, config: Partial<PasswordCheckerConfig>);
|
|
12
|
-
validate(control: AbstractControl): Observable<ValidationErrors | null>;
|
|
13
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerLibDirective, [null, { optional: true; }]>;
|
|
14
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordCheckerLibDirective, "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", never, { "pwnedPasswordApi": { "alias": "pwnedPasswordApi"; "required": false; }; "pwnedPasswordMinimumOccurrenceForError": { "alias": "pwnedPasswordMinimumOccurrenceForError"; "required": false; }; "pwnedPasswordApiCallDebounceTime": { "alias": "pwnedPasswordApiCallDebounceTime"; "required": false; }; }, {}, never, never, true, never>;
|
|
15
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ModuleWithProviders } from '@angular/core';
|
|
2
|
-
import { Partial, PasswordCheckerConfig } from './password-checker.config';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./password-checker-lib.directive";
|
|
5
|
-
export declare class PasswordCheckerModule {
|
|
6
|
-
static forRoot(config?: Partial<PasswordCheckerConfig>): ModuleWithProviders<PasswordCheckerModule>;
|
|
7
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerModule, never>;
|
|
8
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<PasswordCheckerModule, never, [typeof i1.PasswordCheckerLibDirective], [typeof i1.PasswordCheckerLibDirective]>;
|
|
9
|
-
static ɵinj: i0.ɵɵInjectorDeclaration<PasswordCheckerModule>;
|
|
10
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
export type Partial<T> = {
|
|
3
|
-
[P in keyof T]?: T[P];
|
|
4
|
-
};
|
|
5
|
-
export interface PasswordCheckerConfig {
|
|
6
|
-
pwnedPasswordApi: string;
|
|
7
|
-
pwnedPasswordMinimumOccurrenceForError: number;
|
|
8
|
-
pwnedPasswordApiCallDebounceTime: number;
|
|
9
|
-
}
|
|
10
|
-
export declare const PasswordCheckerConfigValue: InjectionToken<Partial<PasswordCheckerConfig>>;
|
package/public_api.d.ts
DELETED