@triangular/password-checker 14.0.0 → 21.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
@@ -23,6 +23,8 @@ Supported Angular Versions
23
23
  | 17.x | 12.0.0 |
24
24
  | 18.x | 13.0.0 - 13.2.0 |
25
25
  | 19.x | 14.0.0 |
26
+ | 20.x | 20.0.0 |
27
+ | 21.x | 21.0.0 |
26
28
 
27
29
 
28
30
  ### Step 1: Install
@@ -2,15 +2,15 @@ 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, Directive, Optional, Inject, Input, NgModule } from '@angular/core';
6
- import * as i1 from '@angular/common/http';
7
- import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
5
+ import { InjectionToken, inject, Input, Directive, NgModule } from '@angular/core';
6
+ import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
8
7
 
9
8
  const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
10
9
 
11
10
  class PasswordCheckerLibDirective {
12
- constructor(http, config) {
13
- this.http = http;
11
+ constructor() {
12
+ this.http = inject(HttpClient);
13
+ let config = inject(PasswordCheckerConfigValue, { optional: true });
14
14
  if (!config) {
15
15
  // default initialization in constructor didn't work.
16
16
  // conflict with @Optional()?
@@ -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: "19.0.1", 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: "19.0.1", type: PasswordCheckerLibDirective, isStandalone: true, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PasswordCheckerLibDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
49
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.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: "19.0.1", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
58
58
  type: Directive,
59
59
  args: [{
60
60
  // eslint-disable-next-line @angular-eslint/directive-selector
@@ -68,12 +68,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImpor
68
68
  ],
69
69
  standalone: true
70
70
  }]
71
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
72
- type: Optional
73
- }, {
74
- type: Inject,
75
- args: [PasswordCheckerConfigValue]
76
- }] }], propDecorators: { pwnedPasswordApi: [{
71
+ }], ctorParameters: () => [], propDecorators: { pwnedPasswordApi: [{
77
72
  type: Input
78
73
  }], pwnedPasswordMinimumOccurrenceForError: [{
79
74
  type: Input
@@ -93,11 +88,11 @@ class PasswordCheckerModule {
93
88
  ]
94
89
  };
95
90
  }
96
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
97
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.1", ngImport: i0, type: PasswordCheckerModule, imports: [PasswordCheckerLibDirective], exports: [PasswordCheckerLibDirective] }); }
98
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: PasswordCheckerModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
92
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.0", ngImport: i0, type: PasswordCheckerModule, imports: [PasswordCheckerLibDirective], exports: [PasswordCheckerLibDirective] }); }
93
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PasswordCheckerModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
99
94
  }
100
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: PasswordCheckerModule, decorators: [{
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: PasswordCheckerModule, decorators: [{
101
96
  type: NgModule,
102
97
  args: [{ declarations: [],
103
98
  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":"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"}
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, Input, inject } 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 private http = inject(HttpClient);\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor() {\n let config = inject<Partial<PasswordCheckerConfig>>(PasswordCheckerConfigValue, { optional: true });\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/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@triangular/password-checker",
3
- "version": "14.0.0",
3
+ "version": "21.0.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^19.0.0",
6
- "@angular/core": "^19.0.0"
5
+ "@angular/common": "^21.0.0",
6
+ "@angular/core": "^21.0.0"
7
7
  },
8
8
  "homepage": "https://password.akehir.com",
9
9
  "license": "MIT",
@@ -13,24 +13,24 @@
13
13
  },
14
14
  "bugs": {
15
15
  "url": "https://github.com/akehir/angular-password-checker/issues",
16
- "email": "raphael@ochsenbe.in"
16
+ "email": "raphael@akehir.com"
17
17
  },
18
18
  "author": {
19
19
  "name": "Raphael Ochsenbein",
20
- "email": "raphael@ochsenbe.in",
20
+ "email": "raphael@akehir.com",
21
21
  "url": "https://akehir.com/"
22
22
  },
23
23
  "dependencies": {
24
24
  "tslib": "^2.0.0"
25
25
  },
26
26
  "module": "fesm2022/triangular-password-checker.mjs",
27
- "typings": "index.d.ts",
27
+ "typings": "types/triangular-password-checker.d.ts",
28
28
  "exports": {
29
29
  "./package.json": {
30
30
  "default": "./package.json"
31
31
  },
32
32
  ".": {
33
- "types": "./index.d.ts",
33
+ "types": "./types/triangular-password-checker.d.ts",
34
34
  "default": "./fesm2022/triangular-password-checker.mjs"
35
35
  }
36
36
  },
@@ -0,0 +1,33 @@
1
+ import { Observable } from 'rxjs';
2
+ import { AsyncValidator, AbstractControl, ValidationErrors } from '@angular/forms';
3
+ import * as i0 from '@angular/core';
4
+ import { ModuleWithProviders } from '@angular/core';
5
+
6
+ declare class PasswordCheckerLibDirective implements AsyncValidator {
7
+ private http;
8
+ pwnedPasswordApi: string;
9
+ pwnedPasswordMinimumOccurrenceForError: number;
10
+ pwnedPasswordApiCallDebounceTime: number;
11
+ constructor();
12
+ validate(control: AbstractControl): Observable<ValidationErrors | null>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerLibDirective, never>;
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
+ }
16
+
17
+ type Partial<T> = {
18
+ [P in keyof T]?: T[P];
19
+ };
20
+ interface PasswordCheckerConfig {
21
+ pwnedPasswordApi: string;
22
+ pwnedPasswordMinimumOccurrenceForError: number;
23
+ pwnedPasswordApiCallDebounceTime: number;
24
+ }
25
+
26
+ declare class PasswordCheckerModule {
27
+ static forRoot(config?: Partial<PasswordCheckerConfig>): ModuleWithProviders<PasswordCheckerModule>;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerModule, never>;
29
+ static ɵmod: i0.ɵɵNgModuleDeclaration<PasswordCheckerModule, never, [typeof PasswordCheckerLibDirective], [typeof PasswordCheckerLibDirective]>;
30
+ static ɵinj: i0.ɵɵInjectorDeclaration<PasswordCheckerModule>;
31
+ }
32
+
33
+ export { PasswordCheckerLibDirective, PasswordCheckerModule };
package/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@triangular/password-checker" />
5
- export * from './public_api';
@@ -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
@@ -1,2 +0,0 @@
1
- export * from './lib/password-checker-lib.directive';
2
- export * from './lib/password-checker-lib.module';