angular-password-strength-meter
Version:
[](https://github.com/antoantonyk/password-strength-meter/actions/workflows/ci-workflow.yml) [
{"version":3,"file":"angular-password-strength-meter.mjs","sources":["../../../projects/password-strength-meter/src/lib/password-strength-meter-service.ts","../../../projects/password-strength-meter/src/lib/psm-progress-bar.directive.ts","../../../projects/password-strength-meter/src/lib/password-strength-meter.component.ts","../../../projects/password-strength-meter/src/lib/password-strength-meter.component.html","../../../projects/password-strength-meter/src/public-api.ts","../../../projects/password-strength-meter/src/angular-password-strength-meter.ts"],"sourcesContent":["export interface FeedbackResult {\n score: number | null;\n feedback: Feedback | null;\n}\n\nexport interface Feedback {\n warning: string | null;\n suggestions: string[];\n}\n\nexport abstract class IPasswordStrengthMeterService {\n abstract score(password: string): number;\n\n abstract scoreWithFeedback(password: string): FeedbackResult;\n\n abstract scoreAsync(password: string): Promise<number>;\n\n abstract scoreWithFeedbackAsync(password: string): Promise<FeedbackResult>;\n}\n","/* eslint-disable @angular-eslint/directive-selector */\nimport {\n Directive,\n ElementRef,\n HostBinding,\n Input,\n OnChanges,\n Renderer2,\n SimpleChanges,\n} from '@angular/core';\n\n@Directive({\n standalone: true,\n selector: '.psm__progress-bar',\n})\nexport class PSMProgressBarDirective implements OnChanges {\n @Input({ required: true })\n numberOfProgressBarItems!: number;\n\n @Input({ required: true })\n passwordStrength!: number | null;\n\n @Input()\n colors: string[] = [];\n\n @HostBinding('attr.aria-valuemin') minProgressVal = 0;\n\n @HostBinding('attr.aria-valuemax') maxProgressVal = 100;\n\n @HostBinding('attr.aria-valuenow') currentProgressVal = 0;\n\n @HostBinding('attr.data-strength') dataPasswordStrength = 0;\n\n progressBar: HTMLDivElement;\n\n private defaultColors = [\n 'darkred',\n 'orangered',\n 'orange',\n 'yellowgreen',\n 'green',\n ];\n\n constructor(\n private renderer: Renderer2,\n private el: ElementRef<HTMLDivElement>\n ) {\n this.progressBar = this.el.nativeElement;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['numberOfProgressBarItems']) {\n this.setProgressBarItems();\n }\n\n this.setProgressBar();\n }\n\n setProgressBarItems(): void {\n const progressBarItemContainer = this.progressBar.querySelector(\n '.psm__progress-bar-items'\n );\n const width = 100 / this.numberOfProgressBarItems!;\n\n progressBarItemContainer?.childNodes.forEach((item) => {\n this.renderer.removeChild(progressBarItemContainer, item);\n });\n\n Array(this.numberOfProgressBarItems)\n .fill(1)\n .forEach(() => {\n const progressBarItem = this.renderer.createElement('div');\n this.renderer.addClass(progressBarItem, 'psm__progress-bar-item');\n this.renderer.setStyle(progressBarItem, 'width', `${width}%`);\n this.renderer.appendChild(progressBarItemContainer, progressBarItem);\n });\n }\n\n setProgressBar(): void {\n const progressBarOverlayWidth = this.getFillMeterWidth(\n this.passwordStrength\n );\n const progressBarOverlayWidthInPx = `${progressBarOverlayWidth}%`;\n\n const progressLevelBasedOnItems =\n (progressBarOverlayWidth / 100) * this.numberOfProgressBarItems;\n const progressBarOverlayColor = this.getMeterFillColor(\n progressLevelBasedOnItems\n );\n\n this.dataPasswordStrength = this.passwordStrength || 0;\n this.currentProgressVal = progressBarOverlayWidth;\n\n const overlayElement = this.progressBar.querySelector<HTMLDivElement>(\n '.psm__progress-bar-overlay'\n );\n\n if (overlayElement) {\n this.renderer.setStyle(\n overlayElement,\n 'width',\n progressBarOverlayWidthInPx\n );\n\n this.renderer.setStyle(\n overlayElement,\n 'background-color',\n progressBarOverlayColor\n );\n }\n }\n\n getFillMeterWidth(strength: number | null | undefined): number {\n if (strength === null || strength === undefined) {\n return 0;\n }\n\n const strengthInPercentage =\n strength !== null ? ((strength + 1) / 5) * 100 : 0;\n\n const roundedStrengthInPercentage = this.getRoundedStrength(\n strengthInPercentage,\n 100 / this.numberOfProgressBarItems\n );\n return roundedStrengthInPercentage;\n }\n\n getMeterFillColor(progressLevel: number): string {\n if (\n !progressLevel ||\n progressLevel <= 0 ||\n (progressLevel > this.colors.length &&\n progressLevel > this.defaultColors.length)\n ) {\n return this.colors[0] ? this.colors[0] : this.defaultColors[0];\n }\n\n const index = progressLevel - 1;\n\n return this.colors[index] ? this.colors[index] : this.defaultColors[index];\n }\n\n private getRoundedStrength(strength: number, roundTo: number): number {\n return Math.round(strength / roundTo) * roundTo;\n }\n}\n","/* eslint-disable @angular-eslint/component-selector */\nimport {\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n Output,\n EventEmitter,\n HostBinding,\n inject,\n booleanAttribute,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n Subject,\n debounceTime,\n distinctUntilChanged,\n of,\n switchMap,\n} from 'rxjs';\n\nimport {\n Feedback,\n FeedbackResult,\n IPasswordStrengthMeterService,\n} from './password-strength-meter-service';\nimport { PSMProgressBarDirective } from './psm-progress-bar.directive';\n\n@Component({\n standalone: true,\n selector: 'password-strength-meter',\n templateUrl: './password-strength-meter.component.html',\n styleUrls: ['./password-strength-meter.component.scss'],\n imports: [PSMProgressBarDirective],\n})\nexport class PasswordStrengthMeterComponent implements OnChanges {\n @Input({ required: true }) password!: string;\n\n @Input() minPasswordLength = 8;\n\n @Input({ transform: booleanAttribute }) enableFeedback = false;\n\n @Input({ transform: booleanAttribute }) enableAsync = false;\n\n @Input() colors: string[] = [];\n\n @Input() numberOfProgressBarItems = 5;\n\n @Output() strengthChange = new EventEmitter<number | null>();\n\n @HostBinding('class') baseClass = 'psm';\n\n private passwordStrengthMeterService: IPasswordStrengthMeterService = inject(\n IPasswordStrengthMeterService\n );\n\n passwordStrength: number | null = null;\n feedback: Feedback | null = null;\n\n private prevPasswordStrength: number | null = null;\n private passwordChangeObservable$ = new Subject<string>();\n\n constructor() {\n this.init();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['password']) {\n this.passwordChangeObservable$.next(this.password);\n }\n }\n\n private init(): void {\n this.passwordChangeObservable$\n .pipe(\n distinctUntilChanged(),\n debounceTime(100),\n switchMap((value) => {\n if (!value) {\n return of({ score: null, feedback: null });\n }\n\n if (value && value.length < this.minPasswordLength) {\n return of({ score: 0, feedback: null });\n }\n\n if (this.enableAsync) {\n return this.calculateScoreAsync(value);\n }\n\n const result = this.calculateScore(value);\n return of(result);\n }),\n takeUntilDestroyed()\n )\n .subscribe((result: FeedbackResult) => {\n this.passwordStrength = result.score;\n this.feedback = result.feedback;\n\n // Only emit the passwordStrength if it changed\n if (this.prevPasswordStrength !== this.passwordStrength) {\n this.strengthChange.emit(this.passwordStrength);\n this.prevPasswordStrength = this.passwordStrength;\n }\n });\n }\n\n private calculateScore(value: string): FeedbackResult {\n if (this.enableFeedback) {\n return this.passwordStrengthMeterService.scoreWithFeedback(value);\n }\n\n const feedbackResult = {\n score: this.passwordStrengthMeterService.score(value),\n feedback: null,\n };\n\n return feedbackResult;\n }\n\n private calculateScoreAsync(value: string): Promise<FeedbackResult> {\n if (this.enableFeedback) {\n return this.passwordStrengthMeterService.scoreWithFeedbackAsync(value);\n }\n\n return this.passwordStrengthMeterService\n .scoreAsync(value)\n .then((result) => ({\n score: result,\n feedback: null,\n }));\n }\n}\n","<div\n class=\"psm__progress-bar\"\n role=\"progressbar\"\n [passwordStrength]=\"passwordStrength\"\n [numberOfProgressBarItems]=\"numberOfProgressBarItems\"\n [colors]=\"colors\"\n>\n <div class=\"psm__progress-bar-items\"></div>\n <div class=\"psm__progress-bar-overlay\"></div>\n</div>\n\n@if(enableFeedback && feedback) {\n\n @if(feedback.warning) {\n <small class=\"psm__feedback\">\n {{ feedback.warning }}\n </small>\n }\n\n @if(feedback.suggestions && feedback.suggestions.length) {\n <small class=\"psm__suggestion\">\n @for (suggestion of feedback.suggestions; track suggestion; let isLast = $last) {\n {{ suggestion }}{{ isLast ? '' : ' ' }}\n }\n </small>\n }\n}\n\n","/*\n * Public API Surface of password-strength-meter\n */\n\nexport * from './lib/password-strength-meter.component';\nexport * from './lib/psm-progress-bar.directive';\nexport * from './lib/password-strength-meter-service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}