diff --git a/package-lock.json b/package-lock.json index 38018670654..51d58942bd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "version": "1.0.0-rc.9", "license": "MIT", "dependencies": { - "cheerio-select": "^1.4.0", + "cheerio-select": "^1.5.0", "dom-serializer": "^1.3.2", "domhandler": "^4.2.0", "htmlparser2": "^6.1.0", @@ -2185,15 +2185,15 @@ } }, "node_modules/cheerio-select": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.4.0.tgz", - "integrity": "sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", "dependencies": { - "css-select": "^4.1.2", - "css-what": "^5.0.0", + "css-select": "^4.1.3", + "css-what": "^5.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0", - "domutils": "^2.6.0" + "domutils": "^2.7.0" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -2396,9 +2396,9 @@ } }, "node_modules/css-select": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.2.tgz", - "integrity": "sha512-nu5ye2Hg/4ISq4XqdLY2bEatAcLIdt3OYGFc9Tm9n7VSlFBcfRv0gBNksHRgSdUDQGtN3XrZ94ztW+NfzkFSUw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^5.0.0", @@ -2411,9 +2411,9 @@ } }, "node_modules/css-what": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.0.tgz", - "integrity": "sha512-qxyKHQvgKwzwDWC/rGbT821eJalfupxYW2qbSJSAtdSTimsr/MlaGONoNLllaUPZWf8QnbcKM/kPVYUQuEKAFA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "engines": { "node": ">= 6" }, @@ -2629,9 +2629,9 @@ } }, "node_modules/domutils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz", - "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -9682,15 +9682,15 @@ "dev": true }, "cheerio-select": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.4.0.tgz", - "integrity": "sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", "requires": { - "css-select": "^4.1.2", - "css-what": "^5.0.0", + "css-select": "^4.1.3", + "css-what": "^5.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0", - "domutils": "^2.6.0" + "domutils": "^2.7.0" } }, "ci-info": { @@ -9853,9 +9853,9 @@ } }, "css-select": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.2.tgz", - "integrity": "sha512-nu5ye2Hg/4ISq4XqdLY2bEatAcLIdt3OYGFc9Tm9n7VSlFBcfRv0gBNksHRgSdUDQGtN3XrZ94ztW+NfzkFSUw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "requires": { "boolbase": "^1.0.0", "css-what": "^5.0.0", @@ -9865,9 +9865,9 @@ } }, "css-what": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.0.tgz", - "integrity": "sha512-qxyKHQvgKwzwDWC/rGbT821eJalfupxYW2qbSJSAtdSTimsr/MlaGONoNLllaUPZWf8QnbcKM/kPVYUQuEKAFA==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" }, "cssom": { "version": "0.4.4", @@ -10025,9 +10025,9 @@ } }, "domutils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz", - "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", diff --git a/package.json b/package.json index 46ec23937d2..0c2c9ebbd54 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "node": ">= 6" }, "dependencies": { - "cheerio-select": "^1.4.0", + "cheerio-select": "^1.5.0", "dom-serializer": "^1.3.2", "domhandler": "^4.2.0", "htmlparser2": "^6.1.0", diff --git a/src/api/traversing.ts b/src/api/traversing.ts index 22afee59448..8bc3bb9a84e 100644 --- a/src/api/traversing.ts +++ b/src/api/traversing.ts @@ -4,12 +4,11 @@ * @module cheerio/traversing */ -import { Node, Element, hasChildren, isDocument } from 'domhandler'; +import { Node, Element, hasChildren, isDocument, Document } from 'domhandler'; import type { Cheerio } from '../cheerio'; import * as select from 'cheerio-select'; import { domEach, isTag, isCheerio } from '../utils'; import { contains } from '../static'; -import { InternalOptions } from '../options'; import { DomUtils } from 'htmlparser2'; import type { FilterFunction, AcceptedFilters } from '../types'; const { uniqueSort } = DomUtils; @@ -55,15 +54,13 @@ export function find( const elems = reSiblingSelector.test(selectorOrHaystack) ? context - : context.reduce( - (newElems, elem) => - hasChildren(elem) - ? newElems.concat(elem.children.filter(isTag)) - : newElems, - [] - ); + : this.children().toArray(); - const options = { context, xmlMode: this.options.xmlMode }; + const options = { + context, + root: this._root?.[0], + xmlMode: this.options.xmlMode, + }; return this._make(select.select(selectorOrHaystack, elems, options)); } @@ -90,7 +87,12 @@ function _getMatcher

( let matched: Element[] = matchMap(fn, this); if (selector) { - matched = filterArray(matched, selector, this.options); + matched = filterArray( + matched, + selector, + this.options.xmlMode, + this._root?.[0] + ); } return this._make( @@ -296,7 +298,11 @@ export function closest( domEach(this, (elem: Node | null) => { while (elem && elem.type !== 'root') { - if (!selector || filterArray([elem], selector, this.options).length) { + if ( + !selector || + filterArray([elem], selector, this.options.xmlMode, this._root?.[0]) + .length + ) { // Do not add duplicate elements to the set if (elem && !set.includes(elem)) { set.push(elem); @@ -685,16 +691,19 @@ export function filter( this: Cheerio, match: AcceptedFilters ): Cheerio { - return this._make(filterArray(this.toArray(), match, this.options)); + return this._make( + filterArray(this.toArray(), match, this.options.xmlMode, this._root?.[0]) + ); } export function filterArray( nodes: T[], match: AcceptedFilters, - options: InternalOptions + xmlMode?: boolean, + root?: Document ): Element[] | T[] { return typeof match === 'string' - ? select.filter(match, (nodes as unknown as Node[]).filter(isTag), options) + ? select.filter(match, nodes as unknown as Node[], { xmlMode, root }) : nodes.filter(getFilterFn(match)); } @@ -766,8 +775,7 @@ export function not( let nodes = this.toArray(); if (typeof match === 'string') { - const elements = (nodes as Node[]).filter(isTag); - const matches = new Set(select.filter(match, elements, this.options)); + const matches = new Set(select.filter(match, nodes, this.options)); nodes = nodes.filter((el) => !matches.has(el)); } else { const filterFn = getFilterFn(match); diff --git a/src/cheerio.ts b/src/cheerio.ts index c92ec0f58b6..c2ec78eb584 100644 --- a/src/cheerio.ts +++ b/src/cheerio.ts @@ -22,8 +22,7 @@ export class Cheerio implements ArrayLike { options: InternalOptions; /** - * The root of the document. Can be overwritten by using the `root` argument - * of the constructor. + * The root of the document. Can be set by using the `root` argument of the constructor. * * @private */