Skip to content

Commit

Permalink
Merge pull request #5 from Theshedman/feat/functional-interface
Browse files Browse the repository at this point in the history
Refactor password validator and add fluent API
  • Loading branch information
UcheSylvester authored Nov 28, 2023
2 parents c2565a6 + 4beb420 commit ed93ac6
Show file tree
Hide file tree
Showing 14 changed files with 227 additions and 93 deletions.
24 changes: 12 additions & 12 deletions .run/Password Validation Test With Coverage.run.xml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Password Validation Test With Coverage" type="JavaScriptTestRunnerJest">
<config-file value="$PROJECT_DIR$/jest.config.ts" />
<node-interpreter value="project" />
<node-options value="--experimental-vm-modules" />
<jest-package value="$PROJECT_DIR$/node_modules/jest" />
<working-dir value="$PROJECT_DIR$" />
<jest-options value="--coverage" />
<envs />
<scope-kind value="ALL" />
<method v="2" />
</configuration>
</component>
<configuration default="false" name="Password Validation Test With Coverage" type="JavaScriptTestRunnerJest">
<config-file value="$PROJECT_DIR$/jest.config.ts"/>
<node-interpreter value="project"/>
<node-options value="--experimental-vm-modules"/>
<jest-package value="$PROJECT_DIR$/node_modules/jest"/>
<working-dir value="$PROJECT_DIR$"/>
<jest-options value="--coverage"/>
<envs/>
<scope-kind value="ALL"/>
<method v="2"/>
</configuration>
</component>
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
"version": "0.0.0-semantic-release",
"description": "@password-validator/core is a JavaScript/TypeScript library that helps enforce strong password policies in applications, improving security by validating password features like length, character types, and consistency with best practices.",
"type": "module",
"main": "./dist/cjs/src/password/validator/main.js",
"module": "./dist/esm/src/password/validator/main.js",
"main": "./dist/cjs/src/password/main.js",
"module": "./dist/esm/src/password/main.js",
"exports": {
"types": "./dist/types/src/password/validator/main.d.ts",
"import": "./dist/esm/src/password/validator/main.js",
"require": "./dist/cjs/src/password/validator/main.js"
"types": "./dist/types/src/password/main.d.ts",
"import": "./dist/esm/src/password/main.js",
"require": "./dist/cjs/src/password/main.js"
},
"scripts": {
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
Expand Down
89 changes: 89 additions & 0 deletions src/password/api/fluent/FluentPasswordValidator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { DigitValidator } from "../../validator/DigitValidator.js";
import { ValidatorManager } from "../standard/ValidatorManager.js";
import { ValidationResult } from "../../validator/ValidationResult.js";
import { PasswordValidator } from "../../validator/PasswordValidator.js";
import { UpperCaseValidator } from "../../validator/UpperCaseValidator.js";
import { MinLengthValidator } from "../../validator/MinLengthValidator.js";
import { MaxLengthValidator } from "../../validator/MaxLengthValidator.js";
import { LowerCaseValidator } from "../../validator/LowerCaseValidator.js";
import { PasswordValidatorManager } from "../standard/PasswordValidatorManager.js";
import { NoSpaceCharacterValidator } from "../../validator/NoSpaceCharacterValidator.js";
import { SpecialCharacterValidator } from "../../validator/SpecialCharacterValidator.js";

export class FluentPasswordValidator {
private digitValidator: DigitValidator | undefined;
private lowerCaseValidator: LowerCaseValidator | undefined;
private minLengthValidator: MinLengthValidator | undefined;
private maxLengthValidator: MaxLengthValidator | undefined;
private upperCaseValidator: UpperCaseValidator | undefined;
private noSpaceCharacterValidator: NoSpaceCharacterValidator | undefined;
private specialCharacterValidator: SpecialCharacterValidator | undefined;

public min(passwordRule: number): this {
this.minLengthValidator = new MinLengthValidator(passwordRule);

return this;
}

public max(passwordRule: number): this {
this.maxLengthValidator = new MaxLengthValidator(passwordRule);

return this;
}

public lower(passwordRule: number): this {
this.lowerCaseValidator = new LowerCaseValidator(passwordRule);

return this;
}

public upper(passwordRule: number): this {
this.upperCaseValidator = new UpperCaseValidator(passwordRule);

return this;
}

public digit(passwordRule: number): this {
this.digitValidator = new DigitValidator(passwordRule);

return this;
}

public noSpace(): this {
this.noSpaceCharacterValidator = new NoSpaceCharacterValidator();

return this;
}

public specialCharacter(passwordRule: number): this {
this.specialCharacterValidator = new SpecialCharacterValidator(
passwordRule,
);

return this;
}

public validate(password: string): ValidationResult {
const validators: Array<PasswordValidator> = [
this.digitValidator as PasswordValidator,
this.minLengthValidator as PasswordValidator,
this.maxLengthValidator as PasswordValidator,
this.lowerCaseValidator as PasswordValidator,
this.upperCaseValidator as PasswordValidator,
this.noSpaceCharacterValidator as PasswordValidator,
this.specialCharacterValidator as PasswordValidator,
];

const pm: ValidatorManager = PasswordValidatorManager.standard();

for (const validator of validators) {
if (!validator) {
continue;
}

pm.register(validator);
}

return pm.validate(password);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
import { ValidatorManager } from "./ValidatorManager.js";
import { ValidationResult } from "./ValidationResult.js";
import { PasswordValidator } from "./PasswordValidator.js";
import { ValidationResult } from "../../validator/ValidationResult.js";
import { PasswordValidator } from "../../validator/PasswordValidator.js";
import { PasswordValidatorConflictException } from "./PasswordValidatorConflictException.js";
import { FluentPasswordValidator } from "../fluent/FluentPasswordValidator.js";

export class PasswordValidatorManager implements ValidatorManager {
private readonly registeredValidators: Array<PasswordValidator>;
private readonly registeredValidators: Array<PasswordValidator> = Array.of();

constructor() {
this.registeredValidators = Array.of();
private constructor() {}

public static standard(): PasswordValidatorManager {
return new PasswordValidatorManager();
}

public static fluent(): FluentPasswordValidator {
return new FluentPasswordValidator();
}

public register(...validators: Array<PasswordValidator>): void {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Validator } from "./Validator.js";
import { PasswordValidator } from "./PasswordValidator.js";
import { Validator } from "../../validator/Validator.js";
import { PasswordValidator } from "../../validator/PasswordValidator.js";

export interface ValidatorManager extends Validator {
register(...validators: Array<PasswordValidator>): void;
Expand Down
15 changes: 15 additions & 0 deletions src/password/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export * from "./validator/Util.js";
export * from "./validator/Validator.js";
export * from "./validator/DigitValidator.js";
export * from "./validator/ValidationResult.js";
export * from "./api/standard/ValidatorManager.js";
export * from "./validator/ValidatorCategory.js";
export * from "./validator/PasswordValidator.js";
export * from "./validator/LowerCaseValidator.js";
export * from "./validator/MaxLengthValidator.js";
export * from "./validator/UpperCaseValidator.js";
export * from "./validator/MinLengthValidator.js";
export * from "./validator/NoSpaceCharacterValidator.js";
export * from "./api/standard/PasswordValidatorManager.js";
export * from "./validator/SpecialCharacterValidator.js";
export * from "./api/standard/PasswordValidatorConflictException.js";
20 changes: 0 additions & 20 deletions src/password/usages/PasswordValidatorManagerUsage.ts

This file was deleted.

10 changes: 10 additions & 0 deletions src/password/usages/fluent/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { ValidationResult } from "../../validator/ValidationResult.js";
import { PasswordValidatorManager } from "../../api/standard/PasswordValidatorManager.js";

const result: ValidationResult = PasswordValidatorManager.fluent()
.min(6)
.digit(1)
.specialCharacter(1)
.validate("eihi2kd#");

console.log({ result });
20 changes: 20 additions & 0 deletions src/password/usages/standard/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { LowerCaseValidator } from "../../validator/LowerCaseValidator.js";
import { MinLengthValidator } from "../../validator/MinLengthValidator.js";
import { UpperCaseValidator } from "../../validator/UpperCaseValidator.js";
import { NoSpaceCharacterValidator } from "../../validator/NoSpaceCharacterValidator.js";
import { SpecialCharacterValidator } from "../../validator/SpecialCharacterValidator.js";
import { PasswordValidatorManager } from "../../api/standard/PasswordValidatorManager.js";

const pm = PasswordValidatorManager.standard();

const minLength = new MinLengthValidator(6);
const specialChar = new SpecialCharacterValidator(1);
const uppercase = new UpperCaseValidator(1);
const lowercase = new LowerCaseValidator(1);
const noSpace = new NoSpaceCharacterValidator();

pm.register(minLength, specialChar, uppercase, lowercase, noSpace);

const results = pm.validate("a*bcUdsdfdsf");

console.log({ results });
15 changes: 0 additions & 15 deletions src/password/validator/main.ts

This file was deleted.

Loading

0 comments on commit ed93ac6

Please sign in to comment.