cheerio-select
Advanced tools
Comparing version 1.3.0 to 1.4.0
import { Options as CSSSelectOptions } from "css-select"; | ||
import type { Element, Node } from "domhandler"; | ||
export { filters, pseudos, aliases } from "css-select"; | ||
export declare type Options = CSSSelectOptions<Node, Element>; | ||
export declare function is(element: Element, selector: string | ((el: Element) => boolean), options?: Options): boolean; | ||
export declare function some(elements: Element[], selector: string | ((el: Element) => boolean), options?: Options): boolean; | ||
export declare function filter(selector: string, elements: Element[], options?: Options): Element[]; | ||
export declare function select(selector: string | ((el: Element) => boolean), root: Element | Element[], options?: Options): Element[]; | ||
export declare function select(selector: string | ((el: Element) => boolean), root: Node | Node[], options?: Options): Element[]; | ||
//# sourceMappingURL=index.d.ts.map |
100
lib/index.js
@@ -38,3 +38,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.select = exports.filter = void 0; | ||
exports.select = exports.filter = exports.some = exports.is = exports.aliases = exports.pseudos = exports.filters = void 0; | ||
var css_what_1 = require("css-what"); | ||
@@ -45,2 +45,7 @@ var css_select_1 = require("css-select"); | ||
var positionals_1 = require("./positionals"); | ||
// Re-export pseudo extension points | ||
var css_select_2 = require("css-select"); | ||
Object.defineProperty(exports, "filters", { enumerable: true, get: function () { return css_select_2.filters; } }); | ||
Object.defineProperty(exports, "pseudos", { enumerable: true, get: function () { return css_select_2.pseudos; } }); | ||
Object.defineProperty(exports, "aliases", { enumerable: true, get: function () { return css_select_2.aliases; } }); | ||
/** Used to indicate a scope should be filtered. Might be ignored when filtering. */ | ||
@@ -55,2 +60,20 @@ var SCOPE_PSEUDO = { | ||
var UNIVERSAL_SELECTOR = { type: "universal", namespace: null }; | ||
function is(element, selector, options) { | ||
if (options === void 0) { options = {}; } | ||
if (typeof selector === "function") | ||
return selector(element); | ||
var _a = helpers_1.groupSelectors(css_what_1.parse(selector, options)), plain = _a[0], filtered = _a[1]; | ||
return ((plain.length > 0 && css_select_1.is(element, plain, options)) || | ||
filtered.some(function (sel) { return filterBySelector(sel, [element], options).length > 0; })); | ||
} | ||
exports.is = is; | ||
function some(elements, selector, options) { | ||
if (options === void 0) { options = {}; } | ||
if (typeof selector === "function") | ||
return elements.some(selector); | ||
var _a = helpers_1.groupSelectors(css_what_1.parse(selector, options)), plain = _a[0], filtered = _a[1]; | ||
return ((plain.length > 0 && elements.some(css_select_1._compileToken(plain, options))) || | ||
filtered.some(function (sel) { return filterBySelector(sel, elements, options).length > 0; })); | ||
} | ||
exports.some = some; | ||
function filterByPosition(filter, elems, data, options) { | ||
@@ -112,3 +135,3 @@ var num = typeof data === "string" ? parseInt(data, 10) : NaN; | ||
} | ||
for (var i = 0; i < filteredSelectors.length; i++) { | ||
for (var i = 0; i < filteredSelectors.length && (found === null || found === void 0 ? void 0 : found.size) !== elements.length; i++) { | ||
var filteredSelector = filteredSelectors[i]; | ||
@@ -120,36 +143,38 @@ var missing = found | ||
break; | ||
var filtered = void 0; | ||
if (filteredSelector.some(css_what_1.isTraversal)) { | ||
/* | ||
* Get one root node, run selector with the scope | ||
* set to all of our nodes. | ||
*/ | ||
var root = helpers_1.getDocumentRoot(elements[0]); | ||
var sel = __spreadArray(__spreadArray([], filteredSelector), [CUSTOM_SCOPE_PSEUDO]); | ||
filtered = findFilterElements(root, sel, options, true, elements); | ||
} | ||
else { | ||
// Performance optimization: If we don't have to traverse, just filter set. | ||
filtered = findFilterElements(elements, filteredSelector, options, false); | ||
} | ||
if (!found) { | ||
/* | ||
* If we haven't found anything before the last selector, | ||
* just return what we found now. | ||
*/ | ||
if (i === filteredSelectors.length - 1) { | ||
return filtered; | ||
} | ||
if (filtered.length) { | ||
var filtered = filterBySelector(filteredSelector, elements, options); | ||
if (filtered.length) { | ||
if (!found) { | ||
/* | ||
* If we haven't found anything before the last selector, | ||
* just return what we found now. | ||
*/ | ||
if (i === filteredSelectors.length - 1) { | ||
return filtered; | ||
} | ||
found = new Set(filtered); | ||
} | ||
else { | ||
filtered.forEach(function (el) { return found.add(el); }); | ||
} | ||
} | ||
else if (filtered.length) { | ||
filtered.forEach(function (el) { return found.add(el); }); | ||
} | ||
} | ||
return typeof found !== "undefined" | ||
? elements.filter(function (el) { return found.has(el); }) | ||
? found.size === elements.length | ||
? elements | ||
: elements.filter(function (el) { return found.has(el); }) | ||
: []; | ||
} | ||
function filterBySelector(selector, elements, options) { | ||
if (selector.some(css_what_1.isTraversal)) { | ||
/* | ||
* Get one root node, run selector with the scope | ||
* set to all of our nodes. | ||
*/ | ||
var root = helpers_1.getDocumentRoot(elements[0]); | ||
var sel = __spreadArray(__spreadArray([], selector), [CUSTOM_SCOPE_PSEUDO]); | ||
return findFilterElements(root, sel, options, true, elements); | ||
} | ||
// Performance optimization: If we don't have to traverse, just filter set. | ||
return findFilterElements(elements, selector, options, false); | ||
} | ||
function select(selector, root, options) { | ||
@@ -216,9 +241,6 @@ if (options === void 0) { options = {}; } | ||
: sub.length === 0 || (sub.length === 1 && sub[0] === SCOPE_PSEUDO) | ||
? Array.isArray(root) | ||
? root | ||
: [root] | ||
? (Array.isArray(root) ? root : [root]).filter(DomUtils.isTag) | ||
: queryForSelector || sub.some(css_what_1.isTraversal) | ||
? findElements(root, [sub], subOpts, limit) | ||
: // We know that this cannot be reached with root not being an array. | ||
filterElements(root, [sub], subOpts); | ||
: filterElements(root, [sub], subOpts); | ||
var elems = elemsNoLimit.slice(0, limit); | ||
@@ -266,5 +288,3 @@ var result = filterByPosition(filter.name, elems, filter.data, options); | ||
return []; | ||
var query = css_select_1._compileToken(sel, | ||
// @ts-expect-error TS seems to mess up the type here ¯\_(ツ)_/¯ | ||
options, root); | ||
var query = css_select_1._compileToken(sel, options, root); | ||
return find(root, query, limit); | ||
@@ -278,5 +298,7 @@ } | ||
function filterElements(elements, sel, options) { | ||
// @ts-expect-error TS seems to mess up the type here ¯\_(ツ)_/¯ | ||
var els = (Array.isArray(elements) ? elements : [elements]).filter(DomUtils.isTag); | ||
if (els.length === 0) | ||
return els; | ||
var query = css_select_1._compileToken(sel, options); | ||
return elements.filter(query); | ||
return els.filter(query); | ||
} |
{ | ||
"name": "cheerio-select", | ||
"description": "CSS selector engine supporting jQuery selectors", | ||
"version": "1.3.0", | ||
"version": "1.4.0", | ||
"author": "Felix Boehm <me@feedic.com>", | ||
@@ -37,19 +37,19 @@ "funding": { | ||
"dependencies": { | ||
"css-select": "^4.0.0", | ||
"css-select": "^4.1.2", | ||
"css-what": "^5.0.0", | ||
"domelementtype": "^2.2.0", | ||
"domhandler": "^4.1.0", | ||
"domutils": "^2.5.2" | ||
"domhandler": "^4.2.0", | ||
"domutils": "^2.6.0" | ||
}, | ||
"devDependencies": { | ||
"@types/jest": "^26.0.22", | ||
"@typescript-eslint/eslint-plugin": "^4.21.0", | ||
"@typescript-eslint/parser": "^4.21.0", | ||
"@typescript-eslint/eslint-plugin": "^4.22.0", | ||
"@typescript-eslint/parser": "^4.22.0", | ||
"coveralls": "^3.1.0", | ||
"eslint": "^7.23.0", | ||
"eslint-config-prettier": "^8.1.0", | ||
"eslint": "^7.24.0", | ||
"eslint-config-prettier": "^8.2.0", | ||
"htmlparser2": "^6.1.0", | ||
"jest": "^26.6.3", | ||
"prettier": "^2.2.1", | ||
"ts-jest": "^26.5.4", | ||
"ts-jest": "^26.5.5", | ||
"typescript": "^4.2.4" | ||
@@ -56,0 +56,0 @@ }, |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
22306
384
Updatedcss-select@^4.1.2
Updateddomhandler@^4.2.0
Updateddomutils@^2.6.0