glance-dom
Version:
Glance DOM library
160 lines (120 loc) • 4.77 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.default = function (_ref2) {
var commands = _ref2.commands,
extensions = _ref2.extensions,
glanceDOM = _ref2.glanceDOM,
reference = _ref2.reference,
containerElements = _ref2.containerElements,
advanced = _ref2.advanced,
_ref2$survey = _ref2.survey,
survey = _ref2$survey === undefined ? {} : _ref2$survey;
survey.containers = survey.containers || containerElements;
survey.subjects = survey.subjects || [];
survey.locatedElements = survey.locatedElements || [];
survey.targets = survey.targets || [];
var result = (0, _reduce2.default)(commands, function (result, command) {
if (result.elementsNotFound) return result;
return dispatch({
command: command,
extensions: extensions,
reference: reference,
glanceDOM: glanceDOM,
result: result
});
}, survey);
_log2.default.debug('Elements found: ' + result.subjects.length);
if (advanced) return _extends({}, result, {
reference: reference,
elements: result.subjects,
logs: _log2.default.logs
});else return result.subjects.length === 1 ? result.subjects[0] : result.subjects;
};
var _containers = require('./containers');
var _containers2 = _interopRequireDefault(_containers);
var _log = require('../utils/log');
var _log2 = _interopRequireDefault(_log);
var _reduce = require('@arr/reduce');
var _reduce2 = _interopRequireDefault(_reduce);
var _filter = require('@arr/filter');
var _filter2 = _interopRequireDefault(_filter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function dispatch(_ref) {
var command = _ref.command,
extensions = _ref.extensions,
glanceDOM = _ref.glanceDOM,
result = _ref.result,
reference = _ref.reference;
switch (command.command) {
case 'beforeall':
extensions.getBeforeAllHooks().forEach(function (h) {
return h({ reference: reference });
});
break;
case 'containers':
if (result.scopes) {
result.containers = (0, _containers2.default)(result.scopes, result.subjects);
}
if (result.subjects.length > 0) result.scopes = result.subjects;
result.locatedElements = [];
result.targets = [];
result.subjects = [];
break;
case 'intersect':
if (result.targets.length > 0) {
var targetLookup = new Set(result.targets);
result.targets = (0, _filter2.default)(result.locatedElements, function (e) {
return targetLookup.has(e);
});
_log2.default.debug('Intersected elements:', result.targets.length);
} else {
result.targets = result.locatedElements;
}
if (result.targets.length === 0) result.elementsNotFound = true;
result.locatedElements = [];
break;
case 'locate':
var locator = extensions.getLocatorForOption(command.option, command.label);
var located = locator(_extends({}, command, {
extensions: extensions,
glanceDOM: glanceDOM,
containerElements: result.containers
}));
if (located.length > 0) _log2.default.debug('Located:', located.length);
result.locatedElements = result.locatedElements.concat(located);
result.locatedElements = [].concat(_toConsumableArray(new Set(result.locatedElements)));
break;
case 'afterlocating':
_log2.default.debug('Located ' + result.locatedElements.length + ' elements for ' + command.label);
break;
case 'filter':
var filterOption = extensions.getFilterForOption(command.option);
var remaining = filterOption(_extends({}, command, {
extensions: extensions,
elements: result.targets,
scopeElements: result.scopes
}));
if (result.targets.length !== remaining.length) {
_log2.default.debug('Filtered out ' + (result.targets.length - remaining.length));
_log2.default.debug('Remaining ' + remaining.length);
}
result.targets = remaining;
break;
case 'afterfiltering':
_log2.default.debug('Elements remaining after filter: ' + result.targets.length);
result.subjects = result.targets;
break;
case 'afterall':
result.containers = (0, _containers2.default)(result.scopes, result.subjects);
extensions.getAfterAllHooks().forEach(function (h) {
return h({ reference: reference, elements: result.subjects });
});
break;
}
return result;
}
;