UNPKG

cf-common-lib

Version:

Object Validators and Utilities

273 lines 20 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class PropagatorUtilService { constructor() { } /** * @param {?} objects * @param {?} keyName * @param {?} value * @param {?} ignoreCase * @return {?} */ findInObjectsArrayFromKey(objects, keyName, value, ignoreCase) { if (ignoreCase) { return objects.find((/** * @param {?} item * @return {?} */ item => { return item[keyName].toLowerCase() == value.toLowerCase(); })); } return objects.find((/** * @param {?} item * @return {?} */ item => { return item[keyName] == value; })); } ; /** * @param {?} objects * @param {?} keyName * @return {?} */ extractKeysFromObjectsList(objects, keyName) { return objects.map((/** * @param {?} item * @return {?} */ item => { return item[keyName]; })); } ; /** * @param {?} objects * @param {?} key * @param {?} value * @return {?} */ objectArrayIndexOf(objects, key, value) { return this.extractKeysFromObjectsList(objects, key).indexOf(value); } ; /** * @param {?} objects * @param {?} key * @param {?} value * @return {?} */ objectArrayFindFromKey(objects, key, value) { /** @type {?} */ let index = this.extractKeysFromObjectsList(objects, key).indexOf(value); if (index === -1) { return; } return objects[index]; } ; /** * @param {?} objects * @param {?} keyName * @param {?} value * @return {?} */ filterInObjectsArrayFromKey(objects, keyName, value) { return objects.filter((/** * @param {?} item * @return {?} */ item => { return item[keyName] === value; })); } ; /** * @param {?} objects * @param {?} keys * @param {?} keyName * @return {?} */ filterObjectsFromKeys(objects, keys, keyName) { return objects.filter((/** * @param {?} item * @return {?} */ item => { return keys.indexOf(item[keyName]) !== -1; })); } ; /** * @param {?} _arr * @return {?} */ flattenArray(_arr) { return _flattenArray(_arr); /** * @param {?} _arr * @return {?} */ function _flattenArray(_arr) { return _arr.reduce((/** * @param {?} _acc * @param {?} _value * @return {?} */ function (_acc, _value) { return Array.isArray(_value) ? _acc.concat(_flattenArray(_value)) : _acc.concat(_value); }), []); } } /** * @param {?} callback * @param {...?} urls * @return {?} */ jsCssScriptInjector(callback, ...urls) { /** @type {?} */ let _count = 0; /** @type {?} */ let _element; this.flattenArray(urls).forEach((/** * @param {?} _url * @return {?} */ _url => { if (_url.endsWith(".js")) { _element = document.createElement('script'); _element.src = _url; _element.type = 'text/javascript'; _element.async = true; } if (_url.endsWith(".css")) { _element = document.createElement('link'); _element.rel = "stylesheet"; _element.href = _url; } if (callback) { _element.addEventListener("load", (/** * @return {?} */ function () { _count++; if (_count == urls.length) { callback(urls); } })); } document.getElementsByTagName('head')[0].appendChild(_element); })); } /** * @param {?} x * @param {?} y * @return {?} */ isObjectsEqual(x, y) { return _objectEquals(x, y); /** * @param {?} x * @param {?} y * @return {?} */ function _objectEquals(x, y) { if (x === null || x === undefined || y === null || y === undefined) { return x === y; } // after this just checking type of one would be enough if (x.constructor !== y.constructor) { return false; } // if they are functions, they should exactly refer to same one (because of closures) if (x instanceof Function) { return x === y; } // if they are regexps, they should exactly refer to same one (it is hard to better equality check on current ES) if (x instanceof RegExp) { return x === y; } if (x === y || x.valueOf() === y.valueOf()) { return true; } if (Array.isArray(x) && x.length !== y.length) { return false; } // if they are dates, they must had equal valueOf if (x instanceof Date) { return false; } // if they are strictly equal, they both need to be object at least if (!(x instanceof Object)) { return false; } if (!(y instanceof Object)) { return false; } // recursive object equality check /** @type {?} */ var p = Object.keys(x); return Object.keys(y).every((/** * @param {?} i * @return {?} */ function (i) { return p.indexOf(i) !== -1; })) && p.every((/** * @param {?} i * @return {?} */ function (i) { return _objectEquals(x[i], y[i]); })); } } /** * @param {?} _exclude * @param {?} _list * @return {?} */ excludeValuesFromObjectList(_exclude, _list) { return _excludeValuesFromObjectList(_exclude, _list); /** * @param {?} _exclude * @param {?} _list * @return {?} */ function _excludeValuesFromObjectList(_exclude, _list) { /** @type {?} */ let temp = []; for (var _ex in _exclude) { _exclude[_ex].forEach((/** * @param {?} _item * @return {?} */ function (_item) { temp = _list.filter((/** * @param {?} book * @return {?} */ function (book) { return book[_ex] != _item; })); _list = temp; })); } return _list; } } } PropagatorUtilService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ PropagatorUtilService.ctorParameters = () => []; /** @nocollapse */ PropagatorUtilService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PropagatorUtilService_Factory() { return new PropagatorUtilService(); }, token: PropagatorUtilService, providedIn: "root" }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGFnYXRvci11dGlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jZi1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3Byb3BhZ2F0b3ItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8scUJBQXFCO0lBRTlCLGdCQUFnQixDQUFDOzs7Ozs7OztJQUVqQix5QkFBeUIsQ0FBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVO1FBQy9ELElBQUksVUFBVSxFQUFHO1lBQ2hCLE9BQU8sT0FBTyxDQUFDLElBQUk7Ozs7WUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDM0IsT0FBTyxJQUFJLENBQUUsT0FBTyxDQUFFLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdELENBQUMsRUFBQyxDQUFDO1NBQ0g7UUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJOzs7O1FBQUUsSUFBSSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUUsT0FBTyxDQUFFLElBQUksS0FBSyxDQUFDO1FBQ2pDLENBQUMsRUFBQyxDQUFDO0lBQ0osQ0FBQztJQUFBLENBQUM7Ozs7OztJQUdILDBCQUEwQixDQUFFLE9BQU8sRUFBRyxPQUFPO1FBQzVDLE9BQU8sT0FBTyxDQUFDLEdBQUc7Ozs7UUFBRSxJQUFJLENBQUMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBRSxPQUFPLENBQUUsQ0FBQztRQUN4QixDQUFDLEVBQUMsQ0FBQztJQUNKLENBQUM7SUFBQSxDQUFDOzs7Ozs7O0lBR0Ysa0JBQWtCLENBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFFLE9BQU8sRUFBRSxHQUFHLENBQUUsQ0FBQyxPQUFPLENBQUUsS0FBSyxD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RUYsQ0FBQzs7O1lBakpELFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGFnYXRvclV0aWxTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBmaW5kSW5PYmplY3RzQXJyYXlGcm9tS2V5KCBvYmplY3RzLCBrZXlOYW1lLCB2YWx1ZSwgaWdub3JlQ2FzZSApIHtcblx0XHRcdGlmKCBpZ25vcmVDYXNlICkge1xuXHRcdFx0XHRyZXR1cm4gb2JqZWN0cy5maW5kKCBpdGVtID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbVsga2V5TmFtZSBdLnRvTG93ZXJDYXNlKCkgPT0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0fSk7XHRcblx0XHRcdH0gXG5cdFx0XHRyZXR1cm4gb2JqZWN0cy5maW5kKCBpdGVtID0+e1xuXHRcdFx0XHRyZXR1cm4gaXRlbVsga2V5TmFtZSBdID09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXG5cdGV4dHJhY3RLZXlzRnJvbU9iamVjdHNMaXN0KCBvYmplY3RzICwga2V5TmFtZSApIHtcblx0XHRyZXR1cm4gb2JqZWN0cy5tYXAoIGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIGl0ZW1bIGtleU5hbWUgXTtcblx0XHR9KTtcblx0fTtcblxuXG5cdG9iamVjdEFycmF5SW5kZXhPZiggb2JqZWN0cywga2V5LCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gdGhpcy5leHRyYWN0S2V5c0Zyb21PYmplY3RzTGlzdCggb2JqZWN0cywga2V5ICkuaW5kZXhPZiggdmFsdWUgKTtcblx0fTtcblxuXHRvYmplY3RBcnJheUZpbmRGcm9tS2V5KCBvYmplY3RzLCBrZXksIHZhbHVlICkge1xuXHRcdGxldCAgaW5kZXggPSB0aGlzLmV4dHJhY3RLZXlzRnJvbU9iamVjdHNMaXN0KCBvYmplY3RzLCBrZXkgKS5pbmRleE9mKCB2YWx1ZSApO1xuXHRcdGlmKCBpbmRleCA9PT0gLTEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHJldHVybiBvYmplY3RzWyBpbmRleCBdO1xuXHR9O1xuXG5cdGZpbHRlckluT2JqZWN0c0FycmF5RnJvbUtleSggb2JqZWN0cywga2V5TmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gb2JqZWN0cy5maWx0ZXIoaXRlbSA9PiB7XG5cdFx0XHRcdHJldHVybiBpdGVtWyBrZXlOYW1lIF0gPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRmaWx0ZXJPYmplY3RzRnJvbUtleXMoIG9iamVjdHMsIGtleXMsIGtleU5hbWUgKSB7XG5cdFx0XHRyZXR1cm4gb2JqZWN0cy5maWx0ZXIoIGl0ZW0gPT4ge1xuXHRcdFx0XHRyZXR1cm4ga2V5cy5pbmRleE9mKCBpdGVtWyBrZXlOYW1lIF0pICE9PSAtMTtcblx0XHRcdH0pO1xuICAgIH07XG4gICAgXG5cdGZsYXR0ZW5BcnJheShfYXJyKXsgXG5cblx0XHRyZXR1cm4gX2ZsYXR0ZW5BcnJheShfYXJyKTtcblxuICAgICAgICBmdW5jdGlvbiBfZmxhdHRlbkFycmF5KF9hcnIpe1xuICAgICAgICAgICAgcmV0dXJuIF9hcnIucmVkdWNlKGZ1bmN0aW9uKF9hY2MsIF92YWx1ZSl7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShfdmFsdWUpIFxuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfYWNjLmNvbmNhdChfZmxhdHRlbkFycmF5KF92YWx1ZSkpXG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF9hY2MuY29uY2F0KF92YWx1ZSk7XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgIH0gXG4gICAgICAgXG4gICAgICAgIFxuXHR9XG5cdFxuXHRqc0Nzc1NjcmlwdEluamVjdG9yKGNhbGxiYWNrLCAuLi51cmxzKSB7XG4gICAgICAgIGxldCBfY291bnQgPSAwO1xuICAgICAgICBsZXQgX2VsZW1lbnQ7IFxuIFxuICAgICAgICB0aGlzLmZsYXR0ZW5BcnJheSh1cmxzKS5mb3JFYWNoKF91cmwgPT4geyAgXG4gICAgICAgICAgICBpZihfdXJsLmVuZHNXaXRoKFwiLmpzXCIpKSB7XG4gICAgICAgICAgICAgICAgX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBfZWxlbWVudC5zcmMgPSBfdXJsO1xuICAgICAgICAgICAgICAgIF9lbGVtZW50LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgICAgICAgICBfZWxlbWVudC5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihfdXJsLmVuZHNXaXRoKFwiLmNzc1wiKSkge1xuICAgICAgICAgICAgICAgIF9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpOyBcbiAgICAgICAgICAgICAgICBfZWxlbWVudC5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgICAgICAgICBfZWxlbWVudC5ocmVmID0gX3VybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGNhbGxiYWNrKSB7IFxuICAgICAgICAgICAgICAgIF9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBfY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgaWYoX2NvdW50PT11cmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodXJscyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoX2VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuXHRcdH1cblx0XHRcblxuXHRpc09iamVjdHNFcXVhbCh4LCB5KXtcblxuXHRcdHJldHVybiBfb2JqZWN0RXF1YWxzKHgsIHkpIDtcblx0XHRcblx0XHRmdW5jdGlvbiBfb2JqZWN0RXF1YWxzKHgsIHkpIHsgIFxuXHRcdFx0aWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IG51bGwgfHwgeSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB4ID09PSB5OyB9XG5cdFx0XHQvLyBhZnRlciB0aGlzIGp1c3QgY2hlY2tpbmcgdHlwZSBvZiBvbmUgd291bGQgYmUgZW5vdWdoXG5cdFx0XHRpZiAoeC5jb25zdHJ1Y3RvciAhPT0geS5jb25zdHJ1Y3RvcikgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdC8vIGlmIHRoZXkgYXJlIGZ1bmN0aW9ucywgdGhleSBzaG91bGQgZXhhY3RseSByZWZlciB0byBzYW1lIG9uZSAoYmVjYXVzZSBvZiBjbG9zdXJlcylcblx0XHRcdGlmICh4IGluc3RhbmNlb2YgRnVuY3Rpb24pIHsgcmV0dXJuIHggPT09IHk7IH1cblx0XHRcdC8vIGlmIHRoZXkgYXJlIHJlZ2V4cHMsIHRoZXkgc2hvdWxkIGV4YWN0bHkgcmVmZXIgdG8gc2FtZSBvbmUgKGl0IGlzIGhhcmQgdG8gYmV0dGVyIGVxdWFsaXR5IGNoZWNrIG9uIGN1cnJlbnQgRVMpXG5cdFx0XHRpZiAoeCBpbnN0YW5jZW9mIFJlZ0V4cCkgeyByZXR1cm4geCA9PT0geTsgfVxuXHRcdFx0aWYgKHggPT09IHkgfHwgeC52YWx1ZU9mKCkgPT09IHkudmFsdWVPZigpKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh4KSAmJiB4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XG5cdFx0XHQvLyBpZiB0aGV5IGFyZSBkYXRlcywgdGhleSBtdXN0IGhhZCBlcXVhbCB2YWx1ZU9mXG5cdFx0XHRpZiAoeCBpbnN0YW5jZW9mIERhdGUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0XG5cdFx0XHQvLyBpZiB0aGV5IGFyZSBzdHJpY3RseSBlcXVhbCwgdGhleSBib3RoIG5lZWQgdG8gYmUgb2JqZWN0IGF0IGxlYXN0XG5cdFx0XHRpZiAoISh4IGluc3RhbmNlb2YgT2JqZWN0KSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRcdGlmICghKHkgaW5zdGFuY2VvZiBPYmplY3QpKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdFxuXHRcdFx0Ly8gcmVjdXJzaXZlIG9iamVjdCBlcXVhbGl0eSBjaGVja1xuXHRcdFx0dmFyIHAgPSBPYmplY3Qua2V5cyh4KTtcblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyh5KS5ldmVyeShmdW5jdGlvbiAoaSkgeyByZXR1cm4gcC5pbmRleE9mKGkpICE9PSAtMTsgfSkgJiZcblx0XHRcdFx0cC5ldmVyeShmdW5jdGlvbiAoaSkgeyByZXR1cm4gX29iamVjdEVxdWFscyh4W2ldLCB5W2ldKTsgfSk7XG5cdFx0fVxuXHR9XG5cblxuXHRleGNsdWRlVmFsdWVzRnJvbU9iamVjdExpc3QoX2V4Y2x1ZGUsIF9saXN0KXtcblxuXHRcdHJldHVybiBfZXhjbHVkZVZhbHVlc0Zyb21PYmplY3RMaXN0KF9leGNsdWRlLCBfbGlzdClcblxuXHRcdGZ1bmN0aW9uIF9leGNsdWRlVmFsdWVzRnJvbU9iamVjdExpc3QoX2V4Y2x1ZGUsIF9saXN0KXtcblx0XHRcdGxldCB0ZW1wID0gW107XG5cdFx0XHRmb3IodmFyIF9leCBpbiBfZXhjbHVkZSl7IFxuXHRcdFx0XHRfZXhjbHVkZVtfZXhdLmZvckVhY2goZnVuY3Rpb24oX2l0ZW0peyBcblx0XHRcdFx0XHR0ZW1wID0gX2xpc3QuZmlsdGVyKGZ1bmN0aW9uKGJvb2speyAgXG5cdFx0XHRcdFx0XHRyZXR1cm4gYm9va1tfZXhdICE9IF9pdGVtIDsgXG5cdFx0XHRcdFx0fSk7ICAgXG5cdFx0XHRcdFx0X2xpc3QgPSB0ZW1wIDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IFxuXHRcdFx0cmV0dXJuIF9saXN0O1xuXHRcdH1cblxuXHR9XG5cblx0XG5cbn1cbiJdfQ==