All files lisk_validator.ts

100% Statements 14/14
100% Branches 2/2
100% Functions 6/6
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59                              1x   1x             1x           1x 17x           1x   1x 3x   6x 6x           70x 50x     20x       1x  
/*
 * Copyright © 2019 Lisk Foundation
 *
 * See the LICENSE file at the top-level directory of this distribution
 * for licensing information.
 *
 * Unless otherwise agreed in a custom licensing agreement with the Lisk Foundation,
 * no part of this software, including this file, may be copied, modified,
 * propagated, or distributed except according to the terms contained in the
 * LICENSE file.
 *
 * Removal or modification of this copyright notice is prohibited.
 *
 */
 
import * as Ajv from 'ajv';
 
import * as formats from './formats';
 
export type ErrorObject = Ajv.ErrorObject;
 
class LiskValidator {
	private readonly validator: Ajv.Ajv;
	public constructor() {
		this.validator = new Ajv({
			allErrors: true,
			schemaId: 'auto',
			useDefaults: false,
		});
 
		for (const formatName of Object.keys(formats)) {
			this.validator.addFormat(
				formatName,
				formats[formatName as keyof typeof formats],
			);
		}
 
		this.validator.addKeyword('uniqueSignedPublicKeys', {
			type: 'array',
			compile: () => (data: ReadonlyArray<string>) =>
				new Set(
					data
						.filter(datum => typeof datum === 'string')
						.map((key: string) => key.slice(1)),
				).size === data.length,
		});
	}
 
	public validate(schema: object, data: object): ReadonlyArray<ErrorObject> {
		if (!this.validator.validate(schema, data)) {
			return this.validator.errors as ReadonlyArray<ErrorObject>;
		}
 
		return [];
	}
}
 
export const validator = new LiskValidator();