mutation-summary
Version:
Makes observing the DOM fast and easy
167 lines • 7.46 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MutationSummaryOptionProcessor = void 0;
var Selector_1 = require("./Selector");
var MutationSummaryOptionProcessor = /** @class */ (function () {
function MutationSummaryOptionProcessor() {
}
MutationSummaryOptionProcessor.createObserverOptions = function (queries) {
var observerOptions = {
childList: true,
subtree: true
};
var attributeFilter;
function observeAttributes(attributes) {
if (observerOptions.attributes && !attributeFilter)
return; // already observing all.
observerOptions.attributes = true;
observerOptions.attributeOldValue = true;
if (!attributes) {
// observe all.
attributeFilter = undefined;
return;
}
// add to observed.
attributeFilter = attributeFilter || {};
attributes.forEach(function (attribute) {
attributeFilter[attribute] = true;
attributeFilter[attribute.toLowerCase()] = true;
});
}
queries.forEach(function (query) {
if (query.characterData) {
observerOptions.characterData = true;
observerOptions.characterDataOldValue = true;
return;
}
if (query.all) {
observeAttributes();
observerOptions.characterData = true;
observerOptions.characterDataOldValue = true;
return;
}
if (query.attribute) {
observeAttributes([query.attribute.trim()]);
return;
}
var attributes = MutationSummaryOptionProcessor._elementFilterAttributes(query.elementFilter).concat(query.attributeList || []);
if (attributes.length)
observeAttributes(attributes);
});
if (attributeFilter)
observerOptions.attributeFilter = Object.keys(attributeFilter);
return observerOptions;
};
MutationSummaryOptionProcessor.validateOptions = function (options) {
for (var prop in options) {
if (!(prop in MutationSummaryOptionProcessor._optionKeys))
throw Error('Invalid option: ' + prop);
}
if (typeof options.callback !== 'function')
throw Error('Invalid options: callback is required and must be a function');
if (!options.queries || !options.queries.length)
throw Error('Invalid options: queries must contain at least one query request object.');
var opts = {
callback: options.callback,
rootNode: options.rootNode || document,
observeOwnChanges: !!options.observeOwnChanges,
oldPreviousSibling: !!options.oldPreviousSibling,
queries: []
};
for (var i = 0; i < options.queries.length; i++) {
var request = options.queries[i];
// all
if (request.all) {
if (Object.keys(request).length > 1)
throw Error('Invalid request option. all has no options.');
opts.queries.push({ all: true });
continue;
}
// attribute
if ('attribute' in request) {
var query = {
attribute: MutationSummaryOptionProcessor._validateAttribute(request.attribute)
};
query.elementFilter = Selector_1.Selector.parseSelectors('*[' + query.attribute + ']');
if (Object.keys(request).length > 1)
throw Error('Invalid request option. attribute has no options.');
opts.queries.push(query);
continue;
}
// element
if ('element' in request) {
var requestOptionCount = Object.keys(request).length;
var query = {
element: request.element,
elementFilter: Selector_1.Selector.parseSelectors(request.element)
};
if (request.hasOwnProperty('elementAttributes')) {
query.attributeList = MutationSummaryOptionProcessor._validateElementAttributes(request.elementAttributes);
requestOptionCount--;
}
if (requestOptionCount > 1)
throw Error('Invalid request option. element only allows elementAttributes option.');
opts.queries.push(query);
continue;
}
// characterData
if (request.characterData) {
if (Object.keys(request).length > 1)
throw Error('Invalid request option. characterData has no options.');
opts.queries.push({ characterData: true });
continue;
}
throw Error('Invalid request option. Unknown query request.');
}
return opts;
};
MutationSummaryOptionProcessor._validateElementAttributes = function (attribs) {
if (!attribs.trim().length)
throw Error('Invalid request option: elementAttributes must contain at least one attribute.');
var lowerAttributes = {};
var attributes = {};
var tokens = attribs.split(/\s+/);
for (var i = 0; i < tokens.length; i++) {
var name_1 = tokens[i];
if (!name_1)
continue;
name_1 = MutationSummaryOptionProcessor._validateAttribute(name_1);
var nameLower = name_1.toLowerCase();
if (lowerAttributes[nameLower])
throw Error('Invalid request option: observing multiple case variations of the same attribute is not supported.');
attributes[name_1] = true;
lowerAttributes[nameLower] = true;
}
return Object.keys(attributes);
};
MutationSummaryOptionProcessor._elementFilterAttributes = function (selectors) {
var attributes = {};
selectors.forEach(function (selector) {
selector.qualifiers.forEach(function (qualifier) {
attributes[qualifier.attrName] = true;
});
});
return Object.keys(attributes);
};
MutationSummaryOptionProcessor._validateAttribute = function (attribute) {
if (typeof attribute != 'string')
throw Error('Invalid request option. attribute must be a non-zero length string.');
attribute = attribute.trim();
if (!attribute)
throw Error('Invalid request option. attribute must be a non-zero length string.');
if (!attribute.match(MutationSummaryOptionProcessor._attributeFilterPattern))
throw Error('Invalid request option. invalid attribute name: ' + attribute);
return attribute;
};
MutationSummaryOptionProcessor._attributeFilterPattern = /^([a-zA-Z:_]+[a-zA-Z0-9_\-:.]*)$/;
MutationSummaryOptionProcessor._optionKeys = {
'callback': true,
'queries': true,
'rootNode': true,
'oldPreviousSibling': true,
'observeOwnChanges': true
};
return MutationSummaryOptionProcessor;
}());
exports.MutationSummaryOptionProcessor = MutationSummaryOptionProcessor;
//# sourceMappingURL=MutationSummaryOptionProcessor.js.map
;