Skip to content

Commit bdec257

Browse files
authored
Merge pull request #47 from Lemoncode/issue45-factory_based_global_object
Replace inheritance with factory based and support for validationConstraints (global object)
2 parents af8ff25 + 37b0b51 commit bdec257

22 files changed

+670
-428
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ lib/README.md
88
lib/ReadmeResources/
99
lib/coverage/
1010
yarn.lock
11-
.vscode/
11+
.vscode/
12+
npm-debug.log

lib/karma.conf.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module.exports = function (config) {
22
config.set({
33
basePath: '',
4-
frameworks: ['mocha', 'chai-as-promised', 'chai'],
4+
frameworks: ['mocha', 'chai-as-promised', 'chai', 'sinon'],
55
files: [
66
'./test/test_index.js'
77
],

lib/lcformvalidation.d.ts

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,34 @@
1-
import {} from 'core-js';
1+
export class FieldValidationResult {
2+
key?: string;
3+
type: string;
4+
succeeded: boolean;
5+
errorMessage: string;
6+
}
27

3-
export class FormNameToFieldNameMapping {
4-
formFieldName: string;
5-
vmFieldName: string;
6-
}
8+
export class FormValidationResult {
9+
succeeded: boolean;
10+
fieldErrors: Array<FieldValidationResult>;
11+
formGlobalErrors: Array<FieldValidationResult>;
12+
}
713

8-
export class FieldValidation {
9-
validationFn: (vm, value) => Promise<FieldValidationResult>;
10-
filter: any;
11-
}
14+
interface FormValidation {
15+
validateField(vm: any, key: string, value: any, filter?: any): Promise<FieldValidationResult>;
16+
validateForm(vm: any): Promise<FormValidationResult>;
17+
isValidationInProgress(): boolean;
18+
isFormDirty(): boolean;
19+
isFormPristine(): boolean;
20+
addFieldValidation(key: string, validation: (value: string, vm: any) => FieldValidationResult, filter?: any): FormValidation;
21+
addFieldValidationAsync(key: string, validation: (value: string, vm: any) => Promise<FieldValidationResult>, filter?: any): FormValidation;
22+
}
1223

13-
export class FieldValidationResult {
14-
key : string;
15-
type : string;
16-
succeeded : boolean;
17-
errorMessage : string;
18-
constructor();
19-
}
24+
export type ValidationResult = FieldValidationResult | Promise<FieldValidationResult>;
2025

21-
export class FormValidationResult {
22-
succeeded: boolean;
23-
fieldErrors : Array<FieldValidationResult>;
24-
formGlobalErrors: Array<FieldValidationResult>;
25-
constructor();
26-
}
26+
export interface FormValidationFunction {
27+
(vm: any): ValidationResult;
28+
}
2729

28-
export interface IValidationEngine {
29-
isFormDirty(): boolean;
30-
isFormPristine(): boolean;
31-
validateFullForm(vm: any): Promise<FormValidationResult>;
32-
triggerFieldValidation(vm: any, key: string, value: any, filter?: any): Promise<FieldValidationResult>;
33-
addFieldValidation(key : string, validation : (vm, value) => FieldValidationResult, filter? : any): IValidationEngine;
34-
addFieldValidationAsync(key : string, validation : (vm, value) => Promise<FieldValidationResult>, filter? : any): IValidationEngine;
35-
addFormValidation(validation : (vm) => FieldValidationResult);
36-
addFormValidationAsync(validation : (vm) => Promise<FieldValidationResult>);
37-
isValidationInProgress(): boolean;
38-
}
30+
export interface ValidationConstraints extends Object {
31+
global?: FormValidationFunction[];
32+
}
3933

40-
export class BaseFormValidation {
41-
_validationEngine: IValidationEngine;
42-
constructor();
43-
validateField(vm: any, key: string, value: any, filter?: any): Promise<FieldValidationResult>;
44-
validateForm(vm: any): Promise<FormValidationResult>;
45-
}
34+
export function createFormValidation(validationCredentials: ValidationConstraints): FormValidation;

lib/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929
"license": "MIT",
3030
"homepage": "https://github.com/Lemoncode/lcFormValidation/blob/master/README.md",
3131
"devDependencies": {
32-
"@types/chai": "^3.4.34",
33-
"@types/chai-as-promised": "0.0.29",
32+
"@types/chai": "^3.4.35",
33+
"@types/chai-as-promised": "^0.0.30",
3434
"@types/core-js": "^0.9.34",
35-
"@types/mocha": "^2.2.32",
35+
"@types/karma-chai-sinon": "^0.1.5",
36+
"@types/mocha": "^2.2.39",
3637
"@types/sinon": "^1.16.31",
3738
"chai": "^3.5.0",
3839
"chai-as-promised": "^5.3.0",
@@ -45,6 +46,7 @@
4546
"karma-chrome-launcher": "^2.0.0",
4647
"karma-mocha": "^0.2.2",
4748
"karma-phantomjs-launcher": "^1.0.0",
49+
"karma-sinon": "^1.0.5",
4850
"karma-sourcemap-loader": "^0.3.7",
4951
"karma-webpack": "^1.7.0",
5052
"mocha": "^2.4.5",

lib/src/baseFormValidation.ts

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,76 @@
1-
import { } from 'core-js';
2-
import { IValidationEngine, ValidationEngine } from './validationEngine';
3-
import { FieldValidationResult, FormValidationResult } from './entities';
1+
import { ValidationEngine } from './validationEngine';
2+
import {
3+
ValidationConstraints,
4+
FormValidationFunction,
5+
FieldValidationResult,
6+
FormValidationResult,
7+
} from './entities';
48
import { consts } from './consts';
59

6-
export class BaseFormValidation {
7-
_validationEngine: IValidationEngine;
10+
interface FormValidation {
11+
validateField(vm: any, key: string, value: any, filter?: any): Promise<FieldValidationResult>;
12+
validateForm(vm: any): Promise<FormValidationResult>;
13+
isValidationInProgress(): boolean;
14+
isFormDirty(): boolean;
15+
isFormPristine(): boolean;
16+
addFieldValidation(key: string, validation: (value: string, vm: any) => FieldValidationResult, filter?: any): FormValidation;
17+
addFieldValidationAsync(key: string, validation: (value: string, vm: any) => Promise<FieldValidationResult>, filter?: any): FormValidation;
18+
}
19+
20+
export class BaseFormValidation implements FormValidation {
21+
private validationEngine: ValidationEngine;
22+
constructor(validationConstraints: ValidationConstraints) {
23+
this.validationEngine = new ValidationEngine();
24+
this.parseValidationConstraints(validationConstraints);
25+
}
26+
27+
private parseValidationConstraints(validationConstraints: ValidationConstraints) {
28+
if (validationConstraints && typeof validationConstraints === 'object') {
29+
if (validationConstraints.global && validationConstraints.global instanceof Array) {
30+
this.addFormValidationFunctions(validationConstraints.global);
31+
}
32+
}
33+
}
34+
35+
private addFormValidationFunctions(validationFunctions: FormValidationFunction[]) {
36+
validationFunctions.forEach((validationFunction: FormValidationFunction) => {
37+
if (typeof validationFunction === 'function') {
38+
this.validationEngine.addFormValidation(validationFunction);
39+
}
40+
});
41+
}
42+
43+
validateField(vm: any, key: string, value: any, filter?: any): Promise<FieldValidationResult> {
44+
return this.validationEngine.validateSingleField(vm, key, value, filter);
45+
}
46+
47+
validateForm(vm: any): Promise<FormValidationResult> {
48+
return this.validationEngine.validateForm(vm);
49+
}
50+
51+
isValidationInProgress(): boolean {
52+
return this.validationEngine.isValidationInProgress();
53+
}
54+
55+
isFormDirty(): boolean {
56+
return this.validationEngine.isFormDirty();
57+
}
858

9-
constructor() {
10-
this._validationEngine = new ValidationEngine();
59+
isFormPristine(): boolean {
60+
return this.validationEngine.isFormPristine();
1161
}
1262

13-
public validateField(vm: any, key: string, value: any, filter: any = consts.defaultFilter): Promise<FieldValidationResult> {
14-
return this._validationEngine.triggerFieldValidation(vm, key, value, filter);
63+
addFieldValidation(key: string, validationFunction: (value: string, vm: any) => FieldValidationResult): FormValidation {
64+
this.validationEngine.addFieldValidation(key, validationFunction);
65+
return this;
1566
}
1667

17-
public validateForm(vm: any): Promise<FormValidationResult> {
18-
return this._validationEngine.validateFullForm(vm);
68+
addFieldValidationAsync(key: string, validationFunction: (value: string, vm: any) => Promise<FieldValidationResult>): FormValidation {
69+
this.validationEngine.addFieldValidationAsync(key, validationFunction);
70+
return this;
1971
}
2072
}
73+
74+
export function createFormValidation(validationConstraints: ValidationConstraints): FormValidation {
75+
return new BaseFormValidation(validationConstraints);
76+
}

lib/src/entities.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
1-
import { } from 'core-js';
2-
3-
export class FormNameToFieldNameMapping {
4-
formFieldName: string;
5-
vmFieldName: string;
6-
}
7-
81
export class FieldValidation {
9-
public validationFn: (vm, value) => Promise<FieldValidationResult>;
2+
public validationFn: (value, vm) => Promise<FieldValidationResult>;
103
public filter: any;
114
}
125

@@ -34,3 +27,13 @@ export class FormValidationResult {
3427
this.fieldErrors = [];
3528
}
3629
}
30+
31+
export type ValidationResult = FieldValidationResult | Promise<FieldValidationResult>;
32+
33+
export interface FormValidationFunction {
34+
(vm: any): ValidationResult;
35+
}
36+
37+
export interface ValidationConstraints extends Object {
38+
global?: FormValidationFunction[];
39+
}

lib/src/entitiesMapper.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { } from 'core-js';
21
import { FieldValidation, FieldValidationResult } from './entities';
32

43
export class EntitiesMapper {

lib/src/index.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { FormNameToFieldNameMapping, FormValidationResult, FieldValidationResult } from "./entities";
2-
import { BaseFormValidation } from './baseFormValidation';
1+
import { FormValidationResult, FieldValidationResult } from "./entities";
2+
import { createFormValidation } from './baseFormValidation';
33

44
export {
5-
FormNameToFieldNameMapping,
65
FormValidationResult,
76
FieldValidationResult,
8-
BaseFormValidation
7+
createFormValidation,
98
}

0 commit comments

Comments
 (0)