From e9bb5d7b8240732dcaca4ecf208a313d6794a27e Mon Sep 17 00:00:00 2001 From: psnider Date: Thu, 3 Sep 2015 13:51:49 +0000 Subject: [PATCH 1/3] updated to fully match 1.2.5 wrapped interfaces in a module, removed prefixes --- tv4/{tv4-tests.ts => tv4-1.2.4-tests.ts} | 0 tv4/tv4-1.2.4.d.ts | 48 ++++++++ tv4/tv4.d.ts | 134 ++++++++++++++++------- 3 files changed, 143 insertions(+), 39 deletions(-) rename tv4/{tv4-tests.ts => tv4-1.2.4-tests.ts} (100%) create mode 100644 tv4/tv4-1.2.4.d.ts diff --git a/tv4/tv4-tests.ts b/tv4/tv4-1.2.4-tests.ts similarity index 100% rename from tv4/tv4-tests.ts rename to tv4/tv4-1.2.4-tests.ts diff --git a/tv4/tv4-1.2.4.d.ts b/tv4/tv4-1.2.4.d.ts new file mode 100644 index 000000000..02b7ebba2 --- /dev/null +++ b/tv4/tv4-1.2.4.d.ts @@ -0,0 +1,48 @@ +// Type definitions for Tiny Validator tv4 1.0.6 +// Project: https://github.com/geraintluff/tv4 +// Definitions by: Bart van der Schoor +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +interface TV4ErrorCodes { + [key:string]:number; +} +interface TV4Error { + code:number; + message:string; + dataPath:string; + schemaPath:string; +} +interface TV4SchemaMap { + [uri:string]:any; +} +interface TV4BaseResult { + missing:string[]; + valid:boolean; +} +interface TV4SingleResult extends TV4BaseResult { + error:TV4Error; +} +interface TV4MultiResult extends TV4BaseResult { + errors:TV4Error[]; +} +interface TV4 { + validateResult(data:any, schema:any):TV4SingleResult; + validateMultiple(data:any, schema:any):TV4MultiResult; + + addSchema(uri:string, schema:any):boolean; + getSchema(uri:string):any; + normSchema(schema:any, baseUri:string):any; + resolveUrl(base:string, href:string):string; + freshApi():TV4; + dropSchemas():void; + reset():void; + + getMissingUris(exp?:RegExp):string[]; + getSchemaUris(exp?:RegExp):string[]; + getSchemaMap():TV4SchemaMap; + errorCodes:TV4ErrorCodes; +} +declare module "tv4" { + var tv4: TV4 + export = tv4; +} diff --git a/tv4/tv4.d.ts b/tv4/tv4.d.ts index 02b7ebba2..3ee5a2aed 100644 --- a/tv4/tv4.d.ts +++ b/tv4/tv4.d.ts @@ -1,48 +1,104 @@ -// Type definitions for Tiny Validator tv4 1.0.6 +// Type definitions for Tiny Validator tv4 1.2.5 // Project: https://github.com/geraintluff/tv4 // Definitions by: Bart van der Schoor +// Definitions by: Peter Snider // Definitions: https://github.com/borisyankov/DefinitelyTyped -interface TV4ErrorCodes { - [key:string]:number; -} -interface TV4Error { - code:number; - message:string; - dataPath:string; - schemaPath:string; -} -interface TV4SchemaMap { - [uri:string]:any; -} -interface TV4BaseResult { - missing:string[]; - valid:boolean; -} -interface TV4SingleResult extends TV4BaseResult { - error:TV4Error; -} -interface TV4MultiResult extends TV4BaseResult { - errors:TV4Error[]; -} -interface TV4 { - validateResult(data:any, schema:any):TV4SingleResult; - validateMultiple(data:any, schema:any):TV4MultiResult; +declare module tv4 { + + // Note that every top-level property is optional in json-schema + export interface JsonSchema { + [key: string]: any; + title?: string; // used for humans only, and not used for computation + description?: string; // used for humans only, and not used for computation + id?: string; + $schema?: string; + type?: string; + items?: any; + properties?: any; + patternProperties?: any; + additionalProperties?: boolean; + required?: string[]; + definitions?: any; + default?: any; + } - addSchema(uri:string, schema:any):boolean; - getSchema(uri:string):any; - normSchema(schema:any, baseUri:string):any; - resolveUrl(base:string, href:string):string; - freshApi():TV4; - dropSchemas():void; - reset():void; + export type SchemaMap = {[uri: string]: JsonSchema;}; + // maps error codes/names to human readable error description for a single language + export type ErrorMap = {[errorCode: string]: string;}; - getMissingUris(exp?:RegExp):string[]; - getSchemaUris(exp?:RegExp):string[]; - getSchemaMap():TV4SchemaMap; - errorCodes:TV4ErrorCodes; + + export interface ErrorCodes { + [key:string]:number; + } + export interface ValidationError { + code:number; + message:any; + dataPath?:string; + schemaPath?:string; + subErrors?: ValidationError[]; + } + export interface ErrorVar extends ValidationError { + params: any; + subErrors: any; + stack: string; + } + export interface BaseResult { + missing:string[]; + valid:boolean; + } + export interface SingleResult extends BaseResult { + error:ValidationError; + } + export interface MultiResult extends BaseResult { + errors:ValidationError[]; + } + export type FormatValidationFunction = (data: any, schema: JsonSchema) => string; + // documentation doesnt agree with code in tv4, this type agrees with code + export type KeywordValidationFunction = (data: any, value: any, schema: JsonSchema, dataPointerPath: string) => string | ValidationError; + export type AsyncValidationCallback = (isValid: boolean, error: ValidationError) => void; + export interface TV4 { + error: ErrorVar; + missing: string[]; + // primary API + validate(data: any, schema: JsonSchema, checkRecursive?: boolean): boolean; + validate(data: any, schema: JsonSchema, checkRecursive: boolean, banUnknownProperties: boolean): boolean; + validateResult(data: any, schema: JsonSchema, checkRecursive?: boolean): SingleResult; + validateResult(data: any, schema: JsonSchema, checkRecursive: boolean, banUnknownProperties: boolean): SingleResult; + validateMultiple(data: any, schema: JsonSchema, checkRecursive?: boolean): MultiResult; + validateMultiple(data: any, schema: JsonSchema, checkRecursive: boolean, banUnknownProperties: boolean): MultiResult; + // from including: tv4.async-jquery.js + validate(data: any, schema: JsonSchema, callback: AsyncValidationCallback, checkRecursive?: boolean): void; + validate(data: any, schema: JsonSchema, callback: AsyncValidationCallback, checkRecursive: boolean, banUnknownProperties: boolean): void; + + // additional API for more complex cases + addSchema(schema: JsonSchema): void; + addSchema(uri:string, schema: JsonSchema): void; + getSchema(uri:string): JsonSchema; + getSchemaMap(): SchemaMap; + getSchemaUris(filter?: RegExp): string[]; + getMissingUris(filter?: RegExp): string[]; + dropSchemas(): void; + freshApi(): TV4; + reset(): void; + setErrorReporter(lang: string): void; + setErrorReporter(reporter: (error: ValidationError, data: any, schema: JsonSchema) => string): void; + language(code: string): void; + addLanguage(code: string, map: ErrorMap): void; + addFormat(format: string, validationFunction: FormatValidationFunction): void; + addFormat(formats: {[formatName: string]: FormatValidationFunction;}): void; + defineKeyword(keyword: string, validationFunction: KeywordValidationFunction): void; + defineError(codeName: string, codeNumber: number, defaultMessage: string): void; + + // not documented + normSchema(schema: JsonSchema, baseUri:string):any; + resolveUrl(base:string, href:string):string; + + errorCodes:ErrorCodes; + } } + declare module "tv4" { - var tv4: TV4 - export = tv4; + var out: tv4.TV4 + export = out; } From 39126634d14770c9738ceeabaefcc09f178d6817 Mon Sep 17 00:00:00 2001 From: psnider Date: Thu, 3 Sep 2015 13:56:51 +0000 Subject: [PATCH 2/3] updated ref in older 1.2.4 test --- tv4/tv4-1.2.4-tests.ts | 2 +- tv4/tv4-tests.ts | 174 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 tv4/tv4-tests.ts diff --git a/tv4/tv4-1.2.4-tests.ts b/tv4/tv4-1.2.4-tests.ts index 2768d9f5f..d899be50f 100644 --- a/tv4/tv4-1.2.4-tests.ts +++ b/tv4/tv4-1.2.4-tests.ts @@ -1,4 +1,4 @@ -/// +/// var str:string; var strArr:string[]; diff --git a/tv4/tv4-tests.ts b/tv4/tv4-tests.ts new file mode 100644 index 000000000..84a4ee328 --- /dev/null +++ b/tv4/tv4-tests.ts @@ -0,0 +1,174 @@ +/// + +var str:string; +var strArr:string[]; +var bool:boolean; +var num:number; +var obj:any; +var validator: tv4.TV4; +var err:tv4.ValidationError; +var errs:tv4.ValidationError[]; +var single:tv4.SingleResult; +var multi:tv4.MultiResult; + +single = validator.validateResult(obj, obj); +bool = single.valid; +strArr = single.missing; +err = single.error; + +num = err.code; +str = err.message; +str = err.dataPath; +str = err.schemaPath; + +multi = validator.validateMultiple(obj, obj); +bool = multi.valid; +strArr = multi.missing; +errs = multi.errors; + +validator.addSchema(str, obj); +obj = validator.getSchema(str); +str = validator.resolveUrl(str, str); + +validator = validator.freshApi(); +validator.dropSchemas(); +validator.reset(); + +strArr = validator.getMissingUris(/abc/); +strArr = validator.getSchemaUris(/abc/); +obj = validator.getSchemaMap()[str]; +num = validator.errorCodes['bla']; + +num = validator.errorCodes['MY_NAME']; + + +// Here are all the examples from the v1.2.3 documentation at https://www.npmjs.com/package/validator +var data = ''; +var schema : tv4.JsonSchema = {type: "string"} +var valid = validator.validate(data, schema); +var url = 'http://example.com/schema'; +validator.addSchema(url, schema); +var singleErrorResult = validator.validateResult(data, schema); +var multiErrorResult = validator.validateMultiple(data, schema); +// async +validator.validate(data, schema, function (isValid, validationError) {}); + +// checkRecursive +var a : tv4.JsonSchema = {}; +var b = { a: a }; +a['b'] = b; +var aSchema : tv4.JsonSchema = { properties: { b: { $ref: 'bSchema' }}}; +var bSchema : tv4.JsonSchema = { properties: { a: { $ref: 'aSchema' }}}; +validator.addSchema('aSchema', aSchema); +validator.addSchema('bSchema', bSchema); +validator.validate(a, aSchema, true); +validator.validateResult(data, aSchema, true); +validator.validateMultiple(data, aSchema, true); + + +// banUnknownProperties +var checkRecursive = true; +validator.validate(data, schema, checkRecursive, true); +validator.validateResult(data, schema, checkRecursive, true); +validator.validateMultiple(data, schema, checkRecursive, true); + +// API +validator.addSchema('http://example.com/schema', {}); +validator.addSchema({}); +var schema = validator.getSchema('http://example.com/schema'); +var map = validator.getSchemaMap(); +var schema = map[uri]; +var arr = validator.getSchemaUris(); +// optional filter using a RegExp +arr = validator.getSchemaUris(/^https?:\/\/example.com/); +var arr = validator.getMissingUris(); +// optional filter using a RegExp +var arr = validator.getMissingUris(/^https?:\/\/example.com/); +validator.dropSchemas(); +var other_tv4 = validator.freshApi(); +validator.reset(); +validator.setErrorReporter(function (error, data, schema) { + return "Error code: " + error.code; +}); +validator.language('en-gb'); +validator.addLanguage('fr', {}); +validator.language('fr') +validator.addFormat('decimal-digits', function (data, schema) { + if (typeof data === 'string' && !/^[0-9]+$/.test(data)) { + return null; + } + return "must be string of decimal digits"; +}); +validator.addFormat({ + 'my-format': function (data: any, schema: any): string {return null;}, + 'other-format': function (data: any, schema: any): string {return 'oops';} +}); +function simpleFailure() {return true;} +function detailedFailure() {return true;} +validator.defineKeyword('my-custom-keyword', function (data, value, schema) { + if (simpleFailure()) { + return "Failure"; + } else if (detailedFailure()) { + return {code: validator.errorCodes['MY_CUSTOM_CODE'], message: {param1: 'a', param2: 'b'}}; + } else { + return null; + } +}); + + +// Demos +schema = { + "items": { + "type": "boolean" + } +}; +{ + let data1 = [true, false]; + let data2 = [true, 123]; + alert("data 1: " + validator.validate(data1, schema)); // true + alert("data 2: " + validator.validate(data2, schema)); // false + alert("data 2 error: " + JSON.stringify(validator.error, null, 4)); + + schema = { + "type": "array", + "items": {"$ref": "#"} + }; +} +{ +let data1 : any = [[], [[]]]; +let data2 : any = [[], [true, []]]; +alert("data 1: " + validator.validate(data1, schema)); // true +alert("data 2: " + validator.validate(data2, schema)); // false +} + +{ + schema = { + "type": "array", + "items": {"$ref": "http://example.com/schema" } + }; + let data = [1, 2, 3]; + alert("Valid: " + validator.validate(data, schema)); // true + alert("Missing schemas: " + JSON.stringify(validator.missing)); +} +{ + validator.addSchema("http://example.com/schema", { + "definitions": { + "arrayItem": {"type": "boolean"} + } + }); + let schema : tv4.JsonSchema = { + "type": "array", + "items": {"$ref": "http://example.com/schema#/definitions/arrayItem" } + }; + let data1 : any = [true, false, true]; + let data2 : any = [1, 2, 3]; + alert("data 1: " + validator.validate(data1, schema)); // true + alert("data 2: " + validator.validate(data2, schema)); // false +} + +// undocumented functions +var uri = ''; +obj = validator.normSchema(schema, uri); + + + From c1b3c6ff2743d0695ac8130ef03a0ee1ea0b27fd Mon Sep 17 00:00:00 2001 From: psnider Date: Thu, 3 Sep 2015 14:14:58 +0000 Subject: [PATCH 3/3] updated attribution --- tv4/tv4.d.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tv4/tv4.d.ts b/tv4/tv4.d.ts index 3ee5a2aed..5e762155a 100644 --- a/tv4/tv4.d.ts +++ b/tv4/tv4.d.ts @@ -1,7 +1,6 @@ // Type definitions for Tiny Validator tv4 1.2.5 // Project: https://github.com/geraintluff/tv4 -// Definitions by: Bart van der Schoor -// Definitions by: Peter Snider +// Definitions by: Bart van der Schoor , Peter Snider // Definitions: https://github.com/borisyankov/DefinitelyTyped declare module tv4 {