A high-performance CSS selector parser with advanced features for modern web development.
- π Fast and memory-efficient parsing for all CSS selectors
- π³ AST-based object model for programmatic manipulation
- π Full compliance with all CSS selector specifications
- π§ͺ Comprehensive test coverage
- π Well-documented API with TypeScript support
- π Two-way conversion between CSS selectors and AST
- 𧩠Modular support for various CSS specifications
css1
: W3C CSS1 Specificationcss2
: W3C CSS2 Specificationcss3
/selectors-3
: W3C Selectors Level 3selectors-4
: W3C Selectors Level 4latest
: refers toselectors-4
progressive
:latest
+ accepts unknown pseudo-classes, pseudo-elements and attribute case sensitivity modifiers
See Changelog for release details.
npm install css-selector-parser
# or
yarn add css-selector-parser
# or
pnpm add css-selector-parser
import { createParser } from 'css-selector-parser';
const parse = createParser();
const selector = parse('a[href^="/"], .container:has(nav) > a[href]:nth-child(2)::before');
console.log(selector);
This produces an AST (Abstract Syntax Tree) output:
({
type: 'Selector',
rules: [
{
type: 'Rule',
items: [
{ type: 'TagName', name: 'a' },
{
type: 'Attribute',
name: 'href',
operator: '^=',
value: { type: 'String', value: '/' }
}
]
},
{
type: 'Rule',
items: [
{ type: 'ClassName', name: 'container' },
{
type: 'PseudoClass',
name: 'has',
argument: {
type: 'Selector',
rules: [
{
type: 'Rule',
items: [ { type: 'TagName', name: 'nav' } ]
}
]
}
}
],
nestedRule: {
type: 'Rule',
items: [
{ type: 'TagName', name: 'a' },
{ type: 'Attribute', name: 'href' },
{
type: 'PseudoClass',
name: 'nth-child',
argument: { type: 'Formula', a: 0, b: 2 }
},
{
type: 'PseudoElement',
name: 'before'
}
],
combinator: '>'
}
}
]
})
import { ast, render } from 'css-selector-parser';
const selector = ast.selector({
rules: [
ast.rule({
items: [
ast.tagName({name: 'a'}),
ast.attribute({name: 'href', operator: '^=', value: ast.string({value: '/'})})
]
}),
ast.rule({
items: [
ast.className({name: 'container'}),
ast.pseudoClass({
name: 'has',
argument: ast.selector({
rules: [ast.rule({items: [ast.tagName({name: 'nav'})]})]
})
})
],
nestedRule: ast.rule({
combinator: '>',
items: [
ast.tagName({name: 'a'}),
ast.attribute({name: 'href'}),
ast.pseudoClass({
name: 'nth-child',
argument: ast.formula({a: 0, b: 2})
}),
ast.pseudoElement({name: 'before'})
]
})
})
]
});
console.log(render(selector)); // a[href^="/"], .container:has(nav) > a[href]:nth-child(2)::before
CSS Modules are specifications that add new selectors or modify existing ones. This parser supports various CSS modules that can be included in your syntax definition:
import { createParser } from 'css-selector-parser';
// Create a parser with specific CSS modules enabled
const parse = createParser({
syntax: 'selectors-4',
modules: ['css-position-3', 'css-scoping-1']
});
Module | Description |
---|---|
css-position-1/2/3/4 |
Position-related pseudo-classes |
css-scoping-1 |
Shadow DOM selectors (:host , :host-context() , ::slotted() ) |
css-pseudo-4 |
Modern pseudo-elements (::selection , ::backdrop , etc.) |
css-shadow-parts-1 |
::part() for styling shadow DOM components |
The latest
syntax automatically includes all modules marked as current specifications.
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure.
If you find this project useful, please consider sponsoring the developer or supporting on Patreon.