diff --git a/plugins/Validation/src/Validation.ts b/plugins/Validation/src/Validation.ts index 532b1823..25bcebc6 100644 --- a/plugins/Validation/src/Validation.ts +++ b/plugins/Validation/src/Validation.ts @@ -9,10 +9,14 @@ export interface ValidationError { readonly severity: ValidationSeverity; } +type ValidationExtensionValidate = { + (attachRule: (value: S) => boolean, + message: string | ((value: S) => string), + severity?: ValidationSeverity): void +} + export interface ValidationExtensions { - validate(attachRule: (value: S) => boolean, - message: string | ((value: S) => string), - severity?: ValidationSeverity): void, + validate: ValidationExtensionValidate, validShallow(): boolean, valid(): boolean, invalidShallow(): boolean, @@ -28,6 +32,10 @@ export interface ValidationExtensions { ): ReadonlyArray, } +export interface ValidationExtensionsArray extends ValidationExtensions { + forEach: ValidationExtensionValidate +} + const PluginID = Symbol('Validate'); const emptyErrors: ValidationError[] = [] @@ -170,10 +178,17 @@ class ValidationPluginInstance { } } +type ValidationExtensionsSubtype = (S extends ReadonlyArray<(infer U)> ? ValidationExtensionsArray : ValidationExtensions); + +// tslint:disable-next-line: no-any +function isArray(state: any): state is ReadonlyArray { + return state.keys && typeof state.keys[0] === 'number'; +} + // tslint:disable-next-line: function-name export function Validation(): Plugin; -export function Validation($this: State): ValidationExtensions; -export function Validation($this?: State): Plugin | ValidationExtensions { +export function Validation($this: State): ValidationExtensionsSubtype; +export function Validation($this?: State): Plugin | ValidationExtensionsSubtype { if ($this) { let state = $this; @@ -185,6 +200,13 @@ export function Validation($this?: State): Plugin | ValidationExtensions { + inst.addRule(state[0], { + rule: r, + message: m, + severity: s || 'error' + }) + }, validate: (r, m, s) => { inst.addRule(state.path, { rule: r, @@ -213,7 +235,7 @@ export function Validation($this?: State): Plugin | ValidationExtensions