UNPKG

ngx-order-pipe

Version:

Angular order pipe, order collection by a field

191 lines 19 kB
import * as tslib_1 from "tslib"; var OrderPipe_1; import { Pipe } from '@angular/core'; let OrderPipe = OrderPipe_1 = class OrderPipe { /** * Check if a value is a string * * @param value */ static isString(value) { return typeof value === 'string' || value instanceof String; } /** * Sorts values ignoring the case * * @param a * @param b */ static caseInsensitiveSort(a, b) { if (OrderPipe_1.isString(a) && OrderPipe_1.isString(b)) { return a.localeCompare(b); } return OrderPipe_1.defaultCompare(a, b); } /** * Default compare method * * @param a * @param b */ static defaultCompare(a, b) { if (a === b) { return 0; } if (a == null) { return 1; } if (b == null) { return -1; } return a > b ? 1 : -1; } /** * Parse expression, split into items * @param expression * @returns {string[]} */ static parseExpression(expression) { expression = expression.replace(/\[(\w+)\]/g, '.$1'); expression = expression.replace(/^\./, ''); return expression.split('.'); } /** * Get value by expression * * @param object * @param expression * @returns {any} */ static getValue(object, expression) { for (let i = 0, n = expression.length; i < n; ++i) { const k = expression[i]; if (!(k in object)) { return; } if (typeof object[k] === 'function') { object = object[k](); } else { object = object[k]; } } return object; } /** * Set value by expression * * @param object * @param value * @param expression */ static setValue(object, value, expression) { let i; for (i = 0; i < expression.length - 1; i++) { object = object[expression[i]]; } object[expression[i]] = value; } transform(value, expression, reverse, isCaseInsensitive = false, comparator) { if (!value) { return value; } if (Array.isArray(expression)) { return this.multiExpressionTransform(value, expression, reverse, isCaseInsensitive, comparator); } if (Array.isArray(value)) { return this.sortArray(value.slice(), expression, reverse, isCaseInsensitive, comparator); } if (typeof value === 'object') { return this.transformObject(Object.assign({}, value), expression, reverse, isCaseInsensitive, comparator); } return value; } /** * Sort array * * @param value * @param expression * @param reverse * @param isCaseInsensitive * @param comparator * @returns {any[]} */ sortArray(value, expression, reverse, isCaseInsensitive, comparator) { const isDeepLink = expression && expression.indexOf('.') !== -1; if (isDeepLink) { expression = OrderPipe_1.parseExpression(expression); } let compareFn; if (comparator && typeof comparator === 'function') { compareFn = comparator; } else { compareFn = isCaseInsensitive ? OrderPipe_1.caseInsensitiveSort : OrderPipe_1.defaultCompare; } const array = value.sort((a, b) => { if (!expression) { return compareFn(a, b); } if (!isDeepLink) { if (a && b) { return compareFn(a[expression], b[expression]); } return compareFn(a, b); } return compareFn(OrderPipe_1.getValue(a, expression), OrderPipe_1.getValue(b, expression)); }); if (reverse) { return array.reverse(); } return array; } /** * Transform Object * * @param value * @param expression * @param reverse * @param isCaseInsensitive * @param comparator * @returns {any[]} */ transformObject(value, expression, reverse, isCaseInsensitive, comparator) { const parsedExpression = OrderPipe_1.parseExpression(expression); let lastPredicate = parsedExpression.pop(); let oldValue = OrderPipe_1.getValue(value, parsedExpression); if (!Array.isArray(oldValue)) { parsedExpression.push(lastPredicate); lastPredicate = null; oldValue = OrderPipe_1.getValue(value, parsedExpression); } if (!oldValue) { return value; } OrderPipe_1.setValue(value, this.transform(oldValue, lastPredicate, reverse, isCaseInsensitive), parsedExpression); return value; } /** * Apply multiple expressions * * @param value * @param {any[]} expressions * @param {boolean} reverse * @param {boolean} isCaseInsensitive * @param {Function} comparator * @returns {any} */ multiExpressionTransform(value, expressions, reverse, isCaseInsensitive = false, comparator) { return expressions.reverse().reduce((result, expression) => { return this.transform(result, expression, reverse, isCaseInsensitive, comparator); }, value); } }; OrderPipe = OrderPipe_1 = tslib_1.__decorate([ Pipe({ name: 'orderBy', pure: false }) ], OrderPipe); export { OrderPipe }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW9yZGVyLnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtb3JkZXItcGlwZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvb3JkZXItcGlwZS9uZ3gtb3JkZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBTXBELElBQWEsU0FBUyxpQkFBdEIsTUFBYSxTQUFTO0lBRXBCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVU7UUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBTSxFQUFFLENBQU07UUFDdkMsSUFBSSxXQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxXQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDYixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNYO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFrQjtRQUN2QyxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFXLEVBQUUsVUFBb0I7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNqRCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFO2dCQUNsQixPQUFPO2FBQ1I7WUFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtnQkFDbkMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEI7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQVcsRUFBRSxLQUFVLEVBQUUsVUFBb0I7UUFDM0QsSUFBSSxDQUFDLENBQUM7UUFDTixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBa0IsRUFBRSxVQUFnQixFQUFFLE9BQWlCLEVBQUUsb0JBQTZCLEtBQUssRUFBRSxVQUFxQjtRQUMxSCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNqRztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDMUY7UUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUMzRztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLFNBQVMsQ0FBQyxLQUFZLEVBQUUsVUFBZ0IsRUFBRSxPQUFpQixFQUFFLGlCQUEyQixFQUFFLFVBQXFCO1FBQ3JILE1BQU0sVUFBVSxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWhFLElBQUksVUFBVSxFQUFFO1lBQ2QsVUFBVSxHQUFHLFdBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEQ7UUFFRCxJQUFJLFNBQW1CLENBQUM7UUFFeEIsSUFBSSxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBQ2xELFNBQVMsR0FBRyxVQUFVLENBQUM7U0FDeEI7YUFBTTtZQUNMLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsV0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxXQUFTLENBQUMsY0FBYyxDQUFDO1NBQzFGO1FBRUQsTUFBTSxLQUFLLEdBQVUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQVUsRUFBRTtZQUN6RCxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN4QjtZQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNWLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDaEQ7Z0JBQ0QsT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1lBRUQsT0FBTyxTQUFTLENBQUMsV0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxFQUFFO1lBQ1gsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDeEI7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxlQUFlLENBQ3JCLEtBQWtCLEVBQ2xCLFVBQWdCLEVBQ2hCLE9BQWlCLEVBQ2pCLGlCQUEyQixFQUMzQixVQUFxQjtRQUVyQixNQUFNLGdCQUFnQixHQUFHLFdBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0MsSUFBSSxRQUFRLEdBQUcsV0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUUzRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM1QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDckMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNyQixRQUFRLEdBQUcsV0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUN4RDtRQUVELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsV0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDakgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssd0JBQXdCLENBQUMsS0FBVSxFQUFFLFdBQWtCLEVBQUUsT0FBZ0IsRUFBRSxvQkFBNkIsS0FBSyxFQUFFLFVBQXFCO1FBQzFJLE9BQU8sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQVcsRUFBRSxVQUFlLEVBQUUsRUFBRTtZQUNuRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEYsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQztDQUNGLENBQUE7QUFsTlksU0FBUztJQUpyQixJQUFJLENBQUM7UUFDSixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUksRUFBRSxLQUFLO0tBQ1osQ0FBQztHQUNXLFNBQVMsQ0FrTnJCO1NBbE5ZLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ29yZGVyQnknLFxuICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBPcmRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdmFsdWVzIGlnbm9yaW5nIHRoZSBjYXNlXG4gICAqXG4gICAqIEBwYXJhbSBhXG4gICAqIEBwYXJhbSBiXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlU29ydChhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChPcmRlclBpcGUuaXNTdHJpbmcoYSkgJiYgT3JkZXJQaXBlLmlzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkZXJQaXBlLmRlZmF1bHRDb21wYXJlKGEsIGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcGFyZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGFcbiAgICogQHBhcmFtIGJcbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Q29tcGFyZShhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChiID09IG51bGwpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGV4cHJlc3Npb24sIHNwbGl0IGludG8gaXRlbXNcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvXFxbKFxcdyspXFxdL2csICcuJDEnKTtcbiAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9eXFwuLywgJycpO1xuICAgIHJldHVybiBleHByZXNzaW9uLnNwbGl0KCcuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIGdldFZhbHVlKG9iamVjdDogYW55LCBleHByZXNzaW9uOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZXhwcmVzc2lvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbnN0IGsgPSBleHByZXNzaW9uW2ldO1xuICAgICAgaWYgKCEoayBpbiBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W2tdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrXSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBzZXRWYWx1ZShvYmplY3Q6IGFueSwgdmFsdWU6IGFueSwgZXhwcmVzc2lvbjogc3RyaW5nW10pIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtleHByZXNzaW9uW2ldXTtcbiAgICB9XG5cbiAgICBvYmplY3RbZXhwcmVzc2lvbltpXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55IHwgYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLCBjb21wYXJhdG9yPzogRnVuY3Rpb24pOiBhbnkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0QXJyYXkodmFsdWUuc2xpY2UoKSwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1PYmplY3QoT2JqZWN0LmFzc2lnbih7fSwgdmFsdWUpLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHNvcnRBcnJheSh2YWx1ZTogYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sIGNvbXBhcmF0b3I/OiBGdW5jdGlvbik6IGFueVtdIHtcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gZXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLmluZGV4T2YoJy4nKSAhPT0gLTE7XG5cbiAgICBpZiAoaXNEZWVwTGluaykge1xuICAgICAgZXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgbGV0IGNvbXBhcmVGbjogRnVuY3Rpb247XG5cbiAgICBpZiAoY29tcGFyYXRvciAmJiB0eXBlb2YgY29tcGFyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcGFyZUZuID0gY29tcGFyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGFyZUZuID0gaXNDYXNlSW5zZW5zaXRpdmUgPyBPcmRlclBpcGUuY2FzZUluc2Vuc2l0aXZlU29ydCA6IE9yZGVyUGlwZS5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheTogYW55W10gPSB2YWx1ZS5zb3J0KChhOiBhbnksIGI6IGFueSk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGbihhLCBiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0RlZXBMaW5rKSB7XG4gICAgICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZUZuKGFbZXhwcmVzc2lvbl0sIGJbZXhwcmVzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJlRm4oYSwgYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wYXJlRm4oT3JkZXJQaXBlLmdldFZhbHVlKGEsIGV4cHJlc3Npb24pLCBPcmRlclBpcGUuZ2V0VmFsdWUoYiwgZXhwcmVzc2lvbikpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBhcnJheS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybU9iamVjdChcbiAgICB2YWx1ZTogYW55IHwgYW55W10sXG4gICAgZXhwcmVzc2lvbj86IGFueSxcbiAgICByZXZlcnNlPzogYm9vbGVhbixcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sXG4gICAgY29tcGFyYXRvcj86IEZ1bmN0aW9uXG4gICk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgbGV0IGxhc3RQcmVkaWNhdGUgPSBwYXJzZWRFeHByZXNzaW9uLnBvcCgpO1xuICAgIGxldCBvbGRWYWx1ZSA9IE9yZGVyUGlwZS5nZXRWYWx1ZSh2YWx1ZSwgcGFyc2VkRXhwcmVzc2lvbik7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkVmFsdWUpKSB7XG4gICAgICBwYXJzZWRFeHByZXNzaW9uLnB1c2gobGFzdFByZWRpY2F0ZSk7XG4gICAgICBsYXN0UHJlZGljYXRlID0gbnVsbDtcbiAgICAgIG9sZFZhbHVlID0gT3JkZXJQaXBlLmdldFZhbHVlKHZhbHVlLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgT3JkZXJQaXBlLnNldFZhbHVlKHZhbHVlLCB0aGlzLnRyYW5zZm9ybShvbGRWYWx1ZSwgbGFzdFByZWRpY2F0ZSwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUpLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbXVsdGlwbGUgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSB7YW55W119IGV4cHJlc3Npb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJzZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ2FzZUluc2Vuc2l0aXZlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHByaXZhdGUgbXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlOiBhbnksIGV4cHJlc3Npb25zOiBhbnlbXSwgcmV2ZXJzZTogYm9vbGVhbiwgaXNDYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSwgY29tcGFyYXRvcj86IEZ1bmN0aW9uKTogYW55IHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbnMucmV2ZXJzZSgpLnJlZHVjZSgocmVzdWx0OiBhbnksIGV4cHJlc3Npb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHJlc3VsdCwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH0sIHZhbHVlKTtcbiAgfVxufVxuIl19