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
91 lines (90 loc) • 7.93 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as ZSchema from 'z-schema';
import { SchemaValidatorFactory } from './schemavalidatorfactory';
export class ZSchemaValidatorFactory extends SchemaValidatorFactory {
constructor() {
super();
this.zschema = new ZSchema({
breakOnFirstError: false
});
}
/**
* @param {?} schema
* @return {?}
*/
createValidatorFn(schema) {
return (value) => {
if (schema["type"] === 'number' || schema["type"] === 'integer') {
value = +value;
}
this.zschema.validate(value, schema);
/** @type {?} */
const errors = this.zschema.getLastErrors();
if (!errors) {
return null;
}
this.denormalizeRequiredPropertyPaths(errors);
/** @type {?} */
const schemaErrors = errors.reduce((_errors, error) => {
error.path = error.path.slice(1);
_errors[error.path] = error;
return _errors;
}, {});
return schemaErrors || null;
};
}
/**
* @param {?} schema
* @param {?} ref
* @return {?}
*/
getSchema(schema, ref) {
/** @type {?} */
const isValid = this.zschema.compileSchema(schema);
if (isValid) {
return this.getDefinition(schema, ref);
}
else {
throw this.zschema.getLastError();
}
}
/**
* @param {?} err
* @return {?}
*/
denormalizeRequiredPropertyPaths(err) {
if (err && err.length) {
err = err.map(error => {
/** @type {?} */
const code = 'OBJECT_MISSING_REQUIRED_PROPERTY';
if (error.path === '#/' && error.code === code) {
error.path = `${error.path}${error.params[0]}`;
}
return error;
});
}
}
/**
* @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 {?} */
ZSchemaValidatorFactory.prototype.zschema;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiei1zY2hlbWEtdmFsaWRhdG9yLWZhY3RvcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2NoZW1hLWZvcm1zLyIsInNvdXJjZXMiOlsibGliL3otc2NoZW1hLXZhbGlkYXRvci1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUdwQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdsRSxNQUFNLDhCQUErQixTQUFRLHNCQUFzQjtJQUlqRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztZQUN2QixpQkFBaUIsRUFBRSxLQUFLO1NBQzNCLENBQUMsQ0FBQztLQUNKOzs7OztJQUVELGlCQUFpQixDQUFDLE1BQWM7UUFDOUIsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUF1QixFQUFFO1lBRXpDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sYUFBVSxRQUFRLElBQUksTUFBTSxhQUFVLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQzs7WUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxDQUFDLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUU5QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwRCxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNoQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVAsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7U0FDN0IsQ0FBQztLQUNIOzs7Ozs7SUFFRCxTQUFTLENBQUMsTUFBVyxFQUFFLEdBQVc7O1FBRWhDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDeEM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNuQztLQUNGOzs7OztJQUVPLGdDQUFnQyxDQUFDLEdBQVU7UUFDakQsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFOztnQkFDcEIsTUFBTSxJQUFJLEdBQUcsa0NBQWtDLENBQUM7Z0JBQ2hELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDL0MsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNoRDtnQkFDRCxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2QsQ0FBQyxDQUFDO1NBQ0o7Ozs7Ozs7SUFHSyxhQUFhLENBQUMsTUFBVyxFQUFFLEdBQVc7O1FBQzVDLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDUixXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBaU2NoZW1hIGZyb20gJ3otc2NoZW1hJztcblxuaW1wb3J0IHsgU2NoZW1hLCBTY2hlbWFFcnJvcnMsIFNjaGVtYVZhbGlkYXRvckZuIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vc2NoZW1hdmFsaWRhdG9yZmFjdG9yeSc7XG5cblxuZXhwb3J0IGNsYXNzIFpTY2hlbWFWYWxpZGF0b3JGYWN0b3J5IGV4dGVuZHMgU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSB7XG5cbiAgcHJvdGVjdGVkIHpzY2hlbWE7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnpzY2hlbWEgPSBuZXcgWlNjaGVtYSh7XG4gICAgICAgIGJyZWFrT25GaXJzdEVycm9yOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlVmFsaWRhdG9yRm4oc2NoZW1hOiBTY2hlbWEpOiBTY2hlbWFWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuICh2YWx1ZTogYW55KTogU2NoZW1hRXJyb3JzIHwgbnVsbCA9PiB7XG5cbiAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gJ251bWJlcicgfHwgc2NoZW1hLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy56c2NoZW1hLnZhbGlkYXRlKHZhbHVlLCBzY2hlbWEpO1xuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy56c2NoZW1hLmdldExhc3RFcnJvcnMoKTtcbiAgICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRlbm9ybWFsaXplUmVxdWlyZWRQcm9wZXJ0eVBhdGhzKGVycm9ycyk7XG5cbiAgICAgIGNvbnN0IHNjaGVtYUVycm9ycyA9IGVycm9ycy5yZWR1Y2UoKF9lcnJvcnMsIGVycm9yKSA9PiB7XG4gICAgICAgIGVycm9yLnBhdGggPSBlcnJvci5wYXRoLnNsaWNlKDEpO1xuICAgICAgICBfZXJyb3JzW2Vycm9yLnBhdGhdID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBfZXJyb3JzO1xuICAgICAgfSwge30pO1xuXG4gICAgICByZXR1cm4gc2NoZW1hRXJyb3JzIHx8IG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIGdldFNjaGVtYShzY2hlbWE6IGFueSwgcmVmOiBzdHJpbmcpIHtcbiAgICAvLyBjaGVjayBkZWZpbml0aW9ucyBhcmUgdmFsaWRcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy56c2NoZW1hLmNvbXBpbGVTY2hlbWEoc2NoZW1hKTtcbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmaW5pdGlvbihzY2hlbWEsIHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IHRoaXMuenNjaGVtYS5nZXRMYXN0RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlbm9ybWFsaXplUmVxdWlyZWRQcm9wZXJ0eVBhdGhzKGVycjogYW55W10pIHtcbiAgICBpZiAoZXJyICYmIGVyci5sZW5ndGgpIHtcbiAgICAgIGVyciA9IGVyci5tYXAoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBjb2RlID0gJ09CSkVDVF9NSVNTSU5HX1JFUVVJUkVEX1BST1BFUlRZJztcbiAgICAgICAgaWYgKGVycm9yLnBhdGggPT09ICcjLycgJiYgZXJyb3IuY29kZSA9PT0gY29kZSkge1xuICAgICAgICAgIGVycm9yLnBhdGggPSBgJHtlcnJvci5wYXRofSR7ZXJyb3IucGFyYW1zWzBdfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZpbml0aW9uKHNjaGVtYTogYW55LCByZWY6IHN0cmluZykge1xuICAgIGxldCBmb3VuZFNjaGVtYSA9IHNjaGVtYTtcbiAgICByZWYuc3BsaXQoJy8nKS5zbGljZSgxKS5mb3JFYWNoKHB0ciA9PiB7XG4gICAgICBpZiAocHRyKSB7XG4gICAgICAgIGZvdW5kU2NoZW1hID0gZm91bmRTY2hlbWFbcHRyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmRTY2hlbWE7XG4gIH1cbn1cblxuIl19