UNPKG

mutation-summary

Version:
167 lines 7.46 kB
"use strict"; 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