Skip to content

Commit

Permalink
Adding locale support to textual dates
Browse files Browse the repository at this point in the history
  • Loading branch information
Lewis Maitland committed Jul 31, 2016
1 parent 284369f commit 69b5bb6
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 19 deletions.
9 changes: 7 additions & 2 deletions README.md
Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions src/sanitizor/Sanitization.ts
Expand Up @@ -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();
},
Expand Down Expand Up @@ -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] ] ]( <any>value );
}
return value;
}
Expand Down
6 changes: 3 additions & 3 deletions src/validator/CreditCardValidator.ts
Expand Up @@ -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);
},
Expand Down Expand Up @@ -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;
}
Expand Down
7 changes: 6 additions & 1 deletion src/validator/IValidationOptions.ts
Expand Up @@ -11,13 +11,18 @@ export interface INumberValidationOptions {
Max?: number;
}

export interface ITimeValidationOptions {
Format: string;
Locale?: string;
}

export interface IValidationOptions {
Number?: INumberValidationOptions;
String?: IStringValidationOptions;
Email?: boolean;
CreditCard?: CreditCardType[];
Pattern?: RegExp;
URL?: boolean;
Time?: string;
Time?: ITimeValidationOptions;
Postcode? : PostcodeLocale[];
}
2 changes: 1 addition & 1 deletion src/validator/PostcodeValidator.ts
Expand Up @@ -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));
}
Expand Down
8 changes: 4 additions & 4 deletions 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;
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion 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 {
Expand Down
36 changes: 31 additions & 5 deletions test/TimeValidatorTest.ts
Expand Up @@ -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";
}
Expand All @@ -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";
}
Expand All @@ -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";
}
Expand All @@ -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";
}
Expand All @@ -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";
}
Expand Down
1 change: 1 addition & 0 deletions tsconfig.json
Expand Up @@ -4,6 +4,7 @@
"module": "commonjs",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noImplicitAny": false,
"sourceMap": true,
"outDir" : "build"
},
Expand Down

0 comments on commit 69b5bb6

Please sign in to comment.