Skip to content

Breaking change: the each method executes one extra time in version 7.0.0 #297

Closed as not planned
@edison1105

Description

@edison1105

In version 6.1.2, the following code outputs 1, but in version 7.0.0, it outputs 2.
The reason is that selector.each executes once more after insertAfter.
This caused an issue for Vue when upgrading to postcss-selector-parser v7

minimal reproduction link: https://github.com/edison1105/postcss-selector-parser-bug

const parser = require('postcss-selector-parser');
const postcss = require('postcss')

let count = 0
const transform = selectors => {
    selectors.each(selector => {
        selector.each(n => {
            count++
            if (n.nodes) {
                selectors.insertAfter(selector, n.nodes[0])
                selectors.removeChild(selector)
            }
        })
    })
}

function processRule(rule) {
    rule.selector = parser(transform).processSync(rule.selector);
}

const plugin = {
    postcssPlugin: 'postcss-plugin',
    Rule(rule) {
        processRule(rule)
    },
}

postcss([plugin]).process(':global(.foo) { color: red; }').then(result => {
    console.log('count:', count)
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions