angular2-json-schema-form
Version:
Angular 2 JSON Schema Form builder
471 lines • 21.2 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var core_1 = require("@angular/core");
var validator_functions_1 = require("./validator.functions");
var utility_functions_1 = require("./utility.functions");
var JsonPointer = (function () {
function JsonPointer() {
}
JsonPointer.get = function (object, pointer, startSlice, endSlice, getBoolean, errors) {
if (startSlice === void 0) { startSlice = 0; }
if (endSlice === void 0) { endSlice = null; }
if (getBoolean === void 0) { getBoolean = false; }
if (errors === void 0) { errors = false; }
if (object === null)
return getBoolean ? false : undefined;
var keyArray = this.parse(pointer);
if (typeof object === 'object' && keyArray !== null) {
var subObject = object;
if (startSlice >= keyArray.length || endSlice <= -keyArray.length)
return object;
if (startSlice <= -keyArray.length)
startSlice = 0;
if (!validator_functions_1.isDefined(endSlice) || endSlice >= keyArray.length)
endSlice = keyArray.length;
keyArray = keyArray.slice(startSlice, endSlice);
for (var _i = 0, keyArray_1 = keyArray; _i < keyArray_1.length; _i++) {
var key = keyArray_1[_i];
if (key === '-' && validator_functions_1.isArray(subObject) && subObject.length) {
key = subObject.length - 1;
}
if (typeof subObject === 'object' && subObject !== null &&
utility_functions_1.hasOwn(subObject, key)) {
subObject = subObject[key];
}
else if (validator_functions_1.isMap(subObject) && subObject.has(key)) {
subObject = subObject.get(key);
}
else {
if (errors)
console.error('get error: "' + key + '" key not found in object.');
if (errors)
console.error(pointer);
if (errors)
console.error(object);
return getBoolean ? false : undefined;
}
}
return getBoolean ? true : subObject;
}
if (errors && keyArray === null)
console.error('get error: Invalid JSON Pointer: ' + pointer);
if (errors && typeof object !== 'object') {
console.error('get error: Invalid object:=');
console.error(object);
}
return getBoolean ? false : undefined;
};
JsonPointer.getFirst = function (items, defaultValue) {
if (defaultValue === void 0) { defaultValue = null; }
if (validator_functions_1.isEmpty(items))
return;
if (validator_functions_1.isArray(items)) {
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
if (validator_functions_1.isEmpty(item))
continue;
if (validator_functions_1.isArray(item) && item.length >= 2) {
if (validator_functions_1.isEmpty(item[0]) || validator_functions_1.isEmpty(item[1]))
continue;
var value = this.get(item[0], item[1]);
if (value)
return value;
continue;
}
console.error('getFirst error: Input not in correct format.\n' +
'Should be: [ [ object1, pointer1 ], [ object 2, pointer2 ], etc... ]');
return;
}
return defaultValue;
}
if (validator_functions_1.isMap(items)) {
for (var _a = 0, items_2 = items; _a < items_2.length; _a++) {
var _b = items_2[_a], object = _b[0], pointer = _b[1];
if (object === null || !this.isJsonPointer(pointer))
continue;
var value = this.get(object, pointer);
if (value)
return value;
}
return defaultValue;
}
console.error('getFirst error: Input not in correct format.\n' +
'Should be: [ [ object1, pointer1 ], [ object 2, pointer2 ], etc... ]');
};
JsonPointer.set = function (object, pointer, value, insert) {
if (insert === void 0) { insert = false; }
var keyArray = this.parse(pointer);
if (keyArray !== null) {
var subObject = object;
for (var i = 0, l = keyArray.length - 1; i < l; ++i) {
var key = keyArray[i];
if (key === '-' && validator_functions_1.isArray(subObject))
key = subObject.length;
if (validator_functions_1.isMap(subObject) && subObject.has(key)) {
subObject = subObject.get(key);
}
else {
if (!utility_functions_1.hasOwn(subObject, key)) {
subObject[key] = (keyArray[i + 1].match(/^(\d+|-)$/)) ? [] : {};
}
subObject = subObject[key];
}
}
var lastKey = keyArray[keyArray.length - 1];
if (validator_functions_1.isArray(subObject) && lastKey === '-') {
subObject.push(value);
}
else if (insert && validator_functions_1.isArray(subObject) && !isNaN(+lastKey)) {
subObject.splice(lastKey, 0, value);
}
else if (validator_functions_1.isMap(subObject)) {
subObject.set(lastKey, value);
}
else {
subObject[lastKey] = value;
}
return object;
}
console.error('set error: Invalid JSON Pointer: ' + pointer);
};
JsonPointer.setCopy = function (object, pointer, value, insert) {
if (insert === void 0) { insert = false; }
var keyArray = this.parse(pointer);
if (keyArray !== null) {
var newObject = utility_functions_1.copy(object);
var subObject = newObject;
for (var i = 0, l = keyArray.length - 1; i < l; ++i) {
var key = keyArray[i];
if (key === '-' && validator_functions_1.isArray(subObject))
key = subObject.length;
if (validator_functions_1.isMap(subObject) && subObject.has(key)) {
subObject.set(key, utility_functions_1.copy(subObject.get(key)));
subObject = subObject.get(key);
}
else {
if (!utility_functions_1.hasOwn(subObject, key)) {
subObject[key] = (keyArray[i + 1].match(/^(\d+|-)$/)) ? [] : {};
}
subObject[key] = utility_functions_1.copy(subObject[key]);
subObject = subObject[key];
}
}
var lastKey = keyArray[keyArray.length - 1];
if (validator_functions_1.isArray(subObject) && lastKey === '-') {
subObject.push(value);
}
else if (insert && validator_functions_1.isArray(subObject) && !isNaN(+lastKey)) {
subObject.splice(lastKey, 0, value);
}
else if (validator_functions_1.isMap(subObject)) {
subObject.set(lastKey, value);
}
else {
subObject[lastKey] = value;
}
return newObject;
}
console.error('setCopy error: Invalid JSON Pointer: ' + pointer);
};
JsonPointer.insert = function (object, pointer, value) {
this.set(object, pointer, value, true);
};
JsonPointer.insertCopy = function (object, pointer, value) {
this.setCopy(object, pointer, value, true);
};
JsonPointer.remove = function (object, pointer) {
var keyArray = this.parse(pointer);
if (keyArray !== null && keyArray.length) {
var lastKey = keyArray.pop();
var parentObject = this.get(object, keyArray);
if (validator_functions_1.isArray(parentObject)) {
if (lastKey === '-')
lastKey = parentObject.length - 1;
parentObject.splice(lastKey, 1);
}
else if (validator_functions_1.isObject(parentObject)) {
delete parentObject[lastKey];
}
return object;
}
console.error('remove error: Invalid JSON Pointer: ' + pointer);
};
JsonPointer.has = function (object, pointer) {
return this.get(object, pointer, 0, null, true);
};
JsonPointer.dict = function (object) {
var results = {};
this.forEachDeep(object, function (value, pointer) {
if (typeof value !== 'object')
results[pointer] = value;
});
return results;
};
JsonPointer.forEachDeep = function (object, fn, bottomUp, pointer, rootObject) {
if (bottomUp === void 0) { bottomUp = false; }
if (pointer === void 0) { pointer = ''; }
if (rootObject === void 0) { rootObject = object; }
if (typeof fn === 'function') {
if (!bottomUp)
fn(object, pointer, rootObject);
if (validator_functions_1.isObject(object) || validator_functions_1.isArray(object)) {
for (var _i = 0, _a = Object.keys(object); _i < _a.length; _i++) {
var key = _a[_i];
var newPointer = pointer + '/' + this.escape(key);
this.forEachDeep(object[key], fn, bottomUp, newPointer, rootObject);
}
}
if (bottomUp)
fn(object, pointer, rootObject);
}
else {
console.error('forEachDeep error: Iterator must be a function.');
}
};
JsonPointer.forEachDeepCopy = function (object, fn, bottomUp, pointer, rootObject) {
if (bottomUp === void 0) { bottomUp = false; }
if (pointer === void 0) { pointer = ''; }
if (rootObject === void 0) { rootObject = object; }
if (typeof fn === 'function') {
if (validator_functions_1.isObject(object) || validator_functions_1.isArray(object)) {
var newObject = Object.assign(validator_functions_1.isArray(object) ? [] : {}, object);
if (!bottomUp)
fn(newObject, pointer, rootObject);
for (var _i = 0, _a = Object.keys(newObject); _i < _a.length; _i++) {
var key = _a[_i];
var newPointer = pointer + '/' + this.escape(key);
newObject[key] = this.forEachDeepCopy(object[key], fn, bottomUp, newPointer, rootObject);
}
if (bottomUp)
fn(newObject, pointer, rootObject);
}
else {
return fn(object, pointer, rootObject);
}
}
console.error('forEachDeep error: Iterator must be a function.');
};
JsonPointer.escape = function (key) {
return key.toString().replace(/~/g, '~0').replace(/\//g, '~1');
};
JsonPointer.unescape = function (key) {
return key.toString().replace(/~1/g, '/').replace(/~0/g, '~');
};
JsonPointer.parse = function (pointer) {
if (validator_functions_1.isArray(pointer))
return pointer;
if (typeof pointer === 'string') {
if (pointer[0] === '#')
pointer = pointer.slice(1);
if (pointer === '')
return [];
if (pointer[0] !== '/') {
console.error('parse error: Invalid JSON Pointer, does not start with "/": ' +
pointer);
return;
}
return pointer.slice(1).split('/').map(this.unescape);
}
console.error('parse error: Invalid JSON Pointer, not a string or array:');
console.error(pointer);
};
JsonPointer.compile = function (keyArray, defaultValue) {
var _this = this;
if (defaultValue === void 0) { defaultValue = ''; }
if (validator_functions_1.isArray(keyArray)) {
if (keyArray.length === 0)
return '';
return '/' + keyArray.map(function (key) { return key === '' ? defaultValue : _this.escape(key); }).join('/');
}
if (typeof keyArray === 'string') {
if (keyArray[0] === '#')
keyArray = keyArray.slice(1);
if (keyArray.length && keyArray[0] !== '/') {
console.error('compile error: Invalid JSON Pointer, does not start with "/": ' + keyArray);
return;
}
return keyArray;
}
console.error('compile error: Invalid JSON Pointer, not a string or array:');
console.error(keyArray);
};
JsonPointer.toKey = function (pointer) {
var keyArray = this.parse(pointer);
if (keyArray === null)
return null;
if (!keyArray.length)
return '';
return keyArray[keyArray.length - 1];
};
JsonPointer.isJsonPointer = function (value) {
if (typeof value === 'string') {
if (value === '')
return true;
if (value[0] === '#')
value = value.slice(1);
if (value[0] === '/')
return true;
}
return false;
};
JsonPointer.isSubPointer = function (shortPointer, longPointer) {
var shortArray = (validator_functions_1.isArray(shortPointer)) ?
shortPointer : this.parse(shortPointer);
var longArray = (validator_functions_1.isArray(longPointer)) ?
longPointer : this.parse(longPointer);
if (!shortArray || !longArray) {
console.error('isSubPointer error: Invalid JSON Pointer, not a string or array:');
if (!shortArray)
console.error(shortPointer);
if (!longArray)
console.error(longPointer);
return;
}
if (shortArray.length > longArray.length)
return false;
for (var _i = 0, _a = Object.keys(shortArray); _i < _a.length; _i++) {
var i = _a[_i];
if (shortArray[i] !== longArray[i])
return false;
}
return true;
};
JsonPointer.toIndexedPointer = function (genericPointer, indexArray, arrayMap) {
if (arrayMap === void 0) { arrayMap = null; }
if (this.isJsonPointer(genericPointer) && validator_functions_1.isArray(indexArray)) {
if (validator_functions_1.isMap(arrayMap)) {
var arrayIndex_1 = 0;
return genericPointer.replace(/\/\-(?=\/|$)/g, function (key, stringIndex) {
var subPointer = genericPointer.slice(0, stringIndex);
if (arrayMap.has(subPointer))
return '/' + indexArray[arrayIndex_1++];
});
}
else {
var indexedPointer = genericPointer;
for (var _i = 0, indexArray_1 = indexArray; _i < indexArray_1.length; _i++) {
var pointerIndex = indexArray_1[_i];
indexedPointer = indexedPointer.replace('/-', '/' + pointerIndex);
}
return indexedPointer;
}
}
console.error('toIndexedPointer error: genericPointer must be ' +
'a JSON Pointer and indexArray must be an array.');
console.error(genericPointer);
console.error(indexArray);
};
;
JsonPointer.toGenericPointer = function (indexedPointer, arrayMap) {
if (this.isJsonPointer(indexedPointer) && validator_functions_1.isMap(arrayMap)) {
var pointerArray = this.parse(indexedPointer);
for (var i = 1, l = pointerArray.length; i < l; i++) {
var subPointer = this.compile(pointerArray.slice(0, i));
if (arrayMap.has(subPointer) && arrayMap.get(subPointer) <= +pointerArray[i]) {
pointerArray[i] = '-';
}
}
return this.compile(pointerArray);
}
console.error('toGenericPointer error: indexedPointer must be ' +
'a JSON Pointer and arrayMap must be a Map.');
console.error(indexedPointer);
console.error(arrayMap);
};
;
JsonPointer.toControlPointer = function (formGroup, dataPointer) {
var dataPointerArray = this.parse(dataPointer);
var controlPointerArray = [];
var subGroup = formGroup;
if (dataPointerArray !== null) {
for (var _i = 0, dataPointerArray_1 = dataPointerArray; _i < dataPointerArray_1.length; _i++) {
var key = dataPointerArray_1[_i];
if (subGroup.hasOwnProperty('controls')) {
controlPointerArray.push('controls');
subGroup = subGroup.controls;
}
if (validator_functions_1.isArray(subGroup) && (key === '-')) {
controlPointerArray.push((subGroup.length - 1).toString());
subGroup = subGroup[subGroup.length - 1];
}
else if (subGroup.hasOwnProperty(key)) {
controlPointerArray.push(key);
subGroup = subGroup[key];
}
else {
console.error('toControlPointer error: Unable to find "' + key + '" item in FormGroup.');
console.error(dataPointer);
console.error(formGroup);
return;
}
}
return this.compile(controlPointerArray);
}
console.error('getControl error: Invalid JSON Pointer: ' + dataPointer);
};
JsonPointer.parseObjectPath = function (path) {
if (validator_functions_1.isArray(path))
return path;
if (typeof path === 'string') {
var index = 0;
var parts = [];
while (index < path.length) {
var nextDot = path.indexOf('.', index);
var nextOB = path.indexOf('[', index);
if (nextDot === -1 && nextOB === -1) {
parts.push(path.slice(index));
index = path.length;
}
else if (nextDot !== -1 &&
(nextDot < nextOB || nextOB === -1)) {
parts.push(path.slice(index, nextDot));
index = nextDot + 1;
}
else {
if (nextOB > index) {
parts.push(path.slice(index, nextOB));
index = nextOB;
}
var quote = path.charAt(nextOB + 1);
if (quote === '"' || quote === "'") {
var nextCB = path.indexOf(quote + ']', nextOB);
while (nextCB !== -1 && path.charAt(nextCB - 1) === '\\') {
nextCB = path.indexOf(quote + ']', nextCB + 2);
}
if (nextCB === -1)
nextCB = path.length;
parts.push(path.slice(index + 2, nextCB)
.replace(new RegExp('\\' + quote, 'g'), quote));
index = nextCB + 2;
}
else {
var nextCB = path.indexOf(']', nextOB);
if (nextCB === -1)
nextCB = path.length;
parts.push(path.slice(index + 1, nextCB));
index = nextCB + 1;
}
if (path.charAt(index) === '.')
index++;
}
}
return parts;
}
console.error('parseObjectPath error: Input object path must be a string.');
};
return JsonPointer;
}());
JsonPointer = __decorate([
core_1.Injectable(),
__metadata("design:paramtypes", [])
], JsonPointer);
exports.JsonPointer = JsonPointer;
//# sourceMappingURL=jsonpointer.functions.js.map