/
ajv-wrapper.ts
72 lines (58 loc) · 2.18 KB
/
ajv-wrapper.ts
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
60
61
62
63
64
65
66
67
68
69
70
71
72
import Ajv from "ajv";
import ajvKeywords from "ajv-keywords";
import { ISchemaValidationResult } from "../interfaces";
import { signedSchema, strictSchema, TransactionSchema } from "../transactions/types/schemas";
import { formats } from "./formats";
import { keywords } from "./keywords";
import { schemas } from "./schemas";
class AjvWrapper {
private ajv: Ajv.Ajv;
private transactionSchemas = new Set<string>();
constructor() {
const ajv = new Ajv({ $data: true, schemas, removeAdditional: true, extendRefs: true });
ajvKeywords(ajv);
keywords.forEach(addKeyword => {
addKeyword(ajv);
});
formats.forEach(addFormat => {
addFormat(ajv);
});
this.ajv = ajv;
}
public instance(): Ajv.Ajv {
return this.ajv;
}
public validate<T = any>(schemaName: string, data: T): ISchemaValidationResult<T> {
this.ajv.validate(schemaName, data);
const error = this.ajv.errors !== null ? this.ajv.errorsText() : null;
return { value: data, error };
}
public extendTransaction(schema: TransactionSchema, remove?: boolean) {
if (remove) {
this.transactionSchemas.delete(schema.$id);
this.ajv.removeSchema(schema.$id);
this.ajv.removeSchema(`${schema.$id}Signed`);
this.ajv.removeSchema(`${schema.$id}Strict`);
} else {
this.transactionSchemas.add(schema.$id);
this.ajv.addSchema(schema);
this.ajv.addSchema(signedSchema(schema));
this.ajv.addSchema(strictSchema(schema));
}
this.updateTransactionArray();
}
private updateTransactionArray() {
const items = [...this.transactionSchemas].map(schema => ({ $ref: `${schema}Signed` }));
const transactionsSchema = {
$id: "transactions",
type: "array",
additionalItems: false,
items: { oneOf: items },
};
this.ajv.removeSchema("block");
this.ajv.removeSchema("transactions");
this.ajv.addSchema(transactionsSchema);
this.ajv.addSchema(schemas.block);
}
}
export const ajvWrapper = new AjvWrapper();