UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

594 lines 101 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.addAPI = exports.addCustomMethods = void 0; const util_1 = require("util"); const lodash_1 = require("lodash"); const builder_symbol_1 = __importDefault(require("../builder-symbol")); const snapshot_properties_1 = require("./snapshot-properties"); const get_callsite_1 = require("../../errors/get-callsite"); const client_function_builder_1 = __importDefault(require("../client-function-builder")); const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise")); const type_assertions_1 = require("../../errors/runtime/type-assertions"); const make_reg_exp_1 = require("../../utils/make-reg-exp"); const selector_text_filter_1 = __importDefault(require("./selector-text-filter")); const selector_attribute_filter_1 = __importDefault(require("./selector-attribute-filter")); const prepare_api_args_1 = __importDefault(require("./prepare-api-args")); const callsite_1 = require("../../utils/callsite"); const VISIBLE_PROP_NAME = 'visible'; const SNAPSHOT_PROP_PRIMITIVE = `[object ${re_executable_promise_1.default.name}]`; const filterNodes = new client_function_builder_1.default((nodes, filter, querySelectorRoot, originNode, ...filterArgs) => { if (typeof filter === 'number') { const matchingNode = filter < 0 ? nodes[nodes.length + filter] : nodes[filter]; return matchingNode ? [matchingNode] : []; } const result = []; if (typeof filter === 'string') { // NOTE: we can search for elements only in document/element/shadow root. if (querySelectorRoot.nodeType !== 1 && querySelectorRoot.nodeType !== 9 && querySelectorRoot.nodeType !== 11) return null; const matching = querySelectorRoot.querySelectorAll(filter); const matchingArr = []; for (let i = 0; i < matching.length; i++) matchingArr.push(matching[i]); filter = node => matchingArr.indexOf(node) > -1; } if (typeof filter === 'function') { for (let j = 0; j < nodes.length; j++) { if (filter(nodes[j], j, originNode, ...filterArgs)) result.push(nodes[j]); } } return result; }).getFunction(); const expandSelectorResults = new client_function_builder_1.default((selector, populateDerivativeNodes) => { const nodes = selector(); if (!nodes.length) return null; const result = []; for (let i = 0; i < nodes.length; i++) { const derivativeNodes = populateDerivativeNodes(nodes[i]); if (derivativeNodes) { for (let j = 0; j < derivativeNodes.length; j++) { if (result.indexOf(derivativeNodes[j]) < 0) result.push(derivativeNodes[j]); } } } return result; }).getFunction(); async function getSnapshot(getSelector, callsite, SelectorBuilder, getVisibleValueMode) { let node = null; const selector = new SelectorBuilder(getSelector(), { getVisibleValueMode, needError: true }, { instantiation: 'Selector' }, callsite).getFunction(); try { node = await selector(); } catch (err) { err.callsite = callsite; throw err; } return node; } function assertAddCustomDOMPropertiesOptions(properties) { (0, type_assertions_1.assertType)(type_assertions_1.is.nonNullObject, 'addCustomDOMProperties', 'The "addCustomDOMProperties" option', properties); Object.keys(properties).forEach(prop => { (0, type_assertions_1.assertType)(type_assertions_1.is.function, 'addCustomDOMProperties', `The custom DOM properties method '${prop}'`, properties[prop]); }); } function assertAddCustomMethods(properties, opts) { (0, type_assertions_1.assertType)(type_assertions_1.is.nonNullObject, 'addCustomMethods', 'The "addCustomMethods" option', properties); if (opts !== void 0) (0, type_assertions_1.assertType)(type_assertions_1.is.nonNullObject, 'addCustomMethods', 'The "addCustomMethods" option', opts); Object.keys(properties).forEach(prop => { (0, type_assertions_1.assertType)(type_assertions_1.is.function, 'addCustomMethods', `The custom method '${prop}'`, properties[prop]); }); } function getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, additionalDependencies) { return Object.assign({}, options, { selectorFn, apiFn, filter, additionalDependencies }); } function createPrimitiveGetterWrapper(observedCallsites, callsite) { return (depth, options) => { const isTestCafeInspect = options === null || options === void 0 ? void 0 : options.isTestCafeInspect; if (observedCallsites && !isTestCafeInspect) observedCallsites.unawaitedSnapshotCallsites.add(callsite); return SNAPSHOT_PROP_PRIMITIVE; }; } function checkForExcessiveAwaits(snapshotPropertyCallsites, checkedCallsite) { const callsiteId = (0, callsite_1.getCallsiteId)(checkedCallsite); // NOTE: If there is an asserted callsite, it means that .expect() was already called. // We don't raise a warning and delete the callsite. if (snapshotPropertyCallsites[callsiteId] && snapshotPropertyCallsites[callsiteId].checked) delete snapshotPropertyCallsites[callsiteId]; // NOTE: If the calliste already exists, but is not asserted, it means that there are // multiple awaited callsites in one assertion. We raise a warning for each of them. else if (snapshotPropertyCallsites[callsiteId] && !snapshotPropertyCallsites[callsiteId].checked) snapshotPropertyCallsites[callsiteId].callsites.push(checkedCallsite); else snapshotPropertyCallsites[callsiteId] = { callsites: [checkedCallsite], checked: false }; } function addSnapshotProperties(obj, getSelector, SelectorBuilder, properties, observedCallsites) { properties.forEach(prop => { Object.defineProperty(obj, prop, { get: () => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('get'); const propertyPromise = re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot[prop]; }); const primitiveGetterWrapper = createPrimitiveGetterWrapper(observedCallsites, callsite); propertyPromise[Symbol.toPrimitive] = primitiveGetterWrapper; propertyPromise[util_1.inspect.custom] = primitiveGetterWrapper; propertyPromise.then = function (onFulfilled, onRejected) { if (observedCallsites) checkForExcessiveAwaits(observedCallsites.snapshotPropertyCallsites, callsite); this._ensureExecuting(); return this._taskPromise.then(onFulfilled, onRejected); }; return propertyPromise; }, }); }); } function addVisibleProperty({ obj, getSelector, SelectorBuilder }) { Object.defineProperty(obj, VISIBLE_PROP_NAME, { get: () => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('get'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder, true); return !!snapshot && snapshot[VISIBLE_PROP_NAME]; }); }, }); } function addCustomMethods(obj, getSelector, SelectorBuilder, customMethods) { const customMethodProps = customMethods ? Object.keys(customMethods) : []; customMethodProps.forEach(prop => { const { returnDOMNodes = false, method } = customMethods[prop]; const dependencies = { customMethod: method, selector: getSelector(), }; const callsiteNames = { instantiation: prop }; if (returnDOMNodes) { obj[prop] = (...args) => { const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); return customMethod.apply(customMethod, [nodes].concat(args)); /* eslint-enable no-undef */ }; const apiFn = (0, prepare_api_args_1.default)(prop, ...args); const filter = () => true; const additionalDependencies = { args, customMethod: method, }; return createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }); }; } else { obj[prop] = new client_function_builder_1.default((...args) => { /* eslint-disable no-undef */ const node = selector(); return customMethod.apply(customMethod, [node].concat(args)); /* eslint-enable no-undef */ }, { dependencies }, callsiteNames).getFunction(); } }); } exports.addCustomMethods = addCustomMethods; function prepareSnapshotPropertyList(customDOMProperties) { let properties = [...snapshot_properties_1.SNAPSHOT_PROPERTIES]; // NOTE: The 'visible' snapshot property has a separate handler. (0, lodash_1.pull)(properties, VISIBLE_PROP_NAME); if (customDOMProperties) properties = properties.concat(Object.keys(customDOMProperties)); return properties; } function getAttributeValue(attributes, attrName) { if (attributes && attributes.hasOwnProperty(attrName)) return attributes[attrName]; // NOTE: https://dom.spec.whatwg.org/#dom-element-getattribute (null result for nonexistent attributes) return null; } function addSnapshotPropertyShorthands({ obj, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites }) { const properties = prepareSnapshotPropertyList(customDOMProperties); addSnapshotProperties(obj, getSelector, SelectorBuilder, properties, observedCallsites); addCustomMethods(obj, getSelector, SelectorBuilder, customMethods); obj.getStyleProperty = prop => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('getStyleProperty'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.style ? snapshot.style[prop] : void 0; }); }; obj.getAttribute = attrName => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('getAttribute'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return getAttributeValue(snapshot.attributes, attrName); }); }; obj.hasAttribute = attrName => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('hasAttribute'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.attributes ? snapshot.attributes.hasOwnProperty(attrName) : false; }); }; obj.getBoundingClientRectProperty = prop => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('getBoundingClientRectProperty'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.boundingClientRect ? snapshot.boundingClientRect[prop] : void 0; }); }; obj.hasClass = name => { const callsite = (0, get_callsite_1.getCallsiteForMethod)('hasClass'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.classNames ? snapshot.classNames.includes(name) : false; }); }; } function createCounter(getSelector, SelectorBuilder) { const builder = new SelectorBuilder(getSelector(), { counterMode: true }, { instantiation: 'Selector' }); const counter = builder.getFunction(); const callsite = (0, get_callsite_1.getCallsiteForMethod)('get'); return async () => { try { return await counter(); } catch (err) { err.callsite = callsite; throw err; } }; } function addCounterProperties({ obj, getSelector, SelectorBuilder }) { Object.defineProperty(obj, 'count', { get: () => { const counter = createCounter(getSelector, SelectorBuilder); return re_executable_promise_1.default.fromFn(() => counter()); }, }); Object.defineProperty(obj, 'exists', { get: () => { const counter = createCounter(getSelector, SelectorBuilder); return re_executable_promise_1.default.fromFn(async () => await counter() > 0); }, }); } function convertFilterToClientFunctionIfNecessary(callsiteName, filter, dependencies) { if (typeof filter === 'function') { const builder = filter[builder_symbol_1.default]; const fn = builder ? builder.fn : filter; const options = builder ? (0, lodash_1.assign)({}, builder.options, { dependencies }) : { dependencies }; return new client_function_builder_1.default(fn, options, { instantiation: callsiteName }).getFunction(); } return filter; } function createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }) { const collectionModeSelectorBuilder = new SelectorBuilder(getSelector(), { collectionMode: true }); const customDOMProperties = collectionModeSelectorBuilder.options.customDOMProperties; const customMethods = collectionModeSelectorBuilder.options.customMethods; let dependencies = { selector: collectionModeSelectorBuilder.getFunction(), filter: filter, filterNodes: filterNodes, }; const { boundTestRun, timeout, visibilityCheck, apiFnChain } = collectionModeSelectorBuilder.options; dependencies = (0, lodash_1.assign)(dependencies, additionalDependencies); const builder = new SelectorBuilder(selectorFn, { dependencies, customDOMProperties, customMethods, boundTestRun, timeout, visibilityCheck, apiFnChain, apiFn, }, { instantiation: 'Selector' }); return builder.getFunction(); } const filterByText = convertFilterToClientFunctionIfNecessary('filter', selector_text_filter_1.default); const filterByAttr = convertFilterToClientFunctionIfNecessary('filter', selector_attribute_filter_1.default); function ensureRegExpContext(str) { // NOTE: if a regexp is created in a separate context (via the 'vm' module) we // should wrap it with new RegExp() to make the `instanceof RegExp` check successful. if (typeof str !== 'string' && !(str instanceof RegExp)) return new RegExp(str); return str; } function addFilterMethods(options) { const { obj, getSelector, SelectorBuilder } = options; obj.nth = index => { (0, type_assertions_1.assertType)(type_assertions_1.is.number, 'nth', 'The "index" argument', index); const apiFn = (0, prepare_api_args_1.default)('nth', index); const builder = new SelectorBuilder(getSelector(), { index, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); }; obj.withText = text => { (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withText', 'The "text" argument', text); const apiFn = (0, prepare_api_args_1.default)('withText', text); text = ensureRegExpContext(text); const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0, textRe); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { textRe: (0, make_reg_exp_1.makeRegExp)(text) }); return createDerivativeSelectorWithFilter(args); }; obj.withExactText = text => { (0, type_assertions_1.assertType)(type_assertions_1.is.string, 'withExactText', 'The "text" argument', text); const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0, exactText); /* eslint-enable no-undef */ }; const apiFn = (0, prepare_api_args_1.default)('withExactText', text); const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { exactText: text }); return createDerivativeSelectorWithFilter(args); }; obj.withAttribute = (attrName, attrValue) => { (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', 'The "attrName" argument', attrName); const apiFn = (0, prepare_api_args_1.default)('withAttribute', attrName, attrValue); attrName = ensureRegExpContext(attrName); if (attrValue !== void 0) { (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', 'The "attrValue" argument', attrValue); attrValue = ensureRegExpContext(attrValue); } const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0, attrName, attrValue); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByAttr, { attrName, attrValue, }); return createDerivativeSelectorWithFilter(args); }; obj.filter = (filter, dependencies) => { (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function], 'filter', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('filter', filter); filter = convertFilterToClientFunctionIfNecessary('filter', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter); return createDerivativeSelectorWithFilter(args); }; obj.filterVisible = () => { const apiFn = (0, prepare_api_args_1.default)('filterVisible'); const builder = new SelectorBuilder(getSelector(), { filterVisible: true, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); }; obj.filterHidden = () => { const apiFn = (0, prepare_api_args_1.default)('filterHidden'); const builder = new SelectorBuilder(getSelector(), { filterHidden: true, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); }; } function addCustomDOMPropertiesMethod({ obj, getSelector, SelectorBuilder }) { obj.addCustomDOMProperties = customDOMProperties => { assertAddCustomDOMPropertiesOptions(customDOMProperties); const builder = new SelectorBuilder(getSelector(), { customDOMProperties }, { instantiation: 'Selector' }); return builder.getFunction(); }; } function addCustomMethodsMethod({ obj, getSelector, SelectorBuilder }) { obj.addCustomMethods = function (methods, opts) { assertAddCustomMethods(methods, opts); const customMethods = {}; Object.keys(methods).forEach(methodName => { customMethods[methodName] = { method: methods[methodName], returnDOMNodes: opts && !!opts.returnDOMNodes, }; }); const builder = new SelectorBuilder(getSelector(), { customMethods }, { instantiation: 'Selector' }); return builder.getFunction(); }; } function addHierarchicalSelectors(options) { const { obj } = options; // Find obj.find = (filter, dependencies) => { (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function], 'find', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('find', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { if (typeof filter === 'string') { return typeof node.querySelectorAll === 'function' ? node.querySelectorAll(filter) : null; } const results = []; const visitNode = currentNode => { const cnLength = currentNode.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = currentNode.childNodes[i]; results.push(child); visitNode(child); } }; visitNode(node); return filterNodes(results, filter, null, node); }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Parent obj.parent = (filter, dependencies) => { if (filter !== void 0) (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'parent', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('parent', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parents = []; for (let parent = node.parentNode; parent; parent = parent.parentNode) parents.push(parent); return filter !== void 0 ? filterNodes(parents, filter, document, node) : parents; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Child obj.child = (filter, dependencies) => { if (filter !== void 0) (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'child', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('child', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const childElements = []; const cnLength = node.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = node.childNodes[i]; if (child.nodeType === 1) childElements.push(child); } return filter !== void 0 ? filterNodes(childElements, filter, node, node) : childElements; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Sibling obj.sibling = (filter, dependencies) => { if (filter !== void 0) (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'sibling', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('sibling', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parent = node.parentNode; if (!parent) return null; const siblings = []; const cnLength = parent.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = parent.childNodes[i]; if (child.nodeType === 1 && child !== node) siblings.push(child); } return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Next sibling obj.nextSibling = (filter, dependencies) => { if (filter !== void 0) (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'nextSibling', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('nextSibling', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parent = node.parentNode; if (!parent) return null; const siblings = []; const cnLength = parent.childNodes.length; let afterNode = false; for (let i = 0; i < cnLength; i++) { const child = parent.childNodes[i]; if (child === node) afterNode = true; else if (afterNode && child.nodeType === 1) siblings.push(child); } return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Prev sibling obj.prevSibling = (filter, dependencies) => { if (filter !== void 0) (0, type_assertions_1.assertType)([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'prevSibling', 'The "filter" argument', filter); const apiFn = (0, prepare_api_args_1.default)('prevSibling', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parent = node.parentNode; if (!parent) return null; const siblings = []; const cnLength = parent.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = parent.childNodes[i]; if (child === node) break; if (child.nodeType === 1) siblings.push(child); } return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // ShadowRoot obj.shadowRoot = () => { const apiFn = (0, prepare_api_args_1.default)('shadowRoot'); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { return !node.shadowRoot ? null : [node.shadowRoot]; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, void 0, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; } function addAPI(selector, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites) { const options = { obj: selector, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites }; addFilterMethods(options); addHierarchicalSelectors(options); addSnapshotPropertyShorthands(options); addCustomDOMPropertiesMethod(options); addCustomMethodsMethod(options); addCounterProperties(options); addVisibleProperty(options); } exports.addAPI = addAPI; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9hZGQtYXBpLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBZ0Q7QUFDaEQsdUVBQTREO0FBQzVELCtEQUE0RDtBQUM1RCw0REFBaUU7QUFDakUseUZBQStEO0FBQy9ELDhGQUFvRTtBQUNwRSwwRUFBc0U7QUFDdEUsMkRBQXNEO0FBQ3RELGtGQUF3RDtBQUN4RCw0RkFBa0U7QUFDbEUsMEVBQWtEO0FBQ2xELG1EQUFxRDtBQUVyRCxNQUFNLGlCQUFpQixHQUFTLFNBQVMsQ0FBQztBQUMxQyxNQUFNLHVCQUF1QixHQUFHLFdBQVcsK0JBQW1CLENBQUMsSUFBSSxHQUFHLENBQUM7QUFFdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxpQ0FBcUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUU7SUFDMUcsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRSxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzdDO0lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRWxCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzVCLHlFQUF5RTtRQUN6RSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUMsUUFBUSxLQUFLLENBQUMsSUFB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