testcafe
Version:
Automated browser testing for the modern web development stack.
594 lines • 101 kB
JavaScript
"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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