From 69b5bb61ffd4bbc90a199ff60262e311f07e3125 Mon Sep 17 00:00:00 2001 From: Lewis Maitland Date: Sun, 31 Jul 2016 22:16:37 +0100 Subject: [PATCH] Adding locale support to textual dates --- README.md | 9 +++++-- src/sanitizor/Sanitization.ts | 4 ++-- src/validator/CreditCardValidator.ts | 6 ++--- src/validator/IValidationOptions.ts | 7 +++++- src/validator/PostcodeValidator.ts | 2 +- src/validator/Validation.ts | 8 +++---- src/validator/Validator.ts | 2 +- test/TimeValidatorTest.ts | 36 ++++++++++++++++++++++++---- tsconfig.json | 1 + 9 files changed, 56 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index f193919..6c61546 100644 --- a/README.md +++ b/README.md @@ -46,12 +46,17 @@ class User { private website: string; @Validate({ - Time: "dd/mm/YY" + Time: { + Format: "dd/mm/YY" + } }) private dob: string; @Validate({ - Time: "HH:MM:SS" + Time: { + Fromat: "HH:MM:SS", + Locale: "en" //If textual dates are supplied only english are valid + } }) private sentAt: string; diff --git a/src/sanitizor/Sanitization.ts b/src/sanitizor/Sanitization.ts index 414e29e..0f43c02 100644 --- a/src/sanitizor/Sanitization.ts +++ b/src/sanitizor/Sanitization.ts @@ -4,7 +4,7 @@ export enum SanitizationType { export class Sanitization { - private static _sanitizationRules = { + private static _sanitizationRules: any = { Trim: ( value: string ) => { return (typeof value !== "string") ? value: value.trim(); }, @@ -33,7 +33,7 @@ export class Sanitization { Sanitize( value: any ): any { for( var i = 0; i < this._sanitization.length; i++ ) { - value = Sanitization._sanitizationRules[ SanitizationType[ this._sanitization[i] ] ]( value ); + value = Sanitization._sanitizationRules[ SanitizationType[ this._sanitization[i] ] ]( value ); } return value; } diff --git a/src/validator/CreditCardValidator.ts b/src/validator/CreditCardValidator.ts index d7b0400..86a656a 100644 --- a/src/validator/CreditCardValidator.ts +++ b/src/validator/CreditCardValidator.ts @@ -4,7 +4,7 @@ export enum CreditCardType { export class CreditCardValidator { - private static _validateType = { + private static _validateType: any = { AmericanExpress: ( card: string ): boolean => { return (/^(34|37){1}.*$/.test(card) && card.length === 15); }, @@ -60,8 +60,8 @@ export class CreditCardValidator { if( CreditCardValidator._validateType.Any( card ) === false) { return false; } - var valid = false; - for( var i = 0; i < types.length; i++ ) { + var valid: boolean = false; + for( var i: number = 0; i < types.length; i++ ) { if( CreditCardValidator._validateType[ CreditCardType[ types[i] ] ]( card ) === true ) { valid = true; } diff --git a/src/validator/IValidationOptions.ts b/src/validator/IValidationOptions.ts index 35373cf..f767027 100644 --- a/src/validator/IValidationOptions.ts +++ b/src/validator/IValidationOptions.ts @@ -11,6 +11,11 @@ export interface INumberValidationOptions { Max?: number; } +export interface ITimeValidationOptions { + Format: string; + Locale?: string; +} + export interface IValidationOptions { Number?: INumberValidationOptions; String?: IStringValidationOptions; @@ -18,6 +23,6 @@ export interface IValidationOptions { CreditCard?: CreditCardType[]; Pattern?: RegExp; URL?: boolean; - Time?: string; + Time?: ITimeValidationOptions; Postcode? : PostcodeLocale[]; } \ No newline at end of file diff --git a/src/validator/PostcodeValidator.ts b/src/validator/PostcodeValidator.ts index 6fb7a36..9577dc0 100644 --- a/src/validator/PostcodeValidator.ts +++ b/src/validator/PostcodeValidator.ts @@ -3,7 +3,7 @@ export enum PostcodeLocale { } export class PostcodeValidator { - private static _postcodeLocale = { + private static _postcodeLocale: any = { GB: (postcode: string): boolean => { return (/^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/.test(postcode)); } diff --git a/src/validator/Validation.ts b/src/validator/Validation.ts index 3be9f8a..2603669 100644 --- a/src/validator/Validation.ts +++ b/src/validator/Validation.ts @@ -1,11 +1,11 @@ -import { IValidationOptions, INumberValidationOptions, IStringValidationOptions } from './IValidationOptions'; +import { IValidationOptions, INumberValidationOptions, IStringValidationOptions, ITimeValidationOptions } from './IValidationOptions'; import { CreditCardType, CreditCardValidator } from './CreditCardValidator'; import { PostcodeLocale, PostcodeValidator } from './PostcodeValidator'; import * as Moment from "moment"; export class Validation { - private static _validationRules = { + private static _validationRules: any = { Number: ( value: number, options: INumberValidationOptions ) => { if( typeof value !== "number" ) return false; @@ -38,8 +38,8 @@ export class Validation { URL: ( value: any ) => { return /\(?(?:(http|https|ftp):\/\/)?(?:((?:[^\W\s]|\.|-|[:]{1})+)@{1})?((?:www.)?(?:[^\W\s]|\.|-)+[\.][^\W\s]{2,4}|localhost(?=\/)|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::(\d*))?([\/]?[^\s\?]*[\/]{1})*(?:\/?([^\s\n\?\[\]\{\}\#]*(?:(?=\.)){1}|[^\s\n\?\[\]\{\}\.\#]*)?([\.]{1}[^\s\?\#]*)?)?(?:\?{1}([^\s\n\#\[\]]*))?([\#][^\s\n]*)?\)?/gi.test( value ); }, - Time: ( value:string, format:string ) => { - return Moment( value, format ).isValid(); + Time: ( value:string, options:ITimeValidationOptions ) => { + return Moment( value, options.Format, options.Locale ).isValid(); }, Postcode: (value: string, options: PostcodeLocale[]) => { return PostcodeValidator.Validate(value, options); diff --git a/src/validator/Validator.ts b/src/validator/Validator.ts index b923047..92062ce 100644 --- a/src/validator/Validator.ts +++ b/src/validator/Validator.ts @@ -1,5 +1,5 @@ import { Validation } from "./Validation"; -import { IValidationOptions, INumberValidationOptions, IStringValidationOptions } from "./IValidationOptions"; +import { IValidationOptions, INumberValidationOptions, IStringValidationOptions, ITimeValidationOptions } from "./IValidationOptions"; import "reflect-metadata"; export class Validator { diff --git a/test/TimeValidatorTest.ts b/test/TimeValidatorTest.ts index f5a5097..d393ca3 100644 --- a/test/TimeValidatorTest.ts +++ b/test/TimeValidatorTest.ts @@ -17,7 +17,9 @@ class TimeValidatorTestSuite { TimeValidatorValid() { class Test { @Validate({ - Time: "HH:MM:SS" + Time: { + Format: "HH:MM:SS" + } }) private _id: string = "10:09:15"; } @@ -30,7 +32,9 @@ class TimeValidatorTestSuite { TimeValidatorInvalidFormat() { class Test { @Validate({ - Time: "DD HH:MM:SS" + Time: { + Format: "DD HH:MM:SS" + } }) private _id: string = "10:09:15"; } @@ -43,7 +47,9 @@ class TimeValidatorTestSuite { TimeValidatorValidGBDate() { class Test { @Validate({ - Time: "DD-MM-YYYY" + Time: { + Format: "DD-MM-YYYY" + } }) private _id: string = "20-09-2015"; } @@ -56,7 +62,9 @@ class TimeValidatorTestSuite { TimeValidatorValidUSDate() { class Test { @Validate({ - Time: "MM-DD-YYYY" + Time: { + Format: "MM-DD-YYYY" + } }) private _id: string = "10-20-2015"; } @@ -65,11 +73,29 @@ class TimeValidatorTestSuite { Chai.assert( Validator.Valid( t ) ); } + @test("Time validator invalid English text date") + TimeValidatorInvalidENDate() { + class Test { + @Validate({ + Time: { + Format: "LLLL", + Locale: "en" + } + }) + private _id: string = "Freitag, 24. Juni 2016 01:42"; + } + + var t = new Test(); + Chai.assert( Validator.Valid( t ) == false ); + } + @test("Time validator invalid") TimeValidatorInvalid() { class Test { @Validate({ - Time: "HH:MM:SS" + Time: { + Format: "HH:MM:SS" + } }) private _id: string = "zzzz"; } diff --git a/tsconfig.json b/tsconfig.json index ef2f4ff..688181c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "module": "commonjs", "emitDecoratorMetadata": true, "experimentalDecorators": true, + "noImplicitAny": false, "sourceMap": true, "outDir" : "build" },