ngx-schema-forms
Version:
New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo
79 lines (78 loc) • 6.51 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as Ajv from 'ajv';
import { SchemaValidatorFactory } from './schemavalidatorfactory';
export class AjvSchemaValidatorFactory extends SchemaValidatorFactory {
constructor() {
super();
this.ajv = new Ajv({
schemaId: 'auto',
allErrors: true
});
}
/**
* @param {?} schema
* @return {?}
*/
createValidatorFn(schema) {
/** @type {?} */
const validate = this.ajv.compile(schema);
return (value) => {
/** @type {?} */
const valid = validate(value);
if (valid) {
return null;
}
/** @type {?} */
const schemaErrors = validate.errors.reduce((errors, error) => {
/** @type {?} */
let path;
if (error.schemaPath === '#/required') {
// denormalize required
path = '/' + error.params.missingProperty;
}
else {
path = error.dataPath.replace(/(\.|\[|\].)/g, '/');
}
errors[path] = {
code: error.keyword,
message: error.message
};
return errors;
}, {});
return schemaErrors || null;
};
}
/**
* @param {?} schema
* @param {?} ref
* @return {?}
*/
getSchema(schema, ref) {
// throws if compilation fails
this.ajv.compile(schema);
return this.getDefinition(schema, ref);
}
/**
* @param {?} schema
* @param {?} ref
* @return {?}
*/
getDefinition(schema, ref) {
/** @type {?} */
let foundSchema = schema;
ref.split('/').slice(1).forEach(ptr => {
if (ptr) {
foundSchema = foundSchema[ptr];
}
});
return foundSchema;
}
}
if (false) {
/** @type {?} */
AjvSchemaValidatorFactory.prototype.ajv;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWp2LXNjaGVtYS12YWxpZGF0b3ItZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY2hlbWEtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvYWp2LXNjaGVtYS12YWxpZGF0b3ItZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFHM0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHbEUsTUFBTSxnQ0FBaUMsU0FBUSxzQkFBc0I7SUFJbkU7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDakIsUUFBUSxFQUFFLE1BQU07WUFDaEIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0tBQ0o7Ozs7O0lBRUQsaUJBQWlCLENBQUMsTUFBYzs7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUF1QixFQUFFOztZQUV6QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDVixNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2I7O1lBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7O2dCQUU1RCxJQUFJLElBQUksQ0FBUztnQkFDakIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDOztvQkFFdEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztpQkFDM0M7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ04sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDcEQ7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUNiLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTztvQkFDbkIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2lCQUN2QixDQUFDO2dCQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVAsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7U0FDN0IsQ0FBQztLQUNIOzs7Ozs7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLEdBQVc7O1FBRW5DLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN4Qzs7Ozs7O0lBRU8sYUFBYSxDQUFDLE1BQVcsRUFBRSxHQUFXOztRQUM1QyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDekIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNoQztTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQWp2IGZyb20gJ2Fqdic7XG5cbmltcG9ydCB7IFNjaGVtYSwgU2NoZW1hRXJyb3JzLCBTY2hlbWFWYWxpZGF0b3JGbiB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IFNjaGVtYVZhbGlkYXRvckZhY3RvcnkgfSBmcm9tICcuL3NjaGVtYXZhbGlkYXRvcmZhY3RvcnknO1xuXG5cbmV4cG9ydCBjbGFzcyBBanZTY2hlbWFWYWxpZGF0b3JGYWN0b3J5IGV4dGVuZHMgU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSB7XG5cbiAgcHJvdGVjdGVkIGFqdjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWp2ID0gbmV3IEFqdih7XG4gICAgICBzY2hlbWFJZDogJ2F1dG8nLFxuICAgICAgYWxsRXJyb3JzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0b3JGbihzY2hlbWE6IFNjaGVtYSk6IFNjaGVtYVZhbGlkYXRvckZuIHtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHRoaXMuYWp2LmNvbXBpbGUoc2NoZW1hKTtcblxuICAgIHJldHVybiAodmFsdWU6IGFueSk6IFNjaGVtYUVycm9ycyB8IG51bGwgPT4ge1xuXG4gICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlKHZhbHVlKTtcbiAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NoZW1hRXJyb3JzID0gdmFsaWRhdGUuZXJyb3JzLnJlZHVjZSgoZXJyb3JzLCBlcnJvcikgPT4ge1xuXG4gICAgICAgIGxldCBwYXRoOiBzdHJpbmc7XG4gICAgICAgIGlmIChlcnJvci5zY2hlbWFQYXRoID09PSAnIy9yZXF1aXJlZCcpIHtcbiAgICAgICAgICAvLyBkZW5vcm1hbGl6ZSByZXF1aXJlZFxuICAgICAgICAgIHBhdGggPSAnLycgKyBlcnJvci5wYXJhbXMubWlzc2luZ1Byb3BlcnR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGggPSBlcnJvci5kYXRhUGF0aC5yZXBsYWNlKC8oXFwufFxcW3xcXF0uKS9nLCAnLycpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yc1twYXRoXSA9IHtcbiAgICAgICAgICBjb2RlOiBlcnJvci5rZXl3b3JkLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcmV0dXJuIHNjaGVtYUVycm9ycyB8fCBudWxsO1xuICAgIH07XG4gIH1cblxuICBnZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWEsIHJlZjogc3RyaW5nKSB7XG4gICAgLy8gdGhyb3dzIGlmIGNvbXBpbGF0aW9uIGZhaWxzXG4gICAgdGhpcy5hanYuY29tcGlsZShzY2hlbWEpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVmaW5pdGlvbihzY2hlbWEsIHJlZik7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmluaXRpb24oc2NoZW1hOiBhbnksIHJlZjogc3RyaW5nKSB7XG4gICAgbGV0IGZvdW5kU2NoZW1hID0gc2NoZW1hO1xuICAgIHJlZi5zcGxpdCgnLycpLnNsaWNlKDEpLmZvckVhY2gocHRyID0+IHtcbiAgICAgIGlmIChwdHIpIHtcbiAgICAgICAgZm91bmRTY2hlbWEgPSBmb3VuZFNjaGVtYVtwdHJdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZFNjaGVtYTtcbiAgfVxufVxuXG4iXX0=