sfcode
An Online Competing and Development Environment
|
cssesc
to 3.0.0 (major)id
and class
selectorscssesc
to 2.0.0 (major).To ease adoption of the v5.0 release, we have relaxed the node version check performed by npm at installation time to allow for node 4, which remains officially unsupported, but likely to continue working for the time being.
This release has BREAKING CHANGES that were required to fix regressions in 4.0.0 and to make the Combinator Node API consistent for all combinator types. Please read carefully.
.a .b
) is stored in the AST has changed..a /for/ .b
) are now properly parsed as a combinator./
was encountered have been fixed.v6.0.0
.In prior releases, the value of a descendant combinator with multiple spaces included all the spaces.
.a .b
: Extra spaces are now stored as space before.combinator.value === " "
combinator.value === " " && combinator.spaces.before === " "
.a /*comment*/.b
: A comment at the end of the combinator causes extra space to become after space.combinator.value === " "
combinator.raws.value === " /*comment/"
combinator.value === " "
combinator.spaces.after === " "
combinator.raws.spaces.after === " /*comment*/"
.a<newline>.b
: whitespace that doesn't start or end with a single space character is stored as a raw value.combinator.value === "\n"
combinator.raws.value === undefined
combinator.value === " "
combinator.raws.value === "\n"
Although, nonstandard and unlikely to ever become a standard, combinators like /deep/
and /for/
are now properly supported.
Because they've been taken off the standardization track, there is no spec-official name for combinators of the form /<ident>/
. However, I talked to Tab Atkins and we agreed to call them "named combinators" so now they are called that.
Before this release such named combinators were parsed without intention and generated three nodes of type "tag"
where the first and last nodes had a value of "/"
.
.a /for/ .b
is parsed as a combinator.root.nodes[0].nodes[1].type === "tag"
root.nodes[0].nodes[1].value === "/"
root.nodes[0].nodes[1].type === "combinator"
root.nodes[0].nodes[1].value === "/for/"
.a /F\6fR/ .b
escapes are handled and uppercase is normalized.root.nodes[0].nodes[2].type === "tag"
root.nodes[0].nodes[2].value === "F\\6fR"
root.nodes[0].nodes[1].type === "combinator"
root.nodes[0].nodes[1].value === "/for/"
root.nodes[0].nodes[1].raws.value === "/F\\6fR/"
A new API was added to look up a node based on the source location.
This release has BREAKING CHANGES that were required to fix bugs regarding values with escape sequences. Please read carefully.
bu\tton, .\31 00, #i\2764\FE0Fu, [attr="value is \"quoted""]</tt>
will parse respectively to the values <tt>button</tt>, <tt>100</tt>, <tt>iā¤ļøu</tt>, <tt>value is "quoted"
. The original escape sequences for these values can be found in the corresponding property name in node.raws
. Where possible, deprecation warnings were added, but the nature of escape handling makes it impossible to detect what is escaped or not. Our expectation is that most users are neither expecting nor handling escape sequences in their use of this library, and so for them, this is a bug fix. Users who are taking care to handle escapes correctly can now update their code to remove the escape handling and let us do it for them.raws
value is immediately updated. This can result in changes to the original escape format. Where the exact value of the escape sequence is important there are methods that allow both values to be set in conjunction. There are a number of new convenience methods for manipulating values that involve escapes, especially for attributes values where the quote mark is involved. See https://github.com/postcss/postcss-selector-parser/pull/133 for an extensive write-up on these changes.Upgrade/API Example
In 3.x
there was no unescape handling and internal consistency of several properties was the caller's job to maintain. It was very easy for the developer to create a CSS file that did not parse correctly when some types of values were in use.
In 4.0
there is a convenient API for setting and mutating values that may need escaping. Especially for attributes.
attrNode.spaces
and attrNode.raws
since the 3.0.0
release.Attribute#offsetOf(part)
to get the offset location of attribute parts like "operator"
and "value"
. This is most often added to Attribute#sourceIndex
for error reporting.process
API is now async, and the sync API is now accessed through processSync
instead.process()
and processSync()
now return a string instead of the Processor instance.ast()
and astSync()
methods have been added to the Processor
. These return the Root
node of the selectors after processing them.transform()
and transformSync()
methods have been added to the Processor
. These return the value returned by the processor callback after processing the selectors.process
, ast
and transform
(and their sync variants) now accept a postcss
rule node. When provided, better errors are generated and selector processing is automatically set back to the rule selector (unless the updateSelector
option is set to false
.)The pattern of:
rule.selector = processor.process(rule.selector).result.toString();
is now:
processor.processSync(rule)
# 2.0.0
This release contains the following breaking changes:
eachInside
iterators to walk
. For example, eachTag
is now walkTags
, and eachInside
is now walk
.Node#removeSelf()
to Node#remove()
.Container#remove()
to Container#removeChild()
.Node#raw
to Node#raws
(thanks to @davidtheclark).&
as the nesting selector, rather than a tag selector.#{foo}
) as an id selector (thanks to @davidtheclark).and;
[data-attr="foo=bar"]
) (thanks to @montmanu).quoted
and raw.unquoted
properties to attribute nodes (thanks to @davidtheclark).)
and ]
tokens when they had no opening pairs. Now postcss-selector-parser will throw when it encounters these lone tokens.# 1.3.2
str.charCodeAt(0)
for compiled builds.String
, to fix a crash on selectors such as foo:bar("test")
.Node#sourceIndex
method (thanks to @davidtheclark).>
combinator. The module will now no longer throw if a selector has a leading/trailing combinator node.@
tokens.replaceWith
(thanks to @jonathantneal).insertAfter
and insertBefore
during iteration.clone
and replaceWith
methods to nodes.insertBefore
and insertAfter
to containers.each
and eachInside
.length
getter and eachInside
, map
, reduce
to the container class.eachComment
).parser.id(opts)
etc.next
and prev
to the node class.first
and last
getters to the container class.every
and some
iterators to the container class.empty
alias for removeAll
.index
.nodes
exclusively, and eliminates excessive nesting..\31\ 0
.