css-select icon indicating copy to clipboard operation
css-select copied to clipboard

[Bug] SelectAll changes array of elements passed to it by reference

Open IAkumaI opened this issue 3 years ago • 2 comments

First of, select two elements. First - any. Second - child of the first element. Then, just run SelectAll on this array. Array (as any of js objects) passed by reference and css-select changes it somewhere.

Example:

const CSSselect = require('css-select');
const {parseDocument} = require('htmlparser2');

const dom = parseDocument('<div class="root"><div class="product"><h1></h1></div></div>');
const elements = CSSselect.selectAll('h1, .product', dom);
console.log(elements.length); // elements.length === 2
// elements contains both h1 AND .product (which are parent of h1)

CSSselect.selectAll('no matter', elements);
console.log(elements.length); // elements.length become 1
// elements contains only .product

IAkumaI avatar Aug 10 '22 22:08 IAkumaI

As I found, this happens after removeSubset() call: https://github.com/fb55/css-select/blob/769d1866fbafe8d6f734c5b2b073756a489f3b13/src/index.ts#L112 which refer to default adapter https://github.com/fb55/domutils/blob/d3e1af0f3b98c0e9f028443385760aaa068be624/src/helpers.ts#L11

But. Is there normal to change original array?

IAkumaI avatar Aug 10 '22 23:08 IAkumaI

This works as expected, but should be documented. Thanks for raising the issue!

fb55 avatar Sep 13 '22 21:09 fb55