@eresearchqut/angular-password-strength-meter
Version:
[](https://github.com/eresearchqut/angular-password-strength-meter/actions/workflows/ci-workflow.yml) [
{"version":3,"file":"eresearchqut-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/eresearchqut-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 { Directive, ElementRef, HostBinding, Input, OnChanges, Renderer2, SimpleChanges, inject } from '@angular/core';\n\n@Directive({\n standalone: true,\n selector: '.psm__progress-bar',\n})\nexport class PSMProgressBarDirective implements OnChanges {\n private renderer = inject(Renderer2);\n private el = inject<ElementRef<HTMLDivElement>>(ElementRef);\n\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 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 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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"}