diff --git a/dist/smart-table-server.js b/dist/smart-table-server.js
index 0b15582..ec3fb25 100644
--- a/dist/smart-table-server.js
+++ b/dist/smart-table-server.js
@@ -1,29 +1,29 @@
(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global['smart-table-server'] = factory());
-}(this, (function () { 'use strict';
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global['smart-table-server'] = factory());
+}(this, function () { 'use strict';
-var index = ({query}) => ({table, tableState}) => {
- const exec = () => {
- table.dispatch('EXEC_CHANGED', {working: true});
- return query(tableState)
- .then(({data = [], summary = {}}) => {
- table.dispatch('SUMMARY_CHANGED', summary);
- table.dispatch('DISPLAY_CHANGED', data);
- table.dispatch('EXEC_CHANGED', {working: false});
- })
- .catch(e => {
- table.dispatch('EXEC_ERROR', e);
- table.dispatch('EXEC_CHANGED', {working: false});
- });
- };
+ var index = ({query}) => ({table, tableState}) => {
+ const exec = () => {
+ table.dispatch('EXEC_CHANGED', {working: true});
+ return query(tableState)
+ .then(({data = [], summary = {}}) => {
+ table.dispatch('SUMMARY_CHANGED', summary);
+ table.dispatch('DISPLAY_CHANGED', data);
+ table.dispatch('EXEC_CHANGED', {working: false});
+ })
+ .catch(e => {
+ table.dispatch('EXEC_ERROR', e);
+ table.dispatch('EXEC_CHANGED', {working: false});
+ });
+ };
- return Object.assign(table, {
- exec, eval: (ts = tableState) => query(ts).then(({data}) => data)
- });
-};
+ return Object.assign(table, {
+ exec, eval: (ts = tableState) => query(ts).then(({data}) => data)
+ });
+ };
-return index;
+ return index;
-})));
+}));
diff --git a/example/bundle.js b/example/bundle.js
index 3dd75d7..e298821 100644
--- a/example/bundle.js
+++ b/example/bundle.js
@@ -1,740 +1,754 @@
(function () {
-'use strict';
-
-function swap (f) {
- return (a, b) => f(b, a);
-}
-
-function compose (first, ...fns) {
- return (...args) => fns.reduce((previous, current) => current(previous), first(...args));
-}
-
-function curry (fn, arityLeft) {
- const arity = arityLeft || fn.length;
- return (...args) => {
- const argLength = args.length || 1;
- if (arity === argLength) {
- return fn(...args);
- } else {
- const func = (...moreArgs) => fn(...args, ...moreArgs);
- return curry(func, arity - args.length);
- }
- };
-}
-
-
-
-function tap (fn) {
- return arg => {
- fn(arg);
- return arg;
- }
-}
-
-function pointer (path) {
-
- const parts = path.split('.');
-
- function partial (obj = {}, parts = []) {
- const p = parts.shift();
- const current = obj[p];
- return (current === undefined || parts.length === 0) ?
- current : partial(current, parts);
- }
-
- function set (target, newTree) {
- let current = target;
- const [leaf, ...intermediate] = parts.reverse();
- for (let key of intermediate.reverse()) {
- if (current[key] === undefined) {
- current[key] = {};
- current = current[key];
- }
- }
- current[leaf] = Object.assign(current[leaf] || {}, newTree);
- return target;
- }
-
- return {
- get(target){
- return partial(target, [...parts])
- },
- set
- }
-}
-
-function sortByProperty (prop) {
- const propGetter = pointer(prop).get;
- return (a, b) => {
- const aVal = propGetter(a);
- const bVal = propGetter(b);
-
- if (aVal === bVal) {
- return 0;
- }
+ 'use strict';
+
+ const swap = (f) => (a, b) => f(b, a);
+ const compose = (first, ...fns) => (...args) => fns.reduce((previous, current) => current(previous), first(...args));
+ const curry = (fn, arityLeft) => {
+ const arity = arityLeft || fn.length;
+ return (...args) => {
+ const argLength = args.length || 1;
+ if (arity === argLength) {
+ return fn(...args);
+ }
+ const func = (...moreArgs) => fn(...args, ...moreArgs);
+ return curry(func, arity - args.length);
+ };
+ };
+ const tap = (fn) => arg => {
+ fn(arg);
+ return arg;
+ };
+
+ const pointer = (path) => {
+ const parts = path.split('.');
+ const partial = (obj = {}, parts = []) => {
+ const p = parts.shift();
+ const current = obj[p];
+ return (current === undefined || current === null || parts.length === 0) ?
+ current : partial(current, parts);
+ };
+ const set = (target, newTree) => {
+ let current = target;
+ const [leaf, ...intermediate] = parts.reverse();
+ for (const key of intermediate.reverse()) {
+ if (current[key] === undefined) {
+ current[key] = {};
+ current = current[key];
+ }
+ }
+ current[leaf] = Object.assign(current[leaf] || {}, newTree);
+ return target;
+ };
+ return {
+ get(target) {
+ return partial(target, [...parts]);
+ },
+ set
+ };
+ };
- if (bVal === undefined) {
- return -1;
+ const defaultComparator = (a, b) => {
+ if (a === b) {
+ return 0;
+ }
+ if (a === undefined) {
+ return 1;
+ }
+ if (b === undefined) {
+ return -1;
+ }
+ return a < b ? -1 : 1;
+ };
+ var SortDirection;
+ (function (SortDirection) {
+ SortDirection["ASC"] = "asc";
+ SortDirection["DESC"] = "desc";
+ SortDirection["NONE"] = "none";
+ })(SortDirection || (SortDirection = {}));
+ const sortByProperty = (prop, comparator) => {
+ const propGetter = pointer(prop).get;
+ return (a, b) => comparator(propGetter(a), propGetter(b));
+ };
+ const defaultSortFactory = (conf) => {
+ const { pointer: pointer$$1, direction = "asc" /* ASC */, comparator = defaultComparator } = conf;
+ if (!pointer$$1 || direction === "none" /* NONE */) {
+ return (array) => [...array];
+ }
+ const orderFunc = sortByProperty(pointer$$1, comparator);
+ const compareFunc = direction === "desc" /* DESC */ ? swap(orderFunc) : orderFunc;
+ return (array) => [...array].sort(compareFunc);
+ };
+
+ var Type;
+ (function (Type) {
+ Type["BOOLEAN"] = "boolean";
+ Type["NUMBER"] = "number";
+ Type["DATE"] = "date";
+ Type["STRING"] = "string";
+ })(Type || (Type = {}));
+ const typeExpression = (type) => {
+ switch (type) {
+ case Type.BOOLEAN:
+ return Boolean;
+ case Type.NUMBER:
+ return Number;
+ case Type.DATE:
+ return val => new Date(val);
+ case Type.STRING:
+ return compose(String, val => val.toLowerCase());
+ default:
+ return val => val;
+ }
+ };
+ var FilterOperator;
+ (function (FilterOperator) {
+ FilterOperator["INCLUDES"] = "includes";
+ FilterOperator["IS"] = "is";
+ FilterOperator["IS_NOT"] = "isNot";
+ FilterOperator["LOWER_THAN"] = "lt";
+ FilterOperator["GREATER_THAN"] = "gt";
+ FilterOperator["GREATER_THAN_OR_EQUAL"] = "gte";
+ FilterOperator["LOWER_THAN_OR_EQUAL"] = "lte";
+ FilterOperator["EQUALS"] = "equals";
+ FilterOperator["NOT_EQUALS"] = "notEquals";
+ FilterOperator["ANY_OF"] = "anyOf";
+ })(FilterOperator || (FilterOperator = {}));
+ const not = fn => input => !fn(input);
+ const is = value => input => Object.is(value, input);
+ const lt = value => input => input < value;
+ const gt = value => input => input > value;
+ const equals = value => input => value === input;
+ const includes = value => input => input.includes(value);
+ const anyOf = value => input => value.includes(input);
+ const operators = {
+ ["includes" /* INCLUDES */]: includes,
+ ["is" /* IS */]: is,
+ ["isNot" /* IS_NOT */]: compose(is, not),
+ ["lt" /* LOWER_THAN */]: lt,
+ ["gte" /* GREATER_THAN_OR_EQUAL */]: compose(lt, not),
+ ["gt" /* GREATER_THAN */]: gt,
+ ["lte" /* LOWER_THAN_OR_EQUAL */]: compose(gt, not),
+ ["equals" /* EQUALS */]: equals,
+ ["notEquals" /* NOT_EQUALS */]: compose(equals, not),
+ ["anyOf" /* ANY_OF */]: anyOf
+ };
+ const every = fns => (...args) => fns.every(fn => fn(...args));
+ const predicate = ({ value = '', operator = "includes" /* INCLUDES */, type }) => {
+ const typeIt = typeExpression(type);
+ const operateOnTyped = compose(typeIt, operators[operator]);
+ const predicateFunc = operateOnTyped(value);
+ return compose(typeIt, predicateFunc);
+ };
+ // Avoid useless filter lookup (improve perf)
+ const normalizeClauses = (conf) => {
+ const output = {};
+ const validPath = Object.keys(conf).filter(path => Array.isArray(conf[path]));
+ validPath.forEach(path => {
+ const validClauses = conf[path].filter(c => c.value !== '');
+ if (validClauses.length > 0) {
+ output[path] = validClauses;
+ }
+ });
+ return output;
+ };
+ const filter = (filter) => {
+ const normalizedClauses = normalizeClauses(filter);
+ const funcList = Object.keys(normalizedClauses).map(path => {
+ const getter = pointer(path).get;
+ const clauses = normalizedClauses[path].map(predicate);
+ return compose(getter, every(clauses));
+ });
+ const filterPredicate = every(funcList);
+ return array => array.filter(filterPredicate);
+ };
+
+ function re(strs, ...substs) {
+ let reStr = transformRaw(strs.raw[0]);
+ for (const [i, subst] of substs.entries()) {
+ if (subst instanceof RegExp) {
+ reStr += subst.source;
+ } else if (typeof subst === 'string') {
+ reStr += quoteText(subst);
+ } else {
+ throw new Error('Illegal substitution: '+subst);
+ }
+ reStr += transformRaw(strs.raw[i+1]);
+ }
+ let flags = '';
+ if (reStr.startsWith('/')) {
+ const lastSlashIndex = reStr.lastIndexOf('/');
+ if (lastSlashIndex === 0) {
+ throw new Error('If the `re` string starts with a slash, it must end with a second slash and zero or more flags: '+reStr);
+ }
+ flags = reStr.slice(lastSlashIndex+1);
+ reStr = reStr.slice(1, lastSlashIndex);
+ }
+ return new RegExp(reStr, flags);
}
- if (aVal === undefined) {
- return 1;
+ function transformRaw(str) {
+ return str.replace(/\\`/g, '`');
}
- return aVal < bVal ? -1 : 1;
- }
-}
-
-function sortFactory ({pointer: pointer$$1, direction} = {}) {
- if (!pointer$$1 || direction === 'none') {
- return array => [...array];
- }
-
- const orderFunc = sortByProperty(pointer$$1);
- const compareFunc = direction === 'desc' ? swap(orderFunc) : orderFunc;
-
- return (array) => [...array].sort(compareFunc);
-}
-
-function typeExpression (type) {
- switch (type) {
- case 'boolean':
- return Boolean;
- case 'number':
- return Number;
- case 'date':
- return (val) => new Date(val);
- default:
- return compose(String, (val) => val.toLowerCase());
- }
-}
-
-const operators = {
- includes(value){
- return (input) => input.includes(value);
- },
- is(value){
- return (input) => Object.is(value, input);
- },
- isNot(value){
- return (input) => !Object.is(value, input);
- },
- lt(value){
- return (input) => input < value;
- },
- gt(value){
- return (input) => input > value;
- },
- lte(value){
- return (input) => input <= value;
- },
- gte(value){
- return (input) => input >= value;
- },
- equals(value){
- return (input) => value == input;
- },
- notEquals(value){
- return (input) => value != input;
- }
-};
-
-const every = fns => (...args) => fns.every(fn => fn(...args));
-
-function predicate ({value = '', operator = 'includes', type = 'string'}) {
- const typeIt = typeExpression(type);
- const operateOnTyped = compose(typeIt, operators[operator]);
- const predicateFunc = operateOnTyped(value);
- return compose(typeIt, predicateFunc);
-}
-
-//avoid useless filter lookup (improve perf)
-function normalizeClauses (conf) {
- const output = {};
- const validPath = Object.keys(conf).filter(path => Array.isArray(conf[path]));
- validPath.forEach(path => {
- const validClauses = conf[path].filter(c => c.value !== '');
- if (validClauses.length) {
- output[path] = validClauses;
- }
- });
- return output;
-}
-
-function filter$1 (filter) {
- const normalizedClauses = normalizeClauses(filter);
- const funcList = Object.keys(normalizedClauses).map(path => {
- const getter = pointer(path).get;
- const clauses = normalizedClauses[path].map(predicate);
- return compose(getter, every(clauses));
- });
- const filterPredicate = every(funcList);
-
- return (array) => array.filter(filterPredicate);
-}
-
-var search$1 = function (searchConf = {}) {
- const {value, scope = []} = searchConf;
- const searchPointers = scope.map(field => pointer(field).get);
- if (!scope.length || !value) {
- return array => array;
- } else {
- return array => array.filter(item => searchPointers.some(p => String(p(item)).includes(String(value))))
- }
-};
-
-function sliceFactory ({page = 1, size} = {}) {
- return function sliceFunction (array = []) {
- const actualSize = size || array.length;
- const offset = (page - 1) * actualSize;
- return array.slice(offset, offset + actualSize);
- };
-}
-
-function emitter () {
-
- const listenersLists = {};
- const instance = {
- on(event, ...listeners){
- listenersLists[event] = (listenersLists[event] || []).concat(listeners);
- return instance;
- },
- dispatch(event, ...args){
- const listeners = listenersLists[event] || [];
- for (let listener of listeners) {
- listener(...args);
- }
- return instance;
- },
- off(event, ...listeners){
- if (!event) {
- Object.keys(listenersLists).forEach(ev => instance.off(ev));
- } else {
- const list = listenersLists[event] || [];
- listenersLists[event] = listeners.length ? list.filter(listener => !listeners.includes(listener)) : [];
- }
- return instance;
- }
- };
- return instance;
-}
-
-function proxyListener (eventMap) {
- return function ({emitter}) {
-
- const proxy = {};
- let eventListeners = {};
-
- for (let ev of Object.keys(eventMap)) {
- const method = eventMap[ev];
- eventListeners[ev] = [];
- proxy[method] = function (...listeners) {
- eventListeners[ev] = eventListeners[ev].concat(listeners);
- emitter.on(ev, ...listeners);
- return proxy;
- };
+ /**
+ * All special characters are escaped, because you may want to quote several characters inside parentheses or square brackets.
+ */
+ function quoteText(text) {
+ return text.replace(/[\\^$.*+?()[\]{}|=!<>:-]/g, '\\$&');
}
- return Object.assign(proxy, {
- off(ev){
- if (!ev) {
- Object.keys(eventListeners).forEach(eventName => proxy.off(eventName));
+ const regexp = (input) => {
+ const { value, scope = [], escape = false, flags = '' } = input;
+ const searchPointers = scope.map(field => pointer(field).get);
+ if (scope.length === 0 || !value) {
+ return (array) => array;
}
- if (eventListeners[ev]) {
- emitter.off(ev, ...eventListeners[ev]);
+ const regex = escape === true ? re `/${value}/${flags}` : new RegExp(value, flags);
+ return (array) => array.filter(item => searchPointers.some(p => regex.test(String(p(item)))));
+ };
+
+ const emitter = () => {
+ const listenersLists = {};
+ const instance = {
+ on(event, ...listeners) {
+ listenersLists[event] = (listenersLists[event] || []).concat(listeners);
+ return instance;
+ },
+ dispatch(event, ...args) {
+ const listeners = listenersLists[event] || [];
+ for (const listener of listeners) {
+ listener(...args);
+ }
+ return instance;
+ },
+ off(event, ...listeners) {
+ if (event === undefined) {
+ Object.keys(listenersLists).forEach(ev => instance.off(ev));
+ }
+ else {
+ const list = listenersLists[event] || [];
+ listenersLists[event] = listeners.length ? list.filter(listener => !listeners.includes(listener)) : [];
+ }
+ return instance;
+ }
+ };
+ return instance;
+ };
+ const proxyListener = (eventMap) => ({ emitter }) => {
+ const eventListeners = {};
+ const proxy = {
+ off(ev) {
+ if (!ev) {
+ Object.keys(eventListeners).forEach(eventName => proxy.off(eventName));
+ }
+ if (eventListeners[ev]) {
+ emitter.off(ev, ...eventListeners[ev]);
+ }
+ return proxy;
+ }
+ };
+ for (const ev of Object.keys(eventMap)) {
+ const method = eventMap[ev];
+ eventListeners[ev] = [];
+ proxy[method] = function (...listeners) {
+ eventListeners[ev] = eventListeners[ev].concat(listeners);
+ emitter.on(ev, ...listeners);
+ return proxy;
+ };
}
return proxy;
- }
- });
- }
-}
-
-const TOGGLE_SORT = 'TOGGLE_SORT';
-const DISPLAY_CHANGED = 'DISPLAY_CHANGED';
-const PAGE_CHANGED = 'CHANGE_PAGE';
-const EXEC_CHANGED = 'EXEC_CHANGED';
-const FILTER_CHANGED = 'FILTER_CHANGED';
-const SUMMARY_CHANGED = 'SUMMARY_CHANGED';
-const SEARCH_CHANGED = 'SEARCH_CHANGED';
-const EXEC_ERROR = 'EXEC_ERROR';
-
-function curriedPointer (path) {
- const {get, set} = pointer(path);
- return {get, set: curry(set)};
-}
-
-var table$2 = function ({
- sortFactory,
- tableState,
- data,
- filterFactory,
- searchFactory
-}) {
- const table = emitter();
- const sortPointer = curriedPointer('sort');
- const slicePointer = curriedPointer('slice');
- const filterPointer = curriedPointer('filter');
- const searchPointer = curriedPointer('search');
-
- const safeAssign = curry((base, extension) => Object.assign({}, base, extension));
- const dispatch = curry(table.dispatch.bind(table), 2);
-
- const dispatchSummary = (filtered) => {
- dispatch(SUMMARY_CHANGED, {
- page: tableState.slice.page,
- size: tableState.slice.size,
- filteredCount: filtered.length
- });
- };
-
- const exec = ({processingDelay = 20} = {}) => {
- table.dispatch(EXEC_CHANGED, {working: true});
- setTimeout(function () {
- try {
- const filterFunc = filterFactory(filterPointer.get(tableState));
- const searchFunc = searchFactory(searchPointer.get(tableState));
- const sortFunc = sortFactory(sortPointer.get(tableState));
- const sliceFunc = sliceFactory(slicePointer.get(tableState));
- const execFunc = compose(filterFunc, searchFunc, tap(dispatchSummary), sortFunc, sliceFunc);
- const displayed = execFunc(data);
- table.dispatch(DISPLAY_CHANGED, displayed.map(d => {
- return {index: data.indexOf(d), value: d};
- }));
- } catch (e) {
- table.dispatch(EXEC_ERROR, e);
- } finally {
- table.dispatch(EXEC_CHANGED, {working: false});
- }
- }, processingDelay);
- };
-
- const updateTableState = curry((pter, ev, newPartialState) => compose(
- safeAssign(pter.get(tableState)),
- tap(dispatch(ev)),
- pter.set(tableState)
- )(newPartialState));
-
- const resetToFirstPage = () => updateTableState(slicePointer, PAGE_CHANGED, {page: 1});
-
- const tableOperation = (pter, ev) => compose(
- updateTableState(pter, ev),
- resetToFirstPage,
- () => table.exec() // we wrap within a function so table.exec can be overwritten (when using with a server for example)
- );
-
- const api = {
- sort: tableOperation(sortPointer, TOGGLE_SORT),
- filter: tableOperation(filterPointer, FILTER_CHANGED),
- search: tableOperation(searchPointer, SEARCH_CHANGED),
- slice: compose(updateTableState(slicePointer, PAGE_CHANGED), () => table.exec()),
- exec,
- eval(state = tableState){
- return Promise.resolve()
- .then(function () {
- const sortFunc = sortFactory(sortPointer.get(state));
- const searchFunc = searchFactory(searchPointer.get(state));
- const filterFunc = filterFactory(filterPointer.get(state));
- const sliceFunc = sliceFactory(slicePointer.get(state));
- const execFunc = compose(filterFunc, searchFunc, sortFunc, sliceFunc);
- return execFunc(data).map(d => {
- return {index: data.indexOf(d), value: d}
- });
+ };
+
+ const sliceFactory = ({ page = 1, size } = { page: 1 }) => (array = []) => {
+ const actualSize = size || array.length;
+ const offset = (page - 1) * actualSize;
+ return array.slice(offset, offset + actualSize);
+ };
+
+ var SmartTableEvents;
+ (function (SmartTableEvents) {
+ SmartTableEvents["TOGGLE_SORT"] = "TOGGLE_SORT";
+ SmartTableEvents["DISPLAY_CHANGED"] = "DISPLAY_CHANGED";
+ SmartTableEvents["PAGE_CHANGED"] = "CHANGE_PAGE";
+ SmartTableEvents["EXEC_CHANGED"] = "EXEC_CHANGED";
+ SmartTableEvents["FILTER_CHANGED"] = "FILTER_CHANGED";
+ SmartTableEvents["SUMMARY_CHANGED"] = "SUMMARY_CHANGED";
+ SmartTableEvents["SEARCH_CHANGED"] = "SEARCH_CHANGED";
+ SmartTableEvents["EXEC_ERROR"] = "EXEC_ERROR";
+ })(SmartTableEvents || (SmartTableEvents = {}));
+ const curriedPointer = (path) => {
+ const { get, set } = pointer(path);
+ return { get, set: curry(set) };
+ };
+ const tableDirective = ({ sortFactory, tableState, data, filterFactory, searchFactory }) => {
+ let filteredCount = data.length;
+ let matchingItems = data;
+ const table = emitter();
+ const sortPointer = curriedPointer('sort');
+ const slicePointer = curriedPointer('slice');
+ const filterPointer = curriedPointer('filter');
+ const searchPointer = curriedPointer('search');
+ // We need to register in case the summary comes from outside (like server data)
+ table.on("SUMMARY_CHANGED" /* SUMMARY_CHANGED */, ({ filteredCount: count }) => {
+ filteredCount = count;
});
- },
- onDisplayChange(fn){
- table.on(DISPLAY_CHANGED, fn);
- },
- getTableState(){
- const sort = Object.assign({}, tableState.sort);
- const search = Object.assign({}, tableState.search);
- const slice = Object.assign({}, tableState.slice);
- const filter = {};
- for (let prop in tableState.filter) {
- filter[prop] = tableState.filter[prop].map(v => Object.assign({}, v));
- }
- return {sort, search, slice, filter};
- }
- };
-
- const instance = Object.assign(table, api);
-
- Object.defineProperty(instance, 'length', {
- get(){
- return data.length;
- }
- });
-
- return instance;
-};
-
-var tableDirective$1 = function ({
- sortFactory: sortFactory$$1 = sortFactory,
- filterFactory = filter$1,
- searchFactory = search$1,
- tableState = {sort: {}, slice: {page: 1}, filter: {}, search: {}},
- data = []
-}, ...tableDirectives) {
-
- const coreTable = table$2({sortFactory: sortFactory$$1, filterFactory, tableState, data, searchFactory});
-
- return tableDirectives.reduce((accumulator, newdir) => {
- return Object.assign(accumulator, newdir({
- sortFactory: sortFactory$$1,
- filterFactory,
- searchFactory,
- tableState,
- data,
- table: coreTable
- }));
- }, coreTable);
-};
-
-const filterListener = proxyListener({[FILTER_CHANGED]: 'onFilterChange'});
-
-var filterDirective = function ({table, pointer, operator = 'includes', type = 'string'}) {
- return Object.assign({
- filter(input){
- const filterConf = {
- [pointer]: [
- {
- value: input,
- operator,
- type
+ const safeAssign = curry((base, extension) => Object.assign({}, base, extension));
+ const dispatch = curry(table.dispatch, 2);
+ const dispatchSummary = (filtered) => {
+ matchingItems = filtered;
+ return dispatch("SUMMARY_CHANGED" /* SUMMARY_CHANGED */, {
+ page: tableState.slice.page,
+ size: tableState.slice.size,
+ filteredCount: filtered.length
+ });
+ };
+ const exec = ({ processingDelay = 20 } = { processingDelay: 20 }) => {
+ table.dispatch("EXEC_CHANGED" /* EXEC_CHANGED */, { working: true });
+ setTimeout(() => {
+ try {
+ const filterFunc = filterFactory(filterPointer.get(tableState));
+ const searchFunc = searchFactory(searchPointer.get(tableState));
+ const sortFunc = sortFactory(sortPointer.get(tableState));
+ const sliceFunc = sliceFactory(slicePointer.get(tableState));
+ const execFunc = compose(filterFunc, searchFunc, tap(dispatchSummary), sortFunc, sliceFunc);
+ const displayed = execFunc(data);
+ table.dispatch("DISPLAY_CHANGED" /* DISPLAY_CHANGED */, displayed.map(d => ({
+ index: data.indexOf(d),
+ value: d
+ })));
+ }
+ catch (err) {
+ table.dispatch("EXEC_ERROR" /* EXEC_ERROR */, err);
+ }
+ finally {
+ table.dispatch("EXEC_CHANGED" /* EXEC_CHANGED */, { working: false });
+ }
+ }, processingDelay);
+ };
+ const updateTableState = curry((pter, ev, newPartialState) => compose(safeAssign(pter.get(tableState)), tap(dispatch(ev)), pter.set(tableState))(newPartialState));
+ const resetToFirstPage = () => updateTableState(slicePointer, "CHANGE_PAGE" /* PAGE_CHANGED */, { page: 1 });
+ const tableOperation = (pter, ev) => compose(updateTableState(pter, ev), resetToFirstPage, () => table.exec() // We wrap within a function so table.exec can be overwritten (when using with a server for example)
+ );
+ const api = {
+ sort: tableOperation(sortPointer, "TOGGLE_SORT" /* TOGGLE_SORT */),
+ filter: tableOperation(filterPointer, "FILTER_CHANGED" /* FILTER_CHANGED */),
+ search: tableOperation(searchPointer, "SEARCH_CHANGED" /* SEARCH_CHANGED */),
+ slice: compose(updateTableState(slicePointer, "CHANGE_PAGE" /* PAGE_CHANGED */), () => table.exec()),
+ exec,
+ async eval(state = tableState) {
+ const sortFunc = sortFactory(sortPointer.get(state));
+ const searchFunc = searchFactory(searchPointer.get(state));
+ const filterFunc = filterFactory(filterPointer.get(state));
+ const sliceFunc = sliceFactory(slicePointer.get(state));
+ const execFunc = compose(filterFunc, searchFunc, sortFunc, sliceFunc);
+ return execFunc(data).map(d => ({ index: data.indexOf(d), value: d }));
+ },
+ onDisplayChange(fn) {
+ table.on("DISPLAY_CHANGED" /* DISPLAY_CHANGED */, fn);
+ },
+ getTableState() {
+ const sort = Object.assign({}, tableState.sort);
+ const search = Object.assign({}, tableState.search);
+ const slice = Object.assign({}, tableState.slice);
+ const filter = {};
+ for (const prop of Object.getOwnPropertyNames(tableState.filter)) {
+ filter[prop] = tableState.filter[prop].map(v => Object.assign({}, v));
+ }
+ return { sort, search, slice, filter };
+ },
+ getMatchingItems() {
+ return [...matchingItems];
}
- ]
-
};
- return table.filter(filterConf);
- }
- },
- filterListener({emitter: table}));
-};
-
-const searchListener = proxyListener({[SEARCH_CHANGED]: 'onSearchChange'});
+ const instance = Object.assign(table, api);
+ Object.defineProperties(instance, {
+ filteredCount: {
+ get() {
+ return filteredCount;
+ }
+ },
+ length: {
+ get() {
+ return data.length;
+ }
+ }
+ });
+ return instance;
+ };
+
+ const filterListener = proxyListener({ ["FILTER_CHANGED" /* FILTER_CHANGED */]: 'onFilterChange' });
+ // todo expose and re-export from smart-table-filter
+ var FilterType;
+ (function (FilterType) {
+ FilterType["BOOLEAN"] = "boolean";
+ FilterType["NUMBER"] = "number";
+ FilterType["DATE"] = "date";
+ FilterType["STRING"] = "string";
+ })(FilterType || (FilterType = {}));
+ const filterDirective = ({ table, pointer, operator = "includes" /* INCLUDES */, type = "string" /* STRING */ }) => {
+ const proxy = filterListener({ emitter: table });
+ return Object.assign({
+ filter(input) {
+ const filterConf = {
+ [pointer]: [
+ {
+ value: input,
+ operator,
+ type
+ }
+ ]
+ };
+ return table.filter(filterConf);
+ },
+ state() {
+ return table.getTableState().filter;
+ }
+ }, proxy);
+ };
+
+ const searchListener = proxyListener({ ["SEARCH_CHANGED" /* SEARCH_CHANGED */]: 'onSearchChange' });
+ const searchDirective = ({ table, scope = [] }) => {
+ const proxy = searchListener({ emitter: table });
+ return Object.assign(proxy, {
+ search(input, opts = {}) {
+ return table.search(Object.assign({}, { value: input, scope }, opts));
+ },
+ state() {
+ return table.getTableState().search;
+ }
+ }, proxy);
+ };
-var searchDirective = function ({table, scope = []}) {
- return Object.assign(
- searchListener({emitter: table}), {
- search(input){
- return table.search({value: input, scope});
- }
+ const sliceListener = proxyListener({
+ ["CHANGE_PAGE" /* PAGE_CHANGED */]: 'onPageChange',
+ ["SUMMARY_CHANGED" /* SUMMARY_CHANGED */]: 'onSummaryChange'
});
-};
-
-const sliceListener = proxyListener({[PAGE_CHANGED]: 'onPageChange', [SUMMARY_CHANGED]: 'onSummaryChange'});
-
-var sliceDirective = function ({table}) {
- let {slice:{page:currentPage, size:currentSize}} = table.getTableState();
- let itemListLength = table.length;
-
- const api = {
- selectPage(p){
- return table.slice({page: p, size: currentSize});
- },
- selectNextPage(){
- return api.selectPage(currentPage + 1);
- },
- selectPreviousPage(){
- return api.selectPage(currentPage - 1);
- },
- changePageSize(size){
- return table.slice({page: 1, size});
- },
- isPreviousPageEnabled(){
- return currentPage > 1;
- },
- isNextPageEnabled(){
- return Math.ceil(itemListLength / currentSize) > currentPage;
+ const paginationDirective = ({ table }) => {
+ let { slice: { page: currentPage, size: currentSize } } = table.getTableState();
+ let itemListLength = table.filteredCount;
+ const proxy = sliceListener({ emitter: table });
+ const api = {
+ selectPage(p) {
+ return table.slice({ page: p, size: currentSize });
+ },
+ selectNextPage() {
+ return api.selectPage(currentPage + 1);
+ },
+ selectPreviousPage() {
+ return api.selectPage(currentPage - 1);
+ },
+ changePageSize(size) {
+ return table.slice({ page: 1, size });
+ },
+ isPreviousPageEnabled() {
+ return currentPage > 1;
+ },
+ isNextPageEnabled() {
+ return Math.ceil(itemListLength / currentSize) > currentPage;
+ },
+ state() {
+ return Object.assign(table.getTableState().slice, { filteredCount: itemListLength });
+ }
+ };
+ const directive = Object.assign(api, proxy);
+ directive.onSummaryChange(({ page: p, size: s, filteredCount }) => {
+ currentPage = p;
+ currentSize = s;
+ itemListLength = filteredCount;
+ });
+ return directive;
+ };
+
+ const debounce = (fn, time) => {
+ let timer = null;
+ return (...args) => {
+ if (timer !== null) {
+ clearTimeout(timer);
+ }
+ timer = setTimeout(() => fn(...args), time);
+ };
+ };
+ const sortListeners = proxyListener({ ["TOGGLE_SORT" /* TOGGLE_SORT */]: 'onSortToggle' });
+ const directions = ["asc" /* ASC */, "desc" /* DESC */];
+ const sortDirective = ({ pointer, table, cycle = false, debounceTime = 0 }) => {
+ const cycleDirections = cycle === true ? ["none" /* NONE */].concat(directions) : [...directions].reverse();
+ const commit = debounce(table.sort, debounceTime);
+ let hit = 0;
+ const proxy = sortListeners({ emitter: table });
+ const directive = Object.assign({
+ toggle() {
+ hit++;
+ const direction = cycleDirections[hit % cycleDirections.length];
+ return commit({ pointer, direction });
+ },
+ state() {
+ return table.getTableState().sort;
+ }
+ }, proxy);
+ directive.onSortToggle(({ pointer: p }) => {
+ hit = pointer !== p ? 0 : hit;
+ });
+ const { pointer: statePointer, direction = "asc" /* ASC */ } = directive.state();
+ hit = statePointer === pointer ? (direction === "asc" /* ASC */ ? 1 : 2) : 0;
+ return directive;
+ };
+
+ const summaryListener = proxyListener({ ["SUMMARY_CHANGED" /* SUMMARY_CHANGED */]: 'onSummaryChange' });
+ const summaryDirective = ({ table }) => summaryListener({ emitter: table });
+
+ const executionListener = proxyListener({ ["EXEC_CHANGED" /* EXEC_CHANGED */]: 'onExecutionChange' });
+ const workingIndicatorDirective = ({ table }) => executionListener({ emitter: table });
+
+ const defaultTableState = () => ({ sort: {}, slice: { page: 1 }, filter: {}, search: {} });
+ const smartTable = ({ sortFactory = defaultSortFactory, filterFactory = filter, searchFactory = regexp, tableState = defaultTableState(), data = [] } = {
+ sortFactory: defaultSortFactory,
+ filterFactory: filter,
+ searchFactory: regexp,
+ tableState: defaultTableState(),
+ data: []
+ }, ...tableExtensions) => {
+ const coreTable = tableDirective({ sortFactory, filterFactory, tableState, data, searchFactory });
+ return tableExtensions.reduce((accumulator, newdir) => Object.assign(accumulator, newdir({
+ sortFactory,
+ filterFactory,
+ searchFactory,
+ tableState,
+ data,
+ table: coreTable
+ })), coreTable);
+ };
+
+ const loadingIndicator = ({table, el}) => {
+ const component = workingIndicatorDirective({table});
+ component.onExecutionChange(function ({working}) {
+ el.classList.remove('st-working');
+ if (working === true) {
+ el.classList.add('st-working');
+ }
+ });
+ return component;
+ };
+
+ const sort = ({el, table, conf = {}}) => {
+ const pointer = conf.pointer || el.getAttribute('data-st-sort');
+ const cycle = conf.cycle || el.hasAttribute('data-st-sort-cycle');
+ const component = sortDirective({pointer, table, cycle});
+ component.onSortToggle(({pointer: currentPointer, direction}) => {
+ el.classList.remove('st-sort-asc', 'st-sort-desc');
+ if (pointer === currentPointer && direction !== 'none') {
+ const className = direction === 'asc' ? 'st-sort-asc' : 'st-sort-desc';
+ el.classList.add(className);
+ }
+ });
+ const eventListener = () => component.toggle();
+ el.addEventListener('click', eventListener);
+ return component;
+ };
+
+ function debounce$1(fn, delay) {
+ let timeoutId;
+ return (ev) => {
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ }
+ timeoutId = setTimeout(function () {
+ fn(ev);
+ }, delay);
+ };
}
- };
- const directive = Object.assign(api, sliceListener({emitter: table}));
- directive.onSummaryChange(({page:p, size:s, filteredCount}) => {
- currentPage = p;
- currentSize = s;
- itemListLength = filteredCount;
- });
-
- return directive;
-};
+ const filter$1 = ({table, el, delay = 400, conf = {}}) => {
+ const pointer = conf.pointer || el.getAttribute('data-st-filter');
+ const operator = conf.operator || el.getAttribute('data-st-filter-operator') || 'includes';
+ const elType = el.hasAttribute('type') ? el.getAttribute('type') : 'string';
+ let type = conf.type || el.getAttribute('data-st-filter-type');
+ if (!type) {
+ type = ['date', 'number'].includes(elType) ? elType : 'string';
+ }
+ const component = filterDirective({table, pointer, type, operator});
+ const eventListener = debounce$1(ev => component.filter(el.value), delay);
+ el.addEventListener('input', eventListener);
+ if (el.tagName === 'SELECT') {
+ el.addEventListener('change', eventListener);
+ }
+ return component;
+ };
+
+ const search = ({el, table, delay = 400, conf = {}}) => {
+ const scope = conf.scope || (el.getAttribute('data-st-search') || '')
+ .split(',')
+ .map(s => s.trim());
+ const flags = conf.flags || el.getAttribute('data-st-search-flags') || '';
+ const component = searchDirective({table, scope});
+ const eventListener = debounce$1(() => {
+ component.search(el.value, {flags});
+ }, delay);
+ el.addEventListener('input', eventListener);
+ };
+
+ const table = ({el, table}) => {
+ const bootDirective = (factory, selector) => Array.from(el.querySelectorAll(selector)).forEach(el => factory({
+ el,
+ table
+ }));
+ // boot
+ bootDirective(sort, '[data-st-sort]');
+ bootDirective(loadingIndicator, '[data-st-loading-indicator]');
+ bootDirective(search, '[data-st-search]');
+ bootDirective(filter$1, '[data-st-filter]');
+
+ return table;
+ };
+
+ function row ({name:{first:firstName, last:lastName}, gender, birthDate, size}) {
+ const tr = document.createElement('tr');
+ tr.innerHTML = `
${lastName} | ${firstName} | ${gender} | ${birthDate.toLocaleDateString()} | ${size} | `;
+ return tr;
+ }
-const sortListeners = proxyListener({[TOGGLE_SORT]: 'onSortToggle'});
-const directions = ['asc', 'desc'];
+ function summaryComponent ({table, el}) {
+ const dir = summaryDirective({table});
+ dir.onSummaryChange(({page, size, filteredCount}) => {
+ el.innerHTML = `showing items ${(page - 1) * size + (filteredCount > 0 ? 1 : 0)} - ${Math.min(filteredCount, page * size)} of ${filteredCount} matching items`;
+ });
+ return dir;
+ }
-var sortDirective = function ({pointer, table, cycle = false}) {
+ function paginationComponent ({table, el}) {
+ const previousButton = document.createElement('button');
+ previousButton.innerHTML = 'Previous';
+ const nextButton = document.createElement('button');
+ nextButton.innerHTML = 'Next';
+ const pageSpan = document.createElement('span');
+ pageSpan.innerHTML = '- page 1 -';
+ const comp = paginationDirective({table});
+
+ comp.onSummaryChange(({page}) => {
+ previousButton.disabled = !comp.isPreviousPageEnabled();
+ nextButton.disabled = !comp.isNextPageEnabled();
+ pageSpan.innerHTML = `- ${page} -`;
+ });
- const cycleDirections = cycle === true ? ['none'].concat(directions) : [...directions].reverse();
+ previousButton.addEventListener('click', () => comp.selectPreviousPage());
+ nextButton.addEventListener('click', () => comp.selectNextPage());
- let hit = 0;
+ el.appendChild(previousButton);
+ el.appendChild(pageSpan);
+ el.appendChild(nextButton);
- const directive = Object.assign({
- toggle(){
- hit++;
- const direction = cycleDirections[hit % cycleDirections.length];
- return table.sort({pointer, direction});
+ return comp;
}
- }, sortListeners({emitter: table}));
+ function rangSizeInput ({minEl, maxEl, table}) {
- directive.onSortToggle(({pointer:p}) => {
- if (pointer !== p) {
- hit = 0;
- }
- });
+ let ltValue;
+ let gtValue;
- return directive;
-};
+ const commit = () => {
+ const clauses = [];
+ if (ltValue) {
+ clauses.push({value: ltValue, operator: 'lte', type: 'number'});
+ }
+ if (gtValue) {
+ clauses.push({value: gtValue, operator: 'gte', type: 'number'});
+ }
+ table.filter({
+ size: clauses
+ });
+ };
-const executionListener = proxyListener({[SUMMARY_CHANGED]: 'onSummaryChange'});
+ minEl.addEventListener('input', debounce$1((ev) => {
+ gtValue = minEl.value;
+ commit();
+ }, 400));
-var summaryDirective$1 = function ({table}) {
- return executionListener({emitter: table});
-};
+ maxEl.addEventListener('input', debounce$1((ev) => {
+ ltValue = maxEl.value;
+ commit();
+ }, 400));
+ }
-const executionListener$1 = proxyListener({[EXEC_CHANGED]: 'onExecutionChange'});
+ var ext = ({query}) => ({table, tableState}) => {
+ const exec = () => {
+ table.dispatch('EXEC_CHANGED', {working: true});
+ return query(tableState)
+ .then(({data = [], summary = {}}) => {
+ table.dispatch('SUMMARY_CHANGED', summary);
+ table.dispatch('DISPLAY_CHANGED', data);
+ table.dispatch('EXEC_CHANGED', {working: false});
+ })
+ .catch(e => {
+ table.dispatch('EXEC_ERROR', e);
+ table.dispatch('EXEC_CHANGED', {working: false});
+ });
+ };
-var workingIndicatorDirective = function ({table}) {
- return executionListener$1({emitter: table});
-};
+ return Object.assign(table, {
+ exec, eval: (ts = tableState) => query(ts).then(({data}) => data)
+ });
+ };
+
+ //a fake sdk to mimic a server: it actually uses another smart-table to process a query and return the result with a random timeout to mimic the http response time
+
+ var sdk = () => {
+ const t = smartTable({data});
+ return {
+ query: (tableState) => {
+ return new Promise((resolve, reject) => {
+ //this timeout is just to avoid the ui to freeze as normally the process would run on the server
+ setTimeout(function () {
+ const notSlicedState = Object.assign({}, tableState, {
+ slice: {page: 1}
+ });
+ Promise
+ .all([t.eval(tableState), t.eval(notSlicedState)])
+ .then(([full, partial]) => {
+ //random timeout on the response to mimic the server response time
+ setTimeout(() => {
+ resolve({
+ data: full,
+ summary: {
+ page: tableState.slice.page,
+ size: tableState.slice.size,
+ filteredCount: partial.length
+ }
+ });
+ }, Math.random() * 2000);
+ })
+ .catch(e => reject(e));
+ }, 20);
+ });
+ }
+ };
+ };
+
+ const el = document.getElementById('table-container');
+ const tbody = el.querySelector('tbody');
+ const summaryEl = el.querySelector('[data-st-summary]');
+
+ const t = smartTable(
+ {tableState: {sort: {}, filter: {}, slice: {page: 1, size: 20}}},
+ ext(sdk()) //server side extension
+ );
+ const tableComponent = table({el, table: t});
+
+ summaryComponent({table: t, el: summaryEl});
+ rangSizeInput({
+ table: t,
+ minEl: document.getElementById('min-size'),
+ maxEl: document.getElementById('max-size')
+ });
-const search = searchDirective;
-const slice = sliceDirective;
-const summary = summaryDirective$1;
-const sort = sortDirective;
-const filter = filterDirective;
-const workingIndicator = workingIndicatorDirective;
-const table = tableDirective$1;
+ const paginationContainer = el.querySelector('[data-st-pagination]');
+ paginationComponent({table: t, el: paginationContainer});
-var loading = function ({table: table$$1, el}) {
- const component = workingIndicator({table: table$$1});
- component.onExecutionChange(function ({working}) {
- el.classList.remove('st-working');
- if (working === true) {
- el.classList.add('st-working');
- }
- });
- return component;
-};
-
-var sort$1 = function ({el, table: table$$1, conf = {}}) {
- const pointer = conf.pointer || el.getAttribute('data-st-sort');
- const cycle = conf.cycle || el.hasAttribute('data-st-sort-cycle');
- const component = sort({pointer, table: table$$1, cycle});
- component.onSortToggle(({pointer:currentPointer, direction}) => {
- el.classList.remove('st-sort-asc', 'st-sort-desc');
- if (pointer === currentPointer && direction !== 'none') {
- const className = direction === 'asc' ? 'st-sort-asc' : 'st-sort-desc';
- el.classList.add(className);
- }
- });
- const eventListener = ev => component.toggle();
- el.addEventListener('click', eventListener);
- return component;
-};
-
-function debounce (fn, delay) {
- let timeoutId;
- return (ev) => {
- if (timeoutId) {
- window.clearTimeout(timeoutId);
- }
- timeoutId = window.setTimeout(function () {
- fn(ev);
- }, delay);
- };
-}
-
-function filterInput ({table: table$$1, el, delay = 400, conf = {}}) {
- const pointer = conf.pointer || el.getAttribute('data-st-filter');
- const operator = conf.operator || el.getAttribute('data-st-filter-operator') || 'includes';
- const elType = el.hasAttribute('type') ? el.getAttribute('type') : 'string';
- let type = conf.type || el.getAttribute('data-st-filter-type');
- if (!type) {
- type = ['date', 'number'].includes(elType) ? elType : 'string';
- }
- const component = filter({table: table$$1, pointer, type, operator});
- const eventListener = debounce(ev => component.filter(el.value), delay);
- el.addEventListener('input', eventListener);
- if (el.tagName === 'SELECT') {
- el.addEventListener('change', eventListener);
- }
- return component;
-}
-
-var searchInput = function ({el, table: table$$1, delay = 400, conf = {}}) {
- const scope = conf.scope || (el.getAttribute('data-st-search') || '').split(',').map(s => s.trim());
- const component = search({table: table$$1, scope});
- const eventListener = debounce(ev => {
- component.search(el.value);
- }, delay);
- el.addEventListener('input', eventListener);
-};
-
-var tableComponentFactory = function ({el, table}) {
- // boot
- [...el.querySelectorAll('[data-st-sort]')].forEach(el => sort$1({el, table}));
- [...el.querySelectorAll('[data-st-loading-indicator]')].forEach(el => loading({el, table}));
- [...el.querySelectorAll('[data-st-search]')].forEach(el => searchInput({el, table}));
- [...el.querySelectorAll('[data-st-filter]')].forEach(el => filterInput({el, table}));
-
- //extension
- const tableDisplayChange = table.onDisplayChange;
- return Object.assign(table, {
- onDisplayChange: (listener) => {
- tableDisplayChange(listener);
- table.exec();
- }
- });
-};
-
-var row = function ({name:{first:firstName, last:lastName}, gender, birthDate, size}) {
- const tr = document.createElement('tr');
- tr.innerHTML = `${lastName} | ${firstName} | ${gender} | ${birthDate.toLocaleDateString()} | ${size} | `;
- return tr;
-};
-
-function summaryComponent ({table: table$$1, el}) {
- const dir = summary({table: table$$1});
- dir.onSummaryChange(({page, size, filteredCount}) => {
- el.innerHTML = `showing items ${(page - 1) * size + (filteredCount > 0 ? 1 : 0)} - ${Math.min(filteredCount, page * size)} of ${filteredCount} matching items`;
- });
- return dir;
-}
-
-function paginationComponent ({table: table$$1, el}) {
- const previousButton = document.createElement('button');
- previousButton.innerHTML = 'Previous';
- const nextButton = document.createElement('button');
- nextButton.innerHTML = 'Next';
- const pageSpan = document.createElement('span');
- pageSpan.innerHTML = '- page 1 -';
- const comp = slice({table: table$$1});
-
- comp.onSummaryChange(({page}) => {
- previousButton.disabled = !comp.isPreviousPageEnabled();
- nextButton.disabled = !comp.isNextPageEnabled();
- pageSpan.innerHTML = `- ${page} -`;
- });
-
- previousButton.addEventListener('click', () => comp.selectPreviousPage());
- nextButton.addEventListener('click', () => comp.selectNextPage());
-
- el.appendChild(previousButton);
- el.appendChild(pageSpan);
- el.appendChild(nextButton);
-
- return comp;
-}
-
-function rangSizeInput ({minEl, maxEl, table: table$$1}) {
-
- let ltValue;
- let gtValue;
-
- const commit = () => {
- const clauses = [];
- if (ltValue) {
- clauses.push({value: ltValue, operator: 'lte', type: 'number'});
- }
- if (gtValue) {
- clauses.push({value: gtValue, operator: 'gte', type: 'number'});
- }
- table$$1.filter({
- size: clauses
+ tableComponent.onDisplayChange(displayed => {
+ tbody.innerHTML = '';
+ for (let r of displayed) {
+ const newChild = row((r.value), r.index);
+ tbody.appendChild(newChild);
+ }
});
- };
-
- minEl.addEventListener('input', debounce((ev) => {
- gtValue = minEl.value;
- commit();
- }, 400));
-
- maxEl.addEventListener('input', debounce((ev) => {
- ltValue = maxEl.value;
- commit();
- }, 400));
-}
-
-var ext = ({query}) => ({table, tableState}) => {
- const exec = () => {
- table.dispatch('EXEC_CHANGED', {working: true});
- return query(tableState)
- .then(({data = [], summary = {}}) => {
- table.dispatch('SUMMARY_CHANGED', summary);
- table.dispatch('DISPLAY_CHANGED', data);
- table.dispatch('EXEC_CHANGED', {working: false});
- })
- .catch(e => {
- table.dispatch('EXEC_ERROR', e);
- table.dispatch('EXEC_CHANGED', {working: false});
- });
- };
-
- return Object.assign(table, {
- exec, eval: (ts = tableState) => query(ts).then(({data}) => data)
- });
-};
-
-//a fake sdk to mimic a server: it actually uses another smart-table to process a query and return the result with a random timeout to mimic the http response time
-var sdk = () => {
- const t = table({data});
- return {
- query: (tableState) => {
- return new Promise((resolve, reject) => {
- //this timeout is just to avoid the ui to freeze as normally the process would run on the server
- setTimeout(function () {
- const notSlicedState = Object.assign({}, tableState, {
- slice: {page: 1}
- });
- Promise
- .all([t.eval(tableState), t.eval(notSlicedState)])
- .then(([full, partial]) => {
- //random timeout on the response to mimic the server response time
- setTimeout(() => {
- resolve({
- data: full,
- summary: {
- page: tableState.slice.page,
- size: tableState.slice.size,
- filteredCount: partial.length
- }
- });
- }, Math.random() * 2000);
- })
- .catch(e => reject(e));
- }, 20);
- });
- }
- };
-};
-
-const el = document.getElementById('table-container');
-const tbody = el.querySelector('tbody');
-const summaryEl = el.querySelector('[data-st-summary]');
-
-const t = table(
- {tableState: {sort: {}, filter: {}, slice: {page: 1, size: 20}}},
- ext(sdk()) //server side extension
-);
-const tableComponent = tableComponentFactory({el, table: t});
-
-summaryComponent({table: t, el: summaryEl});
-rangSizeInput({
- table: t,
- minEl: document.getElementById('min-size'),
- maxEl: document.getElementById('max-size')
-});
-
-const paginationContainer = el.querySelector('[data-st-pagination]');
-paginationComponent({table: t, el: paginationContainer});
-
-tableComponent.onDisplayChange(displayed => {
- tbody.innerHTML = '';
- for (let r of displayed) {
- const newChild = row((r.value), r.index, t);
- tbody.appendChild(newChild);
- }
-});
}());
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtb3BlcmF0b3JzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWpzb24tcG9pbnRlci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS1zb3J0L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWZpbHRlci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS1zZWFyY2gvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtY29yZS9zcmMvc2xpY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtZXZlbnRzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvc3JjL2V2ZW50cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS1jb3JlL3NyYy9kaXJlY3RpdmVzL3RhYmxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvc3JjL3RhYmxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvc3JjL2RpcmVjdGl2ZXMvZmlsdGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvc3JjL2RpcmVjdGl2ZXMvc2VhcmNoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvc3JjL2RpcmVjdGl2ZXMvc2xpY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtY29yZS9zcmMvZGlyZWN0aXZlcy9zb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvc3JjL2RpcmVjdGl2ZXMvc3VtbWFyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS1jb3JlL3NyYy9kaXJlY3RpdmVzL3dvcmtpbmdJbmRpY2F0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtY29yZS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS12YW5pbGxhL2xpYi9sb2FkaW5nSW5kaWNhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLXZhbmlsbGEvbGliL3NvcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtdmFuaWxsYS9saWIvaGVscGVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS12YW5pbGxhL2xpYi9maWx0ZXJzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLXZhbmlsbGEvbGliL3NlYXJjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS12YW5pbGxhL2xpYi90YWJsZS5qcyIsImNvbXBvbmVudHMvcm93LmpzIiwiY29tcG9uZW50cy9zdW1tYXJ5LmpzIiwiY29tcG9uZW50cy9wYWdpbmF0aW9uLmpzIiwiY29tcG9uZW50cy9yYW5nZVNpemVJbnB1dC5qcyIsIi4uL2luZGV4LmpzIiwic2RrLmpzIiwiaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHN3YXAgKGYpIHtcbiAgcmV0dXJuIChhLCBiKSA9PiBmKGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZSAoZmlyc3QsIC4uLmZucykge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IGZucy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBjdXJyZW50KHByZXZpb3VzKSwgZmlyc3QoLi4uYXJncykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VycnkgKGZuLCBhcml0eUxlZnQpIHtcbiAgY29uc3QgYXJpdHkgPSBhcml0eUxlZnQgfHwgZm4ubGVuZ3RoO1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBhcmdMZW5ndGggPSBhcmdzLmxlbmd0aCB8fCAxO1xuICAgIGlmIChhcml0eSA9PT0gYXJnTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZ1bmMgPSAoLi4ubW9yZUFyZ3MpID0+IGZuKC4uLmFyZ3MsIC4uLm1vcmVBcmdzKTtcbiAgICAgIHJldHVybiBjdXJyeShmdW5jLCBhcml0eSAtIGFyZ3MubGVuZ3RoKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseSAoZm4pIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiBmbiguLi5hcmdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhcCAoZm4pIHtcbiAgcmV0dXJuIGFyZyA9PiB7XG4gICAgZm4oYXJnKTtcbiAgICByZXR1cm4gYXJnO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcG9pbnRlciAocGF0aCkge1xuXG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuXG4gIGZ1bmN0aW9uIHBhcnRpYWwgKG9iaiA9IHt9LCBwYXJ0cyA9IFtdKSB7XG4gICAgY29uc3QgcCA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgY29uc3QgY3VycmVudCA9IG9ialtwXTtcbiAgICByZXR1cm4gKGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCBwYXJ0cy5sZW5ndGggPT09IDApID9cbiAgICAgIGN1cnJlbnQgOiBwYXJ0aWFsKGN1cnJlbnQsIHBhcnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBuZXdUcmVlKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgY29uc3QgW2xlYWYsIC4uLmludGVybWVkaWF0ZV0gPSBwYXJ0cy5yZXZlcnNlKCk7XG4gICAgZm9yIChsZXQga2V5IG9mIGludGVybWVkaWF0ZS5yZXZlcnNlKCkpIHtcbiAgICAgIGlmIChjdXJyZW50W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB7fTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3VycmVudFtsZWFmXSA9IE9iamVjdC5hc3NpZ24oY3VycmVudFtsZWFmXSB8fCB7fSwgbmV3VHJlZSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0KHRhcmdldCl7XG4gICAgICByZXR1cm4gcGFydGlhbCh0YXJnZXQsIFsuLi5wYXJ0c10pXG4gICAgfSxcbiAgICBzZXRcbiAgfVxufTtcbiIsImltcG9ydCB7c3dhcH0gZnJvbSAnc21hcnQtdGFibGUtb3BlcmF0b3JzJztcbmltcG9ydCBwb2ludGVyIGZyb20gJ3NtYXJ0LXRhYmxlLWpzb24tcG9pbnRlcic7XG5cblxuZnVuY3Rpb24gc29ydEJ5UHJvcGVydHkgKHByb3ApIHtcbiAgY29uc3QgcHJvcEdldHRlciA9IHBvaW50ZXIocHJvcCkuZ2V0O1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVmFsID0gcHJvcEdldHRlcihhKTtcbiAgICBjb25zdCBiVmFsID0gcHJvcEdldHRlcihiKTtcblxuICAgIGlmIChhVmFsID09PSBiVmFsKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoYlZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKGFWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFWYWwgPCBiVmFsID8gLTEgOiAxO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnRGYWN0b3J5ICh7cG9pbnRlciwgZGlyZWN0aW9ufSA9IHt9KSB7XG4gIGlmICghcG9pbnRlciB8fCBkaXJlY3Rpb24gPT09ICdub25lJykge1xuICAgIHJldHVybiBhcnJheSA9PiBbLi4uYXJyYXldO1xuICB9XG5cbiAgY29uc3Qgb3JkZXJGdW5jID0gc29ydEJ5UHJvcGVydHkocG9pbnRlcik7XG4gIGNvbnN0IGNvbXBhcmVGdW5jID0gZGlyZWN0aW9uID09PSAnZGVzYycgPyBzd2FwKG9yZGVyRnVuYykgOiBvcmRlckZ1bmM7XG5cbiAgcmV0dXJuIChhcnJheSkgPT4gWy4uLmFycmF5XS5zb3J0KGNvbXBhcmVGdW5jKTtcbn0iLCJpbXBvcnQge2NvbXBvc2V9IGZyb20gJ3NtYXJ0LXRhYmxlLW9wZXJhdG9ycyc7XG5pbXBvcnQgcG9pbnRlciBmcm9tICdzbWFydC10YWJsZS1qc29uLXBvaW50ZXInO1xuXG5mdW5jdGlvbiB0eXBlRXhwcmVzc2lvbiAodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiBCb29sZWFuO1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gTnVtYmVyO1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgcmV0dXJuICh2YWwpID0+IG5ldyBEYXRlKHZhbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb21wb3NlKFN0cmluZywgKHZhbCkgPT4gdmFsLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5cbmNvbnN0IG9wZXJhdG9ycyA9IHtcbiAgaW5jbHVkZXModmFsdWUpe1xuICAgIHJldHVybiAoaW5wdXQpID0+IGlucHV0LmluY2x1ZGVzKHZhbHVlKTtcbiAgfSxcbiAgaXModmFsdWUpe1xuICAgIHJldHVybiAoaW5wdXQpID0+IE9iamVjdC5pcyh2YWx1ZSwgaW5wdXQpO1xuICB9LFxuICBpc05vdCh2YWx1ZSl7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4gIU9iamVjdC5pcyh2YWx1ZSwgaW5wdXQpO1xuICB9LFxuICBsdCh2YWx1ZSl7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4gaW5wdXQgPCB2YWx1ZTtcbiAgfSxcbiAgZ3QodmFsdWUpe1xuICAgIHJldHVybiAoaW5wdXQpID0+IGlucHV0ID4gdmFsdWU7XG4gIH0sXG4gIGx0ZSh2YWx1ZSl7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4gaW5wdXQgPD0gdmFsdWU7XG4gIH0sXG4gIGd0ZSh2YWx1ZSl7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4gaW5wdXQgPj0gdmFsdWU7XG4gIH0sXG4gIGVxdWFscyh2YWx1ZSl7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4gdmFsdWUgPT0gaW5wdXQ7XG4gIH0sXG4gIG5vdEVxdWFscyh2YWx1ZSl7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4gdmFsdWUgIT0gaW5wdXQ7XG4gIH1cbn07XG5cbmNvbnN0IGV2ZXJ5ID0gZm5zID0+ICguLi5hcmdzKSA9PiBmbnMuZXZlcnkoZm4gPT4gZm4oLi4uYXJncykpO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlZGljYXRlICh7dmFsdWUgPSAnJywgb3BlcmF0b3IgPSAnaW5jbHVkZXMnLCB0eXBlID0gJ3N0cmluZyd9KSB7XG4gIGNvbnN0IHR5cGVJdCA9IHR5cGVFeHByZXNzaW9uKHR5cGUpO1xuICBjb25zdCBvcGVyYXRlT25UeXBlZCA9IGNvbXBvc2UodHlwZUl0LCBvcGVyYXRvcnNbb3BlcmF0b3JdKTtcbiAgY29uc3QgcHJlZGljYXRlRnVuYyA9IG9wZXJhdGVPblR5cGVkKHZhbHVlKTtcbiAgcmV0dXJuIGNvbXBvc2UodHlwZUl0LCBwcmVkaWNhdGVGdW5jKTtcbn1cblxuLy9hdm9pZCB1c2VsZXNzIGZpbHRlciBsb29rdXAgKGltcHJvdmUgcGVyZilcbmZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXVzZXMgKGNvbmYpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge307XG4gIGNvbnN0IHZhbGlkUGF0aCA9IE9iamVjdC5rZXlzKGNvbmYpLmZpbHRlcihwYXRoID0+IEFycmF5LmlzQXJyYXkoY29uZltwYXRoXSkpO1xuICB2YWxpZFBhdGguZm9yRWFjaChwYXRoID0+IHtcbiAgICBjb25zdCB2YWxpZENsYXVzZXMgPSBjb25mW3BhdGhdLmZpbHRlcihjID0+IGMudmFsdWUgIT09ICcnKTtcbiAgICBpZiAodmFsaWRDbGF1c2VzLmxlbmd0aCkge1xuICAgICAgb3V0cHV0W3BhdGhdID0gdmFsaWRDbGF1c2VzO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbHRlciAoZmlsdGVyKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDbGF1c2VzID0gbm9ybWFsaXplQ2xhdXNlcyhmaWx0ZXIpO1xuICBjb25zdCBmdW5jTGlzdCA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRDbGF1c2VzKS5tYXAocGF0aCA9PiB7XG4gICAgY29uc3QgZ2V0dGVyID0gcG9pbnRlcihwYXRoKS5nZXQ7XG4gICAgY29uc3QgY2xhdXNlcyA9IG5vcm1hbGl6ZWRDbGF1c2VzW3BhdGhdLm1hcChwcmVkaWNhdGUpO1xuICAgIHJldHVybiBjb21wb3NlKGdldHRlciwgZXZlcnkoY2xhdXNlcykpO1xuICB9KTtcbiAgY29uc3QgZmlsdGVyUHJlZGljYXRlID0gZXZlcnkoZnVuY0xpc3QpO1xuXG4gIHJldHVybiAoYXJyYXkpID0+IGFycmF5LmZpbHRlcihmaWx0ZXJQcmVkaWNhdGUpO1xufSIsImltcG9ydCBwb2ludGVyIGZyb20gJ3NtYXJ0LXRhYmxlLWpzb24tcG9pbnRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzZWFyY2hDb25mID0ge30pIHtcbiAgY29uc3Qge3ZhbHVlLCBzY29wZSA9IFtdfSA9IHNlYXJjaENvbmY7XG4gIGNvbnN0IHNlYXJjaFBvaW50ZXJzID0gc2NvcGUubWFwKGZpZWxkID0+IHBvaW50ZXIoZmllbGQpLmdldCk7XG4gIGlmICghc2NvcGUubGVuZ3RoIHx8ICF2YWx1ZSkge1xuICAgIHJldHVybiBhcnJheSA9PiBhcnJheTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJyYXkgPT4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4gc2VhcmNoUG9pbnRlcnMuc29tZShwID0+IFN0cmluZyhwKGl0ZW0pKS5pbmNsdWRlcyhTdHJpbmcodmFsdWUpKSkpXG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbGljZUZhY3RvcnkgKHtwYWdlID0gMSwgc2l6ZX0gPSB7fSkge1xuICByZXR1cm4gZnVuY3Rpb24gc2xpY2VGdW5jdGlvbiAoYXJyYXkgPSBbXSkge1xuICAgIGNvbnN0IGFjdHVhbFNpemUgPSBzaXplIHx8IGFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCBvZmZzZXQgPSAocGFnZSAtIDEpICogYWN0dWFsU2l6ZTtcbiAgICByZXR1cm4gYXJyYXkuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBhY3R1YWxTaXplKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBlbWl0dGVyICgpIHtcblxuICBjb25zdCBsaXN0ZW5lcnNMaXN0cyA9IHt9O1xuICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICBvbihldmVudCwgLi4ubGlzdGVuZXJzKXtcbiAgICAgIGxpc3RlbmVyc0xpc3RzW2V2ZW50XSA9IChsaXN0ZW5lcnNMaXN0c1tldmVudF0gfHwgW10pLmNvbmNhdChsaXN0ZW5lcnMpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0sXG4gICAgZGlzcGF0Y2goZXZlbnQsIC4uLmFyZ3Mpe1xuICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdGVuZXJzTGlzdHNbZXZlbnRdIHx8IFtdO1xuICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0sXG4gICAgb2ZmKGV2ZW50LCAuLi5saXN0ZW5lcnMpe1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBPYmplY3Qua2V5cyhsaXN0ZW5lcnNMaXN0cykuZm9yRWFjaChldiA9PiBpbnN0YW5jZS5vZmYoZXYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBsaXN0ZW5lcnNMaXN0c1tldmVudF0gfHwgW107XG4gICAgICAgIGxpc3RlbmVyc0xpc3RzW2V2ZW50XSA9IGxpc3RlbmVycy5sZW5ndGggPyBsaXN0LmZpbHRlcihsaXN0ZW5lciA9PiAhbGlzdGVuZXJzLmluY2x1ZGVzKGxpc3RlbmVyKSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3h5TGlzdGVuZXIgKGV2ZW50TWFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoe2VtaXR0ZXJ9KSB7XG5cbiAgICBjb25zdCBwcm94eSA9IHt9O1xuICAgIGxldCBldmVudExpc3RlbmVycyA9IHt9O1xuXG4gICAgZm9yIChsZXQgZXYgb2YgT2JqZWN0LmtleXMoZXZlbnRNYXApKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBldmVudE1hcFtldl07XG4gICAgICBldmVudExpc3RlbmVyc1tldl0gPSBbXTtcbiAgICAgIHByb3h5W21ldGhvZF0gPSBmdW5jdGlvbiAoLi4ubGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzW2V2XSA9IGV2ZW50TGlzdGVuZXJzW2V2XS5jb25jYXQobGlzdGVuZXJzKTtcbiAgICAgICAgZW1pdHRlci5vbihldiwgLi4ubGlzdGVuZXJzKTtcbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihwcm94eSwge1xuICAgICAgb2ZmKGV2KXtcbiAgICAgICAgaWYgKCFldikge1xuICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKGV2ZW50TmFtZSA9PiBwcm94eS5vZmYoZXZlbnROYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzW2V2XSkge1xuICAgICAgICAgIGVtaXR0ZXIub2ZmKGV2LCAuLi5ldmVudExpc3RlbmVyc1tldl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsImV4cG9ydCBjb25zdCBUT0dHTEVfU09SVCA9ICdUT0dHTEVfU09SVCc7XG5leHBvcnQgY29uc3QgRElTUExBWV9DSEFOR0VEID0gJ0RJU1BMQVlfQ0hBTkdFRCc7XG5leHBvcnQgY29uc3QgUEFHRV9DSEFOR0VEID0gJ0NIQU5HRV9QQUdFJztcbmV4cG9ydCBjb25zdCBFWEVDX0NIQU5HRUQgPSAnRVhFQ19DSEFOR0VEJztcbmV4cG9ydCBjb25zdCBGSUxURVJfQ0hBTkdFRCA9ICdGSUxURVJfQ0hBTkdFRCc7XG5leHBvcnQgY29uc3QgU1VNTUFSWV9DSEFOR0VEID0gJ1NVTU1BUllfQ0hBTkdFRCc7XG5leHBvcnQgY29uc3QgU0VBUkNIX0NIQU5HRUQgPSAnU0VBUkNIX0NIQU5HRUQnO1xuZXhwb3J0IGNvbnN0IEVYRUNfRVJST1IgPSAnRVhFQ19FUlJPUic7IiwiaW1wb3J0IHNsaWNlIGZyb20gJy4uL3NsaWNlJztcbmltcG9ydCB7Y3VycnksIHRhcCwgY29tcG9zZX0gZnJvbSAnc21hcnQtdGFibGUtb3BlcmF0b3JzJztcbmltcG9ydCBwb2ludGVyIGZyb20gJ3NtYXJ0LXRhYmxlLWpzb24tcG9pbnRlcic7XG5pbXBvcnQge2VtaXR0ZXJ9IGZyb20gJ3NtYXJ0LXRhYmxlLWV2ZW50cyc7XG5pbXBvcnQgc2xpY2VGYWN0b3J5IGZyb20gJy4uL3NsaWNlJztcbmltcG9ydCB7XG4gIFNVTU1BUllfQ0hBTkdFRCxcbiAgVE9HR0xFX1NPUlQsXG4gIERJU1BMQVlfQ0hBTkdFRCxcbiAgUEFHRV9DSEFOR0VELFxuICBFWEVDX0NIQU5HRUQsXG4gIEZJTFRFUl9DSEFOR0VELFxuICBTRUFSQ0hfQ0hBTkdFRCxcbiAgRVhFQ19FUlJPUlxufSBmcm9tICcuLi9ldmVudHMnO1xuXG5mdW5jdGlvbiBjdXJyaWVkUG9pbnRlciAocGF0aCkge1xuICBjb25zdCB7Z2V0LCBzZXR9ID0gcG9pbnRlcihwYXRoKTtcbiAgcmV0dXJuIHtnZXQsIHNldDogY3Vycnkoc2V0KX07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICh7XG4gIHNvcnRGYWN0b3J5LFxuICB0YWJsZVN0YXRlLFxuICBkYXRhLFxuICBmaWx0ZXJGYWN0b3J5LFxuICBzZWFyY2hGYWN0b3J5XG59KSB7XG4gIGNvbnN0IHRhYmxlID0gZW1pdHRlcigpO1xuICBjb25zdCBzb3J0UG9pbnRlciA9IGN1cnJpZWRQb2ludGVyKCdzb3J0Jyk7XG4gIGNvbnN0IHNsaWNlUG9pbnRlciA9IGN1cnJpZWRQb2ludGVyKCdzbGljZScpO1xuICBjb25zdCBmaWx0ZXJQb2ludGVyID0gY3VycmllZFBvaW50ZXIoJ2ZpbHRlcicpO1xuICBjb25zdCBzZWFyY2hQb2ludGVyID0gY3VycmllZFBvaW50ZXIoJ3NlYXJjaCcpO1xuXG4gIGNvbnN0IHNhZmVBc3NpZ24gPSBjdXJyeSgoYmFzZSwgZXh0ZW5zaW9uKSA9PiBPYmplY3QuYXNzaWduKHt9LCBiYXNlLCBleHRlbnNpb24pKTtcbiAgY29uc3QgZGlzcGF0Y2ggPSBjdXJyeSh0YWJsZS5kaXNwYXRjaC5iaW5kKHRhYmxlKSwgMik7XG5cbiAgY29uc3QgZGlzcGF0Y2hTdW1tYXJ5ID0gKGZpbHRlcmVkKSA9PiB7XG4gICAgZGlzcGF0Y2goU1VNTUFSWV9DSEFOR0VELCB7XG4gICAgICBwYWdlOiB0YWJsZVN0YXRlLnNsaWNlLnBhZ2UsXG4gICAgICBzaXplOiB0YWJsZVN0YXRlLnNsaWNlLnNpemUsXG4gICAgICBmaWx0ZXJlZENvdW50OiBmaWx0ZXJlZC5sZW5ndGhcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBleGVjID0gKHtwcm9jZXNzaW5nRGVsYXkgPSAyMH0gPSB7fSkgPT4ge1xuICAgIHRhYmxlLmRpc3BhdGNoKEVYRUNfQ0hBTkdFRCwge3dvcmtpbmc6IHRydWV9KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbHRlckZ1bmMgPSBmaWx0ZXJGYWN0b3J5KGZpbHRlclBvaW50ZXIuZ2V0KHRhYmxlU3RhdGUpKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoRnVuYyA9IHNlYXJjaEZhY3Rvcnkoc2VhcmNoUG9pbnRlci5nZXQodGFibGVTdGF0ZSkpO1xuICAgICAgICBjb25zdCBzb3J0RnVuYyA9IHNvcnRGYWN0b3J5KHNvcnRQb2ludGVyLmdldCh0YWJsZVN0YXRlKSk7XG4gICAgICAgIGNvbnN0IHNsaWNlRnVuYyA9IHNsaWNlRmFjdG9yeShzbGljZVBvaW50ZXIuZ2V0KHRhYmxlU3RhdGUpKTtcbiAgICAgICAgY29uc3QgZXhlY0Z1bmMgPSBjb21wb3NlKGZpbHRlckZ1bmMsIHNlYXJjaEZ1bmMsIHRhcChkaXNwYXRjaFN1bW1hcnkpLCBzb3J0RnVuYywgc2xpY2VGdW5jKTtcbiAgICAgICAgY29uc3QgZGlzcGxheWVkID0gZXhlY0Z1bmMoZGF0YSk7XG4gICAgICAgIHRhYmxlLmRpc3BhdGNoKERJU1BMQVlfQ0hBTkdFRCwgZGlzcGxheWVkLm1hcChkID0+IHtcbiAgICAgICAgICByZXR1cm4ge2luZGV4OiBkYXRhLmluZGV4T2YoZCksIHZhbHVlOiBkfTtcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0YWJsZS5kaXNwYXRjaChFWEVDX0VSUk9SLCBlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRhYmxlLmRpc3BhdGNoKEVYRUNfQ0hBTkdFRCwge3dvcmtpbmc6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfSwgcHJvY2Vzc2luZ0RlbGF5KTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVUYWJsZVN0YXRlID0gY3VycnkoKHB0ZXIsIGV2LCBuZXdQYXJ0aWFsU3RhdGUpID0+IGNvbXBvc2UoXG4gICAgc2FmZUFzc2lnbihwdGVyLmdldCh0YWJsZVN0YXRlKSksXG4gICAgdGFwKGRpc3BhdGNoKGV2KSksXG4gICAgcHRlci5zZXQodGFibGVTdGF0ZSlcbiAgKShuZXdQYXJ0aWFsU3RhdGUpKTtcblxuICBjb25zdCByZXNldFRvRmlyc3RQYWdlID0gKCkgPT4gdXBkYXRlVGFibGVTdGF0ZShzbGljZVBvaW50ZXIsIFBBR0VfQ0hBTkdFRCwge3BhZ2U6IDF9KTtcblxuICBjb25zdCB0YWJsZU9wZXJhdGlvbiA9IChwdGVyLCBldikgPT4gY29tcG9zZShcbiAgICB1cGRhdGVUYWJsZVN0YXRlKHB0ZXIsIGV2KSxcbiAgICByZXNldFRvRmlyc3RQYWdlLFxuICAgICgpID0+IHRhYmxlLmV4ZWMoKSAvLyB3ZSB3cmFwIHdpdGhpbiBhIGZ1bmN0aW9uIHNvIHRhYmxlLmV4ZWMgY2FuIGJlIG92ZXJ3cml0dGVuICh3aGVuIHVzaW5nIHdpdGggYSBzZXJ2ZXIgZm9yIGV4YW1wbGUpXG4gICk7XG5cbiAgY29uc3QgYXBpID0ge1xuICAgIHNvcnQ6IHRhYmxlT3BlcmF0aW9uKHNvcnRQb2ludGVyLCBUT0dHTEVfU09SVCksXG4gICAgZmlsdGVyOiB0YWJsZU9wZXJhdGlvbihmaWx0ZXJQb2ludGVyLCBGSUxURVJfQ0hBTkdFRCksXG4gICAgc2VhcmNoOiB0YWJsZU9wZXJhdGlvbihzZWFyY2hQb2ludGVyLCBTRUFSQ0hfQ0hBTkdFRCksXG4gICAgc2xpY2U6IGNvbXBvc2UodXBkYXRlVGFibGVTdGF0ZShzbGljZVBvaW50ZXIsIFBBR0VfQ0hBTkdFRCksICgpID0+IHRhYmxlLmV4ZWMoKSksXG4gICAgZXhlYyxcbiAgICBldmFsKHN0YXRlID0gdGFibGVTdGF0ZSl7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHNvcnRGdW5jID0gc29ydEZhY3Rvcnkoc29ydFBvaW50ZXIuZ2V0KHN0YXRlKSk7XG4gICAgICAgICAgY29uc3Qgc2VhcmNoRnVuYyA9IHNlYXJjaEZhY3Rvcnkoc2VhcmNoUG9pbnRlci5nZXQoc3RhdGUpKTtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJGdW5jID0gZmlsdGVyRmFjdG9yeShmaWx0ZXJQb2ludGVyLmdldChzdGF0ZSkpO1xuICAgICAgICAgIGNvbnN0IHNsaWNlRnVuYyA9IHNsaWNlRmFjdG9yeShzbGljZVBvaW50ZXIuZ2V0KHN0YXRlKSk7XG4gICAgICAgICAgY29uc3QgZXhlY0Z1bmMgPSBjb21wb3NlKGZpbHRlckZ1bmMsIHNlYXJjaEZ1bmMsIHNvcnRGdW5jLCBzbGljZUZ1bmMpO1xuICAgICAgICAgIHJldHVybiBleGVjRnVuYyhkYXRhKS5tYXAoZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge2luZGV4OiBkYXRhLmluZGV4T2YoZCksIHZhbHVlOiBkfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIG9uRGlzcGxheUNoYW5nZShmbil7XG4gICAgICB0YWJsZS5vbihESVNQTEFZX0NIQU5HRUQsIGZuKTtcbiAgICB9LFxuICAgIGdldFRhYmxlU3RhdGUoKXtcbiAgICAgIGNvbnN0IHNvcnQgPSBPYmplY3QuYXNzaWduKHt9LCB0YWJsZVN0YXRlLnNvcnQpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gT2JqZWN0LmFzc2lnbih7fSwgdGFibGVTdGF0ZS5zZWFyY2gpO1xuICAgICAgY29uc3Qgc2xpY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0YWJsZVN0YXRlLnNsaWNlKTtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHt9O1xuICAgICAgZm9yIChsZXQgcHJvcCBpbiB0YWJsZVN0YXRlLmZpbHRlcikge1xuICAgICAgICBmaWx0ZXJbcHJvcF0gPSB0YWJsZVN0YXRlLmZpbHRlcltwcm9wXS5tYXAodiA9PiBPYmplY3QuYXNzaWduKHt9LCB2KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge3NvcnQsIHNlYXJjaCwgc2xpY2UsIGZpbHRlcn07XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGluc3RhbmNlID0gT2JqZWN0LmFzc2lnbih0YWJsZSwgYXBpKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdGFuY2UsICdsZW5ndGgnLCB7XG4gICAgZ2V0KCl7XG4gICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59IiwiaW1wb3J0IHNvcnQgZnJvbSAnc21hcnQtdGFibGUtc29ydCc7XG5pbXBvcnQgZmlsdGVyIGZyb20gJ3NtYXJ0LXRhYmxlLWZpbHRlcic7XG5pbXBvcnQgc2VhcmNoIGZyb20gJ3NtYXJ0LXRhYmxlLXNlYXJjaCc7XG5pbXBvcnQgdGFibGUgZnJvbSAnLi9kaXJlY3RpdmVzL3RhYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHtcbiAgc29ydEZhY3RvcnkgPSBzb3J0LFxuICBmaWx0ZXJGYWN0b3J5ID0gZmlsdGVyLFxuICBzZWFyY2hGYWN0b3J5ID0gc2VhcmNoLFxuICB0YWJsZVN0YXRlID0ge3NvcnQ6IHt9LCBzbGljZToge3BhZ2U6IDF9LCBmaWx0ZXI6IHt9LCBzZWFyY2g6IHt9fSxcbiAgZGF0YSA9IFtdXG59LCAuLi50YWJsZURpcmVjdGl2ZXMpIHtcblxuICBjb25zdCBjb3JlVGFibGUgPSB0YWJsZSh7c29ydEZhY3RvcnksIGZpbHRlckZhY3RvcnksIHRhYmxlU3RhdGUsIGRhdGEsIHNlYXJjaEZhY3Rvcnl9KTtcblxuICByZXR1cm4gdGFibGVEaXJlY3RpdmVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIG5ld2RpcikgPT4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjY3VtdWxhdG9yLCBuZXdkaXIoe1xuICAgICAgc29ydEZhY3RvcnksXG4gICAgICBmaWx0ZXJGYWN0b3J5LFxuICAgICAgc2VhcmNoRmFjdG9yeSxcbiAgICAgIHRhYmxlU3RhdGUsXG4gICAgICBkYXRhLFxuICAgICAgdGFibGU6IGNvcmVUYWJsZVxuICAgIH0pKTtcbiAgfSwgY29yZVRhYmxlKTtcbn0iLCJpbXBvcnQge0ZJTFRFUl9DSEFOR0VEfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtwcm94eUxpc3RlbmVyfSBmcm9tICdzbWFydC10YWJsZS1ldmVudHMnO1xuXG5jb25zdCBmaWx0ZXJMaXN0ZW5lciA9IHByb3h5TGlzdGVuZXIoe1tGSUxURVJfQ0hBTkdFRF06ICdvbkZpbHRlckNoYW5nZSd9KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHt0YWJsZSwgcG9pbnRlciwgb3BlcmF0b3IgPSAnaW5jbHVkZXMnLCB0eXBlID0gJ3N0cmluZyd9KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgIGZpbHRlcihpbnB1dCl7XG4gICAgICAgIGNvbnN0IGZpbHRlckNvbmYgPSB7XG4gICAgICAgICAgW3BvaW50ZXJdOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiBpbnB1dCxcbiAgICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRhYmxlLmZpbHRlcihmaWx0ZXJDb25mKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbHRlckxpc3RlbmVyKHtlbWl0dGVyOiB0YWJsZX0pKTtcbn0iLCJpbXBvcnQge1NFQVJDSF9DSEFOR0VEfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtwcm94eUxpc3RlbmVyfSBmcm9tICdzbWFydC10YWJsZS1ldmVudHMnO1xuXG5jb25zdCBzZWFyY2hMaXN0ZW5lciA9IHByb3h5TGlzdGVuZXIoe1tTRUFSQ0hfQ0hBTkdFRF06ICdvblNlYXJjaENoYW5nZSd9KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHt0YWJsZSwgc2NvcGUgPSBbXX0pIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgc2VhcmNoTGlzdGVuZXIoe2VtaXR0ZXI6IHRhYmxlfSksIHtcbiAgICAgIHNlYXJjaChpbnB1dCl7XG4gICAgICAgIHJldHVybiB0YWJsZS5zZWFyY2goe3ZhbHVlOiBpbnB1dCwgc2NvcGV9KTtcbiAgICAgIH1cbiAgICB9KTtcbn0iLCJpbXBvcnQge1BBR0VfQ0hBTkdFRCwgU1VNTUFSWV9DSEFOR0VEfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtwcm94eUxpc3RlbmVyfSBmcm9tICdzbWFydC10YWJsZS1ldmVudHMnO1xuXG5jb25zdCBzbGljZUxpc3RlbmVyID0gcHJveHlMaXN0ZW5lcih7W1BBR0VfQ0hBTkdFRF06ICdvblBhZ2VDaGFuZ2UnLCBbU1VNTUFSWV9DSEFOR0VEXTogJ29uU3VtbWFyeUNoYW5nZSd9KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHt0YWJsZX0pIHtcbiAgbGV0IHtzbGljZTp7cGFnZTpjdXJyZW50UGFnZSwgc2l6ZTpjdXJyZW50U2l6ZX19ID0gdGFibGUuZ2V0VGFibGVTdGF0ZSgpO1xuICBsZXQgaXRlbUxpc3RMZW5ndGggPSB0YWJsZS5sZW5ndGg7XG5cbiAgY29uc3QgYXBpID0ge1xuICAgIHNlbGVjdFBhZ2UocCl7XG4gICAgICByZXR1cm4gdGFibGUuc2xpY2Uoe3BhZ2U6IHAsIHNpemU6IGN1cnJlbnRTaXplfSk7XG4gICAgfSxcbiAgICBzZWxlY3ROZXh0UGFnZSgpe1xuICAgICAgcmV0dXJuIGFwaS5zZWxlY3RQYWdlKGN1cnJlbnRQYWdlICsgMSk7XG4gICAgfSxcbiAgICBzZWxlY3RQcmV2aW91c1BhZ2UoKXtcbiAgICAgIHJldHVybiBhcGkuc2VsZWN0UGFnZShjdXJyZW50UGFnZSAtIDEpO1xuICAgIH0sXG4gICAgY2hhbmdlUGFnZVNpemUoc2l6ZSl7XG4gICAgICByZXR1cm4gdGFibGUuc2xpY2Uoe3BhZ2U6IDEsIHNpemV9KTtcbiAgICB9LFxuICAgIGlzUHJldmlvdXNQYWdlRW5hYmxlZCgpe1xuICAgICAgcmV0dXJuIGN1cnJlbnRQYWdlID4gMTtcbiAgICB9LFxuICAgIGlzTmV4dFBhZ2VFbmFibGVkKCl7XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKGl0ZW1MaXN0TGVuZ3RoIC8gY3VycmVudFNpemUpID4gY3VycmVudFBhZ2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBkaXJlY3RpdmUgPSBPYmplY3QuYXNzaWduKGFwaSwgc2xpY2VMaXN0ZW5lcih7ZW1pdHRlcjogdGFibGV9KSk7XG5cbiAgZGlyZWN0aXZlLm9uU3VtbWFyeUNoYW5nZSgoe3BhZ2U6cCwgc2l6ZTpzLCBmaWx0ZXJlZENvdW50fSkgPT4ge1xuICAgIGN1cnJlbnRQYWdlID0gcDtcbiAgICBjdXJyZW50U2l6ZSA9IHM7XG4gICAgaXRlbUxpc3RMZW5ndGggPSBmaWx0ZXJlZENvdW50O1xuICB9KTtcblxuICByZXR1cm4gZGlyZWN0aXZlO1xufVxuIiwiaW1wb3J0IHtUT0dHTEVfU09SVH0gZnJvbSAnLi4vZXZlbnRzJ1xuaW1wb3J0IHtwcm94eUxpc3RlbmVyfSBmcm9tICdzbWFydC10YWJsZS1ldmVudHMnO1xuXG5jb25zdCBzb3J0TGlzdGVuZXJzID0gcHJveHlMaXN0ZW5lcih7W1RPR0dMRV9TT1JUXTogJ29uU29ydFRvZ2dsZSd9KTtcbmNvbnN0IGRpcmVjdGlvbnMgPSBbJ2FzYycsICdkZXNjJ107XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICh7cG9pbnRlciwgdGFibGUsIGN5Y2xlID0gZmFsc2V9KSB7XG5cbiAgY29uc3QgY3ljbGVEaXJlY3Rpb25zID0gY3ljbGUgPT09IHRydWUgPyBbJ25vbmUnXS5jb25jYXQoZGlyZWN0aW9ucykgOiBbLi4uZGlyZWN0aW9uc10ucmV2ZXJzZSgpO1xuXG4gIGxldCBoaXQgPSAwO1xuXG4gIGNvbnN0IGRpcmVjdGl2ZSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHRvZ2dsZSgpe1xuICAgICAgaGl0Kys7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBjeWNsZURpcmVjdGlvbnNbaGl0ICUgY3ljbGVEaXJlY3Rpb25zLmxlbmd0aF07XG4gICAgICByZXR1cm4gdGFibGUuc29ydCh7cG9pbnRlciwgZGlyZWN0aW9ufSk7XG4gICAgfVxuXG4gIH0sIHNvcnRMaXN0ZW5lcnMoe2VtaXR0ZXI6IHRhYmxlfSkpO1xuXG4gIGRpcmVjdGl2ZS5vblNvcnRUb2dnbGUoKHtwb2ludGVyOnB9KSA9PiB7XG4gICAgaWYgKHBvaW50ZXIgIT09IHApIHtcbiAgICAgIGhpdCA9IDA7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGlyZWN0aXZlO1xufSIsImltcG9ydCB7U1VNTUFSWV9DSEFOR0VEfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtwcm94eUxpc3RlbmVyfSBmcm9tICdzbWFydC10YWJsZS1ldmVudHMnO1xuXG5jb25zdCBleGVjdXRpb25MaXN0ZW5lciA9IHByb3h5TGlzdGVuZXIoe1tTVU1NQVJZX0NIQU5HRURdOiAnb25TdW1tYXJ5Q2hhbmdlJ30pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoe3RhYmxlfSkge1xuICByZXR1cm4gZXhlY3V0aW9uTGlzdGVuZXIoe2VtaXR0ZXI6IHRhYmxlfSk7XG59XG4iLCJpbXBvcnQge0VYRUNfQ0hBTkdFRH0gZnJvbSAnLi4vZXZlbnRzJztcbmltcG9ydCB7cHJveHlMaXN0ZW5lcn0gZnJvbSAnc21hcnQtdGFibGUtZXZlbnRzJztcblxuY29uc3QgZXhlY3V0aW9uTGlzdGVuZXIgPSBwcm94eUxpc3RlbmVyKHtbRVhFQ19DSEFOR0VEXTogJ29uRXhlY3V0aW9uQ2hhbmdlJ30pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoe3RhYmxlfSkge1xuICByZXR1cm4gZXhlY3V0aW9uTGlzdGVuZXIoe2VtaXR0ZXI6IHRhYmxlfSk7XG59XG4iLCJpbXBvcnQgdGFibGVEaXJlY3RpdmUgZnJvbSAnLi9zcmMvdGFibGUnO1xuaW1wb3J0IGZpbHRlckRpcmVjdGl2ZSBmcm9tICcuL3NyYy9kaXJlY3RpdmVzL2ZpbHRlcic7XG5pbXBvcnQgc2VhcmNoRGlyZWN0aXZlIGZyb20gJy4vc3JjL2RpcmVjdGl2ZXMvc2VhcmNoJztcbmltcG9ydCBzbGljZURpcmVjdGl2ZSBmcm9tICcuL3NyYy9kaXJlY3RpdmVzL3NsaWNlJztcbmltcG9ydCBzb3J0RGlyZWN0aXZlIGZyb20gJy4vc3JjL2RpcmVjdGl2ZXMvc29ydCc7XG5pbXBvcnQgc3VtbWFyeURpcmVjdGl2ZSBmcm9tICcuL3NyYy9kaXJlY3RpdmVzL3N1bW1hcnknO1xuaW1wb3J0IHdvcmtpbmdJbmRpY2F0b3JEaXJlY3RpdmUgZnJvbSAnLi9zcmMvZGlyZWN0aXZlcy93b3JraW5nSW5kaWNhdG9yJztcblxuZXhwb3J0IGNvbnN0IHNlYXJjaCA9IHNlYXJjaERpcmVjdGl2ZTtcbmV4cG9ydCBjb25zdCBzbGljZSA9IHNsaWNlRGlyZWN0aXZlO1xuZXhwb3J0IGNvbnN0IHN1bW1hcnkgPSBzdW1tYXJ5RGlyZWN0aXZlO1xuZXhwb3J0IGNvbnN0IHNvcnQgPSBzb3J0RGlyZWN0aXZlO1xuZXhwb3J0IGNvbnN0IGZpbHRlciA9IGZpbHRlckRpcmVjdGl2ZTtcbmV4cG9ydCBjb25zdCB3b3JraW5nSW5kaWNhdG9yID0gd29ya2luZ0luZGljYXRvckRpcmVjdGl2ZTtcbmV4cG9ydCBjb25zdCB0YWJsZSA9IHRhYmxlRGlyZWN0aXZlO1xuZXhwb3J0IGRlZmF1bHQgdGFibGU7XG4iLCJpbXBvcnQge3dvcmtpbmdJbmRpY2F0b3J9IGZyb20gJ3NtYXJ0LXRhYmxlLWNvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoe3RhYmxlLCBlbH0pIHtcbiAgY29uc3QgY29tcG9uZW50ID0gd29ya2luZ0luZGljYXRvcih7dGFibGV9KTtcbiAgY29tcG9uZW50Lm9uRXhlY3V0aW9uQ2hhbmdlKGZ1bmN0aW9uICh7d29ya2luZ30pIHtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzdC13b3JraW5nJyk7XG4gICAgaWYgKHdvcmtpbmcgPT09IHRydWUpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3N0LXdvcmtpbmcnKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY29tcG9uZW50O1xufTsiLCJpbXBvcnQge3NvcnR9IGZyb20gJ3NtYXJ0LXRhYmxlLWNvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoe2VsLCB0YWJsZSwgY29uZiA9IHt9fSkge1xuICBjb25zdCBwb2ludGVyID0gY29uZi5wb2ludGVyIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1zb3J0Jyk7XG4gIGNvbnN0IGN5Y2xlID0gY29uZi5jeWNsZSB8fCBlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc3Qtc29ydC1jeWNsZScpO1xuICBjb25zdCBjb21wb25lbnQgPSBzb3J0KHtwb2ludGVyLCB0YWJsZSwgY3ljbGV9KTtcbiAgY29tcG9uZW50Lm9uU29ydFRvZ2dsZSgoe3BvaW50ZXI6Y3VycmVudFBvaW50ZXIsIGRpcmVjdGlvbn0pID0+IHtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzdC1zb3J0LWFzYycsICdzdC1zb3J0LWRlc2MnKTtcbiAgICBpZiAocG9pbnRlciA9PT0gY3VycmVudFBvaW50ZXIgJiYgZGlyZWN0aW9uICE9PSAnbm9uZScpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnc3Qtc29ydC1hc2MnIDogJ3N0LXNvcnQtZGVzYyc7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGV2ID0+IGNvbXBvbmVudC50b2dnbGUoKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudExpc3RlbmVyKTtcbiAgcmV0dXJuIGNvbXBvbmVudDtcbn0iLCJleHBvcnQgZnVuY3Rpb24gZGVib3VuY2UgKGZuLCBkZWxheSkge1xuICBsZXQgdGltZW91dElkO1xuICByZXR1cm4gKGV2KSA9PiB7XG4gICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgICB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBmbihldik7XG4gICAgfSwgZGVsYXkpO1xuICB9O1xufTsiLCJpbXBvcnQge2ZpbHRlcn0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICcuL2hlbHBlcnMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbHRlcklucHV0ICh7dGFibGUsIGVsLCBkZWxheSA9IDQwMCwgY29uZiA9IHt9fSkge1xuICBjb25zdCBwb2ludGVyID0gY29uZi5wb2ludGVyIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1maWx0ZXInKTtcbiAgY29uc3Qgb3BlcmF0b3IgPSBjb25mLm9wZXJhdG9yIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1maWx0ZXItb3BlcmF0b3InKSB8fCAnaW5jbHVkZXMnO1xuICBjb25zdCBlbFR5cGUgPSBlbC5oYXNBdHRyaWJ1dGUoJ3R5cGUnKSA/IGVsLmdldEF0dHJpYnV0ZSgndHlwZScpIDogJ3N0cmluZyc7XG4gIGxldCB0eXBlID0gY29uZi50eXBlIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1maWx0ZXItdHlwZScpO1xuICBpZiAoIXR5cGUpIHtcbiAgICB0eXBlID0gWydkYXRlJywgJ251bWJlciddLmluY2x1ZGVzKGVsVHlwZSkgPyBlbFR5cGUgOiAnc3RyaW5nJztcbiAgfVxuICBjb25zdCBjb21wb25lbnQgPSBmaWx0ZXIoe3RhYmxlLCBwb2ludGVyLCB0eXBlLCBvcGVyYXRvcn0pO1xuICBjb25zdCBldmVudExpc3RlbmVyID0gZGVib3VuY2UoZXYgPT4gY29tcG9uZW50LmZpbHRlcihlbC52YWx1ZSksIGRlbGF5KTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBldmVudExpc3RlbmVyKTtcbiAgaWYgKGVsLnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZlbnRMaXN0ZW5lcik7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn07IiwiaW1wb3J0IHtzZWFyY2h9IGZyb20gJ3NtYXJ0LXRhYmxlLWNvcmUnO1xuaW1wb3J0IHtkZWJvdW5jZX0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHtlbCwgdGFibGUsIGRlbGF5ID0gNDAwLCBjb25mID0ge319KSB7XG4gIGNvbnN0IHNjb3BlID0gY29uZi5zY29wZSB8fCAoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXN0LXNlYXJjaCcpIHx8ICcnKS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgY29uc3QgY29tcG9uZW50ID0gc2VhcmNoKHt0YWJsZSwgc2NvcGV9KTtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGRlYm91bmNlKGV2ID0+IHtcbiAgICBjb21wb25lbnQuc2VhcmNoKGVsLnZhbHVlKTtcbiAgfSwgZGVsYXkpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGV2ZW50TGlzdGVuZXIpO1xufTsiLCJpbXBvcnQgbG9hZGluZyBmcm9tICcuL2xvYWRpbmdJbmRpY2F0b3InO1xuaW1wb3J0IHNvcnQgZnJvbSAgJy4vc29ydCc7XG5pbXBvcnQgZmlsdGVyIGZyb20gJy4vZmlsdGVycydcbmltcG9ydCBzZWFyY2hJbnB1dCBmcm9tICcuL3NlYXJjaCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHtlbCwgdGFibGV9KSB7XG4gIC8vIGJvb3RcbiAgWy4uLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXN0LXNvcnRdJyldLmZvckVhY2goZWwgPT4gc29ydCh7ZWwsIHRhYmxlfSkpO1xuICBbLi4uZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3QtbG9hZGluZy1pbmRpY2F0b3JdJyldLmZvckVhY2goZWwgPT4gbG9hZGluZyh7ZWwsIHRhYmxlfSkpO1xuICBbLi4uZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3Qtc2VhcmNoXScpXS5mb3JFYWNoKGVsID0+IHNlYXJjaElucHV0KHtlbCwgdGFibGV9KSk7XG4gIFsuLi5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zdC1maWx0ZXJdJyldLmZvckVhY2goZWwgPT4gZmlsdGVyKHtlbCwgdGFibGV9KSk7XG5cbiAgLy9leHRlbnNpb25cbiAgY29uc3QgdGFibGVEaXNwbGF5Q2hhbmdlID0gdGFibGUub25EaXNwbGF5Q2hhbmdlO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YWJsZSwge1xuICAgIG9uRGlzcGxheUNoYW5nZTogKGxpc3RlbmVyKSA9PiB7XG4gICAgICB0YWJsZURpc3BsYXlDaGFuZ2UobGlzdGVuZXIpO1xuICAgICAgdGFibGUuZXhlYygpO1xuICAgIH1cbiAgfSk7XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICh7bmFtZTp7Zmlyc3Q6Zmlyc3ROYW1lLCBsYXN0Omxhc3ROYW1lfSwgZ2VuZGVyLCBiaXJ0aERhdGUsIHNpemV9KSB7XG4gIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcbiAgdHIuaW5uZXJIVE1MID0gYDx0ZD4ke2xhc3ROYW1lfTwvdGQ+PHRkPiR7Zmlyc3ROYW1lfTwvdGQ+PHRkPiR7Z2VuZGVyfTwvdGQ+PHRkPiR7YmlydGhEYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpfTwvdGQ+PHRkPiR7c2l6ZX08L3RkPmA7XG4gIHJldHVybiB0cjtcbn0iLCJpbXBvcnQge3N1bW1hcnl9ICBmcm9tICdzbWFydC10YWJsZS1jb3JlJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdW1tYXJ5Q29tcG9uZW50ICh7dGFibGUsIGVsfSkge1xuICBjb25zdCBkaXIgPSBzdW1tYXJ5KHt0YWJsZX0pO1xuICBkaXIub25TdW1tYXJ5Q2hhbmdlKCh7cGFnZSwgc2l6ZSwgZmlsdGVyZWRDb3VudH0pID0+IHtcbiAgICBlbC5pbm5lckhUTUwgPSBgc2hvd2luZyBpdGVtcyA8c3Ryb25nPiR7KHBhZ2UgLSAxKSAqIHNpemUgKyAoZmlsdGVyZWRDb3VudCA+IDAgPyAxIDogMCl9PC9zdHJvbmc+IC0gPHN0cm9uZz4ke01hdGgubWluKGZpbHRlcmVkQ291bnQsIHBhZ2UgKiBzaXplKX08L3N0cm9uZz4gb2YgPHN0cm9uZz4ke2ZpbHRlcmVkQ291bnR9PC9zdHJvbmc+IG1hdGNoaW5nIGl0ZW1zYDtcbiAgfSk7XG4gIHJldHVybiBkaXI7XG59IiwiaW1wb3J0IHtzbGljZX0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhZ2luYXRpb25Db21wb25lbnQgKHt0YWJsZSwgZWx9KSB7XG4gIGNvbnN0IHByZXZpb3VzQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIHByZXZpb3VzQnV0dG9uLmlubmVySFRNTCA9ICdQcmV2aW91cyc7XG4gIGNvbnN0IG5leHRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgbmV4dEJ1dHRvbi5pbm5lckhUTUwgPSAnTmV4dCc7XG4gIGNvbnN0IHBhZ2VTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBwYWdlU3Bhbi5pbm5lckhUTUwgPSAnLSBwYWdlIDEgLSc7XG4gIGNvbnN0IGNvbXAgPSBzbGljZSh7dGFibGV9KTtcblxuICBjb21wLm9uU3VtbWFyeUNoYW5nZSgoe3BhZ2V9KSA9PiB7XG4gICAgcHJldmlvdXNCdXR0b24uZGlzYWJsZWQgPSAhY29tcC5pc1ByZXZpb3VzUGFnZUVuYWJsZWQoKTtcbiAgICBuZXh0QnV0dG9uLmRpc2FibGVkID0gIWNvbXAuaXNOZXh0UGFnZUVuYWJsZWQoKTtcbiAgICBwYWdlU3Bhbi5pbm5lckhUTUwgPSBgLSAke3BhZ2V9IC1gO1xuICB9KTtcblxuICBwcmV2aW91c0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbXAuc2VsZWN0UHJldmlvdXNQYWdlKCkpO1xuICBuZXh0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29tcC5zZWxlY3ROZXh0UGFnZSgpKTtcblxuICBlbC5hcHBlbmRDaGlsZChwcmV2aW91c0J1dHRvbik7XG4gIGVsLmFwcGVuZENoaWxkKHBhZ2VTcGFuKTtcbiAgZWwuYXBwZW5kQ2hpbGQobmV4dEJ1dHRvbik7XG5cbiAgcmV0dXJuIGNvbXA7XG59IiwiaW1wb3J0IHtkZWJvdW5jZX0gZnJvbSAnc21hcnQtdGFibGUtdmFuaWxsYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJhbmdTaXplSW5wdXQgKHttaW5FbCwgbWF4RWwsIHRhYmxlfSkge1xuXG4gIGxldCBsdFZhbHVlO1xuICBsZXQgZ3RWYWx1ZTtcblxuICBjb25zdCBjb21taXQgPSAoKSA9PiB7XG4gICAgY29uc3QgY2xhdXNlcyA9IFtdO1xuICAgIGlmIChsdFZhbHVlKSB7XG4gICAgICBjbGF1c2VzLnB1c2goe3ZhbHVlOiBsdFZhbHVlLCBvcGVyYXRvcjogJ2x0ZScsIHR5cGU6ICdudW1iZXInfSk7XG4gICAgfVxuICAgIGlmIChndFZhbHVlKSB7XG4gICAgICBjbGF1c2VzLnB1c2goe3ZhbHVlOiBndFZhbHVlLCBvcGVyYXRvcjogJ2d0ZScsIHR5cGU6ICdudW1iZXInfSk7XG4gICAgfVxuICAgIHRhYmxlLmZpbHRlcih7XG4gICAgICBzaXplOiBjbGF1c2VzXG4gICAgfSlcbiAgfTtcblxuICBtaW5FbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKChldikgPT4ge1xuICAgIGd0VmFsdWUgPSBtaW5FbC52YWx1ZTtcbiAgICBjb21taXQoKTtcbiAgfSwgNDAwKSk7XG5cbiAgbWF4RWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkZWJvdW5jZSgoZXYpID0+IHtcbiAgICBsdFZhbHVlID0gbWF4RWwudmFsdWU7XG4gICAgY29tbWl0KCk7XG4gIH0sIDQwMCkpO1xufSIsImV4cG9ydCBkZWZhdWx0ICAoe3F1ZXJ5fSkgPT4gKHt0YWJsZSwgdGFibGVTdGF0ZX0pID0+IHtcbiAgY29uc3QgZXhlYyA9ICgpID0+IHtcbiAgICB0YWJsZS5kaXNwYXRjaCgnRVhFQ19DSEFOR0VEJywge3dvcmtpbmc6IHRydWV9KTtcbiAgICByZXR1cm4gcXVlcnkodGFibGVTdGF0ZSlcbiAgICAgIC50aGVuKCh7ZGF0YSA9IFtdLCBzdW1tYXJ5ID0ge319KSA9PiB7XG4gICAgICAgIHRhYmxlLmRpc3BhdGNoKCdTVU1NQVJZX0NIQU5HRUQnLCBzdW1tYXJ5KTtcbiAgICAgICAgdGFibGUuZGlzcGF0Y2goJ0RJU1BMQVlfQ0hBTkdFRCcsIGRhdGEpO1xuICAgICAgICB0YWJsZS5kaXNwYXRjaCgnRVhFQ19DSEFOR0VEJywge3dvcmtpbmc6IGZhbHNlfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICB0YWJsZS5kaXNwYXRjaCgnRVhFQ19FUlJPUicsIGUpO1xuICAgICAgICB0YWJsZS5kaXNwYXRjaCgnRVhFQ19DSEFOR0VEJywge3dvcmtpbmc6IGZhbHNlfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YWJsZSwge1xuICAgIGV4ZWMsIGV2YWw6ICh0cyA9IHRhYmxlU3RhdGUpID0+IHF1ZXJ5KHRzKS50aGVuKCh7ZGF0YX0pID0+IGRhdGEpXG4gIH0pO1xufTsiLCIvL2EgZmFrZSBzZGsgdG8gbWltaWMgYSBzZXJ2ZXI6IGl0IGFjdHVhbGx5IHVzZXMgYW5vdGhlciBzbWFydC10YWJsZSB0byBwcm9jZXNzIGEgcXVlcnkgYW5kIHJldHVybiB0aGUgcmVzdWx0IHdpdGggYSByYW5kb20gdGltZW91dCB0byBtaW1pYyB0aGUgaHR0cCByZXNwb25zZSB0aW1lXG5pbXBvcnQge3RhYmxlfSBmcm9tICdzbWFydC10YWJsZS1jb3JlJztcblxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICBjb25zdCB0ID0gdGFibGUoe2RhdGF9KTtcbiAgcmV0dXJuIHtcbiAgICBxdWVyeTogKHRhYmxlU3RhdGUpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vdGhpcyB0aW1lb3V0IGlzIGp1c3QgdG8gYXZvaWQgdGhlIHVpIHRvIGZyZWV6ZSBhcyBub3JtYWxseSB0aGUgcHJvY2VzcyB3b3VsZCBydW4gb24gdGhlIHNlcnZlclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBub3RTbGljZWRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRhYmxlU3RhdGUsIHtcbiAgICAgICAgICAgIHNsaWNlOiB7cGFnZTogMX1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBQcm9taXNlXG4gICAgICAgICAgICAuYWxsKFt0LmV2YWwodGFibGVTdGF0ZSksIHQuZXZhbChub3RTbGljZWRTdGF0ZSldKVxuICAgICAgICAgICAgLnRoZW4oKFtmdWxsLCBwYXJ0aWFsXSkgPT4ge1xuICAgICAgICAgICAgICAvL3JhbmRvbSB0aW1lb3V0IG9uIHRoZSByZXNwb25zZSB0byBtaW1pYyB0aGUgc2VydmVyIHJlc3BvbnNlIHRpbWVcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICBkYXRhOiBmdWxsLFxuICAgICAgICAgICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiB0YWJsZVN0YXRlLnNsaWNlLnBhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHRhYmxlU3RhdGUuc2xpY2Uuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRDb3VudDogcGFydGlhbC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSwgTWF0aC5yYW5kb20oKSAqIDIwMDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHJlamVjdChlKSk7XG4gICAgICAgIH0sIDIwKVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufTtcblxuXG4iLCJpbXBvcnQge3RhYmxlIGFzIHRhYmxlQ29tcG9uZW50RmFjdG9yeX0gZnJvbSAnc21hcnQtdGFibGUtdmFuaWxsYSc7XG5pbXBvcnQge3RhYmxlfSBmcm9tICdzbWFydC10YWJsZS1jb3JlJztcbmltcG9ydCByb3cgZnJvbSAnLi9jb21wb25lbnRzL3Jvdyc7XG5pbXBvcnQgc3VtbWFyeSBmcm9tICcuL2NvbXBvbmVudHMvc3VtbWFyeSc7XG5pbXBvcnQgcGFnaW5hdGlvbiBmcm9tICcuL2NvbXBvbmVudHMvcGFnaW5hdGlvbic7XG5pbXBvcnQgcmFuZ2VTaXplSW5wdXQgZnJvbSAnLi9jb21wb25lbnRzL3JhbmdlU2l6ZUlucHV0JztcbmltcG9ydCBleHQgZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHNkayBmcm9tICcuL3Nkayc7XG5cbmNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlLWNvbnRhaW5lcicpO1xuY29uc3QgdGJvZHkgPSBlbC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuY29uc3Qgc3VtbWFyeUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc3Qtc3VtbWFyeV0nKTtcblxuY29uc3QgdCA9IHRhYmxlKFxuICB7dGFibGVTdGF0ZToge3NvcnQ6IHt9LCBmaWx0ZXI6IHt9LCBzbGljZToge3BhZ2U6IDEsIHNpemU6IDIwfX19LFxuICBleHQoc2RrKCkpIC8vc2VydmVyIHNpZGUgZXh0ZW5zaW9uXG4pO1xuY29uc3QgdGFibGVDb21wb25lbnQgPSB0YWJsZUNvbXBvbmVudEZhY3Rvcnkoe2VsLCB0YWJsZTogdH0pO1xuXG5zdW1tYXJ5KHt0YWJsZTogdCwgZWw6IHN1bW1hcnlFbH0pO1xucmFuZ2VTaXplSW5wdXQoe1xuICB0YWJsZTogdCxcbiAgbWluRWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtaW4tc2l6ZScpLFxuICBtYXhFbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21heC1zaXplJylcbn0pO1xuXG5jb25zdCBwYWdpbmF0aW9uQ29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc3QtcGFnaW5hdGlvbl0nKTtcbnBhZ2luYXRpb24oe3RhYmxlOiB0LCBlbDogcGFnaW5hdGlvbkNvbnRhaW5lcn0pO1xuXG50YWJsZUNvbXBvbmVudC5vbkRpc3BsYXlDaGFuZ2UoZGlzcGxheWVkID0+IHtcbiAgdGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAobGV0IHIgb2YgZGlzcGxheWVkKSB7XG4gICAgY29uc3QgbmV3Q2hpbGQgPSByb3coKHIudmFsdWUpLCByLmluZGV4LCB0KTtcbiAgICB0Ym9keS5hcHBlbmRDaGlsZChuZXdDaGlsZCk7XG4gIH1cbn0pO1xuIl0sIm5hbWVzIjpbInBvaW50ZXIiLCJmaWx0ZXIiLCJzb3J0RmFjdG9yeSIsInNvcnQiLCJzZWFyY2giLCJ0YWJsZSIsImV4ZWN1dGlvbkxpc3RlbmVyIiwic3VtbWFyeURpcmVjdGl2ZSIsInRhYmxlRGlyZWN0aXZlIiwic3VtbWFyeSIsInJhbmdlU2l6ZUlucHV0IiwicGFnaW5hdGlvbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQU8sU0FBUyxJQUFJLEVBQUUsQ0FBQyxFQUFFO0VBQ3ZCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDMUI7O0FBRUQsQUFBTyxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLEVBQUU7RUFDdEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQzFGOztBQUVELEFBQU8sU0FBUyxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTtFQUNwQyxNQUFNLEtBQUssR0FBRyxTQUFTLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztFQUNyQyxPQUFPLENBQUMsR0FBRyxJQUFJLEtBQUs7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO01BQ3ZCLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDcEIsTUFBTTtNQUNMLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxRQUFR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
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtb3BlcmF0b3JzL2Rpc3QvYnVuZGxlL21vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS1qc29uLXBvaW50ZXIvZGlzdC9idW5kbGUvbW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLXNvcnQvZGlzdC9idW5kbGUvbW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWZpbHRlci9kaXN0L2J1bmRsZS9tb2R1bGUuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtc2VhcmNoL2Rpc3QvYnVuZGxlL21vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS1ldmVudHMvZGlzdC9idW5kbGUvbW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLWNvcmUvZGlzdC9idW5kbGUvbW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLXZhbmlsbGEvbGliL2xvYWRpbmdJbmRpY2F0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtdmFuaWxsYS9saWIvc29ydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zbWFydC10YWJsZS12YW5pbGxhL2xpYi9oZWxwZXJzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLXZhbmlsbGEvbGliL2ZpbHRlcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvc21hcnQtdGFibGUtdmFuaWxsYS9saWIvc2VhcmNoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NtYXJ0LXRhYmxlLXZhbmlsbGEvbGliL3RhYmxlLmpzIiwiY29tcG9uZW50cy9yb3cuanMiLCJjb21wb25lbnRzL3N1bW1hcnkuanMiLCJjb21wb25lbnRzL3BhZ2luYXRpb24uanMiLCJjb21wb25lbnRzL3JhbmdlU2l6ZUlucHV0LmpzIiwiLi4vaW5kZXguanMiLCJzZGsuanMiLCJpbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzd2FwID0gKGYpID0+IChhLCBiKSA9PiBmKGIsIGEpO1xuY29uc3QgY29tcG9zZSA9IChmaXJzdCwgLi4uZm5zKSA9PiAoLi4uYXJncykgPT4gZm5zLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IGN1cnJlbnQocHJldmlvdXMpLCBmaXJzdCguLi5hcmdzKSk7XG5jb25zdCBjdXJyeSA9IChmbiwgYXJpdHlMZWZ0KSA9PiB7XG4gICAgY29uc3QgYXJpdHkgPSBhcml0eUxlZnQgfHwgZm4ubGVuZ3RoO1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBhcmdMZW5ndGggPSBhcmdzLmxlbmd0aCB8fCAxO1xuICAgICAgICBpZiAoYXJpdHkgPT09IGFyZ0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bmMgPSAoLi4ubW9yZUFyZ3MpID0+IGZuKC4uLmFyZ3MsIC4uLm1vcmVBcmdzKTtcbiAgICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmMsIGFyaXR5IC0gYXJncy5sZW5ndGgpO1xuICAgIH07XG59O1xuY29uc3QgYXBwbHkgPSAoZm4pID0+ICguLi5hcmdzKSA9PiBmbiguLi5hcmdzKTtcbmNvbnN0IHRhcCA9IChmbikgPT4gYXJnID0+IHtcbiAgICBmbihhcmcpO1xuICAgIHJldHVybiBhcmc7XG59O1xuXG5leHBvcnQgeyBzd2FwLCBjb21wb3NlLCBjdXJyeSwgYXBwbHksIHRhcCB9O1xuIiwiY29uc3QgcG9pbnRlciA9IChwYXRoKSA9PiB7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgcGFydGlhbCA9IChvYmogPSB7fSwgcGFydHMgPSBbXSkgPT4ge1xuICAgICAgICBjb25zdCBwID0gcGFydHMuc2hpZnQoKTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IG9ialtwXTtcbiAgICAgICAgcmV0dXJuIChjdXJyZW50ID09PSB1bmRlZmluZWQgfHwgY3VycmVudCA9PT0gbnVsbCB8fCBwYXJ0cy5sZW5ndGggPT09IDApID9cbiAgICAgICAgICAgIGN1cnJlbnQgOiBwYXJ0aWFsKGN1cnJlbnQsIHBhcnRzKTtcbiAgICB9O1xuICAgIGNvbnN0IHNldCA9ICh0YXJnZXQsIG5ld1RyZWUpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgICAgIGNvbnN0IFtsZWFmLCAuLi5pbnRlcm1lZGlhdGVdID0gcGFydHMucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBpbnRlcm1lZGlhdGUucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50W2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRbbGVhZl0gPSBPYmplY3QuYXNzaWduKGN1cnJlbnRbbGVhZl0gfHwge30sIG5ld1RyZWUpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWwodGFyZ2V0LCBbLi4ucGFydHNdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0XG4gICAgfTtcbn07XG5cbmV4cG9ydCB7IHBvaW50ZXIgfTtcbiIsImltcG9ydCB7IHN3YXAgfSBmcm9tICdzbWFydC10YWJsZS1vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcG9pbnRlciB9IGZyb20gJ3NtYXJ0LXRhYmxlLWpzb24tcG9pbnRlcic7XG5cbmNvbnN0IGRlZmF1bHRDb21wYXJhdG9yID0gKGEsIGIpID0+IHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTtcbn07XG52YXIgU29ydERpcmVjdGlvbjtcbihmdW5jdGlvbiAoU29ydERpcmVjdGlvbikge1xuICAgIFNvcnREaXJlY3Rpb25bXCJBU0NcIl0gPSBcImFzY1wiO1xuICAgIFNvcnREaXJlY3Rpb25bXCJERVNDXCJdID0gXCJkZXNjXCI7XG4gICAgU29ydERpcmVjdGlvbltcIk5PTkVcIl0gPSBcIm5vbmVcIjtcbn0pKFNvcnREaXJlY3Rpb24gfHwgKFNvcnREaXJlY3Rpb24gPSB7fSkpO1xuY29uc3Qgc29ydEJ5UHJvcGVydHkgPSAocHJvcCwgY29tcGFyYXRvcikgPT4ge1xuICAgIGNvbnN0IHByb3BHZXR0ZXIgPSBwb2ludGVyKHByb3ApLmdldDtcbiAgICByZXR1cm4gKGEsIGIpID0+IGNvbXBhcmF0b3IocHJvcEdldHRlcihhKSwgcHJvcEdldHRlcihiKSk7XG59O1xuY29uc3QgZGVmYXVsdFNvcnRGYWN0b3J5ID0gKGNvbmYpID0+IHtcbiAgICBjb25zdCB7IHBvaW50ZXI6IHBvaW50ZXIkJDEsIGRpcmVjdGlvbiA9IFwiYXNjXCIgLyogQVNDICovLCBjb21wYXJhdG9yID0gZGVmYXVsdENvbXBhcmF0b3IgfSA9IGNvbmY7XG4gICAgaWYgKCFwb2ludGVyJCQxIHx8IGRpcmVjdGlvbiA9PT0gXCJub25lXCIgLyogTk9ORSAqLykge1xuICAgICAgICByZXR1cm4gKGFycmF5KSA9PiBbLi4uYXJyYXldO1xuICAgIH1cbiAgICBjb25zdCBvcmRlckZ1bmMgPSBzb3J0QnlQcm9wZXJ0eShwb2ludGVyJCQxLCBjb21wYXJhdG9yKTtcbiAgICBjb25zdCBjb21wYXJlRnVuYyA9IGRpcmVjdGlvbiA9PT0gXCJkZXNjXCIgLyogREVTQyAqLyA/IHN3YXAob3JkZXJGdW5jKSA6IG9yZGVyRnVuYztcbiAgICByZXR1cm4gKGFycmF5KSA9PiBbLi4uYXJyYXldLnNvcnQoY29tcGFyZUZ1bmMpO1xufTtcblxuZXhwb3J0IHsgU29ydERpcmVjdGlvbiwgZGVmYXVsdFNvcnRGYWN0b3J5IH07XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnc21hcnQtdGFibGUtb3BlcmF0b3JzJztcbmltcG9ydCB7IHBvaW50ZXIgfSBmcm9tICdzbWFydC10YWJsZS1qc29uLXBvaW50ZXInO1xuXG52YXIgVHlwZTtcbihmdW5jdGlvbiAoVHlwZSkge1xuICAgIFR5cGVbXCJCT09MRUFOXCJdID0gXCJib29sZWFuXCI7XG4gICAgVHlwZVtcIk5VTUJFUlwiXSA9IFwibnVtYmVyXCI7XG4gICAgVHlwZVtcIkRBVEVcIl0gPSBcImRhdGVcIjtcbiAgICBUeXBlW1wiU1RSSU5HXCJdID0gXCJzdHJpbmdcIjtcbn0pKFR5cGUgfHwgKFR5cGUgPSB7fSkpO1xuY29uc3QgdHlwZUV4cHJlc3Npb24gPSAodHlwZSkgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFR5cGUuQk9PTEVBTjpcbiAgICAgICAgICAgIHJldHVybiBCb29sZWFuO1xuICAgICAgICBjYXNlIFR5cGUuTlVNQkVSOlxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcjtcbiAgICAgICAgY2FzZSBUeXBlLkRBVEU6XG4gICAgICAgICAgICByZXR1cm4gdmFsID0+IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgIGNhc2UgVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zZShTdHJpbmcsIHZhbCA9PiB2YWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsID0+IHZhbDtcbiAgICB9XG59O1xudmFyIEZpbHRlck9wZXJhdG9yO1xuKGZ1bmN0aW9uIChGaWx0ZXJPcGVyYXRvcikge1xuICAgIEZpbHRlck9wZXJhdG9yW1wiSU5DTFVERVNcIl0gPSBcImluY2x1ZGVzXCI7XG4gICAgRmlsdGVyT3BlcmF0b3JbXCJJU1wiXSA9IFwiaXNcIjtcbiAgICBGaWx0ZXJPcGVyYXRvcltcIklTX05PVFwiXSA9IFwiaXNOb3RcIjtcbiAgICBGaWx0ZXJPcGVyYXRvcltcIkxPV0VSX1RIQU5cIl0gPSBcImx0XCI7XG4gICAgRmlsdGVyT3BlcmF0b3JbXCJHUkVBVEVSX1RIQU5cIl0gPSBcImd0XCI7XG4gICAgRmlsdGVyT3BlcmF0b3JbXCJHUkVBVEVSX1RIQU5fT1JfRVFVQUxcIl0gPSBcImd0ZVwiO1xuICAgIEZpbHRlck9wZXJhdG9yW1wiTE9XRVJfVEhBTl9PUl9FUVVBTFwiXSA9IFwibHRlXCI7XG4gICAgRmlsdGVyT3BlcmF0b3JbXCJFUVVBTFNcIl0gPSBcImVxdWFsc1wiO1xuICAgIEZpbHRlck9wZXJhdG9yW1wiTk9UX0VRVUFMU1wiXSA9IFwibm90RXF1YWxzXCI7XG4gICAgRmlsdGVyT3BlcmF0b3JbXCJBTllfT0ZcIl0gPSBcImFueU9mXCI7XG59KShGaWx0ZXJPcGVyYXRvciB8fCAoRmlsdGVyT3BlcmF0b3IgPSB7fSkpO1xuY29uc3Qgbm90ID0gZm4gPT4gaW5wdXQgPT4gIWZuKGlucHV0KTtcbmNvbnN0IGlzID0gdmFsdWUgPT4gaW5wdXQgPT4gT2JqZWN0LmlzKHZhbHVlLCBpbnB1dCk7XG5jb25zdCBsdCA9IHZhbHVlID0+IGlucHV0ID0+IGlucHV0IDwgdmFsdWU7XG5jb25zdCBndCA9IHZhbHVlID0+IGlucHV0ID0+IGlucHV0ID4gdmFsdWU7XG5jb25zdCBlcXVhbHMgPSB2YWx1ZSA9PiBpbnB1dCA9PiB2YWx1ZSA9PT0gaW5wdXQ7XG5jb25zdCBpbmNsdWRlcyA9IHZhbHVlID0+IGlucHV0ID0+IGlucHV0LmluY2x1ZGVzKHZhbHVlKTtcbmNvbnN0IGFueU9mID0gdmFsdWUgPT4gaW5wdXQgPT4gdmFsdWUuaW5jbHVkZXMoaW5wdXQpO1xuY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgIFtcImluY2x1ZGVzXCIgLyogSU5DTFVERVMgKi9dOiBpbmNsdWRlcyxcbiAgICBbXCJpc1wiIC8qIElTICovXTogaXMsXG4gICAgW1wiaXNOb3RcIiAvKiBJU19OT1QgKi9dOiBjb21wb3NlKGlzLCBub3QpLFxuICAgIFtcImx0XCIgLyogTE9XRVJfVEhBTiAqL106IGx0LFxuICAgIFtcImd0ZVwiIC8qIEdSRUFURVJfVEhBTl9PUl9FUVVBTCAqL106IGNvbXBvc2UobHQsIG5vdCksXG4gICAgW1wiZ3RcIiAvKiBHUkVBVEVSX1RIQU4gKi9dOiBndCxcbiAgICBbXCJsdGVcIiAvKiBMT1dFUl9USEFOX09SX0VRVUFMICovXTogY29tcG9zZShndCwgbm90KSxcbiAgICBbXCJlcXVhbHNcIiAvKiBFUVVBTFMgKi9dOiBlcXVhbHMsXG4gICAgW1wibm90RXF1YWxzXCIgLyogTk9UX0VRVUFMUyAqL106IGNvbXBvc2UoZXF1YWxzLCBub3QpLFxuICAgIFtcImFueU9mXCIgLyogQU5ZX09GICovXTogYW55T2Zcbn07XG5jb25zdCBldmVyeSA9IGZucyA9PiAoLi4uYXJncykgPT4gZm5zLmV2ZXJ5KGZuID0+IGZuKC4uLmFyZ3MpKTtcbmNvbnN0IHByZWRpY2F0ZSA9ICh7IHZhbHVlID0gJycsIG9wZXJhdG9yID0gXCJpbmNsdWRlc1wiIC8qIElOQ0xVREVTICovLCB0eXBlIH0pID0+IHtcbiAgICBjb25zdCB0eXBlSXQgPSB0eXBlRXhwcmVzc2lvbih0eXBlKTtcbiAgICBjb25zdCBvcGVyYXRlT25UeXBlZCA9IGNvbXBvc2UodHlwZUl0LCBvcGVyYXRvcnNbb3BlcmF0b3JdKTtcbiAgICBjb25zdCBwcmVkaWNhdGVGdW5jID0gb3BlcmF0ZU9uVHlwZWQodmFsdWUpO1xuICAgIHJldHVybiBjb21wb3NlKHR5cGVJdCwgcHJlZGljYXRlRnVuYyk7XG59O1xuLy8gQXZvaWQgdXNlbGVzcyBmaWx0ZXIgbG9va3VwIChpbXByb3ZlIHBlcmYpXG5jb25zdCBub3JtYWxpemVDbGF1c2VzID0gKGNvbmYpID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBjb25zdCB2YWxpZFBhdGggPSBPYmplY3Qua2V5cyhjb25mKS5maWx0ZXIocGF0aCA9PiBBcnJheS5pc0FycmF5KGNvbmZbcGF0aF0pKTtcbiAgICB2YWxpZFBhdGguZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRDbGF1c2VzID0gY29uZltwYXRoXS5maWx0ZXIoYyA9PiBjLnZhbHVlICE9PSAnJyk7XG4gICAgICAgIGlmICh2YWxpZENsYXVzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb3V0cHV0W3BhdGhdID0gdmFsaWRDbGF1c2VzO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG5jb25zdCBmaWx0ZXIgPSAoZmlsdGVyKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENsYXVzZXMgPSBub3JtYWxpemVDbGF1c2VzKGZpbHRlcik7XG4gICAgY29uc3QgZnVuY0xpc3QgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkQ2xhdXNlcykubWFwKHBhdGggPT4ge1xuICAgICAgICBjb25zdCBnZXR0ZXIgPSBwb2ludGVyKHBhdGgpLmdldDtcbiAgICAgICAgY29uc3QgY2xhdXNlcyA9IG5vcm1hbGl6ZWRDbGF1c2VzW3BhdGhdLm1hcChwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gY29tcG9zZShnZXR0ZXIsIGV2ZXJ5KGNsYXVzZXMpKTtcbiAgICB9KTtcbiAgICBjb25zdCBmaWx0ZXJQcmVkaWNhdGUgPSBldmVyeShmdW5jTGlzdCk7XG4gICAgcmV0dXJuIGFycmF5ID0+IGFycmF5LmZpbHRlcihmaWx0ZXJQcmVkaWNhdGUpO1xufTtcblxuZXhwb3J0IHsgRmlsdGVyT3BlcmF0b3IsIHByZWRpY2F0ZSwgZmlsdGVyIH07XG4iLCJpbXBvcnQgeyBwb2ludGVyIH0gZnJvbSAnc21hcnQtdGFibGUtanNvbi1wb2ludGVyJztcblxuY29uc3QgYmFzaWMgPSAoaW5wdXQpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBzY29wZSA9IFtdLCBpc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZSB9ID0gaW5wdXQ7XG4gICAgY29uc3Qgc2VhcmNoUG9pbnRlcnMgPSBzY29wZS5tYXAoZmllbGQgPT4gcG9pbnRlcihmaWVsZCkuZ2V0KTtcbiAgICBpZiAoc2NvcGUubGVuZ3RoID09PSAwIHx8ICF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKGFycmF5KSA9PiBhcnJheTtcbiAgICB9XG4gICAgY29uc3QgdGVzdCA9IGlzQ2FzZVNlbnNpdGl2ZSA9PT0gdHJ1ZSA/IFN0cmluZyh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChhcnJheSkgPT4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4gc2VhcmNoUG9pbnRlcnMuc29tZShwID0+IHtcbiAgICAgICAgY29uc3QgdiA9IGlzQ2FzZVNlbnNpdGl2ZSA9PT0gdHJ1ZSA/IFN0cmluZyhwKGl0ZW0pKSA6IFN0cmluZyhwKGl0ZW0pKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gdi5pbmNsdWRlcyh0ZXN0KTtcbiAgICB9KSk7XG59O1xuXG5mdW5jdGlvbiByZShzdHJzLCAuLi5zdWJzdHMpIHtcbiAgICBsZXQgcmVTdHIgPSB0cmFuc2Zvcm1SYXcoc3Rycy5yYXdbMF0pO1xuICAgIGZvciAoY29uc3QgW2ksIHN1YnN0XSBvZiBzdWJzdHMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChzdWJzdCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgcmVTdHIgKz0gc3Vic3Quc291cmNlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdWJzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlU3RyICs9IHF1b3RlVGV4dChzdWJzdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgc3Vic3RpdHV0aW9uOiAnK3N1YnN0KTtcbiAgICAgICAgfVxuICAgICAgICByZVN0ciArPSB0cmFuc2Zvcm1SYXcoc3Rycy5yYXdbaSsxXSk7XG4gICAgfVxuICAgIGxldCBmbGFncyA9ICcnO1xuICAgIGlmIChyZVN0ci5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZVN0ci5sYXN0SW5kZXhPZignLycpO1xuICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWYgdGhlIGByZWAgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgc2xhc2gsIGl0IG11c3QgZW5kIHdpdGggYSBzZWNvbmQgc2xhc2ggYW5kIHplcm8gb3IgbW9yZSBmbGFnczogJytyZVN0cik7XG4gICAgICAgIH1cbiAgICAgICAgZmxhZ3MgPSByZVN0ci5zbGljZShsYXN0U2xhc2hJbmRleCsxKTtcbiAgICAgICAgcmVTdHIgPSByZVN0ci5zbGljZSgxLCBsYXN0U2xhc2hJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVnRXhwKHJlU3RyLCBmbGFncyk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVJhdyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcXFxgL2csICdgJyk7XG59XG5cbi8qKlxuICogQWxsIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCwgYmVjYXVzZSB5b3UgbWF5IHdhbnQgdG8gcXVvdGUgc2V2ZXJhbCBjaGFyYWN0ZXJzIGluc2lkZSBwYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlVGV4dCh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXw9ITw+Oi1dL2csICdcXFxcJCYnKTtcbn1cblxuY29uc3QgcmVnZXhwID0gKGlucHV0KSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgc2NvcGUgPSBbXSwgZXNjYXBlID0gZmFsc2UsIGZsYWdzID0gJycgfSA9IGlucHV0O1xuICAgIGNvbnN0IHNlYXJjaFBvaW50ZXJzID0gc2NvcGUubWFwKGZpZWxkID0+IHBvaW50ZXIoZmllbGQpLmdldCk7XG4gICAgaWYgKHNjb3BlLmxlbmd0aCA9PT0gMCB8fCAhdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChhcnJheSkgPT4gYXJyYXk7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4ID0gZXNjYXBlID09PSB0cnVlID8gcmUgYC8ke3ZhbHVlfS8ke2ZsYWdzfWAgOiBuZXcgUmVnRXhwKHZhbHVlLCBmbGFncyk7XG4gICAgcmV0dXJuIChhcnJheSkgPT4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4gc2VhcmNoUG9pbnRlcnMuc29tZShwID0+IHJlZ2V4LnRlc3QoU3RyaW5nKHAoaXRlbSkpKSkpO1xufTtcblxuZXhwb3J0IHsgYmFzaWMsIHJlZ2V4cCB9O1xuIiwiY29uc3QgZW1pdHRlciA9ICgpID0+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnNMaXN0cyA9IHt9O1xuICAgIGNvbnN0IGluc3RhbmNlID0ge1xuICAgICAgICBvbihldmVudCwgLi4ubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNMaXN0c1tldmVudF0gPSAobGlzdGVuZXJzTGlzdHNbZXZlbnRdIHx8IFtdKS5jb25jYXQobGlzdGVuZXJzKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGF0Y2goZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RlbmVyc0xpc3RzW2V2ZW50XSB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIG9mZihldmVudCwgLi4ubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGxpc3RlbmVyc0xpc3RzKS5mb3JFYWNoKGV2ID0+IGluc3RhbmNlLm9mZihldikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdCA9IGxpc3RlbmVyc0xpc3RzW2V2ZW50XSB8fCBbXTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnNMaXN0c1tldmVudF0gPSBsaXN0ZW5lcnMubGVuZ3RoID8gbGlzdC5maWx0ZXIobGlzdGVuZXIgPT4gIWxpc3RlbmVycy5pbmNsdWRlcyhsaXN0ZW5lcikpIDogW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBpbnN0YW5jZTtcbn07XG5jb25zdCBwcm94eUxpc3RlbmVyID0gKGV2ZW50TWFwKSA9PiAoeyBlbWl0dGVyIH0pID0+IHtcbiAgICBjb25zdCBldmVudExpc3RlbmVycyA9IHt9O1xuICAgIGNvbnN0IHByb3h5ID0ge1xuICAgICAgICBvZmYoZXYpIHtcbiAgICAgICAgICAgIGlmICghZXYpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhldmVudExpc3RlbmVycykuZm9yRWFjaChldmVudE5hbWUgPT4gcHJveHkub2ZmKGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzW2V2XSkge1xuICAgICAgICAgICAgICAgIGVtaXR0ZXIub2ZmKGV2LCAuLi5ldmVudExpc3RlbmVyc1tldl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGV2IG9mIE9iamVjdC5rZXlzKGV2ZW50TWFwKSkge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBldmVudE1hcFtldl07XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzW2V2XSA9IFtdO1xuICAgICAgICBwcm94eVttZXRob2RdID0gZnVuY3Rpb24gKC4uLmxpc3RlbmVycykge1xuICAgICAgICAgICAgZXZlbnRMaXN0ZW5lcnNbZXZdID0gZXZlbnRMaXN0ZW5lcnNbZXZdLmNvbmNhdChsaXN0ZW5lcnMpO1xuICAgICAgICAgICAgZW1pdHRlci5vbihldiwgLi4ubGlzdGVuZXJzKTtcbiAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3h5O1xufTtcblxuZXhwb3J0IHsgZW1pdHRlciwgcHJveHlMaXN0ZW5lciB9O1xuIiwiaW1wb3J0IHsgZGVmYXVsdFNvcnRGYWN0b3J5IH0gZnJvbSAnc21hcnQtdGFibGUtc29ydCc7XG5leHBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnc21hcnQtdGFibGUtc29ydCc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdzbWFydC10YWJsZS1maWx0ZXInO1xuZXhwb3J0IHsgRmlsdGVyT3BlcmF0b3IgfSBmcm9tICdzbWFydC10YWJsZS1maWx0ZXInO1xuaW1wb3J0IHsgcmVnZXhwIH0gZnJvbSAnc21hcnQtdGFibGUtc2VhcmNoJztcbmltcG9ydCB7IGN1cnJ5LCBjb21wb3NlLCB0YXAgfSBmcm9tICdzbWFydC10YWJsZS1vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcG9pbnRlciB9IGZyb20gJ3NtYXJ0LXRhYmxlLWpzb24tcG9pbnRlcic7XG5pbXBvcnQgeyBlbWl0dGVyLCBwcm94eUxpc3RlbmVyIH0gZnJvbSAnc21hcnQtdGFibGUtZXZlbnRzJztcblxuY29uc3Qgc2xpY2VGYWN0b3J5ID0gKHsgcGFnZSA9IDEsIHNpemUgfSA9IHsgcGFnZTogMSB9KSA9PiAoYXJyYXkgPSBbXSkgPT4ge1xuICAgIGNvbnN0IGFjdHVhbFNpemUgPSBzaXplIHx8IGFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCBvZmZzZXQgPSAocGFnZSAtIDEpICogYWN0dWFsU2l6ZTtcbiAgICByZXR1cm4gYXJyYXkuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBhY3R1YWxTaXplKTtcbn07XG5cbnZhciBTbWFydFRhYmxlRXZlbnRzO1xuKGZ1bmN0aW9uIChTbWFydFRhYmxlRXZlbnRzKSB7XG4gICAgU21hcnRUYWJsZUV2ZW50c1tcIlRPR0dMRV9TT1JUXCJdID0gXCJUT0dHTEVfU09SVFwiO1xuICAgIFNtYXJ0VGFibGVFdmVudHNbXCJESVNQTEFZX0NIQU5HRURcIl0gPSBcIkRJU1BMQVlfQ0hBTkdFRFwiO1xuICAgIFNtYXJ0VGFibGVFdmVudHNbXCJQQUdFX0NIQU5HRURcIl0gPSBcIkNIQU5HRV9QQUdFXCI7XG4gICAgU21hcnRUYWJsZUV2ZW50c1tcIkVYRUNfQ0hBTkdFRFwiXSA9IFwiRVhFQ19DSEFOR0VEXCI7XG4gICAgU21hcnRUYWJsZUV2ZW50c1tcIkZJTFRFUl9DSEFOR0VEXCJdID0gXCJGSUxURVJfQ0hBTkdFRFwiO1xuICAgIFNtYXJ0VGFibGVFdmVudHNbXCJTVU1NQVJZX0NIQU5HRURcIl0gPSBcIlNVTU1BUllfQ0hBTkdFRFwiO1xuICAgIFNtYXJ0VGFibGVFdmVudHNbXCJTRUFSQ0hfQ0hBTkdFRFwiXSA9IFwiU0VBUkNIX0NIQU5HRURcIjtcbiAgICBTbWFydFRhYmxlRXZlbnRzW1wiRVhFQ19FUlJPUlwiXSA9IFwiRVhFQ19FUlJPUlwiO1xufSkoU21hcnRUYWJsZUV2ZW50cyB8fCAoU21hcnRUYWJsZUV2ZW50cyA9IHt9KSk7XG5jb25zdCBjdXJyaWVkUG9pbnRlciA9IChwYXRoKSA9PiB7XG4gICAgY29uc3QgeyBnZXQsIHNldCB9ID0gcG9pbnRlcihwYXRoKTtcbiAgICByZXR1cm4geyBnZXQsIHNldDogY3Vycnkoc2V0KSB9O1xufTtcbmNvbnN0IHRhYmxlRGlyZWN0aXZlID0gKHsgc29ydEZhY3RvcnksIHRhYmxlU3RhdGUsIGRhdGEsIGZpbHRlckZhY3RvcnksIHNlYXJjaEZhY3RvcnkgfSkgPT4ge1xuICAgIGxldCBmaWx0ZXJlZENvdW50ID0gZGF0YS5sZW5ndGg7XG4gICAgbGV0IG1hdGNoaW5nSXRlbXMgPSBkYXRhO1xuICAgIGNvbnN0IHRhYmxlID0gZW1pdHRlcigpO1xuICAgIGNvbnN0IHNvcnRQb2ludGVyID0gY3VycmllZFBvaW50ZXIoJ3NvcnQnKTtcbiAgICBjb25zdCBzbGljZVBvaW50ZXIgPSBjdXJyaWVkUG9pbnRlcignc2xpY2UnKTtcbiAgICBjb25zdCBmaWx0ZXJQb2ludGVyID0gY3VycmllZFBvaW50ZXIoJ2ZpbHRlcicpO1xuICAgIGNvbnN0IHNlYXJjaFBvaW50ZXIgPSBjdXJyaWVkUG9pbnRlcignc2VhcmNoJyk7XG4gICAgLy8gV2UgbmVlZCB0byByZWdpc3RlciBpbiBjYXNlIHRoZSBzdW1tYXJ5IGNvbWVzIGZyb20gb3V0c2lkZSAobGlrZSBzZXJ2ZXIgZGF0YSlcbiAgICB0YWJsZS5vbihcIlNVTU1BUllfQ0hBTkdFRFwiIC8qIFNVTU1BUllfQ0hBTkdFRCAqLywgKHsgZmlsdGVyZWRDb3VudDogY291bnQgfSkgPT4ge1xuICAgICAgICBmaWx0ZXJlZENvdW50ID0gY291bnQ7XG4gICAgfSk7XG4gICAgY29uc3Qgc2FmZUFzc2lnbiA9IGN1cnJ5KChiYXNlLCBleHRlbnNpb24pID0+IE9iamVjdC5hc3NpZ24oe30sIGJhc2UsIGV4dGVuc2lvbikpO1xuICAgIGNvbnN0IGRpc3BhdGNoID0gY3VycnkodGFibGUuZGlzcGF0Y2gsIDIpO1xuICAgIGNvbnN0IGRpc3BhdGNoU3VtbWFyeSA9IChmaWx0ZXJlZCkgPT4ge1xuICAgICAgICBtYXRjaGluZ0l0ZW1zID0gZmlsdGVyZWQ7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaChcIlNVTU1BUllfQ0hBTkdFRFwiIC8qIFNVTU1BUllfQ0hBTkdFRCAqLywge1xuICAgICAgICAgICAgcGFnZTogdGFibGVTdGF0ZS5zbGljZS5wYWdlLFxuICAgICAgICAgICAgc2l6ZTogdGFibGVTdGF0ZS5zbGljZS5zaXplLFxuICAgICAgICAgICAgZmlsdGVyZWRDb3VudDogZmlsdGVyZWQubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgZXhlYyA9ICh7IHByb2Nlc3NpbmdEZWxheSA9IDIwIH0gPSB7IHByb2Nlc3NpbmdEZWxheTogMjAgfSkgPT4ge1xuICAgICAgICB0YWJsZS5kaXNwYXRjaChcIkVYRUNfQ0hBTkdFRFwiIC8qIEVYRUNfQ0hBTkdFRCAqLywgeyB3b3JraW5nOiB0cnVlIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyRnVuYyA9IGZpbHRlckZhY3RvcnkoZmlsdGVyUG9pbnRlci5nZXQodGFibGVTdGF0ZSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaEZ1bmMgPSBzZWFyY2hGYWN0b3J5KHNlYXJjaFBvaW50ZXIuZ2V0KHRhYmxlU3RhdGUpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0RnVuYyA9IHNvcnRGYWN0b3J5KHNvcnRQb2ludGVyLmdldCh0YWJsZVN0YXRlKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VGdW5jID0gc2xpY2VGYWN0b3J5KHNsaWNlUG9pbnRlci5nZXQodGFibGVTdGF0ZSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWNGdW5jID0gY29tcG9zZShmaWx0ZXJGdW5jLCBzZWFyY2hGdW5jLCB0YXAoZGlzcGF0Y2hTdW1tYXJ5KSwgc29ydEZ1bmMsIHNsaWNlRnVuYyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheWVkID0gZXhlY0Z1bmMoZGF0YSk7XG4gICAgICAgICAgICAgICAgdGFibGUuZGlzcGF0Y2goXCJESVNQTEFZX0NIQU5HRURcIiAvKiBESVNQTEFZX0NIQU5HRUQgKi8sIGRpc3BsYXllZC5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogZGF0YS5pbmRleE9mKGQpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZFxuICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGFibGUuZGlzcGF0Y2goXCJFWEVDX0VSUk9SXCIgLyogRVhFQ19FUlJPUiAqLywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRhYmxlLmRpc3BhdGNoKFwiRVhFQ19DSEFOR0VEXCIgLyogRVhFQ19DSEFOR0VEICovLCB7IHdvcmtpbmc6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBwcm9jZXNzaW5nRGVsYXkpO1xuICAgIH07XG4gICAgY29uc3QgdXBkYXRlVGFibGVTdGF0ZSA9IGN1cnJ5KChwdGVyLCBldiwgbmV3UGFydGlhbFN0YXRlKSA9PiBjb21wb3NlKHNhZmVBc3NpZ24ocHRlci5nZXQodGFibGVTdGF0ZSkpLCB0YXAoZGlzcGF0Y2goZXYpKSwgcHRlci5zZXQodGFibGVTdGF0ZSkpKG5ld1BhcnRpYWxTdGF0ZSkpO1xuICAgIGNvbnN0IHJlc2V0VG9GaXJzdFBhZ2UgPSAoKSA9PiB1cGRhdGVUYWJsZVN0YXRlKHNsaWNlUG9pbnRlciwgXCJDSEFOR0VfUEFHRVwiIC8qIFBBR0VfQ0hBTkdFRCAqLywgeyBwYWdlOiAxIH0pO1xuICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uID0gKHB0ZXIsIGV2KSA9PiBjb21wb3NlKHVwZGF0ZVRhYmxlU3RhdGUocHRlciwgZXYpLCByZXNldFRvRmlyc3RQYWdlLCAoKSA9PiB0YWJsZS5leGVjKCkgLy8gV2Ugd3JhcCB3aXRoaW4gYSBmdW5jdGlvbiBzbyB0YWJsZS5leGVjIGNhbiBiZSBvdmVyd3JpdHRlbiAod2hlbiB1c2luZyB3aXRoIGEgc2VydmVyIGZvciBleGFtcGxlKVxuICAgICk7XG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgICBzb3J0OiB0YWJsZU9wZXJhdGlvbihzb3J0UG9pbnRlciwgXCJUT0dHTEVfU09SVFwiIC8qIFRPR0dMRV9TT1JUICovKSxcbiAgICAgICAgZmlsdGVyOiB0YWJsZU9wZXJhdGlvbihmaWx0ZXJQb2ludGVyLCBcIkZJTFRFUl9DSEFOR0VEXCIgLyogRklMVEVSX0NIQU5HRUQgKi8pLFxuICAgICAgICBzZWFyY2g6IHRhYmxlT3BlcmF0aW9uKHNlYXJjaFBvaW50ZXIsIFwiU0VBUkNIX0NIQU5HRURcIiAvKiBTRUFSQ0hfQ0hBTkdFRCAqLyksXG4gICAgICAgIHNsaWNlOiBjb21wb3NlKHVwZGF0ZVRhYmxlU3RhdGUoc2xpY2VQb2ludGVyLCBcIkNIQU5HRV9QQUdFXCIgLyogUEFHRV9DSEFOR0VEICovKSwgKCkgPT4gdGFibGUuZXhlYygpKSxcbiAgICAgICAgZXhlYyxcbiAgICAgICAgYXN5bmMgZXZhbChzdGF0ZSA9IHRhYmxlU3RhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRGdW5jID0gc29ydEZhY3Rvcnkoc29ydFBvaW50ZXIuZ2V0KHN0YXRlKSk7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hGdW5jID0gc2VhcmNoRmFjdG9yeShzZWFyY2hQb2ludGVyLmdldChzdGF0ZSkpO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRnVuYyA9IGZpbHRlckZhY3RvcnkoZmlsdGVyUG9pbnRlci5nZXQoc3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHNsaWNlRnVuYyA9IHNsaWNlRmFjdG9yeShzbGljZVBvaW50ZXIuZ2V0KHN0YXRlKSk7XG4gICAgICAgICAgICBjb25zdCBleGVjRnVuYyA9IGNvbXBvc2UoZmlsdGVyRnVuYywgc2VhcmNoRnVuYywgc29ydEZ1bmMsIHNsaWNlRnVuYyk7XG4gICAgICAgICAgICByZXR1cm4gZXhlY0Z1bmMoZGF0YSkubWFwKGQgPT4gKHsgaW5kZXg6IGRhdGEuaW5kZXhPZihkKSwgdmFsdWU6IGQgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBvbkRpc3BsYXlDaGFuZ2UoZm4pIHtcbiAgICAgICAgICAgIHRhYmxlLm9uKFwiRElTUExBWV9DSEFOR0VEXCIgLyogRElTUExBWV9DSEFOR0VEICovLCBmbik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFRhYmxlU3RhdGUoKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGFibGVTdGF0ZS5zb3J0KTtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaCA9IE9iamVjdC5hc3NpZ24oe30sIHRhYmxlU3RhdGUuc2VhcmNoKTtcbiAgICAgICAgICAgIGNvbnN0IHNsaWNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGFibGVTdGF0ZS5zbGljZSk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YWJsZVN0YXRlLmZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJbcHJvcF0gPSB0YWJsZVN0YXRlLmZpbHRlcltwcm9wXS5tYXAodiA9PiBPYmplY3QuYXNzaWduKHt9LCB2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzb3J0LCBzZWFyY2gsIHNsaWNlLCBmaWx0ZXIgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TWF0Y2hpbmdJdGVtcygpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4ubWF0Y2hpbmdJdGVtc107XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gT2JqZWN0LmFzc2lnbih0YWJsZSwgYXBpKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbnN0YW5jZSwge1xuICAgICAgICBmaWx0ZXJlZENvdW50OiB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkQ291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxlbmd0aDoge1xuICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbn07XG5cbmNvbnN0IGZpbHRlckxpc3RlbmVyID0gcHJveHlMaXN0ZW5lcih7IFtcIkZJTFRFUl9DSEFOR0VEXCIgLyogRklMVEVSX0NIQU5HRUQgKi9dOiAnb25GaWx0ZXJDaGFuZ2UnIH0pO1xuLy8gdG9kbyBleHBvc2UgYW5kIHJlLWV4cG9ydCBmcm9tIHNtYXJ0LXRhYmxlLWZpbHRlclxudmFyIEZpbHRlclR5cGU7XG4oZnVuY3Rpb24gKEZpbHRlclR5cGUpIHtcbiAgICBGaWx0ZXJUeXBlW1wiQk9PTEVBTlwiXSA9IFwiYm9vbGVhblwiO1xuICAgIEZpbHRlclR5cGVbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIEZpbHRlclR5cGVbXCJEQVRFXCJdID0gXCJkYXRlXCI7XG4gICAgRmlsdGVyVHlwZVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG59KShGaWx0ZXJUeXBlIHx8IChGaWx0ZXJUeXBlID0ge30pKTtcbmNvbnN0IGZpbHRlckRpcmVjdGl2ZSA9ICh7IHRhYmxlLCBwb2ludGVyLCBvcGVyYXRvciA9IFwiaW5jbHVkZXNcIiAvKiBJTkNMVURFUyAqLywgdHlwZSA9IFwic3RyaW5nXCIgLyogU1RSSU5HICovIH0pID0+IHtcbiAgICBjb25zdCBwcm94eSA9IGZpbHRlckxpc3RlbmVyKHsgZW1pdHRlcjogdGFibGUgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBmaWx0ZXIoaW5wdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckNvbmYgPSB7XG4gICAgICAgICAgICAgICAgW3BvaW50ZXJdOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZS5maWx0ZXIoZmlsdGVyQ29uZik7XG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldFRhYmxlU3RhdGUoKS5maWx0ZXI7XG4gICAgICAgIH1cbiAgICB9LCBwcm94eSk7XG59O1xuXG5jb25zdCBzZWFyY2hMaXN0ZW5lciA9IHByb3h5TGlzdGVuZXIoeyBbXCJTRUFSQ0hfQ0hBTkdFRFwiIC8qIFNFQVJDSF9DSEFOR0VEICovXTogJ29uU2VhcmNoQ2hhbmdlJyB9KTtcbmNvbnN0IHNlYXJjaERpcmVjdGl2ZSA9ICh7IHRhYmxlLCBzY29wZSA9IFtdIH0pID0+IHtcbiAgICBjb25zdCBwcm94eSA9IHNlYXJjaExpc3RlbmVyKHsgZW1pdHRlcjogdGFibGUgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJveHksIHtcbiAgICAgICAgc2VhcmNoKGlucHV0LCBvcHRzID0ge30pIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZS5zZWFyY2goT2JqZWN0LmFzc2lnbih7fSwgeyB2YWx1ZTogaW5wdXQsIHNjb3BlIH0sIG9wdHMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0VGFibGVTdGF0ZSgpLnNlYXJjaDtcbiAgICAgICAgfVxuICAgIH0sIHByb3h5KTtcbn07XG5cbmNvbnN0IHNsaWNlTGlzdGVuZXIgPSBwcm94eUxpc3RlbmVyKHtcbiAgICBbXCJDSEFOR0VfUEFHRVwiIC8qIFBBR0VfQ0hBTkdFRCAqL106ICdvblBhZ2VDaGFuZ2UnLFxuICAgIFtcIlNVTU1BUllfQ0hBTkdFRFwiIC8qIFNVTU1BUllfQ0hBTkdFRCAqL106ICdvblN1bW1hcnlDaGFuZ2UnXG59KTtcbmNvbnN0IHBhZ2luYXRpb25EaXJlY3RpdmUgPSAoeyB0YWJsZSB9KSA9PiB7XG4gICAgbGV0IHsgc2xpY2U6IHsgcGFnZTogY3VycmVudFBhZ2UsIHNpemU6IGN1cnJlbnRTaXplIH0gfSA9IHRhYmxlLmdldFRhYmxlU3RhdGUoKTtcbiAgICBsZXQgaXRlbUxpc3RMZW5ndGggPSB0YWJsZS5maWx0ZXJlZENvdW50O1xuICAgIGNvbnN0IHByb3h5ID0gc2xpY2VMaXN0ZW5lcih7IGVtaXR0ZXI6IHRhYmxlIH0pO1xuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgICAgc2VsZWN0UGFnZShwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFibGUuc2xpY2UoeyBwYWdlOiBwLCBzaXplOiBjdXJyZW50U2l6ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0TmV4dFBhZ2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBpLnNlbGVjdFBhZ2UoY3VycmVudFBhZ2UgKyAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0UHJldmlvdXNQYWdlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGFwaS5zZWxlY3RQYWdlKGN1cnJlbnRQYWdlIC0gMSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5nZVBhZ2VTaXplKHNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZS5zbGljZSh7IHBhZ2U6IDEsIHNpemUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGlzUHJldmlvdXNQYWdlRW5hYmxlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZSA+IDE7XG4gICAgICAgIH0sXG4gICAgICAgIGlzTmV4dFBhZ2VFbmFibGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChpdGVtTGlzdExlbmd0aCAvIGN1cnJlbnRTaXplKSA+IGN1cnJlbnRQYWdlO1xuICAgICAgICB9LFxuICAgICAgICBzdGF0ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhYmxlLmdldFRhYmxlU3RhdGUoKS5zbGljZSwgeyBmaWx0ZXJlZENvdW50OiBpdGVtTGlzdExlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZGlyZWN0aXZlID0gT2JqZWN0LmFzc2lnbihhcGksIHByb3h5KTtcbiAgICBkaXJlY3RpdmUub25TdW1tYXJ5Q2hhbmdlKCh7IHBhZ2U6IHAsIHNpemU6IHMsIGZpbHRlcmVkQ291bnQgfSkgPT4ge1xuICAgICAgICBjdXJyZW50UGFnZSA9IHA7XG4gICAgICAgIGN1cnJlbnRTaXplID0gcztcbiAgICAgICAgaXRlbUxpc3RMZW5ndGggPSBmaWx0ZXJlZENvdW50O1xuICAgIH0pO1xuICAgIHJldHVybiBkaXJlY3RpdmU7XG59O1xuXG5jb25zdCBkZWJvdW5jZSA9IChmbiwgdGltZSkgPT4ge1xuICAgIGxldCB0aW1lciA9IG51bGw7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmICh0aW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gZm4oLi4uYXJncyksIHRpbWUpO1xuICAgIH07XG59O1xuY29uc3Qgc29ydExpc3RlbmVycyA9IHByb3h5TGlzdGVuZXIoeyBbXCJUT0dHTEVfU09SVFwiIC8qIFRPR0dMRV9TT1JUICovXTogJ29uU29ydFRvZ2dsZScgfSk7XG5jb25zdCBkaXJlY3Rpb25zID0gW1wiYXNjXCIgLyogQVNDICovLCBcImRlc2NcIiAvKiBERVNDICovXTtcbmNvbnN0IHNvcnREaXJlY3RpdmUgPSAoeyBwb2ludGVyLCB0YWJsZSwgY3ljbGUgPSBmYWxzZSwgZGVib3VuY2VUaW1lID0gMCB9KSA9PiB7XG4gICAgY29uc3QgY3ljbGVEaXJlY3Rpb25zID0gY3ljbGUgPT09IHRydWUgPyBbXCJub25lXCIgLyogTk9ORSAqL10uY29uY2F0KGRpcmVjdGlvbnMpIDogWy4uLmRpcmVjdGlvbnNdLnJldmVyc2UoKTtcbiAgICBjb25zdCBjb21taXQgPSBkZWJvdW5jZSh0YWJsZS5zb3J0LCBkZWJvdW5jZVRpbWUpO1xuICAgIGxldCBoaXQgPSAwO1xuICAgIGNvbnN0IHByb3h5ID0gc29ydExpc3RlbmVycyh7IGVtaXR0ZXI6IHRhYmxlIH0pO1xuICAgIGNvbnN0IGRpcmVjdGl2ZSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICB0b2dnbGUoKSB7XG4gICAgICAgICAgICBoaXQrKztcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGN5Y2xlRGlyZWN0aW9uc1toaXQgJSBjeWNsZURpcmVjdGlvbnMubGVuZ3RoXTtcbiAgICAgICAgICAgIHJldHVybiBjb21taXQoeyBwb2ludGVyLCBkaXJlY3Rpb24gfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldFRhYmxlU3RhdGUoKS5zb3J0O1xuICAgICAgICB9XG4gICAgfSwgcHJveHkpO1xuICAgIGRpcmVjdGl2ZS5vblNvcnRUb2dnbGUoKHsgcG9pbnRlcjogcCB9KSA9PiB7XG4gICAgICAgIGhpdCA9IHBvaW50ZXIgIT09IHAgPyAwIDogaGl0O1xuICAgIH0pO1xuICAgIGNvbnN0IHsgcG9pbnRlcjogc3RhdGVQb2ludGVyLCBkaXJlY3Rpb24gPSBcImFzY1wiIC8qIEFTQyAqLyB9ID0gZGlyZWN0aXZlLnN0YXRlKCk7XG4gICAgaGl0ID0gc3RhdGVQb2ludGVyID09PSBwb2ludGVyID8gKGRpcmVjdGlvbiA9PT0gXCJhc2NcIiAvKiBBU0MgKi8gPyAxIDogMikgOiAwO1xuICAgIHJldHVybiBkaXJlY3RpdmU7XG59O1xuXG5jb25zdCBzdW1tYXJ5TGlzdGVuZXIgPSBwcm94eUxpc3RlbmVyKHsgW1wiU1VNTUFSWV9DSEFOR0VEXCIgLyogU1VNTUFSWV9DSEFOR0VEICovXTogJ29uU3VtbWFyeUNoYW5nZScgfSk7XG5jb25zdCBzdW1tYXJ5RGlyZWN0aXZlID0gKHsgdGFibGUgfSkgPT4gc3VtbWFyeUxpc3RlbmVyKHsgZW1pdHRlcjogdGFibGUgfSk7XG5cbmNvbnN0IGV4ZWN1dGlvbkxpc3RlbmVyID0gcHJveHlMaXN0ZW5lcih7IFtcIkVYRUNfQ0hBTkdFRFwiIC8qIEVYRUNfQ0hBTkdFRCAqL106ICdvbkV4ZWN1dGlvbkNoYW5nZScgfSk7XG5jb25zdCB3b3JraW5nSW5kaWNhdG9yRGlyZWN0aXZlID0gKHsgdGFibGUgfSkgPT4gZXhlY3V0aW9uTGlzdGVuZXIoeyBlbWl0dGVyOiB0YWJsZSB9KTtcblxuY29uc3QgZGVmYXVsdFRhYmxlU3RhdGUgPSAoKSA9PiAoeyBzb3J0OiB7fSwgc2xpY2U6IHsgcGFnZTogMSB9LCBmaWx0ZXI6IHt9LCBzZWFyY2g6IHt9IH0pO1xuY29uc3Qgc21hcnRUYWJsZSA9ICh7IHNvcnRGYWN0b3J5ID0gZGVmYXVsdFNvcnRGYWN0b3J5LCBmaWx0ZXJGYWN0b3J5ID0gZmlsdGVyLCBzZWFyY2hGYWN0b3J5ID0gcmVnZXhwLCB0YWJsZVN0YXRlID0gZGVmYXVsdFRhYmxlU3RhdGUoKSwgZGF0YSA9IFtdIH0gPSB7XG4gICAgc29ydEZhY3Rvcnk6IGRlZmF1bHRTb3J0RmFjdG9yeSxcbiAgICBmaWx0ZXJGYWN0b3J5OiBmaWx0ZXIsXG4gICAgc2VhcmNoRmFjdG9yeTogcmVnZXhwLFxuICAgIHRhYmxlU3RhdGU6IGRlZmF1bHRUYWJsZVN0YXRlKCksXG4gICAgZGF0YTogW11cbn0sIC4uLnRhYmxlRXh0ZW5zaW9ucykgPT4ge1xuICAgIGNvbnN0IGNvcmVUYWJsZSA9IHRhYmxlRGlyZWN0aXZlKHsgc29ydEZhY3RvcnksIGZpbHRlckZhY3RvcnksIHRhYmxlU3RhdGUsIGRhdGEsIHNlYXJjaEZhY3RvcnkgfSk7XG4gICAgcmV0dXJuIHRhYmxlRXh0ZW5zaW9ucy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBuZXdkaXIpID0+IE9iamVjdC5hc3NpZ24oYWNjdW11bGF0b3IsIG5ld2Rpcih7XG4gICAgICAgIHNvcnRGYWN0b3J5LFxuICAgICAgICBmaWx0ZXJGYWN0b3J5LFxuICAgICAgICBzZWFyY2hGYWN0b3J5LFxuICAgICAgICB0YWJsZVN0YXRlLFxuICAgICAgICBkYXRhLFxuICAgICAgICB0YWJsZTogY29yZVRhYmxlXG4gICAgfSkpLCBjb3JlVGFibGUpO1xufTtcblxuZXhwb3J0IHsgRmlsdGVyVHlwZSwgU21hcnRUYWJsZUV2ZW50cywgZmlsdGVyRGlyZWN0aXZlLCBwYWdpbmF0aW9uRGlyZWN0aXZlLCBzZWFyY2hEaXJlY3RpdmUsIHNsaWNlRmFjdG9yeSwgc21hcnRUYWJsZSwgc29ydERpcmVjdGl2ZSwgc3VtbWFyeURpcmVjdGl2ZSwgdGFibGVEaXJlY3RpdmUsIHdvcmtpbmdJbmRpY2F0b3JEaXJlY3RpdmUgfTtcbiIsImltcG9ydCB7d29ya2luZ0luZGljYXRvckRpcmVjdGl2ZX0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5cbmV4cG9ydCBjb25zdCBsb2FkaW5nSW5kaWNhdG9yID0gKHt0YWJsZSwgZWx9KSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gd29ya2luZ0luZGljYXRvckRpcmVjdGl2ZSh7dGFibGV9KTtcbiAgICBjb21wb25lbnQub25FeGVjdXRpb25DaGFuZ2UoZnVuY3Rpb24gKHt3b3JraW5nfSkge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzdC13b3JraW5nJyk7XG4gICAgICAgIGlmICh3b3JraW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdzdC13b3JraW5nJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tcG9uZW50O1xufTtcbiIsImltcG9ydCB7c29ydERpcmVjdGl2ZX0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5cbmV4cG9ydCBjb25zdCBzb3J0ID0gKHtlbCwgdGFibGUsIGNvbmYgPSB7fX0pID0+IHtcbiAgICBjb25zdCBwb2ludGVyID0gY29uZi5wb2ludGVyIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1zb3J0Jyk7XG4gICAgY29uc3QgY3ljbGUgPSBjb25mLmN5Y2xlIHx8IGVsLmhhc0F0dHJpYnV0ZSgnZGF0YS1zdC1zb3J0LWN5Y2xlJyk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gc29ydERpcmVjdGl2ZSh7cG9pbnRlciwgdGFibGUsIGN5Y2xlfSk7XG4gICAgY29tcG9uZW50Lm9uU29ydFRvZ2dsZSgoe3BvaW50ZXI6IGN1cnJlbnRQb2ludGVyLCBkaXJlY3Rpb259KSA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3N0LXNvcnQtYXNjJywgJ3N0LXNvcnQtZGVzYycpO1xuICAgICAgICBpZiAocG9pbnRlciA9PT0gY3VycmVudFBvaW50ZXIgJiYgZGlyZWN0aW9uICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnc3Qtc29ydC1hc2MnIDogJ3N0LXNvcnQtZGVzYyc7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBldmVudExpc3RlbmVyID0gKCkgPT4gY29tcG9uZW50LnRvZ2dsZSgpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnRMaXN0ZW5lcik7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVib3VuY2UoZm4sIGRlbGF5KSB7XG4gICAgbGV0IHRpbWVvdXRJZDtcbiAgICByZXR1cm4gKGV2KSA9PiB7XG4gICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB9XG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZm4oZXYpO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7ZmlsdGVyRGlyZWN0aXZlfSBmcm9tICdzbWFydC10YWJsZS1jb3JlJztcbmltcG9ydCB7ZGVib3VuY2V9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXIgPSAoe3RhYmxlLCBlbCwgZGVsYXkgPSA0MDAsIGNvbmYgPSB7fX0pID0+IHtcbiAgICBjb25zdCBwb2ludGVyID0gY29uZi5wb2ludGVyIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1maWx0ZXInKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IGNvbmYub3BlcmF0b3IgfHwgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXN0LWZpbHRlci1vcGVyYXRvcicpIHx8ICdpbmNsdWRlcyc7XG4gICAgY29uc3QgZWxUeXBlID0gZWwuaGFzQXR0cmlidXRlKCd0eXBlJykgPyBlbC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA6ICdzdHJpbmcnO1xuICAgIGxldCB0eXBlID0gY29uZi50eXBlIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1maWx0ZXItdHlwZScpO1xuICAgIGlmICghdHlwZSkge1xuICAgICAgICB0eXBlID0gWydkYXRlJywgJ251bWJlciddLmluY2x1ZGVzKGVsVHlwZSkgPyBlbFR5cGUgOiAnc3RyaW5nJztcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50ID0gZmlsdGVyRGlyZWN0aXZlKHt0YWJsZSwgcG9pbnRlciwgdHlwZSwgb3BlcmF0b3J9KTtcbiAgICBjb25zdCBldmVudExpc3RlbmVyID0gZGVib3VuY2UoZXYgPT4gY29tcG9uZW50LmZpbHRlcihlbC52YWx1ZSksIGRlbGF5KTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGV2ZW50TGlzdGVuZXIpO1xuICAgIGlmIChlbC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudExpc3RlbmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn07XG4iLCJpbXBvcnQge3NlYXJjaERpcmVjdGl2ZX0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3Qgc2VhcmNoID0gKHtlbCwgdGFibGUsIGRlbGF5ID0gNDAwLCBjb25mID0ge319KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBjb25mLnNjb3BlIHx8IChlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3Qtc2VhcmNoJykgfHwgJycpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgY29uc3QgZmxhZ3MgPSBjb25mLmZsYWdzIHx8IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zdC1zZWFyY2gtZmxhZ3MnKSB8fCAnJztcbiAgICBjb25zdCBjb21wb25lbnQgPSBzZWFyY2hEaXJlY3RpdmUoe3RhYmxlLCBzY29wZX0pO1xuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZWFyY2goZWwudmFsdWUsIHtmbGFnc30pO1xuICAgIH0sIGRlbGF5KTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGV2ZW50TGlzdGVuZXIpO1xufTtcbiIsImltcG9ydCB7bG9hZGluZ0luZGljYXRvciBhcyBsb2FkaW5nfSBmcm9tICcuL2xvYWRpbmdJbmRpY2F0b3InO1xuaW1wb3J0IHtzb3J0fSBmcm9tICcuL3NvcnQnO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJy4vZmlsdGVycyc7XG5pbXBvcnQge3NlYXJjaCBhcyBzZWFyY2hJbnB1dH0gZnJvbSAnLi9zZWFyY2gnO1xuXG5leHBvcnQgY29uc3QgdGFibGUgPSAoe2VsLCB0YWJsZX0pID0+IHtcbiAgICBjb25zdCBib290RGlyZWN0aXZlID0gKGZhY3RvcnksIHNlbGVjdG9yKSA9PiBBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5mb3JFYWNoKGVsID0+IGZhY3Rvcnkoe1xuICAgICAgICBlbCxcbiAgICAgICAgdGFibGVcbiAgICB9KSk7XG4gICAgLy8gYm9vdFxuICAgIGJvb3REaXJlY3RpdmUoc29ydCwgJ1tkYXRhLXN0LXNvcnRdJyk7XG4gICAgYm9vdERpcmVjdGl2ZShsb2FkaW5nLCAnW2RhdGEtc3QtbG9hZGluZy1pbmRpY2F0b3JdJyk7XG4gICAgYm9vdERpcmVjdGl2ZShzZWFyY2hJbnB1dCwgJ1tkYXRhLXN0LXNlYXJjaF0nKTtcbiAgICBib290RGlyZWN0aXZlKGZpbHRlciwgJ1tkYXRhLXN0LWZpbHRlcl0nKTtcblxuICAgIHJldHVybiB0YWJsZTtcbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoe25hbWU6e2ZpcnN0OmZpcnN0TmFtZSwgbGFzdDpsYXN0TmFtZX0sIGdlbmRlciwgYmlydGhEYXRlLCBzaXplfSkge1xuICBjb25zdCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gIHRyLmlubmVySFRNTCA9IGA8dGQ+JHtsYXN0TmFtZX08L3RkPjx0ZD4ke2ZpcnN0TmFtZX08L3RkPjx0ZD4ke2dlbmRlcn08L3RkPjx0ZD4ke2JpcnRoRGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX08L3RkPjx0ZD4ke3NpemV9PC90ZD5gO1xuICByZXR1cm4gdHI7XG59IiwiaW1wb3J0IHtzdW1tYXJ5RGlyZWN0aXZlfSAgZnJvbSAnc21hcnQtdGFibGUtY29yZSdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3VtbWFyeUNvbXBvbmVudCAoe3RhYmxlLCBlbH0pIHtcbiAgY29uc3QgZGlyID0gc3VtbWFyeURpcmVjdGl2ZSh7dGFibGV9KTtcbiAgZGlyLm9uU3VtbWFyeUNoYW5nZSgoe3BhZ2UsIHNpemUsIGZpbHRlcmVkQ291bnR9KSA9PiB7XG4gICAgZWwuaW5uZXJIVE1MID0gYHNob3dpbmcgaXRlbXMgPHN0cm9uZz4keyhwYWdlIC0gMSkgKiBzaXplICsgKGZpbHRlcmVkQ291bnQgPiAwID8gMSA6IDApfTwvc3Ryb25nPiAtIDxzdHJvbmc+JHtNYXRoLm1pbihmaWx0ZXJlZENvdW50LCBwYWdlICogc2l6ZSl9PC9zdHJvbmc+IG9mIDxzdHJvbmc+JHtmaWx0ZXJlZENvdW50fTwvc3Ryb25nPiBtYXRjaGluZyBpdGVtc2A7XG4gIH0pO1xuICByZXR1cm4gZGlyO1xufSIsImltcG9ydCB7cGFnaW5hdGlvbkRpcmVjdGl2ZX0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhZ2luYXRpb25Db21wb25lbnQgKHt0YWJsZSwgZWx9KSB7XG4gIGNvbnN0IHByZXZpb3VzQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIHByZXZpb3VzQnV0dG9uLmlubmVySFRNTCA9ICdQcmV2aW91cyc7XG4gIGNvbnN0IG5leHRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgbmV4dEJ1dHRvbi5pbm5lckhUTUwgPSAnTmV4dCc7XG4gIGNvbnN0IHBhZ2VTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBwYWdlU3Bhbi5pbm5lckhUTUwgPSAnLSBwYWdlIDEgLSc7XG4gIGNvbnN0IGNvbXAgPSBwYWdpbmF0aW9uRGlyZWN0aXZlKHt0YWJsZX0pO1xuXG4gIGNvbXAub25TdW1tYXJ5Q2hhbmdlKCh7cGFnZX0pID0+IHtcbiAgICBwcmV2aW91c0J1dHRvbi5kaXNhYmxlZCA9ICFjb21wLmlzUHJldmlvdXNQYWdlRW5hYmxlZCgpO1xuICAgIG5leHRCdXR0b24uZGlzYWJsZWQgPSAhY29tcC5pc05leHRQYWdlRW5hYmxlZCgpO1xuICAgIHBhZ2VTcGFuLmlubmVySFRNTCA9IGAtICR7cGFnZX0gLWA7XG4gIH0pO1xuXG4gIHByZXZpb3VzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29tcC5zZWxlY3RQcmV2aW91c1BhZ2UoKSk7XG4gIG5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb21wLnNlbGVjdE5leHRQYWdlKCkpO1xuXG4gIGVsLmFwcGVuZENoaWxkKHByZXZpb3VzQnV0dG9uKTtcbiAgZWwuYXBwZW5kQ2hpbGQocGFnZVNwYW4pO1xuICBlbC5hcHBlbmRDaGlsZChuZXh0QnV0dG9uKTtcblxuICByZXR1cm4gY29tcDtcbn0iLCJpbXBvcnQge2RlYm91bmNlfSBmcm9tICdzbWFydC10YWJsZS12YW5pbGxhJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ1NpemVJbnB1dCAoe21pbkVsLCBtYXhFbCwgdGFibGV9KSB7XG5cbiAgbGV0IGx0VmFsdWU7XG4gIGxldCBndFZhbHVlO1xuXG4gIGNvbnN0IGNvbW1pdCA9ICgpID0+IHtcbiAgICBjb25zdCBjbGF1c2VzID0gW107XG4gICAgaWYgKGx0VmFsdWUpIHtcbiAgICAgIGNsYXVzZXMucHVzaCh7dmFsdWU6IGx0VmFsdWUsIG9wZXJhdG9yOiAnbHRlJywgdHlwZTogJ251bWJlcid9KTtcbiAgICB9XG4gICAgaWYgKGd0VmFsdWUpIHtcbiAgICAgIGNsYXVzZXMucHVzaCh7dmFsdWU6IGd0VmFsdWUsIG9wZXJhdG9yOiAnZ3RlJywgdHlwZTogJ251bWJlcid9KTtcbiAgICB9XG4gICAgdGFibGUuZmlsdGVyKHtcbiAgICAgIHNpemU6IGNsYXVzZXNcbiAgICB9KVxuICB9O1xuXG4gIG1pbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UoKGV2KSA9PiB7XG4gICAgZ3RWYWx1ZSA9IG1pbkVsLnZhbHVlO1xuICAgIGNvbW1pdCgpO1xuICB9LCA0MDApKTtcblxuICBtYXhFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKChldikgPT4ge1xuICAgIGx0VmFsdWUgPSBtYXhFbC52YWx1ZTtcbiAgICBjb21taXQoKTtcbiAgfSwgNDAwKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgICh7cXVlcnl9KSA9PiAoe3RhYmxlLCB0YWJsZVN0YXRlfSkgPT4ge1xuICBjb25zdCBleGVjID0gKCkgPT4ge1xuICAgIHRhYmxlLmRpc3BhdGNoKCdFWEVDX0NIQU5HRUQnLCB7d29ya2luZzogdHJ1ZX0pO1xuICAgIHJldHVybiBxdWVyeSh0YWJsZVN0YXRlKVxuICAgICAgLnRoZW4oKHtkYXRhID0gW10sIHN1bW1hcnkgPSB7fX0pID0+IHtcbiAgICAgICAgdGFibGUuZGlzcGF0Y2goJ1NVTU1BUllfQ0hBTkdFRCcsIHN1bW1hcnkpO1xuICAgICAgICB0YWJsZS5kaXNwYXRjaCgnRElTUExBWV9DSEFOR0VEJywgZGF0YSk7XG4gICAgICAgIHRhYmxlLmRpc3BhdGNoKCdFWEVDX0NIQU5HRUQnLCB7d29ya2luZzogZmFsc2V9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIHRhYmxlLmRpc3BhdGNoKCdFWEVDX0VSUk9SJywgZSk7XG4gICAgICAgIHRhYmxlLmRpc3BhdGNoKCdFWEVDX0NIQU5HRUQnLCB7d29ya2luZzogZmFsc2V9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHRhYmxlLCB7XG4gICAgZXhlYywgZXZhbDogKHRzID0gdGFibGVTdGF0ZSkgPT4gcXVlcnkodHMpLnRoZW4oKHtkYXRhfSkgPT4gZGF0YSlcbiAgfSk7XG59OyIsIi8vYSBmYWtlIHNkayB0byBtaW1pYyBhIHNlcnZlcjogaXQgYWN0dWFsbHkgdXNlcyBhbm90aGVyIHNtYXJ0LXRhYmxlIHRvIHByb2Nlc3MgYSBxdWVyeSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgd2l0aCBhIHJhbmRvbSB0aW1lb3V0IHRvIG1pbWljIHRoZSBodHRwIHJlc3BvbnNlIHRpbWVcbmltcG9ydCB7c21hcnRUYWJsZSBhcyB0YWJsZX0gZnJvbSAnc21hcnQtdGFibGUtY29yZSc7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcbiAgY29uc3QgdCA9IHRhYmxlKHtkYXRhfSk7XG4gIHJldHVybiB7XG4gICAgcXVlcnk6ICh0YWJsZVN0YXRlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvL3RoaXMgdGltZW91dCBpcyBqdXN0IHRvIGF2b2lkIHRoZSB1aSB0byBmcmVlemUgYXMgbm9ybWFsbHkgdGhlIHByb2Nlc3Mgd291bGQgcnVuIG9uIHRoZSBzZXJ2ZXJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3Qgbm90U2xpY2VkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCB0YWJsZVN0YXRlLCB7XG4gICAgICAgICAgICBzbGljZToge3BhZ2U6IDF9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgUHJvbWlzZVxuICAgICAgICAgICAgLmFsbChbdC5ldmFsKHRhYmxlU3RhdGUpLCB0LmV2YWwobm90U2xpY2VkU3RhdGUpXSlcbiAgICAgICAgICAgIC50aGVuKChbZnVsbCwgcGFydGlhbF0pID0+IHtcbiAgICAgICAgICAgICAgLy9yYW5kb20gdGltZW91dCBvbiB0aGUgcmVzcG9uc2UgdG8gbWltaWMgdGhlIHNlcnZlciByZXNwb25zZSB0aW1lXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgZGF0YTogZnVsbCxcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogdGFibGVTdGF0ZS5zbGljZS5wYWdlLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB0YWJsZVN0YXRlLnNsaWNlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkQ291bnQ6IHBhcnRpYWwubGVuZ3RoXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sIE1hdGgucmFuZG9tKCkgKiAyMDAwKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpO1xuICAgICAgICB9LCAyMClcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn07XG5cblxuIiwiaW1wb3J0IHt0YWJsZSBhcyB0YWJsZUNvbXBvbmVudEZhY3Rvcnl9IGZyb20gJ3NtYXJ0LXRhYmxlLXZhbmlsbGEnO1xuaW1wb3J0IHtzbWFydFRhYmxlIGFzIHRhYmxlfSBmcm9tICdzbWFydC10YWJsZS1jb3JlJztcbmltcG9ydCByb3cgZnJvbSAnLi9jb21wb25lbnRzL3Jvdyc7XG5pbXBvcnQgc3VtbWFyeSBmcm9tICcuL2NvbXBvbmVudHMvc3VtbWFyeSc7XG5pbXBvcnQgcGFnaW5hdGlvbiBmcm9tICcuL2NvbXBvbmVudHMvcGFnaW5hdGlvbic7XG5pbXBvcnQgcmFuZ2VTaXplSW5wdXQgZnJvbSAnLi9jb21wb25lbnRzL3JhbmdlU2l6ZUlucHV0JztcbmltcG9ydCBleHQgZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHNkayBmcm9tICcuL3Nkayc7XG5cbmNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlLWNvbnRhaW5lcicpO1xuY29uc3QgdGJvZHkgPSBlbC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuY29uc3Qgc3VtbWFyeUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc3Qtc3VtbWFyeV0nKTtcblxuY29uc3QgdCA9IHRhYmxlKFxuICB7dGFibGVTdGF0ZToge3NvcnQ6IHt9LCBmaWx0ZXI6IHt9LCBzbGljZToge3BhZ2U6IDEsIHNpemU6IDIwfX19LFxuICBleHQoc2RrKCkpIC8vc2VydmVyIHNpZGUgZXh0ZW5zaW9uXG4pO1xuY29uc3QgdGFibGVDb21wb25lbnQgPSB0YWJsZUNvbXBvbmVudEZhY3Rvcnkoe2VsLCB0YWJsZTogdH0pO1xuXG5zdW1tYXJ5KHt0YWJsZTogdCwgZWw6IHN1bW1hcnlFbH0pO1xucmFuZ2VTaXplSW5wdXQoe1xuICB0YWJsZTogdCxcbiAgbWluRWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtaW4tc2l6ZScpLFxuICBtYXhFbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21heC1zaXplJylcbn0pO1xuXG5jb25zdCBwYWdpbmF0aW9uQ29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc3QtcGFnaW5hdGlvbl0nKTtcbnBhZ2luYXRpb24oe3RhYmxlOiB0LCBlbDogcGFnaW5hdGlvbkNvbnRhaW5lcn0pO1xuXG50YWJsZUNvbXBvbmVudC5vbkRpc3BsYXlDaGFuZ2UoZGlzcGxheWVkID0+IHtcbiAgdGJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAobGV0IHIgb2YgZGlzcGxheWVkKSB7XG4gICAgY29uc3QgbmV3Q2hpbGQgPSByb3coKHIudmFsdWUpLCByLmluZGV4LCB0KTtcbiAgICB0Ym9keS5hcHBlbmRDaGlsZChuZXdDaGlsZCk7XG4gIH1cbn0pO1xuIl0sIm5hbWVzIjpbImRlYm91bmNlIiwiZmlsdGVyIiwibG9hZGluZyIsInNlYXJjaElucHV0IiwidGFibGUiLCJ0YWJsZUNvbXBvbmVudEZhY3RvcnkiLCJzdW1tYXJ5IiwicmFuZ2VTaXplSW5wdXQiLCJwYWdpbmF0aW9uIl0sIm1hcHBpbmdzIjoiOzs7SUFBQSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JILE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLFNBQVMsS0FBSztJQUNqQyxJQUFJLE1BQU0sS0FBSyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ3pDLElBQUksT0FBTyxDQUFDLEdBQUcsSUFB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
diff --git a/example/components/pagination.js b/example/components/pagination.js
index baca8f7..e964ca7 100644
--- a/example/components/pagination.js
+++ b/example/components/pagination.js
@@ -1,4 +1,4 @@
-import {slice} from 'smart-table-core';
+import {paginationDirective} from 'smart-table-core';
export default function paginationComponent ({table, el}) {
const previousButton = document.createElement('button');
@@ -7,7 +7,7 @@ export default function paginationComponent ({table, el}) {
nextButton.innerHTML = 'Next';
const pageSpan = document.createElement('span');
pageSpan.innerHTML = '- page 1 -';
- const comp = slice({table});
+ const comp = paginationDirective({table});
comp.onSummaryChange(({page}) => {
previousButton.disabled = !comp.isPreviousPageEnabled();
diff --git a/example/components/summary.js b/example/components/summary.js
index c530b54..9e9dadb 100644
--- a/example/components/summary.js
+++ b/example/components/summary.js
@@ -1,7 +1,7 @@
-import {summary} from 'smart-table-core'
+import {summaryDirective} from 'smart-table-core'
export default function summaryComponent ({table, el}) {
- const dir = summary({table});
+ const dir = summaryDirective({table});
dir.onSummaryChange(({page, size, filteredCount}) => {
el.innerHTML = `showing items ${(page - 1) * size + (filteredCount > 0 ? 1 : 0)} - ${Math.min(filteredCount, page * size)} of ${filteredCount} matching items`;
});
diff --git a/example/index.js b/example/index.js
index b1c62f0..2149f69 100644
--- a/example/index.js
+++ b/example/index.js
@@ -1,5 +1,5 @@
import {table as tableComponentFactory} from 'smart-table-vanilla';
-import {table} from 'smart-table-core';
+import {smartTable as table} from 'smart-table-core';
import row from './components/row';
import summary from './components/summary';
import pagination from './components/pagination';
diff --git a/example/rollup.config.js b/example/rollup.config.js
index a05ac4d..a0e4419 100644
--- a/example/rollup.config.js
+++ b/example/rollup.config.js
@@ -1,9 +1,11 @@
const node = require('rollup-plugin-node-resolve');
module.exports = {
- entry: 'example/index.js',
- dest: 'example/bundle.js',
- format: 'iife',
+ input: 'example/index.js',
+ output: {
+ file: 'example/bundle.js',
+ format: 'iife',
+ name: 'tableExample',
+ sourcemap: 'inline',
+ },
plugins: [node({jsnext: true})],
- moduleName: 'tableExample',
- sourceMap: 'inline'
};
diff --git a/example/sdk.js b/example/sdk.js
index dd2c772..5edec2b 100644
--- a/example/sdk.js
+++ b/example/sdk.js
@@ -1,5 +1,5 @@
//a fake sdk to mimic a server: it actually uses another smart-table to process a query and return the result with a random timeout to mimic the http response time
-import {table} from 'smart-table-core';
+import {smartTable as table} from 'smart-table-core';
export default () => {
const t = table({data});
diff --git a/package.json b/package.json
index 444d7e5..49af589 100644
--- a/package.json
+++ b/package.json
@@ -29,10 +29,10 @@
},
"homepage": "https://github.com/smart-table/smart-table-server#readme",
"devDependencies": {
- "rollup": "^0.41.6",
- "rollup-plugin-node-resolve": "^3.0.0",
- "smart-table-core": "^1.3.5",
- "smart-table-vanilla": "^0.1.0",
+ "rollup": "^1.16.3",
+ "rollup-plugin-node-resolve": "^5.2.0",
+ "smart-table-core": "^3.0.4",
+ "smart-table-vanilla": "0.2.0",
"zora": "^0.3.0"
}
}
diff --git a/rollup.config.js b/rollup.config.js
index 40eb290..1dc8deb 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -1,8 +1,10 @@
import node from 'rollup-plugin-node-resolve';
export default {
- entry: 'index.js',
- dest: 'dist/smart-table-server.js',
- format: 'umd',
+ input: 'index.js',
+ output: {
+ file: 'dist/smart-table-server.js',
+ format: 'umd',
+ name: 'smart-table-server',
+ },
plugins: [node({jsnext: true})],
- moduleName: 'smart-table-server'
};
diff --git a/test/dist/index.js b/test/dist/index.js
index 6d9778f..f1bee14 100644
--- a/test/dist/index.js
+++ b/test/dist/index.js
@@ -1,1131 +1,1149 @@
(function () {
-'use strict';
-
-/**
- * slice() reference.
- */
-
-var slice = Array.prototype.slice;
-
-/**
- * Expose `co`.
- */
-
-var index = co['default'] = co.co = co;
-
-/**
- * Wrap the given generator `fn` into a
- * function that returns a promise.
- * This is a separate function so that
- * every `co()` call doesn't create a new,
- * unnecessary closure.
- *
- * @param {GeneratorFunction} fn
- * @return {Function}
- * @api public
- */
-
-co.wrap = function (fn) {
- createPromise.__generatorFunction__ = fn;
- return createPromise;
- function createPromise() {
- return co.call(this, fn.apply(this, arguments));
- }
-};
-
-/**
- * Execute the generator function or a generator
- * and return a promise.
- *
- * @param {Function} fn
- * @return {Promise}
- * @api public
- */
-
-function co(gen) {
- var ctx = this;
- var args = slice.call(arguments, 1);
-
- // we wrap everything in a promise to avoid promise chaining,
- // which leads to memory leak errors.
- // see https://github.com/tj/co/issues/180
- return new Promise(function(resolve, reject) {
- if (typeof gen === 'function') gen = gen.apply(ctx, args);
- if (!gen || typeof gen.next !== 'function') return resolve(gen);
-
- onFulfilled();
-
- /**
- * @param {Mixed} res
- * @return {Promise}
- * @api private
- */
-
- function onFulfilled(res) {
- var ret;
- try {
- ret = gen.next(res);
- } catch (e) {
- return reject(e);
- }
- next(ret);
+ 'use strict';
+
+ /**
+ * slice() reference.
+ */
+
+ var slice = Array.prototype.slice;
+
+ /**
+ * Expose `co`.
+ */
+
+ var index = co['default'] = co.co = co;
+
+ /**
+ * Wrap the given generator `fn` into a
+ * function that returns a promise.
+ * This is a separate function so that
+ * every `co()` call doesn't create a new,
+ * unnecessary closure.
+ *
+ * @param {GeneratorFunction} fn
+ * @return {Function}
+ * @api public
+ */
+
+ co.wrap = function (fn) {
+ createPromise.__generatorFunction__ = fn;
+ return createPromise;
+ function createPromise() {
+ return co.call(this, fn.apply(this, arguments));
}
+ };
- /**
- * @param {Error} err
- * @return {Promise}
- * @api private
- */
+ /**
+ * Execute the generator function or a generator
+ * and return a promise.
+ *
+ * @param {Function} fn
+ * @return {Promise}
+ * @api public
+ */
+
+ function co(gen) {
+ var ctx = this;
+ var args = slice.call(arguments, 1);
+
+ // we wrap everything in a promise to avoid promise chaining,
+ // which leads to memory leak errors.
+ // see https://github.com/tj/co/issues/180
+ return new Promise(function(resolve, reject) {
+ if (typeof gen === 'function') gen = gen.apply(ctx, args);
+ if (!gen || typeof gen.next !== 'function') return resolve(gen);
+
+ onFulfilled();
+
+ /**
+ * @param {Mixed} res
+ * @return {Promise}
+ * @api private
+ */
+
+ function onFulfilled(res) {
+ var ret;
+ try {
+ ret = gen.next(res);
+ } catch (e) {
+ return reject(e);
+ }
+ next(ret);
+ }
- function onRejected(err) {
- var ret;
- try {
- ret = gen.throw(err);
- } catch (e) {
- return reject(e);
+ /**
+ * @param {Error} err
+ * @return {Promise}
+ * @api private
+ */
+
+ function onRejected(err) {
+ var ret;
+ try {
+ ret = gen.throw(err);
+ } catch (e) {
+ return reject(e);
+ }
+ next(ret);
}
- next(ret);
- }
- /**
- * Get the next value in the generator,
- * return a promise.
- *
- * @param {Object} ret
- * @return {Promise}
- * @api private
- */
-
- function next(ret) {
- if (ret.done) return resolve(ret.value);
- var value = toPromise.call(ctx, ret.value);
- if (value && isPromise(value)) return value.then(onFulfilled, onRejected);
- return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '
- + 'but the following object was passed: "' + String(ret.value) + '"'));
+ /**
+ * Get the next value in the generator,
+ * return a promise.
+ *
+ * @param {Object} ret
+ * @return {Promise}
+ * @api private
+ */
+
+ function next(ret) {
+ if (ret.done) return resolve(ret.value);
+ var value = toPromise.call(ctx, ret.value);
+ if (value && isPromise(value)) return value.then(onFulfilled, onRejected);
+ return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '
+ + 'but the following object was passed: "' + String(ret.value) + '"'));
+ }
+ });
+ }
+
+ /**
+ * Convert a `yield`ed value into a promise.
+ *
+ * @param {Mixed} obj
+ * @return {Promise}
+ * @api private
+ */
+
+ function toPromise(obj) {
+ if (!obj) return obj;
+ if (isPromise(obj)) return obj;
+ if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
+ if ('function' == typeof obj) return thunkToPromise.call(this, obj);
+ if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
+ if (isObject(obj)) return objectToPromise.call(this, obj);
+ return obj;
+ }
+
+ /**
+ * Convert a thunk to a promise.
+ *
+ * @param {Function}
+ * @return {Promise}
+ * @api private
+ */
+
+ function thunkToPromise(fn) {
+ var ctx = this;
+ return new Promise(function (resolve, reject) {
+ fn.call(ctx, function (err, res) {
+ if (err) return reject(err);
+ if (arguments.length > 2) res = slice.call(arguments, 1);
+ resolve(res);
+ });
+ });
+ }
+
+ /**
+ * Convert an array of "yieldables" to a promise.
+ * Uses `Promise.all()` internally.
+ *
+ * @param {Array} obj
+ * @return {Promise}
+ * @api private
+ */
+
+ function arrayToPromise(obj) {
+ return Promise.all(obj.map(toPromise, this));
+ }
+
+ /**
+ * Convert an object of "yieldables" to a promise.
+ * Uses `Promise.all()` internally.
+ *
+ * @param {Object} obj
+ * @return {Promise}
+ * @api private
+ */
+
+ function objectToPromise(obj){
+ var results = new obj.constructor();
+ var keys = Object.keys(obj);
+ var promises = [];
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var promise = toPromise.call(this, obj[key]);
+ if (promise && isPromise(promise)) defer(promise, key);
+ else results[key] = obj[key];
}
- });
-}
-
-/**
- * Convert a `yield`ed value into a promise.
- *
- * @param {Mixed} obj
- * @return {Promise}
- * @api private
- */
-
-function toPromise(obj) {
- if (!obj) return obj;
- if (isPromise(obj)) return obj;
- if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
- if ('function' == typeof obj) return thunkToPromise.call(this, obj);
- if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
- if (isObject(obj)) return objectToPromise.call(this, obj);
- return obj;
-}
-
-/**
- * Convert a thunk to a promise.
- *
- * @param {Function}
- * @return {Promise}
- * @api private
- */
-
-function thunkToPromise(fn) {
- var ctx = this;
- return new Promise(function (resolve, reject) {
- fn.call(ctx, function (err, res) {
- if (err) return reject(err);
- if (arguments.length > 2) res = slice.call(arguments, 1);
- resolve(res);
+ return Promise.all(promises).then(function () {
+ return results;
});
- });
-}
-
-/**
- * Convert an array of "yieldables" to a promise.
- * Uses `Promise.all()` internally.
- *
- * @param {Array} obj
- * @return {Promise}
- * @api private
- */
-
-function arrayToPromise(obj) {
- return Promise.all(obj.map(toPromise, this));
-}
-
-/**
- * Convert an object of "yieldables" to a promise.
- * Uses `Promise.all()` internally.
- *
- * @param {Object} obj
- * @return {Promise}
- * @api private
- */
-
-function objectToPromise(obj){
- var results = new obj.constructor();
- var keys = Object.keys(obj);
- var promises = [];
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- var promise = toPromise.call(this, obj[key]);
- if (promise && isPromise(promise)) defer(promise, key);
- else results[key] = obj[key];
+
+ function defer(promise, key) {
+ // predefine the key in the result
+ results[key] = undefined;
+ promises.push(promise.then(function (res) {
+ results[key] = res;
+ }));
+ }
}
- return Promise.all(promises).then(function () {
- return results;
- });
- function defer(promise, key) {
- // predefine the key in the result
- results[key] = undefined;
- promises.push(promise.then(function (res) {
- results[key] = res;
- }));
+ /**
+ * Check if `obj` is a promise.
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+
+ function isPromise(obj) {
+ return 'function' == typeof obj.then;
}
-}
-
-/**
- * Check if `obj` is a promise.
- *
- * @param {Object} obj
- * @return {Boolean}
- * @api private
- */
-
-function isPromise(obj) {
- return 'function' == typeof obj.then;
-}
-
-/**
- * Check if `obj` is a generator.
- *
- * @param {Mixed} obj
- * @return {Boolean}
- * @api private
- */
-
-function isGenerator(obj) {
- return 'function' == typeof obj.next && 'function' == typeof obj.throw;
-}
-
-/**
- * Check if `obj` is a generator function.
- *
- * @param {Mixed} obj
- * @return {Boolean}
- * @api private
- */
-function isGeneratorFunction(obj) {
- var constructor = obj.constructor;
- if (!constructor) return false;
- if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;
- return isGenerator(constructor.prototype);
-}
-
-/**
- * Check for plain object.
- *
- * @param {Mixed} val
- * @return {Boolean}
- * @api private
- */
-
-function isObject(val) {
- return Object == val.constructor;
-}
-
-function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
-}
-
-var keys = createCommonjsModule(function (module, exports) {
-exports = module.exports = typeof Object.keys === 'function'
- ? Object.keys : shim;
-
-exports.shim = shim;
-function shim (obj) {
- var keys = [];
- for (var key in obj) keys.push(key);
- return keys;
-}
-});
-
-var is_arguments = createCommonjsModule(function (module, exports) {
-var supportsArgumentsClass = (function(){
- return Object.prototype.toString.call(arguments)
-})() == '[object Arguments]';
-
-exports = module.exports = supportsArgumentsClass ? supported : unsupported;
-
-exports.supported = supported;
-function supported(object) {
- return Object.prototype.toString.call(object) == '[object Arguments]';
-}
-
-exports.unsupported = unsupported;
-function unsupported(object){
- return object &&
- typeof object == 'object' &&
- typeof object.length == 'number' &&
- Object.prototype.hasOwnProperty.call(object, 'callee') &&
- !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
- false;
-}
-});
-
-var index$1 = createCommonjsModule(function (module) {
-var pSlice = Array.prototype.slice;
-var objectKeys = keys;
-var isArguments = is_arguments;
-
-var deepEqual = module.exports = function (actual, expected, opts) {
- if (!opts) opts = {};
- // 7.1. All identical values are equivalent, as determined by ===.
- if (actual === expected) {
- return true;
- } else if (actual instanceof Date && expected instanceof Date) {
- return actual.getTime() === expected.getTime();
-
- // 7.3. Other pairs that do not both pass typeof value == 'object',
- // equivalence is determined by ==.
- } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
- return opts.strict ? actual === expected : actual == expected;
-
- // 7.4. For all other Object pairs, including Array objects, equivalence is
- // determined by having the same number of owned properties (as verified
- // with Object.prototype.hasOwnProperty.call), the same set of keys
- // (although not necessarily the same order), equivalent values for every
- // corresponding key, and an identical 'prototype' property. Note: this
- // accounts for both named and indexed properties on Arrays.
- } else {
- return objEquiv(actual, expected, opts);
+ /**
+ * Check if `obj` is a generator.
+ *
+ * @param {Mixed} obj
+ * @return {Boolean}
+ * @api private
+ */
+
+ function isGenerator(obj) {
+ return 'function' == typeof obj.next && 'function' == typeof obj.throw;
}
-};
-function isUndefinedOrNull(value) {
- return value === null || value === undefined;
-}
+ /**
+ * Check if `obj` is a generator function.
+ *
+ * @param {Mixed} obj
+ * @return {Boolean}
+ * @api private
+ */
+ function isGeneratorFunction(obj) {
+ var constructor = obj.constructor;
+ if (!constructor) return false;
+ if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;
+ return isGenerator(constructor.prototype);
+ }
+
+ /**
+ * Check for plain object.
+ *
+ * @param {Mixed} val
+ * @return {Boolean}
+ * @api private
+ */
-function isBuffer (x) {
- if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
- if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
- return false;
+ function isObject(val) {
+ return Object == val.constructor;
}
- if (x.length > 0 && typeof x[0] !== 'number') return false;
- return true;
-}
-
-function objEquiv(a, b, opts) {
- var i, key;
- if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
- return false;
- // an identical 'prototype' property.
- if (a.prototype !== b.prototype) return false;
- //~~~I've managed to break Object.keys through screwy arguments passing.
- // Converting to array solves the problem.
- if (isArguments(a)) {
- if (!isArguments(b)) {
- return false;
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ var keys = createCommonjsModule(function (module, exports) {
+ exports = module.exports = typeof Object.keys === 'function'
+ ? Object.keys : shim;
+
+ exports.shim = shim;
+ function shim (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+ }
+ });
+
+ var is_arguments = createCommonjsModule(function (module, exports) {
+ var supportsArgumentsClass = (function(){
+ return Object.prototype.toString.call(arguments)
+ })() == '[object Arguments]';
+
+ exports = module.exports = supportsArgumentsClass ? supported : unsupported;
+
+ exports.supported = supported;
+ function supported(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+ }
+
+ exports.unsupported = unsupported;
+ function unsupported(object){
+ return object &&
+ typeof object == 'object' &&
+ typeof object.length == 'number' &&
+ Object.prototype.hasOwnProperty.call(object, 'callee') &&
+ !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
+ false;
+ }
+ });
+
+ var index$1 = createCommonjsModule(function (module) {
+ var pSlice = Array.prototype.slice;
+ var objectKeys = keys;
+ var isArguments = is_arguments;
+
+ var deepEqual = module.exports = function (actual, expected, opts) {
+ if (!opts) opts = {};
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (actual instanceof Date && expected instanceof Date) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
+ return opts.strict ? actual === expected : actual == expected;
+
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected, opts);
}
- a = pSlice.call(a);
- b = pSlice.call(b);
- return deepEqual(a, b, opts);
+ };
+
+ function isUndefinedOrNull(value) {
+ return value === null || value === undefined;
}
- if (isBuffer(a)) {
- if (!isBuffer(b)) {
+
+ function isBuffer (x) {
+ if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
+ if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
return false;
}
- if (a.length !== b.length) return false;
- for (i = 0; i < a.length; i++) {
- if (a[i] !== b[i]) return false;
- }
+ if (x.length > 0 && typeof x[0] !== 'number') return false;
return true;
}
- try {
- var ka = objectKeys(a),
- kb = objectKeys(b);
- } catch (e) {//happens when one is a string literal and the other isn't
- return false;
- }
- // having the same number of owned properties (keys incorporates
- // hasOwnProperty)
- if (ka.length != kb.length)
- return false;
- //the same set of keys (although not necessarily the same order),
- ka.sort();
- kb.sort();
- //~~~cheap key test
- for (i = ka.length - 1; i >= 0; i--) {
- if (ka[i] != kb[i])
+
+ function objEquiv(a, b, opts) {
+ var i, key;
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
return false;
- }
- //equivalent values for every corresponding key, and
- //~~~possibly expensive deep test
- for (i = ka.length - 1; i >= 0; i--) {
- key = ka[i];
- if (!deepEqual(a[key], b[key], opts)) return false;
- }
- return typeof a === typeof b;
-}
-});
-
-const assertions = {
- ok(val, message = 'should be truthy') {
- const assertionResult = {
- pass: Boolean(val),
- expected: 'truthy',
- actual: val,
- operator: 'ok',
- message
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- deepEqual(actual, expected, message = 'should be equivalent') {
- const assertionResult = {
- pass: index$1(actual, expected),
- actual,
- expected,
- message,
- operator: 'deepEqual'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- equal(actual, expected, message = 'should be equal') {
- const assertionResult = {
- pass: actual === expected,
- actual,
- expected,
- message,
- operator: 'equal'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- notOk(val, message = 'should not be truthy') {
- const assertionResult = {
- pass: !Boolean(val),
- expected: 'falsy',
- actual: val,
- operator: 'notOk',
- message
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- notDeepEqual(actual, expected, message = 'should not be equivalent') {
- const assertionResult = {
- pass: !index$1(actual, expected),
- actual,
- expected,
- message,
- operator: 'notDeepEqual'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- notEqual(actual, expected, message = 'should not be equal') {
- const assertionResult = {
- pass: actual !== expected,
- actual,
- expected,
- message,
- operator: 'notEqual'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- throws(func, expected, message) {
- let caught, pass, actual;
- if (typeof expected === 'string') {
- [expected, message] = [message, expected];
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ //~~~I've managed to break Object.keys through screwy arguments passing.
+ // Converting to array solves the problem.
+ if (isArguments(a)) {
+ if (!isArguments(b)) {
+ return false;
+ }
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return deepEqual(a, b, opts);
}
- try {
- func();
- } catch (error) {
- caught = {error};
+ if (isBuffer(a)) {
+ if (!isBuffer(b)) {
+ return false;
+ }
+ if (a.length !== b.length) return false;
+ for (i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) return false;
+ }
+ return true;
}
- pass = caught !== undefined;
- actual = caught && caught.error;
- if (expected instanceof RegExp) {
- pass = expected.test(actual) || expected.test(actual && actual.message);
- expected = String(expected);
- } else if (typeof expected === 'function' && caught) {
- pass = actual instanceof expected;
- actual = actual.constructor;
+ try {
+ var ka = objectKeys(a),
+ kb = objectKeys(b);
+ } catch (e) {//happens when one is a string literal and the other isn't
+ return false;
}
- const assertionResult = {
- pass,
- expected,
- actual,
- operator: 'throws',
- message: message || 'should throw'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- doesNotThrow(func, expected, message) {
- let caught;
- if (typeof expected === 'string') {
- [expected, message] = [message, expected];
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
}
- try {
- func();
- } catch (error) {
- caught = {error};
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!deepEqual(a[key], b[key], opts)) return false;
}
- const assertionResult = {
- pass: caught === undefined,
- expected: 'no thrown error',
- actual: caught && caught.error,
- operator: 'doesNotThrow',
- message: message || 'should not throw'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- },
- fail(reason = 'fail called') {
- const assertionResult = {
- pass: false,
- actual: 'fail called',
- expected: 'fail not called',
- message: reason,
- operator: 'fail'
- };
- this.test.addAssertion(assertionResult);
- return assertionResult;
- }
-};
-
-function assertion (test) {
- return Object.create(assertions, {test: {value: test}});
-}
-
-const Test = {
- run: function () {
- const assert = assertion(this);
- const now = Date.now();
- return index(this.coroutine(assert))
- .then(() => {
- return {assertions: this.assertions, executionTime: Date.now() - now};
- });
- },
- addAssertion(){
- const newAssertions = [...arguments].map(a => Object.assign({description: this.description}, a));
- this.assertions.push(...newAssertions);
- return this;
+ return typeof a === typeof b;
}
-};
-
-function test ({description, coroutine, only = false}) {
- return Object.create(Test, {
- description: {value: description},
- coroutine: {value: coroutine},
- assertions: {value: []},
- only: {value: only},
- length: {
- get(){
- return this.assertions.length
- }
- }
});
-}
-
-function tapOut ({pass, message, index}) {
- const status = pass === true ? 'ok' : 'not ok';
- console.log([status, index, message].join(' '));
-}
-
-function canExit () {
- return typeof process !== 'undefined' && typeof process.exit === 'function';
-}
-
-function tap () {
- return function * () {
- let index = 1;
- let lastId = 0;
- let success = 0;
- let failure = 0;
-
- const starTime = Date.now();
- console.log('TAP version 13');
- try {
- while (true) {
- const assertion = yield;
- if (assertion.pass === true) {
- success++;
- } else {
- failure++;
- }
- assertion.index = index;
- if (assertion.id !== lastId) {
- console.log(`# ${assertion.description} - ${assertion.executionTime}ms`);
- lastId = assertion.id;
- }
- tapOut(assertion);
- if (assertion.pass !== true) {
- console.log(` ---
- operator: ${assertion.operator}
- expected: ${JSON.stringify(assertion.expected)}
- actual: ${JSON.stringify(assertion.actual)}
- ...`);
- }
- index++;
+
+ const assertions = {
+ ok(val, message = 'should be truthy') {
+ const assertionResult = {
+ pass: Boolean(val),
+ expected: 'truthy',
+ actual: val,
+ operator: 'ok',
+ message
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ deepEqual(actual, expected, message = 'should be equivalent') {
+ const assertionResult = {
+ pass: index$1(actual, expected),
+ actual,
+ expected,
+ message,
+ operator: 'deepEqual'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ equal(actual, expected, message = 'should be equal') {
+ const assertionResult = {
+ pass: actual === expected,
+ actual,
+ expected,
+ message,
+ operator: 'equal'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ notOk(val, message = 'should not be truthy') {
+ const assertionResult = {
+ pass: !Boolean(val),
+ expected: 'falsy',
+ actual: val,
+ operator: 'notOk',
+ message
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ notDeepEqual(actual, expected, message = 'should not be equivalent') {
+ const assertionResult = {
+ pass: !index$1(actual, expected),
+ actual,
+ expected,
+ message,
+ operator: 'notDeepEqual'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ notEqual(actual, expected, message = 'should not be equal') {
+ const assertionResult = {
+ pass: actual !== expected,
+ actual,
+ expected,
+ message,
+ operator: 'notEqual'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ throws(func, expected, message) {
+ let caught, pass, actual;
+ if (typeof expected === 'string') {
+ [expected, message] = [message, expected];
}
- } catch (e) {
- console.log('Bail out! unhandled exception');
- console.log(e);
- if (canExit()) {
- process.exit(1);
+ try {
+ func();
+ } catch (error) {
+ caught = {error};
}
- }
- finally {
- const execution = Date.now() - starTime;
- if (index > 1) {
- console.log(`
-1..${index - 1}
-# duration ${execution}ms
-# success ${success}
-# failure ${failure}`);
+ pass = caught !== undefined;
+ actual = caught && caught.error;
+ if (expected instanceof RegExp) {
+ pass = expected.test(actual) || expected.test(actual && actual.message);
+ expected = String(expected);
+ } else if (typeof expected === 'function' && caught) {
+ pass = actual instanceof expected;
+ actual = actual.constructor;
}
- if (failure && canExit()) {
- process.exit(1);
+ const assertionResult = {
+ pass,
+ expected,
+ actual,
+ operator: 'throws',
+ message: message || 'should throw'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ doesNotThrow(func, expected, message) {
+ let caught;
+ if (typeof expected === 'string') {
+ [expected, message] = [message, expected];
}
- }
- };
-}
-
-const Plan = {
- test(description, coroutine, opts = {}){
- const testItems = (!coroutine && description.tests) ? [...description] : [{description, coroutine}];
- this.tests.push(...testItems.map(t=>test(Object.assign(t, opts))));
- return this;
- },
-
- only(description, coroutine){
- return this.test(description, coroutine, {only: true});
- },
-
- run(sink = tap()){
- const sinkIterator = sink();
- sinkIterator.next();
- const hasOnly = this.tests.some(t=>t.only);
- const runnable = hasOnly ? this.tests.filter(t=>t.only) : this.tests;
- return index(function * () {
- let id = 1;
try {
- const results = runnable.map(t=>t.run());
- for (let r of results) {
- const {assertions, executionTime} = yield r;
- for (let assert of assertions) {
- sinkIterator.next(Object.assign(assert, {id, executionTime}));
- }
- id++;
- }
- }
- catch (e) {
- sinkIterator.throw(e);
- } finally {
- sinkIterator.return();
- }
- }.bind(this))
- },
-
- * [Symbol.iterator](){
- for (let t of this.tests) {
- yield t;
- }
- }
-};
-
-function plan$1 () {
- return Object.create(Plan, {
- tests: {value: []},
- length: {
- get(){
- return this.tests.length
+ func();
+ } catch (error) {
+ caught = {error};
}
- }
- });
-}
-
-function swap (f) {
- return (a, b) => f(b, a);
-}
-
-function compose (first, ...fns) {
- return (...args) => fns.reduce((previous, current) => current(previous), first(...args));
-}
-
-function curry (fn, arityLeft) {
- const arity = arityLeft || fn.length;
- return (...args) => {
- const argLength = args.length || 1;
- if (arity === argLength) {
- return fn(...args);
- } else {
- const func = (...moreArgs) => fn(...args, ...moreArgs);
- return curry(func, arity - args.length);
+ const assertionResult = {
+ pass: caught === undefined,
+ expected: 'no thrown error',
+ actual: caught && caught.error,
+ operator: 'doesNotThrow',
+ message: message || 'should not throw'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
+ },
+ fail(reason = 'fail called') {
+ const assertionResult = {
+ pass: false,
+ actual: 'fail called',
+ expected: 'fail not called',
+ message: reason,
+ operator: 'fail'
+ };
+ this.test.addAssertion(assertionResult);
+ return assertionResult;
}
};
-}
+ function assertion (test) {
+ return Object.create(assertions, {test: {value: test}});
+ }
+ const Test = {
+ run: function () {
+ const assert = assertion(this);
+ const now = Date.now();
+ return index(this.coroutine(assert))
+ .then(() => {
+ return {assertions: this.assertions, executionTime: Date.now() - now};
+ });
+ },
+ addAssertion(){
+ const newAssertions = [...arguments].map(a => Object.assign({description: this.description}, a));
+ this.assertions.push(...newAssertions);
+ return this;
+ }
+ };
-function tap$1 (fn) {
- return arg => {
- fn(arg);
- return arg;
+ function test ({description, coroutine, only = false}) {
+ return Object.create(Test, {
+ description: {value: description},
+ coroutine: {value: coroutine},
+ assertions: {value: []},
+ only: {value: only},
+ length: {
+ get(){
+ return this.assertions.length
+ }
+ }
+ });
}
-}
-
-function pointer (path) {
- const parts = path.split('.');
+ function tapOut ({pass, message, index}) {
+ const status = pass === true ? 'ok' : 'not ok';
+ console.log([status, index, message].join(' '));
+ }
- function partial (obj = {}, parts = []) {
- const p = parts.shift();
- const current = obj[p];
- return (current === undefined || parts.length === 0) ?
- current : partial(current, parts);
+ function canExit () {
+ return typeof process !== 'undefined' && typeof process.exit === 'function';
}
- function set (target, newTree) {
- let current = target;
- const [leaf, ...intermediate] = parts.reverse();
- for (let key of intermediate.reverse()) {
- if (current[key] === undefined) {
- current[key] = {};
- current = current[key];
+ function tap () {
+ return function * () {
+ let index = 1;
+ let lastId = 0;
+ let success = 0;
+ let failure = 0;
+
+ const starTime = Date.now();
+ console.log('TAP version 13');
+ try {
+ while (true) {
+ const assertion = yield;
+ if (assertion.pass === true) {
+ success++;
+ } else {
+ failure++;
+ }
+ assertion.index = index;
+ if (assertion.id !== lastId) {
+ console.log(`# ${assertion.description} - ${assertion.executionTime}ms`);
+ lastId = assertion.id;
+ }
+ tapOut(assertion);
+ if (assertion.pass !== true) {
+ console.log(` ---
+ operator: ${assertion.operator}
+ expected: ${JSON.stringify(assertion.expected)}
+ actual: ${JSON.stringify(assertion.actual)}
+ ...`);
+ }
+ index++;
+ }
+ } catch (e) {
+ console.log('Bail out! unhandled exception');
+ console.log(e);
+ if (canExit()) {
+ process.exit(1);
+ }
}
- }
- current[leaf] = Object.assign(current[leaf] || {}, newTree);
- return target;
+ finally {
+ const execution = Date.now() - starTime;
+ if (index > 1) {
+ console.log(`
+1..${index - 1}
+# duration ${execution}ms
+# success ${success}
+# failure ${failure}`);
+ }
+ if (failure && canExit()) {
+ process.exit(1);
+ }
+ }
+ };
}
- return {
- get(target){
- return partial(target, [...parts])
+ const Plan = {
+ test(description, coroutine, opts = {}){
+ const testItems = (!coroutine && description.tests) ? [...description] : [{description, coroutine}];
+ this.tests.push(...testItems.map(t=>test(Object.assign(t, opts))));
+ return this;
},
- set
- }
-}
-
-function sortByProperty (prop) {
- const propGetter = pointer(prop).get;
- return (a, b) => {
- const aVal = propGetter(a);
- const bVal = propGetter(b);
- if (aVal === bVal) {
- return 0;
- }
+ only(description, coroutine){
+ return this.test(description, coroutine, {only: true});
+ },
- if (bVal === undefined) {
- return -1;
- }
+ run(sink = tap()){
+ const sinkIterator = sink();
+ sinkIterator.next();
+ const hasOnly = this.tests.some(t=>t.only);
+ const runnable = hasOnly ? this.tests.filter(t=>t.only) : this.tests;
+ return index(function * () {
+ let id = 1;
+ try {
+ const results = runnable.map(t=>t.run());
+ for (let r of results) {
+ const {assertions, executionTime} = yield r;
+ for (let assert of assertions) {
+ sinkIterator.next(Object.assign(assert, {id, executionTime}));
+ }
+ id++;
+ }
+ }
+ catch (e) {
+ sinkIterator.throw(e);
+ } finally {
+ sinkIterator.return();
+ }
+ }.bind(this))
+ },
- if (aVal === undefined) {
- return 1;
+ * [Symbol.iterator](){
+ for (let t of this.tests) {
+ yield t;
+ }
}
+ };
- return aVal < bVal ? -1 : 1;
- }
-}
-
-function sortFactory ({pointer: pointer$$1, direction} = {}) {
- if (!pointer$$1 || direction === 'none') {
- return array => [...array];
- }
-
- const orderFunc = sortByProperty(pointer$$1);
- const compareFunc = direction === 'desc' ? swap(orderFunc) : orderFunc;
-
- return (array) => [...array].sort(compareFunc);
-}
-
-function typeExpression (type) {
- switch (type) {
- case 'boolean':
- return Boolean;
- case 'number':
- return Number;
- case 'date':
- return (val) => new Date(val);
- default:
- return compose(String, (val) => val.toLowerCase());
- }
-}
-
-const operators = {
- includes(value){
- return (input) => input.includes(value);
- },
- is(value){
- return (input) => Object.is(value, input);
- },
- isNot(value){
- return (input) => !Object.is(value, input);
- },
- lt(value){
- return (input) => input < value;
- },
- gt(value){
- return (input) => input > value;
- },
- lte(value){
- return (input) => input <= value;
- },
- gte(value){
- return (input) => input >= value;
- },
- equals(value){
- return (input) => value == input;
- },
- notEquals(value){
- return (input) => value != input;
- }
-};
-
-const every = fns => (...args) => fns.every(fn => fn(...args));
-
-function predicate ({value = '', operator = 'includes', type = 'string'}) {
- const typeIt = typeExpression(type);
- const operateOnTyped = compose(typeIt, operators[operator]);
- const predicateFunc = operateOnTyped(value);
- return compose(typeIt, predicateFunc);
-}
-
-//avoid useless filter lookup (improve perf)
-function normalizeClauses (conf) {
- const output = {};
- const validPath = Object.keys(conf).filter(path => Array.isArray(conf[path]));
- validPath.forEach(path => {
- const validClauses = conf[path].filter(c => c.value !== '');
- if (validClauses.length) {
- output[path] = validClauses;
- }
- });
- return output;
-}
-
-function filter$1 (filter) {
- const normalizedClauses = normalizeClauses(filter);
- const funcList = Object.keys(normalizedClauses).map(path => {
- const getter = pointer(path).get;
- const clauses = normalizedClauses[path].map(predicate);
- return compose(getter, every(clauses));
- });
- const filterPredicate = every(funcList);
-
- return (array) => array.filter(filterPredicate);
-}
-
-var search$1 = function (searchConf = {}) {
- const {value, scope = []} = searchConf;
- const searchPointers = scope.map(field => pointer(field).get);
- if (!scope.length || !value) {
- return array => array;
- } else {
- return array => array.filter(item => searchPointers.some(p => String(p(item)).includes(String(value))))
+ function plan () {
+ return Object.create(Plan, {
+ tests: {value: []},
+ length: {
+ get(){
+ return this.tests.length
+ }
+ }
+ });
}
-};
-function sliceFactory ({page = 1, size} = {}) {
- return function sliceFunction (array = []) {
- const actualSize = size || array.length;
- const offset = (page - 1) * actualSize;
- return array.slice(offset, offset + actualSize);
+ const swap = (f) => (a, b) => f(b, a);
+ const compose = (first, ...fns) => (...args) => fns.reduce((previous, current) => current(previous), first(...args));
+ const curry = (fn, arityLeft) => {
+ const arity = arityLeft || fn.length;
+ return (...args) => {
+ const argLength = args.length || 1;
+ if (arity === argLength) {
+ return fn(...args);
+ }
+ const func = (...moreArgs) => fn(...args, ...moreArgs);
+ return curry(func, arity - args.length);
+ };
+ };
+ const tap$1 = (fn) => arg => {
+ fn(arg);
+ return arg;
};
-}
-function emitter () {
+ const pointer = (path) => {
+ const parts = path.split('.');
+ const partial = (obj = {}, parts = []) => {
+ const p = parts.shift();
+ const current = obj[p];
+ return (current === undefined || current === null || parts.length === 0) ?
+ current : partial(current, parts);
+ };
+ const set = (target, newTree) => {
+ let current = target;
+ const [leaf, ...intermediate] = parts.reverse();
+ for (const key of intermediate.reverse()) {
+ if (current[key] === undefined) {
+ current[key] = {};
+ current = current[key];
+ }
+ }
+ current[leaf] = Object.assign(current[leaf] || {}, newTree);
+ return target;
+ };
+ return {
+ get(target) {
+ return partial(target, [...parts]);
+ },
+ set
+ };
+ };
- const listenersLists = {};
- const instance = {
- on(event, ...listeners){
- listenersLists[event] = (listenersLists[event] || []).concat(listeners);
- return instance;
- },
- dispatch(event, ...args){
- const listeners = listenersLists[event] || [];
- for (let listener of listeners) {
- listener(...args);
+ const defaultComparator = (a, b) => {
+ if (a === b) {
+ return 0;
}
- return instance;
- },
- off(event, ...listeners){
- if (!event) {
- Object.keys(listenersLists).forEach(ev => instance.off(ev));
- } else {
- const list = listenersLists[event] || [];
- listenersLists[event] = listeners.length ? list.filter(listener => !listeners.includes(listener)) : [];
+ if (a === undefined) {
+ return 1;
}
- return instance;
- }
+ if (b === undefined) {
+ return -1;
+ }
+ return a < b ? -1 : 1;
};
- return instance;
-}
-
-const TOGGLE_SORT = 'TOGGLE_SORT';
-const DISPLAY_CHANGED = 'DISPLAY_CHANGED';
-const PAGE_CHANGED = 'CHANGE_PAGE';
-const EXEC_CHANGED = 'EXEC_CHANGED';
-const FILTER_CHANGED = 'FILTER_CHANGED';
-const SUMMARY_CHANGED = 'SUMMARY_CHANGED';
-const SEARCH_CHANGED = 'SEARCH_CHANGED';
-const EXEC_ERROR = 'EXEC_ERROR';
-
-function curriedPointer (path) {
- const {get, set} = pointer(path);
- return {get, set: curry(set)};
-}
-
-var table$2 = function ({
- sortFactory,
- tableState,
- data,
- filterFactory,
- searchFactory
-}) {
- const table = emitter();
- const sortPointer = curriedPointer('sort');
- const slicePointer = curriedPointer('slice');
- const filterPointer = curriedPointer('filter');
- const searchPointer = curriedPointer('search');
-
- const safeAssign = curry((base, extension) => Object.assign({}, base, extension));
- const dispatch = curry(table.dispatch.bind(table), 2);
-
- const dispatchSummary = (filtered) => {
- dispatch(SUMMARY_CHANGED, {
- page: tableState.slice.page,
- size: tableState.slice.size,
- filteredCount: filtered.length
- });
+ var SortDirection;
+ (function (SortDirection) {
+ SortDirection["ASC"] = "asc";
+ SortDirection["DESC"] = "desc";
+ SortDirection["NONE"] = "none";
+ })(SortDirection || (SortDirection = {}));
+ const sortByProperty = (prop, comparator) => {
+ const propGetter = pointer(prop).get;
+ return (a, b) => comparator(propGetter(a), propGetter(b));
+ };
+ const defaultSortFactory = (conf) => {
+ const { pointer: pointer$$1, direction = "asc" /* ASC */, comparator = defaultComparator } = conf;
+ if (!pointer$$1 || direction === "none" /* NONE */) {
+ return (array) => [...array];
+ }
+ const orderFunc = sortByProperty(pointer$$1, comparator);
+ const compareFunc = direction === "desc" /* DESC */ ? swap(orderFunc) : orderFunc;
+ return (array) => [...array].sort(compareFunc);
};
- const exec = ({processingDelay = 20} = {}) => {
- table.dispatch(EXEC_CHANGED, {working: true});
- setTimeout(function () {
- try {
- const filterFunc = filterFactory(filterPointer.get(tableState));
- const searchFunc = searchFactory(searchPointer.get(tableState));
- const sortFunc = sortFactory(sortPointer.get(tableState));
- const sliceFunc = sliceFactory(slicePointer.get(tableState));
- const execFunc = compose(filterFunc, searchFunc, tap$1(dispatchSummary), sortFunc, sliceFunc);
- const displayed = execFunc(data);
- table.dispatch(DISPLAY_CHANGED, displayed.map(d => {
- return {index: data.indexOf(d), value: d};
- }));
- } catch (e) {
- table.dispatch(EXEC_ERROR, e);
- } finally {
- table.dispatch(EXEC_CHANGED, {working: false});
+ var Type;
+ (function (Type) {
+ Type["BOOLEAN"] = "boolean";
+ Type["NUMBER"] = "number";
+ Type["DATE"] = "date";
+ Type["STRING"] = "string";
+ })(Type || (Type = {}));
+ const typeExpression = (type) => {
+ switch (type) {
+ case Type.BOOLEAN:
+ return Boolean;
+ case Type.NUMBER:
+ return Number;
+ case Type.DATE:
+ return val => new Date(val);
+ case Type.STRING:
+ return compose(String, val => val.toLowerCase());
+ default:
+ return val => val;
}
- }, processingDelay);
+ };
+ var FilterOperator;
+ (function (FilterOperator) {
+ FilterOperator["INCLUDES"] = "includes";
+ FilterOperator["IS"] = "is";
+ FilterOperator["IS_NOT"] = "isNot";
+ FilterOperator["LOWER_THAN"] = "lt";
+ FilterOperator["GREATER_THAN"] = "gt";
+ FilterOperator["GREATER_THAN_OR_EQUAL"] = "gte";
+ FilterOperator["LOWER_THAN_OR_EQUAL"] = "lte";
+ FilterOperator["EQUALS"] = "equals";
+ FilterOperator["NOT_EQUALS"] = "notEquals";
+ FilterOperator["ANY_OF"] = "anyOf";
+ })(FilterOperator || (FilterOperator = {}));
+ const not = fn => input => !fn(input);
+ const is = value => input => Object.is(value, input);
+ const lt = value => input => input < value;
+ const gt = value => input => input > value;
+ const equals = value => input => value === input;
+ const includes = value => input => input.includes(value);
+ const anyOf = value => input => value.includes(input);
+ const operators = {
+ ["includes" /* INCLUDES */]: includes,
+ ["is" /* IS */]: is,
+ ["isNot" /* IS_NOT */]: compose(is, not),
+ ["lt" /* LOWER_THAN */]: lt,
+ ["gte" /* GREATER_THAN_OR_EQUAL */]: compose(lt, not),
+ ["gt" /* GREATER_THAN */]: gt,
+ ["lte" /* LOWER_THAN_OR_EQUAL */]: compose(gt, not),
+ ["equals" /* EQUALS */]: equals,
+ ["notEquals" /* NOT_EQUALS */]: compose(equals, not),
+ ["anyOf" /* ANY_OF */]: anyOf
+ };
+ const every = fns => (...args) => fns.every(fn => fn(...args));
+ const predicate = ({ value = '', operator = "includes" /* INCLUDES */, type }) => {
+ const typeIt = typeExpression(type);
+ const operateOnTyped = compose(typeIt, operators[operator]);
+ const predicateFunc = operateOnTyped(value);
+ return compose(typeIt, predicateFunc);
+ };
+ // Avoid useless filter lookup (improve perf)
+ const normalizeClauses = (conf) => {
+ const output = {};
+ const validPath = Object.keys(conf).filter(path => Array.isArray(conf[path]));
+ validPath.forEach(path => {
+ const validClauses = conf[path].filter(c => c.value !== '');
+ if (validClauses.length > 0) {
+ output[path] = validClauses;
+ }
+ });
+ return output;
+ };
+ const filter = (filter) => {
+ const normalizedClauses = normalizeClauses(filter);
+ const funcList = Object.keys(normalizedClauses).map(path => {
+ const getter = pointer(path).get;
+ const clauses = normalizedClauses[path].map(predicate);
+ return compose(getter, every(clauses));
+ });
+ const filterPredicate = every(funcList);
+ return array => array.filter(filterPredicate);
};
- const updateTableState = curry((pter, ev, newPartialState) => compose(
- safeAssign(pter.get(tableState)),
- tap$1(dispatch(ev)),
- pter.set(tableState)
- )(newPartialState));
-
- const resetToFirstPage = () => updateTableState(slicePointer, PAGE_CHANGED, {page: 1});
-
- const tableOperation = (pter, ev) => compose(
- updateTableState(pter, ev),
- resetToFirstPage,
- () => table.exec() // we wrap within a function so table.exec can be overwritten (when using with a server for example)
- );
-
- const api = {
- sort: tableOperation(sortPointer, TOGGLE_SORT),
- filter: tableOperation(filterPointer, FILTER_CHANGED),
- search: tableOperation(searchPointer, SEARCH_CHANGED),
- slice: compose(updateTableState(slicePointer, PAGE_CHANGED), () => table.exec()),
- exec,
- eval(state = tableState){
- return Promise.resolve()
- .then(function () {
- const sortFunc = sortFactory(sortPointer.get(state));
- const searchFunc = searchFactory(searchPointer.get(state));
- const filterFunc = filterFactory(filterPointer.get(state));
- const sliceFunc = sliceFactory(slicePointer.get(state));
- const execFunc = compose(filterFunc, searchFunc, sortFunc, sliceFunc);
- return execFunc(data).map(d => {
- return {index: data.indexOf(d), value: d}
- });
- });
- },
- onDisplayChange(fn){
- table.on(DISPLAY_CHANGED, fn);
- },
- getTableState(){
- const sort = Object.assign({}, tableState.sort);
- const search = Object.assign({}, tableState.search);
- const slice = Object.assign({}, tableState.slice);
- const filter = {};
- for (let prop in tableState.filter) {
- filter[prop] = tableState.filter[prop].map(v => Object.assign({}, v));
+ function re(strs, ...substs) {
+ let reStr = transformRaw(strs.raw[0]);
+ for (const [i, subst] of substs.entries()) {
+ if (subst instanceof RegExp) {
+ reStr += subst.source;
+ } else if (typeof subst === 'string') {
+ reStr += quoteText(subst);
+ } else {
+ throw new Error('Illegal substitution: '+subst);
+ }
+ reStr += transformRaw(strs.raw[i+1]);
}
- return {sort, search, slice, filter};
- }
+ let flags = '';
+ if (reStr.startsWith('/')) {
+ const lastSlashIndex = reStr.lastIndexOf('/');
+ if (lastSlashIndex === 0) {
+ throw new Error('If the `re` string starts with a slash, it must end with a second slash and zero or more flags: '+reStr);
+ }
+ flags = reStr.slice(lastSlashIndex+1);
+ reStr = reStr.slice(1, lastSlashIndex);
+ }
+ return new RegExp(reStr, flags);
+ }
+
+ function transformRaw(str) {
+ return str.replace(/\\`/g, '`');
+ }
+
+ /**
+ * All special characters are escaped, because you may want to quote several characters inside parentheses or square brackets.
+ */
+ function quoteText(text) {
+ return text.replace(/[\\^$.*+?()[\]{}|=!<>:-]/g, '\\$&');
+ }
+
+ const regexp = (input) => {
+ const { value, scope = [], escape = false, flags = '' } = input;
+ const searchPointers = scope.map(field => pointer(field).get);
+ if (scope.length === 0 || !value) {
+ return (array) => array;
+ }
+ const regex = escape === true ? re `/${value}/${flags}` : new RegExp(value, flags);
+ return (array) => array.filter(item => searchPointers.some(p => regex.test(String(p(item)))));
};
- const instance = Object.assign(table, api);
+ const emitter = () => {
+ const listenersLists = {};
+ const instance = {
+ on(event, ...listeners) {
+ listenersLists[event] = (listenersLists[event] || []).concat(listeners);
+ return instance;
+ },
+ dispatch(event, ...args) {
+ const listeners = listenersLists[event] || [];
+ for (const listener of listeners) {
+ listener(...args);
+ }
+ return instance;
+ },
+ off(event, ...listeners) {
+ if (event === undefined) {
+ Object.keys(listenersLists).forEach(ev => instance.off(ev));
+ }
+ else {
+ const list = listenersLists[event] || [];
+ listenersLists[event] = listeners.length ? list.filter(listener => !listeners.includes(listener)) : [];
+ }
+ return instance;
+ }
+ };
+ return instance;
+ };
- Object.defineProperty(instance, 'length', {
- get(){
- return data.length;
- }
- });
+ const sliceFactory = ({ page = 1, size } = { page: 1 }) => (array = []) => {
+ const actualSize = size || array.length;
+ const offset = (page - 1) * actualSize;
+ return array.slice(offset, offset + actualSize);
+ };
- return instance;
-};
-
-var tableDirective = function ({
- sortFactory: sortFactory$$1 = sortFactory,
- filterFactory = filter$1,
- searchFactory = search$1,
- tableState = {sort: {}, slice: {page: 1}, filter: {}, search: {}},
- data = []
-}, ...tableDirectives) {
-
- const coreTable = table$2({sortFactory: sortFactory$$1, filterFactory, tableState, data, searchFactory});
-
- return tableDirectives.reduce((accumulator, newdir) => {
- return Object.assign(accumulator, newdir({
- sortFactory: sortFactory$$1,
- filterFactory,
- searchFactory,
- tableState,
- data,
- table: coreTable
- }));
- }, coreTable);
-};
-
-const table = tableDirective;
-
-var ext = ({query}) => ({table, tableState}) => {
- const exec = () => {
- table.dispatch('EXEC_CHANGED', {working: true});
- return query(tableState)
- .then(({data = [], summary = {}}) => {
- table.dispatch('SUMMARY_CHANGED', summary);
- table.dispatch('DISPLAY_CHANGED', data);
- table.dispatch('EXEC_CHANGED', {working: false});
- })
- .catch(e => {
- table.dispatch('EXEC_ERROR', e);
- table.dispatch('EXEC_CHANGED', {working: false});
+ var SmartTableEvents;
+ (function (SmartTableEvents) {
+ SmartTableEvents["TOGGLE_SORT"] = "TOGGLE_SORT";
+ SmartTableEvents["DISPLAY_CHANGED"] = "DISPLAY_CHANGED";
+ SmartTableEvents["PAGE_CHANGED"] = "CHANGE_PAGE";
+ SmartTableEvents["EXEC_CHANGED"] = "EXEC_CHANGED";
+ SmartTableEvents["FILTER_CHANGED"] = "FILTER_CHANGED";
+ SmartTableEvents["SUMMARY_CHANGED"] = "SUMMARY_CHANGED";
+ SmartTableEvents["SEARCH_CHANGED"] = "SEARCH_CHANGED";
+ SmartTableEvents["EXEC_ERROR"] = "EXEC_ERROR";
+ })(SmartTableEvents || (SmartTableEvents = {}));
+ const curriedPointer = (path) => {
+ const { get, set } = pointer(path);
+ return { get, set: curry(set) };
+ };
+ const tableDirective = ({ sortFactory, tableState, data, filterFactory, searchFactory }) => {
+ let filteredCount = data.length;
+ let matchingItems = data;
+ const table = emitter();
+ const sortPointer = curriedPointer('sort');
+ const slicePointer = curriedPointer('slice');
+ const filterPointer = curriedPointer('filter');
+ const searchPointer = curriedPointer('search');
+ // We need to register in case the summary comes from outside (like server data)
+ table.on("SUMMARY_CHANGED" /* SUMMARY_CHANGED */, ({ filteredCount: count }) => {
+ filteredCount = count;
+ });
+ const safeAssign = curry((base, extension) => Object.assign({}, base, extension));
+ const dispatch = curry(table.dispatch, 2);
+ const dispatchSummary = (filtered) => {
+ matchingItems = filtered;
+ return dispatch("SUMMARY_CHANGED" /* SUMMARY_CHANGED */, {
+ page: tableState.slice.page,
+ size: tableState.slice.size,
+ filteredCount: filtered.length
+ });
+ };
+ const exec = ({ processingDelay = 20 } = { processingDelay: 20 }) => {
+ table.dispatch("EXEC_CHANGED" /* EXEC_CHANGED */, { working: true });
+ setTimeout(() => {
+ try {
+ const filterFunc = filterFactory(filterPointer.get(tableState));
+ const searchFunc = searchFactory(searchPointer.get(tableState));
+ const sortFunc = sortFactory(sortPointer.get(tableState));
+ const sliceFunc = sliceFactory(slicePointer.get(tableState));
+ const execFunc = compose(filterFunc, searchFunc, tap$1(dispatchSummary), sortFunc, sliceFunc);
+ const displayed = execFunc(data);
+ table.dispatch("DISPLAY_CHANGED" /* DISPLAY_CHANGED */, displayed.map(d => ({
+ index: data.indexOf(d),
+ value: d
+ })));
+ }
+ catch (err) {
+ table.dispatch("EXEC_ERROR" /* EXEC_ERROR */, err);
+ }
+ finally {
+ table.dispatch("EXEC_CHANGED" /* EXEC_CHANGED */, { working: false });
+ }
+ }, processingDelay);
+ };
+ const updateTableState = curry((pter, ev, newPartialState) => compose(safeAssign(pter.get(tableState)), tap$1(dispatch(ev)), pter.set(tableState))(newPartialState));
+ const resetToFirstPage = () => updateTableState(slicePointer, "CHANGE_PAGE" /* PAGE_CHANGED */, { page: 1 });
+ const tableOperation = (pter, ev) => compose(updateTableState(pter, ev), resetToFirstPage, () => table.exec() // We wrap within a function so table.exec can be overwritten (when using with a server for example)
+ );
+ const api = {
+ sort: tableOperation(sortPointer, "TOGGLE_SORT" /* TOGGLE_SORT */),
+ filter: tableOperation(filterPointer, "FILTER_CHANGED" /* FILTER_CHANGED */),
+ search: tableOperation(searchPointer, "SEARCH_CHANGED" /* SEARCH_CHANGED */),
+ slice: compose(updateTableState(slicePointer, "CHANGE_PAGE" /* PAGE_CHANGED */), () => table.exec()),
+ exec,
+ async eval(state = tableState) {
+ const sortFunc = sortFactory(sortPointer.get(state));
+ const searchFunc = searchFactory(searchPointer.get(state));
+ const filterFunc = filterFactory(filterPointer.get(state));
+ const sliceFunc = sliceFactory(slicePointer.get(state));
+ const execFunc = compose(filterFunc, searchFunc, sortFunc, sliceFunc);
+ return execFunc(data).map(d => ({ index: data.indexOf(d), value: d }));
+ },
+ onDisplayChange(fn) {
+ table.on("DISPLAY_CHANGED" /* DISPLAY_CHANGED */, fn);
+ },
+ getTableState() {
+ const sort = Object.assign({}, tableState.sort);
+ const search = Object.assign({}, tableState.search);
+ const slice = Object.assign({}, tableState.slice);
+ const filter = {};
+ for (const prop of Object.getOwnPropertyNames(tableState.filter)) {
+ filter[prop] = tableState.filter[prop].map(v => Object.assign({}, v));
+ }
+ return { sort, search, slice, filter };
+ },
+ getMatchingItems() {
+ return [...matchingItems];
+ }
+ };
+ const instance = Object.assign(table, api);
+ Object.defineProperties(instance, {
+ filteredCount: {
+ get() {
+ return filteredCount;
+ }
+ },
+ length: {
+ get() {
+ return data.length;
+ }
+ }
});
+ return instance;
+ };
+ // todo expose and re-export from smart-table-filter
+ var FilterType;
+ (function (FilterType) {
+ FilterType["BOOLEAN"] = "boolean";
+ FilterType["NUMBER"] = "number";
+ FilterType["DATE"] = "date";
+ FilterType["STRING"] = "string";
+ })(FilterType || (FilterType = {}));
+
+ const defaultTableState = () => ({ sort: {}, slice: { page: 1 }, filter: {}, search: {} });
+ const smartTable = ({ sortFactory = defaultSortFactory, filterFactory = filter, searchFactory = regexp, tableState = defaultTableState(), data = [] } = {
+ sortFactory: defaultSortFactory,
+ filterFactory: filter,
+ searchFactory: regexp,
+ tableState: defaultTableState(),
+ data: []
+ }, ...tableExtensions) => {
+ const coreTable = tableDirective({ sortFactory, filterFactory, tableState, data, searchFactory });
+ return tableExtensions.reduce((accumulator, newdir) => Object.assign(accumulator, newdir({
+ sortFactory,
+ filterFactory,
+ searchFactory,
+ tableState,
+ data,
+ table: coreTable
+ })), coreTable);
};
- return Object.assign(table, {
- exec, eval: (ts = tableState) => query(ts).then(({data}) => data)
- });
-};
-
-plan$1()
- .test('should dispatch working state change', function * (t) {
- let workingState;
- const tb = table({data: []}, ext({query: (tableState) => Promise.resolve({summary: {}, data: []})}));
- tb.on('EXEC_CHANGED', ({working}) => {
- workingState = working;
- });
- const p = tb.sort({pointer: 'foo'});
- t.equal(workingState, true);
- yield p;
- t.equal(workingState, false);
- })
- .test('should dispatch error when promise is rejected', function * (t) {
- let workingState;
- let err;
- const error = {message: 'ERROR !!!'};
- const tb = table({data: []}, ext({query: (tableState) => Promise.reject(error)}));
- tb.on('EXEC_CHANGED', ({working}) => {
- workingState = working;
- });
- tb.on('EXEC_ERROR', (e) => {
- err = e;
+ var ext = ({query}) => ({table, tableState}) => {
+ const exec = () => {
+ table.dispatch('EXEC_CHANGED', {working: true});
+ return query(tableState)
+ .then(({data = [], summary = {}}) => {
+ table.dispatch('SUMMARY_CHANGED', summary);
+ table.dispatch('DISPLAY_CHANGED', data);
+ table.dispatch('EXEC_CHANGED', {working: false});
+ })
+ .catch(e => {
+ table.dispatch('EXEC_ERROR', e);
+ table.dispatch('EXEC_CHANGED', {working: false});
+ });
+ };
+
+ return Object.assign(table, {
+ exec, eval: (ts = tableState) => query(ts).then(({data}) => data)
});
- const p = tb.sort({pointer: 'foo'});
- t.equal(workingState, true);
- try {
+ };
+
+ plan()
+ .test('should dispatch working state change', function * (t) {
+ let workingState;
+ const tb = smartTable({data: []}, ext({query: (tableState) => Promise.resolve({summary: {}, data: []})}));
+ tb.on('EXEC_CHANGED', ({working}) => {
+ workingState = working;
+ });
+ const p = tb.sort({pointer: 'foo'});
+ t.equal(workingState, true);
yield p;
- } catch (e) {
- t.fail('should not be here');
- }
- t.equal(workingState, false);
- t.equal(err, error);
- })
- .test('should dispatch summary changed based on the client value', function * (t) {
- let summary$$1;
- const tb = table({data: []}, ext({
- query: (tableState) => Promise.resolve({
- summary: {
- foo: 'bar'
- }, data: []
- })
- }));
- tb.on('SUMMARY_CHANGED', s => {
- summary$$1 = s;
- });
- const p = tb.sort({pointer: 'foo'});
- yield p;
- t.deepEqual(summary$$1, {foo: 'bar'});
- })
- .test('should dispatch display changed based on the client value', function * (t) {
- let data;
- const tb = table({data: []}, ext({
- query: (tableState) => Promise.resolve({
- summary: {
- foo: 'bar'
- }, data: [
+ t.equal(workingState, false);
+ })
+ .test('should dispatch error when promise is rejected', function * (t) {
+ let workingState;
+ let err;
+ const error = {message: 'ERROR !!!'};
+ const tb = smartTable({data: []}, ext({query: (tableState) => Promise.reject(error)}));
+ tb.on('EXEC_CHANGED', ({working}) => {
+ workingState = working;
+ });
+ tb.on('EXEC_ERROR', (e) => {
+ err = e;
+ });
+ const p = tb.sort({pointer: 'foo'});
+ t.equal(workingState, true);
+ try {
+ yield p;
+ } catch (e) {
+ t.fail('should not be here');
+ }
+ t.equal(workingState, false);
+ t.equal(err, error);
+ })
+ .test('should dispatch summary changed based on the client value', function * (t) {
+ let summary;
+ const tb = smartTable({data: []}, ext({
+ query: (tableState) => Promise.resolve({
+ summary: {
+ foo: 'bar'
+ }, data: []
+ })
+ }));
+ tb.on('SUMMARY_CHANGED', s => {
+ summary = s;
+ });
+ const p = tb.sort({pointer: 'foo'});
+ yield p;
+ t.deepEqual(summary, {foo: 'bar'});
+ })
+ .test('should dispatch display changed based on the client value', function * (t) {
+ let data;
+ const tb = smartTable({data: []}, ext({
+ query: (tableState) => Promise.resolve({
+ summary: {
+ foo: 'bar'
+ }, data: [
+ {woot: 'blah'},
+ {woot: 'im'}
+ ]
+ })
+ }));
+ tb.on('DISPLAY_CHANGED', d => {
+ data = d;
+ });
+ const p = tb.sort({pointer: 'foo'});
+ yield p;
+ t.deepEqual(data, [
{woot: 'blah'},
{woot: 'im'}
]
- })
- }));
- tb.on('DISPLAY_CHANGED', d => {
- data = d;
- });
- const p = tb.sort({pointer: 'foo'});
- yield p;
- t.deepEqual(data, [
+ );
+ })
+ .test('should overwrite eval function to resolve with value provided by client', function * (t) {
+ const tb = smartTable({data: []}, ext({
+ query: (tableState) => Promise.resolve({
+ summary: {
+ foo: 'bar'
+ }, data: [
+ {woot: 'blah'},
+ {woot: 'im'}
+ ]
+ })
+ }));
+
+ const d = yield tb.eval();
+ t.deepEqual(d, [
{woot: 'blah'},
{woot: 'im'}
- ]
- );
- })
- .test('should overwrite eval function to resolve with value provided by client', function * (t) {
- const tb = table({data: []}, ext({
- query: (tableState) => Promise.resolve({
- summary: {
- foo: 'bar'
- }, data: [
- {woot: 'blah'},
- {woot: 'im'}
- ]
- })
- }));
-
- const d = yield tb.eval();
- t.deepEqual(d, [
- {woot: 'blah'},
- {woot: 'im'}
- ]);
- })
- .run();
+ ]);
+ })
+ .run();
}());
//# sourceMappingURL=index.js.map
diff --git a/test/dist/index.js.map b/test/dist/index.js.map
index b709641..b025c3c 100644
--- a/test/dist/index.js.map
+++ b/test/dist/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sources":["../../node_modules/zora/dist/zora.es.js","../../node_modules/smart-table-operators/index.js","../../node_modules/smart-table-json-pointer/index.js","../../node_modules/smart-table-sort/index.js","../../node_modules/smart-table-filter/index.js","../../node_modules/smart-table-search/index.js","../../node_modules/smart-table-core/src/slice.js","../../node_modules/smart-table-events/index.js","../../node_modules/smart-table-core/src/events.js","../../node_modules/smart-table-core/src/directives/table.js","../../node_modules/smart-table-core/src/table.js","../../node_modules/smart-table-core/index.js","../../index.js","../index.js"],"sourcesContent":["/**\n * slice() reference.\n */\n\nvar slice = Array.prototype.slice;\n\n/**\n * Expose `co`.\n */\n\nvar index = co['default'] = co.co = co;\n\n/**\n * Wrap the given generator `fn` into a\n * function that returns a promise.\n * This is a separate function so that\n * every `co()` call doesn't create a new,\n * unnecessary closure.\n *\n * @param {GeneratorFunction} fn\n * @return {Function}\n * @api public\n */\n\nco.wrap = function (fn) {\n createPromise.__generatorFunction__ = fn;\n return createPromise;\n function createPromise() {\n return co.call(this, fn.apply(this, arguments));\n }\n};\n\n/**\n * Execute the generator function or a generator\n * and return a promise.\n *\n * @param {Function} fn\n * @return {Promise}\n * @api public\n */\n\nfunction co(gen) {\n var ctx = this;\n var args = slice.call(arguments, 1);\n\n // we wrap everything in a promise to avoid promise chaining,\n // which leads to memory leak errors.\n // see https://github.com/tj/co/issues/180\n return new Promise(function(resolve, reject) {\n if (typeof gen === 'function') gen = gen.apply(ctx, args);\n if (!gen || typeof gen.next !== 'function') return resolve(gen);\n\n onFulfilled();\n\n /**\n * @param {Mixed} res\n * @return {Promise}\n * @api private\n */\n\n function onFulfilled(res) {\n var ret;\n try {\n ret = gen.next(res);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n /**\n * @param {Error} err\n * @return {Promise}\n * @api private\n */\n\n function onRejected(err) {\n var ret;\n try {\n ret = gen.throw(err);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n /**\n * Get the next value in the generator,\n * return a promise.\n *\n * @param {Object} ret\n * @return {Promise}\n * @api private\n */\n\n function next(ret) {\n if (ret.done) return resolve(ret.value);\n var value = toPromise.call(ctx, ret.value);\n if (value && isPromise(value)) return value.then(onFulfilled, onRejected);\n return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '\n + 'but the following object was passed: \"' + String(ret.value) + '\"'));\n }\n });\n}\n\n/**\n * Convert a `yield`ed value into a promise.\n *\n * @param {Mixed} obj\n * @return {Promise}\n * @api private\n */\n\nfunction toPromise(obj) {\n if (!obj) return obj;\n if (isPromise(obj)) return obj;\n if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);\n if ('function' == typeof obj) return thunkToPromise.call(this, obj);\n if (Array.isArray(obj)) return arrayToPromise.call(this, obj);\n if (isObject(obj)) return objectToPromise.call(this, obj);\n return obj;\n}\n\n/**\n * Convert a thunk to a promise.\n *\n * @param {Function}\n * @return {Promise}\n * @api private\n */\n\nfunction thunkToPromise(fn) {\n var ctx = this;\n return new Promise(function (resolve, reject) {\n fn.call(ctx, function (err, res) {\n if (err) return reject(err);\n if (arguments.length > 2) res = slice.call(arguments, 1);\n resolve(res);\n });\n });\n}\n\n/**\n * Convert an array of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Array} obj\n * @return {Promise}\n * @api private\n */\n\nfunction arrayToPromise(obj) {\n return Promise.all(obj.map(toPromise, this));\n}\n\n/**\n * Convert an object of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Object} obj\n * @return {Promise}\n * @api private\n */\n\nfunction objectToPromise(obj){\n var results = new obj.constructor();\n var keys = Object.keys(obj);\n var promises = [];\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var promise = toPromise.call(this, obj[key]);\n if (promise && isPromise(promise)) defer(promise, key);\n else results[key] = obj[key];\n }\n return Promise.all(promises).then(function () {\n return results;\n });\n\n function defer(promise, key) {\n // predefine the key in the result\n results[key] = undefined;\n promises.push(promise.then(function (res) {\n results[key] = res;\n }));\n }\n}\n\n/**\n * Check if `obj` is a promise.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isPromise(obj) {\n return 'function' == typeof obj.then;\n}\n\n/**\n * Check if `obj` is a generator.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isGenerator(obj) {\n return 'function' == typeof obj.next && 'function' == typeof obj.throw;\n}\n\n/**\n * Check if `obj` is a generator function.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\nfunction isGeneratorFunction(obj) {\n var constructor = obj.constructor;\n if (!constructor) return false;\n if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;\n return isGenerator(constructor.prototype);\n}\n\n/**\n * Check for plain object.\n *\n * @param {Mixed} val\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(val) {\n return Object == val.constructor;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar keys = createCommonjsModule(function (module, exports) {\nexports = module.exports = typeof Object.keys === 'function'\n ? Object.keys : shim;\n\nexports.shim = shim;\nfunction shim (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n}\n});\n\nvar is_arguments = createCommonjsModule(function (module, exports) {\nvar supportsArgumentsClass = (function(){\n return Object.prototype.toString.call(arguments)\n})() == '[object Arguments]';\n\nexports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\nexports.supported = supported;\nfunction supported(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nexports.unsupported = unsupported;\nfunction unsupported(object){\n return object &&\n typeof object == 'object' &&\n typeof object.length == 'number' &&\n Object.prototype.hasOwnProperty.call(object, 'callee') &&\n !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n false;\n}\n});\n\nvar index$1 = createCommonjsModule(function (module) {\nvar pSlice = Array.prototype.slice;\nvar objectKeys = keys;\nvar isArguments = is_arguments;\n\nvar deepEqual = module.exports = function (actual, expected, opts) {\n if (!opts) opts = {};\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n\n // 7.3. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n return opts.strict ? actual === expected : actual == expected;\n\n // 7.4. For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected, opts);\n }\n};\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer (x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') return false;\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n var i, key;\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n //~~~I've managed to break Object.keys through screwy arguments passing.\n // Converting to array solves the problem.\n if (isArguments(a)) {\n if (!isArguments(b)) {\n return false;\n }\n a = pSlice.call(a);\n b = pSlice.call(b);\n return deepEqual(a, b, opts);\n }\n if (isBuffer(a)) {\n if (!isBuffer(b)) {\n return false;\n }\n if (a.length !== b.length) return false;\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n try {\n var ka = objectKeys(a),\n kb = objectKeys(b);\n } catch (e) {//happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) return false;\n }\n return typeof a === typeof b;\n}\n});\n\nconst assertions = {\n ok(val, message = 'should be truthy') {\n const assertionResult = {\n pass: Boolean(val),\n expected: 'truthy',\n actual: val,\n operator: 'ok',\n message\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n deepEqual(actual, expected, message = 'should be equivalent') {\n const assertionResult = {\n pass: index$1(actual, expected),\n actual,\n expected,\n message,\n operator: 'deepEqual'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n equal(actual, expected, message = 'should be equal') {\n const assertionResult = {\n pass: actual === expected,\n actual,\n expected,\n message,\n operator: 'equal'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n notOk(val, message = 'should not be truthy') {\n const assertionResult = {\n pass: !Boolean(val),\n expected: 'falsy',\n actual: val,\n operator: 'notOk',\n message\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n notDeepEqual(actual, expected, message = 'should not be equivalent') {\n const assertionResult = {\n pass: !index$1(actual, expected),\n actual,\n expected,\n message,\n operator: 'notDeepEqual'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n notEqual(actual, expected, message = 'should not be equal') {\n const assertionResult = {\n pass: actual !== expected,\n actual,\n expected,\n message,\n operator: 'notEqual'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n throws(func, expected, message) {\n let caught, pass, actual;\n if (typeof expected === 'string') {\n [expected, message] = [message, expected];\n }\n try {\n func();\n } catch (error) {\n caught = {error};\n }\n pass = caught !== undefined;\n actual = caught && caught.error;\n if (expected instanceof RegExp) {\n pass = expected.test(actual) || expected.test(actual && actual.message);\n expected = String(expected);\n } else if (typeof expected === 'function' && caught) {\n pass = actual instanceof expected;\n actual = actual.constructor;\n }\n const assertionResult = {\n pass,\n expected,\n actual,\n operator: 'throws',\n message: message || 'should throw'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n doesNotThrow(func, expected, message) {\n let caught;\n if (typeof expected === 'string') {\n [expected, message] = [message, expected];\n }\n try {\n func();\n } catch (error) {\n caught = {error};\n }\n const assertionResult = {\n pass: caught === undefined,\n expected: 'no thrown error',\n actual: caught && caught.error,\n operator: 'doesNotThrow',\n message: message || 'should not throw'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n fail(reason = 'fail called') {\n const assertionResult = {\n pass: false,\n actual: 'fail called',\n expected: 'fail not called',\n message: reason,\n operator: 'fail'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n }\n};\n\nfunction assertion (test) {\n return Object.create(assertions, {test: {value: test}});\n}\n\nconst Test = {\n run: function () {\n const assert = assertion(this);\n const now = Date.now();\n return index(this.coroutine(assert))\n .then(() => {\n return {assertions: this.assertions, executionTime: Date.now() - now};\n });\n },\n addAssertion(){\n const newAssertions = [...arguments].map(a => Object.assign({description: this.description}, a));\n this.assertions.push(...newAssertions);\n return this;\n }\n};\n\nfunction test ({description, coroutine, only = false}) {\n return Object.create(Test, {\n description: {value: description},\n coroutine: {value: coroutine},\n assertions: {value: []},\n only: {value: only},\n length: {\n get(){\n return this.assertions.length\n }\n }\n });\n}\n\nfunction tapOut ({pass, message, index}) {\n const status = pass === true ? 'ok' : 'not ok';\n console.log([status, index, message].join(' '));\n}\n\nfunction canExit () {\n return typeof process !== 'undefined' && typeof process.exit === 'function';\n}\n\nfunction tap () {\n return function * () {\n let index = 1;\n let lastId = 0;\n let success = 0;\n let failure = 0;\n\n const starTime = Date.now();\n console.log('TAP version 13');\n try {\n while (true) {\n const assertion = yield;\n if (assertion.pass === true) {\n success++;\n } else {\n failure++;\n }\n assertion.index = index;\n if (assertion.id !== lastId) {\n console.log(`# ${assertion.description} - ${assertion.executionTime}ms`);\n lastId = assertion.id;\n }\n tapOut(assertion);\n if (assertion.pass !== true) {\n console.log(` ---\n operator: ${assertion.operator}\n expected: ${JSON.stringify(assertion.expected)}\n actual: ${JSON.stringify(assertion.actual)}\n ...`);\n }\n index++;\n }\n } catch (e) {\n console.log('Bail out! unhandled exception');\n console.log(e);\n if (canExit()) {\n process.exit(1);\n }\n }\n finally {\n const execution = Date.now() - starTime;\n if (index > 1) {\n console.log(`\n1..${index - 1}\n# duration ${execution}ms\n# success ${success}\n# failure ${failure}`);\n }\n if (failure && canExit()) {\n process.exit(1);\n }\n }\n };\n}\n\nconst Plan = {\n test(description, coroutine, opts = {}){\n const testItems = (!coroutine && description.tests) ? [...description] : [{description, coroutine}];\n this.tests.push(...testItems.map(t=>test(Object.assign(t, opts))));\n return this;\n },\n\n only(description, coroutine){\n return this.test(description, coroutine, {only: true});\n },\n\n run(sink = tap()){\n const sinkIterator = sink();\n sinkIterator.next();\n const hasOnly = this.tests.some(t=>t.only);\n const runnable = hasOnly ? this.tests.filter(t=>t.only) : this.tests;\n return index(function * () {\n let id = 1;\n try {\n const results = runnable.map(t=>t.run());\n for (let r of results) {\n const {assertions, executionTime} = yield r;\n for (let assert of assertions) {\n sinkIterator.next(Object.assign(assert, {id, executionTime}));\n }\n id++;\n }\n }\n catch (e) {\n sinkIterator.throw(e);\n } finally {\n sinkIterator.return();\n }\n }.bind(this))\n },\n\n * [Symbol.iterator](){\n for (let t of this.tests) {\n yield t;\n }\n }\n};\n\nfunction plan () {\n return Object.create(Plan, {\n tests: {value: []},\n length: {\n get(){\n return this.tests.length\n }\n }\n });\n}\n\nexport default plan;\n","export function swap (f) {\n return (a, b) => f(b, a);\n}\n\nexport function compose (first, ...fns) {\n return (...args) => fns.reduce((previous, current) => current(previous), first(...args));\n}\n\nexport function curry (fn, arityLeft) {\n const arity = arityLeft || fn.length;\n return (...args) => {\n const argLength = args.length || 1;\n if (arity === argLength) {\n return fn(...args);\n } else {\n const func = (...moreArgs) => fn(...args, ...moreArgs);\n return curry(func, arity - args.length);\n }\n };\n}\n\nexport function apply (fn) {\n return (...args) => fn(...args);\n}\n\nexport function tap (fn) {\n return arg => {\n fn(arg);\n return arg;\n }\n}","export default function pointer (path) {\n\n const parts = path.split('.');\n\n function partial (obj = {}, parts = []) {\n const p = parts.shift();\n const current = obj[p];\n return (current === undefined || parts.length === 0) ?\n current : partial(current, parts);\n }\n\n function set (target, newTree) {\n let current = target;\n const [leaf, ...intermediate] = parts.reverse();\n for (let key of intermediate.reverse()) {\n if (current[key] === undefined) {\n current[key] = {};\n current = current[key];\n }\n }\n current[leaf] = Object.assign(current[leaf] || {}, newTree);\n return target;\n }\n\n return {\n get(target){\n return partial(target, [...parts])\n },\n set\n }\n};\n","import {swap} from 'smart-table-operators';\nimport pointer from 'smart-table-json-pointer';\n\n\nfunction sortByProperty (prop) {\n const propGetter = pointer(prop).get;\n return (a, b) => {\n const aVal = propGetter(a);\n const bVal = propGetter(b);\n\n if (aVal === bVal) {\n return 0;\n }\n\n if (bVal === undefined) {\n return -1;\n }\n\n if (aVal === undefined) {\n return 1;\n }\n\n return aVal < bVal ? -1 : 1;\n }\n}\n\nexport default function sortFactory ({pointer, direction} = {}) {\n if (!pointer || direction === 'none') {\n return array => [...array];\n }\n\n const orderFunc = sortByProperty(pointer);\n const compareFunc = direction === 'desc' ? swap(orderFunc) : orderFunc;\n\n return (array) => [...array].sort(compareFunc);\n}","import {compose} from 'smart-table-operators';\nimport pointer from 'smart-table-json-pointer';\n\nfunction typeExpression (type) {\n switch (type) {\n case 'boolean':\n return Boolean;\n case 'number':\n return Number;\n case 'date':\n return (val) => new Date(val);\n default:\n return compose(String, (val) => val.toLowerCase());\n }\n}\n\nconst operators = {\n includes(value){\n return (input) => input.includes(value);\n },\n is(value){\n return (input) => Object.is(value, input);\n },\n isNot(value){\n return (input) => !Object.is(value, input);\n },\n lt(value){\n return (input) => input < value;\n },\n gt(value){\n return (input) => input > value;\n },\n lte(value){\n return (input) => input <= value;\n },\n gte(value){\n return (input) => input >= value;\n },\n equals(value){\n return (input) => value == input;\n },\n notEquals(value){\n return (input) => value != input;\n }\n};\n\nconst every = fns => (...args) => fns.every(fn => fn(...args));\n\nexport function predicate ({value = '', operator = 'includes', type = 'string'}) {\n const typeIt = typeExpression(type);\n const operateOnTyped = compose(typeIt, operators[operator]);\n const predicateFunc = operateOnTyped(value);\n return compose(typeIt, predicateFunc);\n}\n\n//avoid useless filter lookup (improve perf)\nfunction normalizeClauses (conf) {\n const output = {};\n const validPath = Object.keys(conf).filter(path => Array.isArray(conf[path]));\n validPath.forEach(path => {\n const validClauses = conf[path].filter(c => c.value !== '');\n if (validClauses.length) {\n output[path] = validClauses;\n }\n });\n return output;\n}\n\nexport default function filter (filter) {\n const normalizedClauses = normalizeClauses(filter);\n const funcList = Object.keys(normalizedClauses).map(path => {\n const getter = pointer(path).get;\n const clauses = normalizedClauses[path].map(predicate);\n return compose(getter, every(clauses));\n });\n const filterPredicate = every(funcList);\n\n return (array) => array.filter(filterPredicate);\n}","import pointer from 'smart-table-json-pointer';\n\nexport default function (searchConf = {}) {\n const {value, scope = []} = searchConf;\n const searchPointers = scope.map(field => pointer(field).get);\n if (!scope.length || !value) {\n return array => array;\n } else {\n return array => array.filter(item => searchPointers.some(p => String(p(item)).includes(String(value))))\n }\n}","export default function sliceFactory ({page = 1, size} = {}) {\n return function sliceFunction (array = []) {\n const actualSize = size || array.length;\n const offset = (page - 1) * actualSize;\n return array.slice(offset, offset + actualSize);\n };\n}\n","export function emitter () {\n\n const listenersLists = {};\n const instance = {\n on(event, ...listeners){\n listenersLists[event] = (listenersLists[event] || []).concat(listeners);\n return instance;\n },\n dispatch(event, ...args){\n const listeners = listenersLists[event] || [];\n for (let listener of listeners) {\n listener(...args);\n }\n return instance;\n },\n off(event, ...listeners){\n if (!event) {\n Object.keys(listenersLists).forEach(ev => instance.off(ev));\n } else {\n const list = listenersLists[event] || [];\n listenersLists[event] = listeners.length ? list.filter(listener => !listeners.includes(listener)) : [];\n }\n return instance;\n }\n };\n return instance;\n}\n\nexport function proxyListener (eventMap) {\n return function ({emitter}) {\n\n const proxy = {};\n let eventListeners = {};\n\n for (let ev of Object.keys(eventMap)) {\n const method = eventMap[ev];\n eventListeners[ev] = [];\n proxy[method] = function (...listeners) {\n eventListeners[ev] = eventListeners[ev].concat(listeners);\n emitter.on(ev, ...listeners);\n return proxy;\n };\n }\n\n return Object.assign(proxy, {\n off(ev){\n if (!ev) {\n Object.keys(eventListeners).forEach(eventName => proxy.off(eventName));\n }\n if (eventListeners[ev]) {\n emitter.off(ev, ...eventListeners[ev]);\n }\n return proxy;\n }\n });\n }\n}","export const TOGGLE_SORT = 'TOGGLE_SORT';\nexport const DISPLAY_CHANGED = 'DISPLAY_CHANGED';\nexport const PAGE_CHANGED = 'CHANGE_PAGE';\nexport const EXEC_CHANGED = 'EXEC_CHANGED';\nexport const FILTER_CHANGED = 'FILTER_CHANGED';\nexport const SUMMARY_CHANGED = 'SUMMARY_CHANGED';\nexport const SEARCH_CHANGED = 'SEARCH_CHANGED';\nexport const EXEC_ERROR = 'EXEC_ERROR';","import slice from '../slice';\nimport {curry, tap, compose} from 'smart-table-operators';\nimport pointer from 'smart-table-json-pointer';\nimport {emitter} from 'smart-table-events';\nimport sliceFactory from '../slice';\nimport {\n SUMMARY_CHANGED,\n TOGGLE_SORT,\n DISPLAY_CHANGED,\n PAGE_CHANGED,\n EXEC_CHANGED,\n FILTER_CHANGED,\n SEARCH_CHANGED,\n EXEC_ERROR\n} from '../events';\n\nfunction curriedPointer (path) {\n const {get, set} = pointer(path);\n return {get, set: curry(set)};\n}\n\nexport default function ({\n sortFactory,\n tableState,\n data,\n filterFactory,\n searchFactory\n}) {\n const table = emitter();\n const sortPointer = curriedPointer('sort');\n const slicePointer = curriedPointer('slice');\n const filterPointer = curriedPointer('filter');\n const searchPointer = curriedPointer('search');\n\n const safeAssign = curry((base, extension) => Object.assign({}, base, extension));\n const dispatch = curry(table.dispatch.bind(table), 2);\n\n const dispatchSummary = (filtered) => {\n dispatch(SUMMARY_CHANGED, {\n page: tableState.slice.page,\n size: tableState.slice.size,\n filteredCount: filtered.length\n });\n };\n\n const exec = ({processingDelay = 20} = {}) => {\n table.dispatch(EXEC_CHANGED, {working: true});\n setTimeout(function () {\n try {\n const filterFunc = filterFactory(filterPointer.get(tableState));\n const searchFunc = searchFactory(searchPointer.get(tableState));\n const sortFunc = sortFactory(sortPointer.get(tableState));\n const sliceFunc = sliceFactory(slicePointer.get(tableState));\n const execFunc = compose(filterFunc, searchFunc, tap(dispatchSummary), sortFunc, sliceFunc);\n const displayed = execFunc(data);\n table.dispatch(DISPLAY_CHANGED, displayed.map(d => {\n return {index: data.indexOf(d), value: d};\n }));\n } catch (e) {\n table.dispatch(EXEC_ERROR, e);\n } finally {\n table.dispatch(EXEC_CHANGED, {working: false});\n }\n }, processingDelay);\n };\n\n const updateTableState = curry((pter, ev, newPartialState) => compose(\n safeAssign(pter.get(tableState)),\n tap(dispatch(ev)),\n pter.set(tableState)\n )(newPartialState));\n\n const resetToFirstPage = () => updateTableState(slicePointer, PAGE_CHANGED, {page: 1});\n\n const tableOperation = (pter, ev) => compose(\n updateTableState(pter, ev),\n resetToFirstPage,\n () => table.exec() // we wrap within a function so table.exec can be overwritten (when using with a server for example)\n );\n\n const api = {\n sort: tableOperation(sortPointer, TOGGLE_SORT),\n filter: tableOperation(filterPointer, FILTER_CHANGED),\n search: tableOperation(searchPointer, SEARCH_CHANGED),\n slice: compose(updateTableState(slicePointer, PAGE_CHANGED), () => table.exec()),\n exec,\n eval(state = tableState){\n return Promise.resolve()\n .then(function () {\n const sortFunc = sortFactory(sortPointer.get(state));\n const searchFunc = searchFactory(searchPointer.get(state));\n const filterFunc = filterFactory(filterPointer.get(state));\n const sliceFunc = sliceFactory(slicePointer.get(state));\n const execFunc = compose(filterFunc, searchFunc, sortFunc, sliceFunc);\n return execFunc(data).map(d => {\n return {index: data.indexOf(d), value: d}\n });\n });\n },\n onDisplayChange(fn){\n table.on(DISPLAY_CHANGED, fn);\n },\n getTableState(){\n const sort = Object.assign({}, tableState.sort);\n const search = Object.assign({}, tableState.search);\n const slice = Object.assign({}, tableState.slice);\n const filter = {};\n for (let prop in tableState.filter) {\n filter[prop] = tableState.filter[prop].map(v => Object.assign({}, v));\n }\n return {sort, search, slice, filter};\n }\n };\n\n const instance = Object.assign(table, api);\n\n Object.defineProperty(instance, 'length', {\n get(){\n return data.length;\n }\n });\n\n return instance;\n}","import sort from 'smart-table-sort';\nimport filter from 'smart-table-filter';\nimport search from 'smart-table-search';\nimport table from './directives/table';\n\nexport default function ({\n sortFactory = sort,\n filterFactory = filter,\n searchFactory = search,\n tableState = {sort: {}, slice: {page: 1}, filter: {}, search: {}},\n data = []\n}, ...tableDirectives) {\n\n const coreTable = table({sortFactory, filterFactory, tableState, data, searchFactory});\n\n return tableDirectives.reduce((accumulator, newdir) => {\n return Object.assign(accumulator, newdir({\n sortFactory,\n filterFactory,\n searchFactory,\n tableState,\n data,\n table: coreTable\n }));\n }, coreTable);\n}","import tableDirective from './src/table';\nimport filterDirective from './src/directives/filter';\nimport searchDirective from './src/directives/search';\nimport sliceDirective from './src/directives/slice';\nimport sortDirective from './src/directives/sort';\nimport summaryDirective from './src/directives/summary';\nimport workingIndicatorDirective from './src/directives/workingIndicator';\n\nexport const search = searchDirective;\nexport const slice = sliceDirective;\nexport const summary = summaryDirective;\nexport const sort = sortDirective;\nexport const filter = filterDirective;\nexport const workingIndicator = workingIndicatorDirective;\nexport const table = tableDirective;\nexport default table;\n","export default ({query}) => ({table, tableState}) => {\n const exec = () => {\n table.dispatch('EXEC_CHANGED', {working: true});\n return query(tableState)\n .then(({data = [], summary = {}}) => {\n table.dispatch('SUMMARY_CHANGED', summary);\n table.dispatch('DISPLAY_CHANGED', data);\n table.dispatch('EXEC_CHANGED', {working: false});\n })\n .catch(e => {\n table.dispatch('EXEC_ERROR', e);\n table.dispatch('EXEC_CHANGED', {working: false});\n });\n };\n\n return Object.assign(table, {\n exec, eval: (ts = tableState) => query(ts).then(({data}) => data)\n });\n};","import zora from 'zora';\nimport {table} from 'smart-table-core';\nimport ext from '../index';\n\nzora()\n .test('should dispatch working state change', function * (t) {\n let workingState;\n const tb = table({data: []}, ext({query: (tableState) => Promise.resolve({summary: {}, data: []})}));\n tb.on('EXEC_CHANGED', ({working}) => {\n workingState = working;\n });\n const p = tb.sort({pointer: 'foo'});\n t.equal(workingState, true);\n yield p;\n t.equal(workingState, false);\n })\n .test('should dispatch error when promise is rejected', function * (t) {\n let workingState;\n let err;\n const error = {message: 'ERROR !!!'};\n const tb = table({data: []}, ext({query: (tableState) => Promise.reject(error)}));\n tb.on('EXEC_CHANGED', ({working}) => {\n workingState = working;\n });\n tb.on('EXEC_ERROR', (e) => {\n err = e;\n });\n const p = tb.sort({pointer: 'foo'});\n t.equal(workingState, true);\n try {\n yield p;\n } catch (e) {\n t.fail('should not be here');\n }\n t.equal(workingState, false);\n t.equal(err, error);\n })\n .test('should dispatch summary changed based on the client value', function * (t) {\n let summary;\n const tb = table({data: []}, ext({\n query: (tableState) => Promise.resolve({\n summary: {\n foo: 'bar'\n }, data: []\n })\n }));\n tb.on('SUMMARY_CHANGED', s => {\n summary = s;\n });\n const p = tb.sort({pointer: 'foo'});\n yield p;\n t.deepEqual(summary, {foo: 'bar'});\n })\n .test('should dispatch display changed based on the client value', function * (t) {\n let data;\n const tb = table({data: []}, ext({\n query: (tableState) => Promise.resolve({\n summary: {\n foo: 'bar'\n }, data: [\n {woot: 'blah'},\n {woot: 'im'}\n ]\n })\n }));\n tb.on('DISPLAY_CHANGED', d => {\n data = d;\n });\n const p = tb.sort({pointer: 'foo'});\n yield p;\n t.deepEqual(data, [\n {woot: 'blah'},\n {woot: 'im'}\n ]\n );\n })\n .test('should overwrite eval function to resolve with value provided by client', function * (t) {\n const tb = table({data: []}, ext({\n query: (tableState) => Promise.resolve({\n summary: {\n foo: 'bar'\n }, data: [\n {woot: 'blah'},\n {woot: 'im'}\n ]\n })\n }));\n\n const d = yield tb.eval();\n t.deepEqual(d, [\n {woot: 'blah'},\n {woot: 'im'}\n ]);\n })\n .run();"],"names":["plan","tap","pointer","filter","sortFactory","sort","search","table","slice","zora","summary"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","sources":["../../node_modules/zora/dist/zora.es.js","../../node_modules/smart-table-operators/dist/bundle/module.js","../../node_modules/smart-table-json-pointer/dist/bundle/module.js","../../node_modules/smart-table-sort/dist/bundle/module.js","../../node_modules/smart-table-filter/dist/bundle/module.js","../../node_modules/smart-table-search/dist/bundle/module.js","../../node_modules/smart-table-events/dist/bundle/module.js","../../node_modules/smart-table-core/dist/bundle/module.js","../../index.js","../index.js"],"sourcesContent":["/**\n * slice() reference.\n */\n\nvar slice = Array.prototype.slice;\n\n/**\n * Expose `co`.\n */\n\nvar index = co['default'] = co.co = co;\n\n/**\n * Wrap the given generator `fn` into a\n * function that returns a promise.\n * This is a separate function so that\n * every `co()` call doesn't create a new,\n * unnecessary closure.\n *\n * @param {GeneratorFunction} fn\n * @return {Function}\n * @api public\n */\n\nco.wrap = function (fn) {\n createPromise.__generatorFunction__ = fn;\n return createPromise;\n function createPromise() {\n return co.call(this, fn.apply(this, arguments));\n }\n};\n\n/**\n * Execute the generator function or a generator\n * and return a promise.\n *\n * @param {Function} fn\n * @return {Promise}\n * @api public\n */\n\nfunction co(gen) {\n var ctx = this;\n var args = slice.call(arguments, 1);\n\n // we wrap everything in a promise to avoid promise chaining,\n // which leads to memory leak errors.\n // see https://github.com/tj/co/issues/180\n return new Promise(function(resolve, reject) {\n if (typeof gen === 'function') gen = gen.apply(ctx, args);\n if (!gen || typeof gen.next !== 'function') return resolve(gen);\n\n onFulfilled();\n\n /**\n * @param {Mixed} res\n * @return {Promise}\n * @api private\n */\n\n function onFulfilled(res) {\n var ret;\n try {\n ret = gen.next(res);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n /**\n * @param {Error} err\n * @return {Promise}\n * @api private\n */\n\n function onRejected(err) {\n var ret;\n try {\n ret = gen.throw(err);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n /**\n * Get the next value in the generator,\n * return a promise.\n *\n * @param {Object} ret\n * @return {Promise}\n * @api private\n */\n\n function next(ret) {\n if (ret.done) return resolve(ret.value);\n var value = toPromise.call(ctx, ret.value);\n if (value && isPromise(value)) return value.then(onFulfilled, onRejected);\n return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '\n + 'but the following object was passed: \"' + String(ret.value) + '\"'));\n }\n });\n}\n\n/**\n * Convert a `yield`ed value into a promise.\n *\n * @param {Mixed} obj\n * @return {Promise}\n * @api private\n */\n\nfunction toPromise(obj) {\n if (!obj) return obj;\n if (isPromise(obj)) return obj;\n if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);\n if ('function' == typeof obj) return thunkToPromise.call(this, obj);\n if (Array.isArray(obj)) return arrayToPromise.call(this, obj);\n if (isObject(obj)) return objectToPromise.call(this, obj);\n return obj;\n}\n\n/**\n * Convert a thunk to a promise.\n *\n * @param {Function}\n * @return {Promise}\n * @api private\n */\n\nfunction thunkToPromise(fn) {\n var ctx = this;\n return new Promise(function (resolve, reject) {\n fn.call(ctx, function (err, res) {\n if (err) return reject(err);\n if (arguments.length > 2) res = slice.call(arguments, 1);\n resolve(res);\n });\n });\n}\n\n/**\n * Convert an array of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Array} obj\n * @return {Promise}\n * @api private\n */\n\nfunction arrayToPromise(obj) {\n return Promise.all(obj.map(toPromise, this));\n}\n\n/**\n * Convert an object of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Object} obj\n * @return {Promise}\n * @api private\n */\n\nfunction objectToPromise(obj){\n var results = new obj.constructor();\n var keys = Object.keys(obj);\n var promises = [];\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var promise = toPromise.call(this, obj[key]);\n if (promise && isPromise(promise)) defer(promise, key);\n else results[key] = obj[key];\n }\n return Promise.all(promises).then(function () {\n return results;\n });\n\n function defer(promise, key) {\n // predefine the key in the result\n results[key] = undefined;\n promises.push(promise.then(function (res) {\n results[key] = res;\n }));\n }\n}\n\n/**\n * Check if `obj` is a promise.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isPromise(obj) {\n return 'function' == typeof obj.then;\n}\n\n/**\n * Check if `obj` is a generator.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isGenerator(obj) {\n return 'function' == typeof obj.next && 'function' == typeof obj.throw;\n}\n\n/**\n * Check if `obj` is a generator function.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\nfunction isGeneratorFunction(obj) {\n var constructor = obj.constructor;\n if (!constructor) return false;\n if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;\n return isGenerator(constructor.prototype);\n}\n\n/**\n * Check for plain object.\n *\n * @param {Mixed} val\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(val) {\n return Object == val.constructor;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar keys = createCommonjsModule(function (module, exports) {\nexports = module.exports = typeof Object.keys === 'function'\n ? Object.keys : shim;\n\nexports.shim = shim;\nfunction shim (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n}\n});\n\nvar is_arguments = createCommonjsModule(function (module, exports) {\nvar supportsArgumentsClass = (function(){\n return Object.prototype.toString.call(arguments)\n})() == '[object Arguments]';\n\nexports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\nexports.supported = supported;\nfunction supported(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nexports.unsupported = unsupported;\nfunction unsupported(object){\n return object &&\n typeof object == 'object' &&\n typeof object.length == 'number' &&\n Object.prototype.hasOwnProperty.call(object, 'callee') &&\n !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n false;\n}\n});\n\nvar index$1 = createCommonjsModule(function (module) {\nvar pSlice = Array.prototype.slice;\nvar objectKeys = keys;\nvar isArguments = is_arguments;\n\nvar deepEqual = module.exports = function (actual, expected, opts) {\n if (!opts) opts = {};\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n\n // 7.3. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n return opts.strict ? actual === expected : actual == expected;\n\n // 7.4. For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected, opts);\n }\n};\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer (x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') return false;\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n var i, key;\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n //~~~I've managed to break Object.keys through screwy arguments passing.\n // Converting to array solves the problem.\n if (isArguments(a)) {\n if (!isArguments(b)) {\n return false;\n }\n a = pSlice.call(a);\n b = pSlice.call(b);\n return deepEqual(a, b, opts);\n }\n if (isBuffer(a)) {\n if (!isBuffer(b)) {\n return false;\n }\n if (a.length !== b.length) return false;\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n try {\n var ka = objectKeys(a),\n kb = objectKeys(b);\n } catch (e) {//happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) return false;\n }\n return typeof a === typeof b;\n}\n});\n\nconst assertions = {\n ok(val, message = 'should be truthy') {\n const assertionResult = {\n pass: Boolean(val),\n expected: 'truthy',\n actual: val,\n operator: 'ok',\n message\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n deepEqual(actual, expected, message = 'should be equivalent') {\n const assertionResult = {\n pass: index$1(actual, expected),\n actual,\n expected,\n message,\n operator: 'deepEqual'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n equal(actual, expected, message = 'should be equal') {\n const assertionResult = {\n pass: actual === expected,\n actual,\n expected,\n message,\n operator: 'equal'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n notOk(val, message = 'should not be truthy') {\n const assertionResult = {\n pass: !Boolean(val),\n expected: 'falsy',\n actual: val,\n operator: 'notOk',\n message\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n notDeepEqual(actual, expected, message = 'should not be equivalent') {\n const assertionResult = {\n pass: !index$1(actual, expected),\n actual,\n expected,\n message,\n operator: 'notDeepEqual'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n notEqual(actual, expected, message = 'should not be equal') {\n const assertionResult = {\n pass: actual !== expected,\n actual,\n expected,\n message,\n operator: 'notEqual'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n throws(func, expected, message) {\n let caught, pass, actual;\n if (typeof expected === 'string') {\n [expected, message] = [message, expected];\n }\n try {\n func();\n } catch (error) {\n caught = {error};\n }\n pass = caught !== undefined;\n actual = caught && caught.error;\n if (expected instanceof RegExp) {\n pass = expected.test(actual) || expected.test(actual && actual.message);\n expected = String(expected);\n } else if (typeof expected === 'function' && caught) {\n pass = actual instanceof expected;\n actual = actual.constructor;\n }\n const assertionResult = {\n pass,\n expected,\n actual,\n operator: 'throws',\n message: message || 'should throw'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n doesNotThrow(func, expected, message) {\n let caught;\n if (typeof expected === 'string') {\n [expected, message] = [message, expected];\n }\n try {\n func();\n } catch (error) {\n caught = {error};\n }\n const assertionResult = {\n pass: caught === undefined,\n expected: 'no thrown error',\n actual: caught && caught.error,\n operator: 'doesNotThrow',\n message: message || 'should not throw'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n },\n fail(reason = 'fail called') {\n const assertionResult = {\n pass: false,\n actual: 'fail called',\n expected: 'fail not called',\n message: reason,\n operator: 'fail'\n };\n this.test.addAssertion(assertionResult);\n return assertionResult;\n }\n};\n\nfunction assertion (test) {\n return Object.create(assertions, {test: {value: test}});\n}\n\nconst Test = {\n run: function () {\n const assert = assertion(this);\n const now = Date.now();\n return index(this.coroutine(assert))\n .then(() => {\n return {assertions: this.assertions, executionTime: Date.now() - now};\n });\n },\n addAssertion(){\n const newAssertions = [...arguments].map(a => Object.assign({description: this.description}, a));\n this.assertions.push(...newAssertions);\n return this;\n }\n};\n\nfunction test ({description, coroutine, only = false}) {\n return Object.create(Test, {\n description: {value: description},\n coroutine: {value: coroutine},\n assertions: {value: []},\n only: {value: only},\n length: {\n get(){\n return this.assertions.length\n }\n }\n });\n}\n\nfunction tapOut ({pass, message, index}) {\n const status = pass === true ? 'ok' : 'not ok';\n console.log([status, index, message].join(' '));\n}\n\nfunction canExit () {\n return typeof process !== 'undefined' && typeof process.exit === 'function';\n}\n\nfunction tap () {\n return function * () {\n let index = 1;\n let lastId = 0;\n let success = 0;\n let failure = 0;\n\n const starTime = Date.now();\n console.log('TAP version 13');\n try {\n while (true) {\n const assertion = yield;\n if (assertion.pass === true) {\n success++;\n } else {\n failure++;\n }\n assertion.index = index;\n if (assertion.id !== lastId) {\n console.log(`# ${assertion.description} - ${assertion.executionTime}ms`);\n lastId = assertion.id;\n }\n tapOut(assertion);\n if (assertion.pass !== true) {\n console.log(` ---\n operator: ${assertion.operator}\n expected: ${JSON.stringify(assertion.expected)}\n actual: ${JSON.stringify(assertion.actual)}\n ...`);\n }\n index++;\n }\n } catch (e) {\n console.log('Bail out! unhandled exception');\n console.log(e);\n if (canExit()) {\n process.exit(1);\n }\n }\n finally {\n const execution = Date.now() - starTime;\n if (index > 1) {\n console.log(`\n1..${index - 1}\n# duration ${execution}ms\n# success ${success}\n# failure ${failure}`);\n }\n if (failure && canExit()) {\n process.exit(1);\n }\n }\n };\n}\n\nconst Plan = {\n test(description, coroutine, opts = {}){\n const testItems = (!coroutine && description.tests) ? [...description] : [{description, coroutine}];\n this.tests.push(...testItems.map(t=>test(Object.assign(t, opts))));\n return this;\n },\n\n only(description, coroutine){\n return this.test(description, coroutine, {only: true});\n },\n\n run(sink = tap()){\n const sinkIterator = sink();\n sinkIterator.next();\n const hasOnly = this.tests.some(t=>t.only);\n const runnable = hasOnly ? this.tests.filter(t=>t.only) : this.tests;\n return index(function * () {\n let id = 1;\n try {\n const results = runnable.map(t=>t.run());\n for (let r of results) {\n const {assertions, executionTime} = yield r;\n for (let assert of assertions) {\n sinkIterator.next(Object.assign(assert, {id, executionTime}));\n }\n id++;\n }\n }\n catch (e) {\n sinkIterator.throw(e);\n } finally {\n sinkIterator.return();\n }\n }.bind(this))\n },\n\n * [Symbol.iterator](){\n for (let t of this.tests) {\n yield t;\n }\n }\n};\n\nfunction plan () {\n return Object.create(Plan, {\n tests: {value: []},\n length: {\n get(){\n return this.tests.length\n }\n }\n });\n}\n\nexport default plan;\n","const swap = (f) => (a, b) => f(b, a);\nconst compose = (first, ...fns) => (...args) => fns.reduce((previous, current) => current(previous), first(...args));\nconst curry = (fn, arityLeft) => {\n const arity = arityLeft || fn.length;\n return (...args) => {\n const argLength = args.length || 1;\n if (arity === argLength) {\n return fn(...args);\n }\n const func = (...moreArgs) => fn(...args, ...moreArgs);\n return curry(func, arity - args.length);\n };\n};\nconst apply = (fn) => (...args) => fn(...args);\nconst tap = (fn) => arg => {\n fn(arg);\n return arg;\n};\n\nexport { swap, compose, curry, apply, tap };\n","const pointer = (path) => {\n const parts = path.split('.');\n const partial = (obj = {}, parts = []) => {\n const p = parts.shift();\n const current = obj[p];\n return (current === undefined || current === null || parts.length === 0) ?\n current : partial(current, parts);\n };\n const set = (target, newTree) => {\n let current = target;\n const [leaf, ...intermediate] = parts.reverse();\n for (const key of intermediate.reverse()) {\n if (current[key] === undefined) {\n current[key] = {};\n current = current[key];\n }\n }\n current[leaf] = Object.assign(current[leaf] || {}, newTree);\n return target;\n };\n return {\n get(target) {\n return partial(target, [...parts]);\n },\n set\n };\n};\n\nexport { pointer };\n","import { swap } from 'smart-table-operators';\nimport { pointer } from 'smart-table-json-pointer';\n\nconst defaultComparator = (a, b) => {\n if (a === b) {\n return 0;\n }\n if (a === undefined) {\n return 1;\n }\n if (b === undefined) {\n return -1;\n }\n return a < b ? -1 : 1;\n};\nvar SortDirection;\n(function (SortDirection) {\n SortDirection[\"ASC\"] = \"asc\";\n SortDirection[\"DESC\"] = \"desc\";\n SortDirection[\"NONE\"] = \"none\";\n})(SortDirection || (SortDirection = {}));\nconst sortByProperty = (prop, comparator) => {\n const propGetter = pointer(prop).get;\n return (a, b) => comparator(propGetter(a), propGetter(b));\n};\nconst defaultSortFactory = (conf) => {\n const { pointer: pointer$$1, direction = \"asc\" /* ASC */, comparator = defaultComparator } = conf;\n if (!pointer$$1 || direction === \"none\" /* NONE */) {\n return (array) => [...array];\n }\n const orderFunc = sortByProperty(pointer$$1, comparator);\n const compareFunc = direction === \"desc\" /* DESC */ ? swap(orderFunc) : orderFunc;\n return (array) => [...array].sort(compareFunc);\n};\n\nexport { SortDirection, defaultSortFactory };\n","import { compose } from 'smart-table-operators';\nimport { pointer } from 'smart-table-json-pointer';\n\nvar Type;\n(function (Type) {\n Type[\"BOOLEAN\"] = \"boolean\";\n Type[\"NUMBER\"] = \"number\";\n Type[\"DATE\"] = \"date\";\n Type[\"STRING\"] = \"string\";\n})(Type || (Type = {}));\nconst typeExpression = (type) => {\n switch (type) {\n case Type.BOOLEAN:\n return Boolean;\n case Type.NUMBER:\n return Number;\n case Type.DATE:\n return val => new Date(val);\n case Type.STRING:\n return compose(String, val => val.toLowerCase());\n default:\n return val => val;\n }\n};\nvar FilterOperator;\n(function (FilterOperator) {\n FilterOperator[\"INCLUDES\"] = \"includes\";\n FilterOperator[\"IS\"] = \"is\";\n FilterOperator[\"IS_NOT\"] = \"isNot\";\n FilterOperator[\"LOWER_THAN\"] = \"lt\";\n FilterOperator[\"GREATER_THAN\"] = \"gt\";\n FilterOperator[\"GREATER_THAN_OR_EQUAL\"] = \"gte\";\n FilterOperator[\"LOWER_THAN_OR_EQUAL\"] = \"lte\";\n FilterOperator[\"EQUALS\"] = \"equals\";\n FilterOperator[\"NOT_EQUALS\"] = \"notEquals\";\n FilterOperator[\"ANY_OF\"] = \"anyOf\";\n})(FilterOperator || (FilterOperator = {}));\nconst not = fn => input => !fn(input);\nconst is = value => input => Object.is(value, input);\nconst lt = value => input => input < value;\nconst gt = value => input => input > value;\nconst equals = value => input => value === input;\nconst includes = value => input => input.includes(value);\nconst anyOf = value => input => value.includes(input);\nconst operators = {\n [\"includes\" /* INCLUDES */]: includes,\n [\"is\" /* IS */]: is,\n [\"isNot\" /* IS_NOT */]: compose(is, not),\n [\"lt\" /* LOWER_THAN */]: lt,\n [\"gte\" /* GREATER_THAN_OR_EQUAL */]: compose(lt, not),\n [\"gt\" /* GREATER_THAN */]: gt,\n [\"lte\" /* LOWER_THAN_OR_EQUAL */]: compose(gt, not),\n [\"equals\" /* EQUALS */]: equals,\n [\"notEquals\" /* NOT_EQUALS */]: compose(equals, not),\n [\"anyOf\" /* ANY_OF */]: anyOf\n};\nconst every = fns => (...args) => fns.every(fn => fn(...args));\nconst predicate = ({ value = '', operator = \"includes\" /* INCLUDES */, type }) => {\n const typeIt = typeExpression(type);\n const operateOnTyped = compose(typeIt, operators[operator]);\n const predicateFunc = operateOnTyped(value);\n return compose(typeIt, predicateFunc);\n};\n// Avoid useless filter lookup (improve perf)\nconst normalizeClauses = (conf) => {\n const output = {};\n const validPath = Object.keys(conf).filter(path => Array.isArray(conf[path]));\n validPath.forEach(path => {\n const validClauses = conf[path].filter(c => c.value !== '');\n if (validClauses.length > 0) {\n output[path] = validClauses;\n }\n });\n return output;\n};\nconst filter = (filter) => {\n const normalizedClauses = normalizeClauses(filter);\n const funcList = Object.keys(normalizedClauses).map(path => {\n const getter = pointer(path).get;\n const clauses = normalizedClauses[path].map(predicate);\n return compose(getter, every(clauses));\n });\n const filterPredicate = every(funcList);\n return array => array.filter(filterPredicate);\n};\n\nexport { FilterOperator, predicate, filter };\n","import { pointer } from 'smart-table-json-pointer';\n\nconst basic = (input) => {\n const { value, scope = [], isCaseSensitive = false } = input;\n const searchPointers = scope.map(field => pointer(field).get);\n if (scope.length === 0 || !value) {\n return (array) => array;\n }\n const test = isCaseSensitive === true ? String(value) : String(value).toLowerCase();\n return (array) => array.filter(item => searchPointers.some(p => {\n const v = isCaseSensitive === true ? String(p(item)) : String(p(item)).toLowerCase();\n return v.includes(test);\n }));\n};\n\nfunction re(strs, ...substs) {\n let reStr = transformRaw(strs.raw[0]);\n for (const [i, subst] of substs.entries()) {\n if (subst instanceof RegExp) {\n reStr += subst.source;\n } else if (typeof subst === 'string') {\n reStr += quoteText(subst);\n } else {\n throw new Error('Illegal substitution: '+subst);\n }\n reStr += transformRaw(strs.raw[i+1]);\n }\n let flags = '';\n if (reStr.startsWith('/')) {\n const lastSlashIndex = reStr.lastIndexOf('/');\n if (lastSlashIndex === 0) {\n throw new Error('If the `re` string starts with a slash, it must end with a second slash and zero or more flags: '+reStr);\n }\n flags = reStr.slice(lastSlashIndex+1);\n reStr = reStr.slice(1, lastSlashIndex);\n }\n return new RegExp(reStr, flags);\n}\n\nfunction transformRaw(str) {\n return str.replace(/\\\\`/g, '`');\n}\n\n/**\n * All special characters are escaped, because you may want to quote several characters inside parentheses or square brackets.\n */\nfunction quoteText(text) {\n return text.replace(/[\\\\^$.*+?()[\\]{}|=!<>:-]/g, '\\\\$&');\n}\n\nconst regexp = (input) => {\n const { value, scope = [], escape = false, flags = '' } = input;\n const searchPointers = scope.map(field => pointer(field).get);\n if (scope.length === 0 || !value) {\n return (array) => array;\n }\n const regex = escape === true ? re `/${value}/${flags}` : new RegExp(value, flags);\n return (array) => array.filter(item => searchPointers.some(p => regex.test(String(p(item)))));\n};\n\nexport { basic, regexp };\n","const emitter = () => {\n const listenersLists = {};\n const instance = {\n on(event, ...listeners) {\n listenersLists[event] = (listenersLists[event] || []).concat(listeners);\n return instance;\n },\n dispatch(event, ...args) {\n const listeners = listenersLists[event] || [];\n for (const listener of listeners) {\n listener(...args);\n }\n return instance;\n },\n off(event, ...listeners) {\n if (event === undefined) {\n Object.keys(listenersLists).forEach(ev => instance.off(ev));\n }\n else {\n const list = listenersLists[event] || [];\n listenersLists[event] = listeners.length ? list.filter(listener => !listeners.includes(listener)) : [];\n }\n return instance;\n }\n };\n return instance;\n};\nconst proxyListener = (eventMap) => ({ emitter }) => {\n const eventListeners = {};\n const proxy = {\n off(ev) {\n if (!ev) {\n Object.keys(eventListeners).forEach(eventName => proxy.off(eventName));\n }\n if (eventListeners[ev]) {\n emitter.off(ev, ...eventListeners[ev]);\n }\n return proxy;\n }\n };\n for (const ev of Object.keys(eventMap)) {\n const method = eventMap[ev];\n eventListeners[ev] = [];\n proxy[method] = function (...listeners) {\n eventListeners[ev] = eventListeners[ev].concat(listeners);\n emitter.on(ev, ...listeners);\n return proxy;\n };\n }\n return proxy;\n};\n\nexport { emitter, proxyListener };\n","import { defaultSortFactory } from 'smart-table-sort';\nexport { SortDirection } from 'smart-table-sort';\nimport { filter } from 'smart-table-filter';\nexport { FilterOperator } from 'smart-table-filter';\nimport { regexp } from 'smart-table-search';\nimport { curry, compose, tap } from 'smart-table-operators';\nimport { pointer } from 'smart-table-json-pointer';\nimport { emitter, proxyListener } from 'smart-table-events';\n\nconst sliceFactory = ({ page = 1, size } = { page: 1 }) => (array = []) => {\n const actualSize = size || array.length;\n const offset = (page - 1) * actualSize;\n return array.slice(offset, offset + actualSize);\n};\n\nvar SmartTableEvents;\n(function (SmartTableEvents) {\n SmartTableEvents[\"TOGGLE_SORT\"] = \"TOGGLE_SORT\";\n SmartTableEvents[\"DISPLAY_CHANGED\"] = \"DISPLAY_CHANGED\";\n SmartTableEvents[\"PAGE_CHANGED\"] = \"CHANGE_PAGE\";\n SmartTableEvents[\"EXEC_CHANGED\"] = \"EXEC_CHANGED\";\n SmartTableEvents[\"FILTER_CHANGED\"] = \"FILTER_CHANGED\";\n SmartTableEvents[\"SUMMARY_CHANGED\"] = \"SUMMARY_CHANGED\";\n SmartTableEvents[\"SEARCH_CHANGED\"] = \"SEARCH_CHANGED\";\n SmartTableEvents[\"EXEC_ERROR\"] = \"EXEC_ERROR\";\n})(SmartTableEvents || (SmartTableEvents = {}));\nconst curriedPointer = (path) => {\n const { get, set } = pointer(path);\n return { get, set: curry(set) };\n};\nconst tableDirective = ({ sortFactory, tableState, data, filterFactory, searchFactory }) => {\n let filteredCount = data.length;\n let matchingItems = data;\n const table = emitter();\n const sortPointer = curriedPointer('sort');\n const slicePointer = curriedPointer('slice');\n const filterPointer = curriedPointer('filter');\n const searchPointer = curriedPointer('search');\n // We need to register in case the summary comes from outside (like server data)\n table.on(\"SUMMARY_CHANGED\" /* SUMMARY_CHANGED */, ({ filteredCount: count }) => {\n filteredCount = count;\n });\n const safeAssign = curry((base, extension) => Object.assign({}, base, extension));\n const dispatch = curry(table.dispatch, 2);\n const dispatchSummary = (filtered) => {\n matchingItems = filtered;\n return dispatch(\"SUMMARY_CHANGED\" /* SUMMARY_CHANGED */, {\n page: tableState.slice.page,\n size: tableState.slice.size,\n filteredCount: filtered.length\n });\n };\n const exec = ({ processingDelay = 20 } = { processingDelay: 20 }) => {\n table.dispatch(\"EXEC_CHANGED\" /* EXEC_CHANGED */, { working: true });\n setTimeout(() => {\n try {\n const filterFunc = filterFactory(filterPointer.get(tableState));\n const searchFunc = searchFactory(searchPointer.get(tableState));\n const sortFunc = sortFactory(sortPointer.get(tableState));\n const sliceFunc = sliceFactory(slicePointer.get(tableState));\n const execFunc = compose(filterFunc, searchFunc, tap(dispatchSummary), sortFunc, sliceFunc);\n const displayed = execFunc(data);\n table.dispatch(\"DISPLAY_CHANGED\" /* DISPLAY_CHANGED */, displayed.map(d => ({\n index: data.indexOf(d),\n value: d\n })));\n }\n catch (err) {\n table.dispatch(\"EXEC_ERROR\" /* EXEC_ERROR */, err);\n }\n finally {\n table.dispatch(\"EXEC_CHANGED\" /* EXEC_CHANGED */, { working: false });\n }\n }, processingDelay);\n };\n const updateTableState = curry((pter, ev, newPartialState) => compose(safeAssign(pter.get(tableState)), tap(dispatch(ev)), pter.set(tableState))(newPartialState));\n const resetToFirstPage = () => updateTableState(slicePointer, \"CHANGE_PAGE\" /* PAGE_CHANGED */, { page: 1 });\n const tableOperation = (pter, ev) => compose(updateTableState(pter, ev), resetToFirstPage, () => table.exec() // We wrap within a function so table.exec can be overwritten (when using with a server for example)\n );\n const api = {\n sort: tableOperation(sortPointer, \"TOGGLE_SORT\" /* TOGGLE_SORT */),\n filter: tableOperation(filterPointer, \"FILTER_CHANGED\" /* FILTER_CHANGED */),\n search: tableOperation(searchPointer, \"SEARCH_CHANGED\" /* SEARCH_CHANGED */),\n slice: compose(updateTableState(slicePointer, \"CHANGE_PAGE\" /* PAGE_CHANGED */), () => table.exec()),\n exec,\n async eval(state = tableState) {\n const sortFunc = sortFactory(sortPointer.get(state));\n const searchFunc = searchFactory(searchPointer.get(state));\n const filterFunc = filterFactory(filterPointer.get(state));\n const sliceFunc = sliceFactory(slicePointer.get(state));\n const execFunc = compose(filterFunc, searchFunc, sortFunc, sliceFunc);\n return execFunc(data).map(d => ({ index: data.indexOf(d), value: d }));\n },\n onDisplayChange(fn) {\n table.on(\"DISPLAY_CHANGED\" /* DISPLAY_CHANGED */, fn);\n },\n getTableState() {\n const sort = Object.assign({}, tableState.sort);\n const search = Object.assign({}, tableState.search);\n const slice = Object.assign({}, tableState.slice);\n const filter = {};\n for (const prop of Object.getOwnPropertyNames(tableState.filter)) {\n filter[prop] = tableState.filter[prop].map(v => Object.assign({}, v));\n }\n return { sort, search, slice, filter };\n },\n getMatchingItems() {\n return [...matchingItems];\n }\n };\n const instance = Object.assign(table, api);\n Object.defineProperties(instance, {\n filteredCount: {\n get() {\n return filteredCount;\n }\n },\n length: {\n get() {\n return data.length;\n }\n }\n });\n return instance;\n};\n\nconst filterListener = proxyListener({ [\"FILTER_CHANGED\" /* FILTER_CHANGED */]: 'onFilterChange' });\n// todo expose and re-export from smart-table-filter\nvar FilterType;\n(function (FilterType) {\n FilterType[\"BOOLEAN\"] = \"boolean\";\n FilterType[\"NUMBER\"] = \"number\";\n FilterType[\"DATE\"] = \"date\";\n FilterType[\"STRING\"] = \"string\";\n})(FilterType || (FilterType = {}));\nconst filterDirective = ({ table, pointer, operator = \"includes\" /* INCLUDES */, type = \"string\" /* STRING */ }) => {\n const proxy = filterListener({ emitter: table });\n return Object.assign({\n filter(input) {\n const filterConf = {\n [pointer]: [\n {\n value: input,\n operator,\n type\n }\n ]\n };\n return table.filter(filterConf);\n },\n state() {\n return table.getTableState().filter;\n }\n }, proxy);\n};\n\nconst searchListener = proxyListener({ [\"SEARCH_CHANGED\" /* SEARCH_CHANGED */]: 'onSearchChange' });\nconst searchDirective = ({ table, scope = [] }) => {\n const proxy = searchListener({ emitter: table });\n return Object.assign(proxy, {\n search(input, opts = {}) {\n return table.search(Object.assign({}, { value: input, scope }, opts));\n },\n state() {\n return table.getTableState().search;\n }\n }, proxy);\n};\n\nconst sliceListener = proxyListener({\n [\"CHANGE_PAGE\" /* PAGE_CHANGED */]: 'onPageChange',\n [\"SUMMARY_CHANGED\" /* SUMMARY_CHANGED */]: 'onSummaryChange'\n});\nconst paginationDirective = ({ table }) => {\n let { slice: { page: currentPage, size: currentSize } } = table.getTableState();\n let itemListLength = table.filteredCount;\n const proxy = sliceListener({ emitter: table });\n const api = {\n selectPage(p) {\n return table.slice({ page: p, size: currentSize });\n },\n selectNextPage() {\n return api.selectPage(currentPage + 1);\n },\n selectPreviousPage() {\n return api.selectPage(currentPage - 1);\n },\n changePageSize(size) {\n return table.slice({ page: 1, size });\n },\n isPreviousPageEnabled() {\n return currentPage > 1;\n },\n isNextPageEnabled() {\n return Math.ceil(itemListLength / currentSize) > currentPage;\n },\n state() {\n return Object.assign(table.getTableState().slice, { filteredCount: itemListLength });\n }\n };\n const directive = Object.assign(api, proxy);\n directive.onSummaryChange(({ page: p, size: s, filteredCount }) => {\n currentPage = p;\n currentSize = s;\n itemListLength = filteredCount;\n });\n return directive;\n};\n\nconst debounce = (fn, time) => {\n let timer = null;\n return (...args) => {\n if (timer !== null) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => fn(...args), time);\n };\n};\nconst sortListeners = proxyListener({ [\"TOGGLE_SORT\" /* TOGGLE_SORT */]: 'onSortToggle' });\nconst directions = [\"asc\" /* ASC */, \"desc\" /* DESC */];\nconst sortDirective = ({ pointer, table, cycle = false, debounceTime = 0 }) => {\n const cycleDirections = cycle === true ? [\"none\" /* NONE */].concat(directions) : [...directions].reverse();\n const commit = debounce(table.sort, debounceTime);\n let hit = 0;\n const proxy = sortListeners({ emitter: table });\n const directive = Object.assign({\n toggle() {\n hit++;\n const direction = cycleDirections[hit % cycleDirections.length];\n return commit({ pointer, direction });\n },\n state() {\n return table.getTableState().sort;\n }\n }, proxy);\n directive.onSortToggle(({ pointer: p }) => {\n hit = pointer !== p ? 0 : hit;\n });\n const { pointer: statePointer, direction = \"asc\" /* ASC */ } = directive.state();\n hit = statePointer === pointer ? (direction === \"asc\" /* ASC */ ? 1 : 2) : 0;\n return directive;\n};\n\nconst summaryListener = proxyListener({ [\"SUMMARY_CHANGED\" /* SUMMARY_CHANGED */]: 'onSummaryChange' });\nconst summaryDirective = ({ table }) => summaryListener({ emitter: table });\n\nconst executionListener = proxyListener({ [\"EXEC_CHANGED\" /* EXEC_CHANGED */]: 'onExecutionChange' });\nconst workingIndicatorDirective = ({ table }) => executionListener({ emitter: table });\n\nconst defaultTableState = () => ({ sort: {}, slice: { page: 1 }, filter: {}, search: {} });\nconst smartTable = ({ sortFactory = defaultSortFactory, filterFactory = filter, searchFactory = regexp, tableState = defaultTableState(), data = [] } = {\n sortFactory: defaultSortFactory,\n filterFactory: filter,\n searchFactory: regexp,\n tableState: defaultTableState(),\n data: []\n}, ...tableExtensions) => {\n const coreTable = tableDirective({ sortFactory, filterFactory, tableState, data, searchFactory });\n return tableExtensions.reduce((accumulator, newdir) => Object.assign(accumulator, newdir({\n sortFactory,\n filterFactory,\n searchFactory,\n tableState,\n data,\n table: coreTable\n })), coreTable);\n};\n\nexport { FilterType, SmartTableEvents, filterDirective, paginationDirective, searchDirective, sliceFactory, smartTable, sortDirective, summaryDirective, tableDirective, workingIndicatorDirective };\n","export default ({query}) => ({table, tableState}) => {\n const exec = () => {\n table.dispatch('EXEC_CHANGED', {working: true});\n return query(tableState)\n .then(({data = [], summary = {}}) => {\n table.dispatch('SUMMARY_CHANGED', summary);\n table.dispatch('DISPLAY_CHANGED', data);\n table.dispatch('EXEC_CHANGED', {working: false});\n })\n .catch(e => {\n table.dispatch('EXEC_ERROR', e);\n table.dispatch('EXEC_CHANGED', {working: false});\n });\n };\n\n return Object.assign(table, {\n exec, eval: (ts = tableState) => query(ts).then(({data}) => data)\n });\n};","import zora from 'zora';\nimport {smartTable as table} from 'smart-table-core';\nimport ext from '../index';\n\nzora()\n .test('should dispatch working state change', function * (t) {\n let workingState;\n const tb = table({data: []}, ext({query: (tableState) => Promise.resolve({summary: {}, data: []})}));\n tb.on('EXEC_CHANGED', ({working}) => {\n workingState = working;\n });\n const p = tb.sort({pointer: 'foo'});\n t.equal(workingState, true);\n yield p;\n t.equal(workingState, false);\n })\n .test('should dispatch error when promise is rejected', function * (t) {\n let workingState;\n let err;\n const error = {message: 'ERROR !!!'};\n const tb = table({data: []}, ext({query: (tableState) => Promise.reject(error)}));\n tb.on('EXEC_CHANGED', ({working}) => {\n workingState = working;\n });\n tb.on('EXEC_ERROR', (e) => {\n err = e;\n });\n const p = tb.sort({pointer: 'foo'});\n t.equal(workingState, true);\n try {\n yield p;\n } catch (e) {\n t.fail('should not be here');\n }\n t.equal(workingState, false);\n t.equal(err, error);\n })\n .test('should dispatch summary changed based on the client value', function * (t) {\n let summary;\n const tb = table({data: []}, ext({\n query: (tableState) => Promise.resolve({\n summary: {\n foo: 'bar'\n }, data: []\n })\n }));\n tb.on('SUMMARY_CHANGED', s => {\n summary = s;\n });\n const p = tb.sort({pointer: 'foo'});\n yield p;\n t.deepEqual(summary, {foo: 'bar'});\n })\n .test('should dispatch display changed based on the client value', function * (t) {\n let data;\n const tb = table({data: []}, ext({\n query: (tableState) => Promise.resolve({\n summary: {\n foo: 'bar'\n }, data: [\n {woot: 'blah'},\n {woot: 'im'}\n ]\n })\n }));\n tb.on('DISPLAY_CHANGED', d => {\n data = d;\n });\n const p = tb.sort({pointer: 'foo'});\n yield p;\n t.deepEqual(data, [\n {woot: 'blah'},\n {woot: 'im'}\n ]\n );\n })\n .test('should overwrite eval function to resolve with value provided by client', function * (t) {\n const tb = table({data: []}, ext({\n query: (tableState) => Promise.resolve({\n summary: {\n foo: 'bar'\n }, data: [\n {woot: 'blah'},\n {woot: 'im'}\n ]\n })\n }));\n\n const d = yield tb.eval();\n t.deepEqual(d, [\n {woot: 'blah'},\n {woot: 'im'}\n ]);\n })\n .run();"],"names":["tap","zora","table"],"mappings":"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"}
\ No newline at end of file
diff --git a/test/index.js b/test/index.js
index 09d206f..4f30ffc 100644
--- a/test/index.js
+++ b/test/index.js
@@ -1,5 +1,5 @@
import zora from 'zora';
-import {table} from 'smart-table-core';
+import {smartTable as table} from 'smart-table-core';
import ext from '../index';
zora()
diff --git a/test/rollup.config.js b/test/rollup.config.js
index f9951bf..839dc7c 100644
--- a/test/rollup.config.js
+++ b/test/rollup.config.js
@@ -1,9 +1,11 @@
import node from 'rollup-plugin-node-resolve';
export default {
- entry: './test/index.js',
- dest: './test/dist/index.js',
- format: 'iife',
+ input: './test/index.js',
+ output: {
+ file: './test/dist/index.js',
+ format: 'iife',
+ name: 'test',
+ sourcemap: true
+ },
plugins: [node({jsnext: true})],
- moduleName: 'test',
- sourceMap: true
};
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 26b2b3d..f87d7b7 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,20 +2,41 @@
# yarn lockfile v1
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
+
+"@types/node@*", "@types/node@^12.0.8":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.10.tgz#51babf9c7deadd5343620055fc8aff7995c8b031"
+ integrity sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==
+
+"@types/resolve@0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+acorn@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
+ integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
+
array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
-browser-resolve@^1.11.0:
- version "1.11.2"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
- dependencies:
- resolve "1.1.7"
-
-builtin-modules@^1.0.0, builtin-modules@^1.1.0:
+builtin-modules@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+builtin-modules@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
+ integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
+
camelcase-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
@@ -51,6 +72,11 @@ error-ex@^1.2.0:
dependencies:
is-arrayish "^0.2.1"
+estree-walker@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
+ integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -169,9 +195,10 @@ path-exists@^2.0.0:
dependencies:
pinkie-promise "^2.0.0"
-path-parse@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
path-type@^1.0.0:
version "1.1.0"
@@ -195,6 +222,11 @@ pinkie@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+re-template-tag@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/re-template-tag/-/re-template-tag-2.0.1.tgz#bdebf1cc76cece769090906e7317925069504955"
+ integrity sha512-TkxjSTkKDTKjSrflkkUDHd/2RDQuwoYPdrdNtTcDG0wD2EeT5FeeWe1QANwKe4BwOC5kN8a7QnvSAgSz7mRhwQ==
+
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -223,30 +255,39 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
-resolve@1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
-
-resolve@^1.1.6:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+resolve@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e"
+ integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==
dependencies:
- path-parse "^1.0.5"
+ path-parse "^1.0.6"
-rollup-plugin-node-resolve@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0"
+rollup-plugin-node-resolve@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523"
+ integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==
dependencies:
- browser-resolve "^1.11.0"
- builtin-modules "^1.1.0"
+ "@types/resolve" "0.0.8"
+ builtin-modules "^3.1.0"
is-module "^1.0.0"
- resolve "^1.1.6"
+ resolve "^1.11.1"
+ rollup-pluginutils "^2.8.1"
+
+rollup-pluginutils@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97"
+ integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==
+ dependencies:
+ estree-walker "^0.6.1"
-rollup@^0.41.6:
- version "0.41.6"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a"
+rollup@^1.16.3:
+ version "1.16.3"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.16.3.tgz#9b8bcf31523efc83447a9624bd2fe6ca58caa1e7"
+ integrity sha512-iXINUUEk2NTZXE3GcUtLQt2cvfQsAUXBQ8AFsDK8tg7Wp5bwTKdZXPdzB2IJQwHpdUNfsIgYMAfajurh7SVTnA==
dependencies:
- source-map-support "^0.4.0"
+ "@types/estree" "0.0.39"
+ "@types/node" "^12.0.8"
+ acorn "^6.1.1"
"semver@2 || 3 || 4 || 5":
version "5.3.0"
@@ -256,64 +297,63 @@ signal-exit@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
-smart-table-core@^1.1.0, smart-table-core@^1.3.5:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/smart-table-core/-/smart-table-core-1.3.5.tgz#35e5f7f79461787e83abecae22ea4c8a65f8c763"
+smart-table-core@^3.0.0, smart-table-core@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/smart-table-core/-/smart-table-core-3.0.4.tgz#591d0569c8d89b70c8ba6304a01e0999af8cd9e0"
+ integrity sha512-JSg/UPaX/BXEb1QgLdF60jTQkb9Ps3WSx1zwzduAiQYqgvOwVx0IupArpAhr7W9mocPOLtaS1aOP0iwe5zCNMQ==
dependencies:
- smart-table-events "^1.0.0"
- smart-table-filter "^1.0.0"
- smart-table-json-pointer "^1.0.1"
- smart-table-operators "^2.0.0"
- smart-table-search "^1.0.1"
- smart-table-sort "^1.0.0"
+ smart-table-events "^1.0.10"
+ smart-table-filter "^2.0.4"
+ smart-table-json-pointer "^2.0.4"
+ smart-table-operators "^2.0.10"
+ smart-table-search "^2.0.6"
+ smart-table-sort "^2.0.4"
-smart-table-events@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/smart-table-events/-/smart-table-events-1.0.2.tgz#ff6ec3b5f47effbfc6d42bfb85120150c8863d53"
+smart-table-events@^1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/smart-table-events/-/smart-table-events-1.0.10.tgz#c6596ab2bd8246fe238df9447b5a8d706efc1659"
+ integrity sha512-v/5OC4uO2n2Fpa3/liT08hCDTaMrA5SkEo81QssYDbQLIbIDv1ZsONs4hMgbH+O1DEAN2ZmIEtEf8WLIDYTuCA==
-smart-table-filter@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/smart-table-filter/-/smart-table-filter-1.0.0.tgz#85e3fcc356dd02fd4bd2e6321d538893e190ce6e"
+smart-table-filter@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/smart-table-filter/-/smart-table-filter-2.0.4.tgz#6d56afc29cddead59121a916d76ac1c85bb15a4b"
+ integrity sha512-8Hbg9LBND9jdZH2zAfHETvWxsLL1B9Ves5atstQ7pvZkJvD0sPzI175pGwRQfXx5+r05yz2roO/kTQ31Q8g7WA==
dependencies:
- smart-table-json-pointer "^1.0.1"
- smart-table-operators "^2.0.0"
+ smart-table-json-pointer "^2.0.4"
+ smart-table-operators "^2.0.10"
-smart-table-json-pointer@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/smart-table-json-pointer/-/smart-table-json-pointer-1.0.1.tgz#8927850521a49f4b74c778c2e1686a23ec21f742"
-
-smart-table-operators@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/smart-table-operators/-/smart-table-operators-2.0.1.tgz#73a30c464b10f449a8de4ef4e6806394ac7f7d86"
+smart-table-json-pointer@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/smart-table-json-pointer/-/smart-table-json-pointer-2.0.4.tgz#824c2c489f57f004288fdde00a61964db1dba7e3"
+ integrity sha512-+egO41SIMPwwNnxvodz6oXa3nuZQesW7Si4QitrDyV0EYPby1GcbrSbYvC/08PBWZ6YbhvCNdCmha4rHVGU8VA==
-smart-table-search@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/smart-table-search/-/smart-table-search-1.0.1.tgz#63775aea2c853deaeb5f0d9a7b4af1ad5bb4f0a8"
- dependencies:
- smart-table-json-pointer "^1.0.1"
+smart-table-operators@^2.0.10:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/smart-table-operators/-/smart-table-operators-2.0.10.tgz#b368b3c70da3b53037ddd98bf7e4a9e8637ebbe9"
+ integrity sha512-qjc3DZVFCTSz+zfEwXB4uoZ1lUomQLBmND9ZUobXVR5zf15KW66ETIHLi8eQBfSHUDdvi3yNslK3aiCJbeG/gw==
-smart-table-sort@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/smart-table-sort/-/smart-table-sort-1.0.0.tgz#e5ed29210e536b8e757e17ffb29ca0536df53d27"
+smart-table-search@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/smart-table-search/-/smart-table-search-2.0.6.tgz#b2fd2e92481e3a009704c272dce3506e4e6021b4"
+ integrity sha512-yruH8HFmeTQHrtbnOa0Y/gc4ZfYIwcuaJQUABmXVju992jVuVe/ubao8OdoXnbmX0MWwZdlXOE52D9kQ6/YzjQ==
dependencies:
- smart-table-json-pointer "^1.0.1"
- smart-table-operators "^2.0.0"
+ re-template-tag "^2.0.1"
+ smart-table-json-pointer "^2.0.4"
-smart-table-vanilla@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/smart-table-vanilla/-/smart-table-vanilla-0.1.0.tgz#91bf0507211f16d0b6d05663a27f1327c577a759"
+smart-table-sort@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/smart-table-sort/-/smart-table-sort-2.0.4.tgz#618a6a439bb9553ecfe1e23caaef34030eff89ef"
+ integrity sha512-61d2f44TebZlg0PME79zWYogWXG303YsOZ+6dNxofQRgc4s45rUGtKN6CIyuYeqE1lkJJFLVH7leF6W8UYyBzw==
dependencies:
- smart-table-core "^1.1.0"
+ smart-table-json-pointer "^2.0.4"
+ smart-table-operators "^2.0.10"
-source-map-support@^0.4.0:
- version "0.4.15"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
+smart-table-vanilla@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/smart-table-vanilla/-/smart-table-vanilla-0.2.0.tgz#a0da6454646dc57988eefa3957eb56c10b95a919"
+ integrity sha512-uPXglzxFxA3N7+B0E7JoJdWDvO41ZxJ/CuItWMVoLETM5lH4JstReTpBz7XufLqyE2axSs62J1E7wef+YwJrEg==
dependencies:
- source-map "^0.5.6"
-
-source-map@^0.5.6:
- version "0.5.6"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+ smart-table-core "^3.0.0"
spdx-correct@~1.0.0:
version "1.0.2"