2023-07-05 11:02:15 +02:00
"use strict" ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
exports . _ _esModule = true ;
exports . default = void 0 ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var _declaration = _interopRequireDefault ( require ( "./declaration" ) ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var _comment = _interopRequireDefault ( require ( "./comment" ) ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var _node = _interopRequireDefault ( require ( "./node" ) ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { default : obj } ; }
function _createForOfIteratorHelperLoose ( o , allowArrayLike ) { var it ; if ( typeof Symbol === "undefined" || o [ Symbol . iterator ] == null ) { if ( Array . isArray ( o ) || ( it = _unsupportedIterableToArray ( o ) ) || allowArrayLike && o && typeof o . length === "number" ) { if ( it ) o = it ; var i = 0 ; return function ( ) { if ( i >= o . length ) return { done : true } ; return { done : false , value : o [ i ++ ] } ; } ; } throw new TypeError ( "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ; } it = o [ Symbol . iterator ] ( ) ; return it . next . bind ( it ) ; }
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
function _unsupportedIterableToArray ( o , minLen ) { if ( ! o ) return ; if ( typeof o === "string" ) return _arrayLikeToArray ( o , minLen ) ; var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ; if ( n === "Object" && o . constructor ) n = o . constructor . name ; if ( n === "Map" || n === "Set" ) return Array . from ( o ) ; if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _arrayLikeToArray ( o , minLen ) ; }
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
function _arrayLikeToArray ( arr , len ) { if ( len == null || len > arr . length ) len = arr . length ; for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) { arr2 [ i ] = arr [ i ] ; } return arr2 ; }
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
function _defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( "value" in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } }
function _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
function _inheritsLoose ( subClass , superClass ) { subClass . prototype = Object . create ( superClass . prototype ) ; subClass . prototype . constructor = subClass ; subClass . _ _proto _ _ = superClass ; }
function cleanSource ( nodes ) {
return nodes . map ( function ( i ) {
if ( i . nodes ) i . nodes = cleanSource ( i . nodes ) ;
delete i . source ;
return i ;
} ) ;
}
/ * *
* The { @ link Root } , { @ link AtRule } , and { @ link Rule } container nodes
* inherit some common methods to help work with their children .
*
* Note that all containers can store any content . If you write a rule inside
* a rule , PostCSS will parse it .
*
* @ extends Node
* @ abstract
* /
var Container = /*#__PURE__*/ function ( _Node ) {
_inheritsLoose ( Container , _Node ) ;
function Container ( ) {
return _Node . apply ( this , arguments ) || this ;
}
var _proto = Container . prototype ;
_proto . push = function push ( child ) {
child . parent = this ;
this . nodes . push ( child ) ;
return this ;
}
/ * *
* Iterates through the container ’ s immediate children ,
* calling ` callback ` for each child .
*
* Returning ` false ` in the callback will break iteration .
*
* This method only iterates through the container ’ s immediate children .
* If you need to recursively iterate through all the container ’ s descendant
* nodes , use { @ link Container # walk } .
*
* Unlike the for ` {} ` - cycle or ` Array#forEach ` this iterator is safe
* if you are mutating the array of child nodes during iteration .
* PostCSS will adjust the current index to match the mutations .
*
* @ param { childIterator } callback Iterator receives each node and index .
*
* @ return { false | undefined } Returns ` false ` if iteration was broke .
*
* @ example
* const root = postcss . parse ( 'a { color: black; z-index: 1 }' )
* const rule = root . first
*
* for ( const decl of rule . nodes ) {
* decl . cloneBefore ( { prop : '-webkit-' + decl . prop } )
* // Cycle will be infinite, because cloneBefore moves the current node
* // to the next index
* }
*
* rule . each ( decl => {
* decl . cloneBefore ( { prop : '-webkit-' + decl . prop } )
* // Will be executed only for color and z-index
* } )
* /
;
_proto . each = function each ( callback ) {
if ( ! this . lastEach ) this . lastEach = 0 ;
if ( ! this . indexes ) this . indexes = { } ;
this . lastEach += 1 ;
var id = this . lastEach ;
this . indexes [ id ] = 0 ;
if ( ! this . nodes ) return undefined ;
var index , result ;
while ( this . indexes [ id ] < this . nodes . length ) {
index = this . indexes [ id ] ;
result = callback ( this . nodes [ index ] , index ) ;
if ( result === false ) break ;
this . indexes [ id ] += 1 ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
delete this . indexes [ id ] ;
return result ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Traverses the container ’ s descendant nodes , calling callback
* for each node .
*
* Like container . each ( ) , this method is safe to use
* if you are mutating arrays during iteration .
*
* If you only need to iterate through the container ’ s immediate children ,
* use { @ link Container # each } .
*
* @ param { childIterator } callback Iterator receives each node and index .
*
* @ return { false | undefined } Returns ` false ` if iteration was broke .
*
* @ example
* root . walk ( node => {
* // Traverses all descendant nodes.
* } )
* /
;
_proto . walk = function walk ( callback ) {
return this . each ( function ( child , i ) {
var result ;
2023-07-01 10:42:40 +02:00
try {
2023-07-05 11:02:15 +02:00
result = callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
} catch ( e ) {
2023-07-05 11:02:15 +02:00
e . postcssNode = child ;
if ( e . stack && child . source && /\n\s{4}at / . test ( e . stack ) ) {
var s = child . source ;
e . stack = e . stack . replace ( /\n\s{4}at / , "$&" + s . input . from + ":" + s . start . line + ":" + s . start . column + "$&" ) ;
}
throw e ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if ( result !== false && child . walk ) {
2023-07-05 11:02:15 +02:00
result = child . walk ( callback ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return result ;
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Traverses the container ’ s descendant nodes , calling callback
* for each declaration node .
*
* If you pass a filter , iteration will only happen over declarations
* with matching properties .
*
* Like { @ link Container # each } , this method is safe
* to use if you are mutating arrays during iteration .
*
* @ param { string | RegExp } [ prop ] String or regular expression
* to filter declarations by property name .
* @ param { childIterator } callback Iterator receives each node and index .
*
* @ return { false | undefined } Returns ` false ` if iteration was broke .
*
* @ example
* root . walkDecls ( decl => {
* checkPropertySupport ( decl . prop )
* } )
*
* root . walkDecls ( 'border-radius' , decl => {
* decl . remove ( )
* } )
*
* root . walkDecls ( /^background/ , decl => {
* decl . value = takeFirstColorFromGradient ( decl . value )
* } )
* /
;
_proto . walkDecls = function walkDecls ( prop , callback ) {
2023-07-01 10:42:40 +02:00
if ( ! callback ) {
2023-07-05 11:02:15 +02:00
callback = prop ;
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'decl' ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if ( prop instanceof RegExp ) {
2023-07-05 11:02:15 +02:00
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'decl' && prop . test ( child . prop ) ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'decl' && child . prop === prop ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Traverses the container ’ s descendant nodes , calling callback
* for each rule node .
*
* If you pass a filter , iteration will only happen over rules
* with matching selectors .
*
* Like { @ link Container # each } , this method is safe
* to use if you are mutating arrays during iteration .
*
* @ param { string | RegExp } [ selector ] String or regular expression
* to filter rules by selector .
* @ param { childIterator } callback Iterator receives each node and index .
*
* @ return { false | undefined } returns ` false ` if iteration was broke .
*
* @ example
* const selectors = [ ]
* root . walkRules ( rule => {
* selectors . push ( rule . selector )
* } )
* console . log ( ` Your CSS uses ${ selectors . length } selectors ` )
* /
;
_proto . walkRules = function walkRules ( selector , callback ) {
2023-07-01 10:42:40 +02:00
if ( ! callback ) {
2023-07-05 11:02:15 +02:00
callback = selector ;
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'rule' ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if ( selector instanceof RegExp ) {
2023-07-05 11:02:15 +02:00
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'rule' && selector . test ( child . selector ) ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'rule' && child . selector === selector ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Traverses the container ’ s descendant nodes , calling callback
* for each at - rule node .
*
* If you pass a filter , iteration will only happen over at - rules
* that have matching names .
*
* Like { @ link Container # each } , this method is safe
* to use if you are mutating arrays during iteration .
*
* @ param { string | RegExp } [ name ] String or regular expression
* to filter at - rules by name .
* @ param { childIterator } callback Iterator receives each node and index .
*
* @ return { false | undefined } Returns ` false ` if iteration was broke .
*
* @ example
* root . walkAtRules ( rule => {
* if ( isOld ( rule . name ) ) rule . remove ( )
* } )
*
* let first = false
* root . walkAtRules ( 'charset' , rule => {
* if ( ! first ) {
* first = true
* } else {
* rule . remove ( )
* }
* } )
* /
;
_proto . walkAtRules = function walkAtRules ( name , callback ) {
2023-07-01 10:42:40 +02:00
if ( ! callback ) {
2023-07-05 11:02:15 +02:00
callback = name ;
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'atrule' ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if ( name instanceof RegExp ) {
2023-07-05 11:02:15 +02:00
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'atrule' && name . test ( child . name ) ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'atrule' && child . name === name ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Traverses the container ’ s descendant nodes , calling callback
* for each comment node .
*
* Like { @ link Container # each } , this method is safe
* to use if you are mutating arrays during iteration .
*
* @ param { childIterator } callback Iterator receives each node and index .
*
* @ return { false | undefined } Returns ` false ` if iteration was broke .
*
* @ example
* root . walkComments ( comment => {
* comment . remove ( )
* } )
* /
;
_proto . walkComments = function walkComments ( callback ) {
return this . walk ( function ( child , i ) {
2023-07-01 10:42:40 +02:00
if ( child . type === 'comment' ) {
2023-07-05 11:02:15 +02:00
return callback ( child , i ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Inserts new nodes to the end of the container .
*
* @ param { ... ( Node | object | string | Node [ ] ) } children New nodes .
*
* @ return { Node } This node for methods chain .
*
* @ example
* const decl1 = postcss . decl ( { prop : 'color' , value : 'black' } )
* const decl2 = postcss . decl ( { prop : 'background-color' , value : 'white' } )
* rule . append ( decl1 , decl2 )
*
* root . append ( { name : 'charset' , params : '"UTF-8"' } ) // at-rule
* root . append ( { selector : 'a' } ) // rule
* rule . append ( { prop : 'color' , value : 'black' } ) // declaration
* rule . append ( { text : 'Comment' } ) // comment
*
* root . append ( 'a {}' )
* root . first . append ( 'color: black; z-index: 1' )
* /
;
_proto . append = function append ( ) {
for ( var _len = arguments . length , children = new Array ( _len ) , _key = 0 ; _key < _len ; _key ++ ) {
children [ _key ] = arguments [ _key ] ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
for ( var _i = 0 , _children = children ; _i < _children . length ; _i ++ ) {
var child = _children [ _i ] ;
var nodes = this . normalize ( child , this . last ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for ( var _iterator = _createForOfIteratorHelperLoose ( nodes ) , _step ; ! ( _step = _iterator ( ) ) . done ; ) {
var node = _step . value ;
this . nodes . push ( node ) ;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
return this ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Inserts new nodes to the start of the container .
*
* @ param { ... ( Node | object | string | Node [ ] ) } children New nodes .
*
* @ return { Node } This node for methods chain .
*
* @ example
* const decl1 = postcss . decl ( { prop : 'color' , value : 'black' } )
* const decl2 = postcss . decl ( { prop : 'background-color' , value : 'white' } )
* rule . prepend ( decl1 , decl2 )
*
* root . append ( { name : 'charset' , params : '"UTF-8"' } ) // at-rule
* root . append ( { selector : 'a' } ) // rule
* rule . append ( { prop : 'color' , value : 'black' } ) // declaration
* rule . append ( { text : 'Comment' } ) // comment
*
* root . append ( 'a {}' )
* root . first . append ( 'color: black; z-index: 1' )
* /
;
_proto . prepend = function prepend ( ) {
for ( var _len2 = arguments . length , children = new Array ( _len2 ) , _key2 = 0 ; _key2 < _len2 ; _key2 ++ ) {
children [ _key2 ] = arguments [ _key2 ] ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
children = children . reverse ( ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for ( var _iterator2 = _createForOfIteratorHelperLoose ( children ) , _step2 ; ! ( _step2 = _iterator2 ( ) ) . done ; ) {
var child = _step2 . value ;
var nodes = this . normalize ( child , this . first , 'prepend' ) . reverse ( ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for ( var _iterator3 = _createForOfIteratorHelperLoose ( nodes ) , _step3 ; ! ( _step3 = _iterator3 ( ) ) . done ; ) {
var node = _step3 . value ;
this . nodes . unshift ( node ) ;
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for ( var id in this . indexes ) {
this . indexes [ id ] = this . indexes [ id ] + nodes . length ;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
return this ;
} ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto . cleanRaws = function cleanRaws ( keepBetween ) {
_Node . prototype . cleanRaws . call ( this , keepBetween ) ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
if ( this . nodes ) {
for ( var _iterator4 = _createForOfIteratorHelperLoose ( this . nodes ) , _step4 ; ! ( _step4 = _iterator4 ( ) ) . done ; ) {
var node = _step4 . value ;
node . cleanRaws ( keepBetween ) ;
2023-07-01 10:42:40 +02:00
}
}
}
2023-07-05 11:02:15 +02:00
/ * *
* Insert new node before old node within the container .
*
* @ param { Node | number } exist Child or child ’ s index .
* @ param { Node | object | string | Node [ ] } add New node .
*
* @ return { Node } This node for methods chain .
*
* @ example
* rule . insertBefore ( decl , decl . clone ( { prop : '-webkit-' + decl . prop } ) )
* /
;
_proto . insertBefore = function insertBefore ( exist , add ) {
exist = this . index ( exist ) ;
var type = exist === 0 ? 'prepend' : false ;
var nodes = this . normalize ( add , this . nodes [ exist ] , type ) . reverse ( ) ;
for ( var _iterator5 = _createForOfIteratorHelperLoose ( nodes ) , _step5 ; ! ( _step5 = _iterator5 ( ) ) . done ; ) {
var node = _step5 . value ;
this . nodes . splice ( exist , 0 , node ) ;
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var index ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for ( var id in this . indexes ) {
index = this . indexes [ id ] ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
if ( exist <= index ) {
this . indexes [ id ] = index + nodes . length ;
}
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
return this ;
}
/ * *
* Insert new node after old node within the container .
*
* @ param { Node | number } exist Child or child ’ s index .
* @ param { Node | object | string | Node [ ] } add New node .
*
* @ return { Node } This node for methods chain .
* /
;
_proto . insertAfter = function insertAfter ( exist , add ) {
exist = this . index ( exist ) ;
var nodes = this . normalize ( add , this . nodes [ exist ] ) . reverse ( ) ;
for ( var _iterator6 = _createForOfIteratorHelperLoose ( nodes ) , _step6 ; ! ( _step6 = _iterator6 ( ) ) . done ; ) {
var node = _step6 . value ;
this . nodes . splice ( exist + 1 , 0 , node ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
var index ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for ( var id in this . indexes ) {
index = this . indexes [ id ] ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
if ( exist < index ) {
this . indexes [ id ] = index + nodes . length ;
}
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
return this ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Removes node from the container and cleans the parent properties
* from the node and its children .
*
* @ param { Node | number } child Child or child ’ s index .
*
* @ return { Node } This node for methods chain
*
* @ example
* rule . nodes . length //=> 5
* rule . removeChild ( decl )
* rule . nodes . length //=> 4
* decl . parent //=> undefined
* /
;
_proto . removeChild = function removeChild ( child ) {
child = this . index ( child ) ;
this . nodes [ child ] . parent = undefined ;
this . nodes . splice ( child , 1 ) ;
var index ;
for ( var id in this . indexes ) {
index = this . indexes [ id ] ;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
if ( index >= child ) {
this . indexes [ id ] = index - 1 ;
}
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
return this ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Removes all children from the container
* and cleans their parent properties .
*
* @ return { Node } This node for methods chain .
*
* @ example
* rule . removeAll ( )
* rule . nodes . length //=> 0
* /
;
_proto . removeAll = function removeAll ( ) {
for ( var _iterator7 = _createForOfIteratorHelperLoose ( this . nodes ) , _step7 ; ! ( _step7 = _iterator7 ( ) ) . done ; ) {
var node = _step7 . value ;
node . parent = undefined ;
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
this . nodes = [ ] ;
return this ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Passes all declaration values within the container that match pattern
* through callback , replacing those values with the returned result
* of callback .
*
* This method is useful if you are using a custom unit or function
* and need to iterate through all values .
*
* @ param { string | RegExp } pattern Replace pattern .
* @ param { object } opts Options to speed up the search .
* @ param { string | string [ ] } opts . props An array of property names .
* @ param { string } opts . fast String that ’ s used to narrow down
* values and speed up the regexp search .
* @ param { function | string } callback String to replace pattern or callback
* that returns a new value . The callback
* will receive the same arguments
* as those passed to a function parameter
* of ` String#replace ` .
*
* @ return { Node } This node for methods chain .
*
* @ example
* root . replaceValues ( /\d+rem/ , { fast : 'rem' } , string => {
* return 15 * parseInt ( string ) + 'px'
* } )
* /
;
_proto . replaceValues = function replaceValues ( pattern , opts , callback ) {
if ( ! callback ) {
callback = opts ;
opts = { } ;
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
this . walkDecls ( function ( decl ) {
if ( opts . props && opts . props . indexOf ( decl . prop ) === - 1 ) return ;
if ( opts . fast && decl . value . indexOf ( opts . fast ) === - 1 ) return ;
decl . value = decl . value . replace ( pattern , callback ) ;
} ) ;
return this ;
}
/ * *
* Returns ` true ` if callback returns ` true `
* for all of the container ’ s children .
*
* @ param { childCondition } condition Iterator returns true or false .
*
* @ return { boolean } Is every child pass condition .
*
* @ example
* const noPrefixes = rule . every ( i => i . prop [ 0 ] !== '-' )
* /
;
_proto . every = function every ( condition ) {
return this . nodes . every ( condition ) ;
}
/ * *
* Returns ` true ` if callback returns ` true ` for ( at least ) one
* of the container ’ s children .
*
* @ param { childCondition } condition Iterator returns true or false .
*
* @ return { boolean } Is some child pass condition .
*
* @ example
* const hasPrefix = rule . some ( i => i . prop [ 0 ] === '-' )
* /
;
_proto . some = function some ( condition ) {
return this . nodes . some ( condition ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* Returns a ` child ` ’ s index within the { @ link Container # nodes } array .
*
* @ param { Node } child Child of the current container .
*
* @ return { number } Child index .
*
* @ example
* rule . index ( rule . nodes [ 2 ] ) //=> 2
* /
;
_proto . index = function index ( child ) {
if ( typeof child === 'number' ) {
return child ;
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
return this . nodes . indexOf ( child ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* The container ’ s first child .
*
* @ type { Node }
*
* @ example
* rule . first === rules . nodes [ 0 ]
* /
;
_proto . normalize = function normalize ( nodes , sample ) {
var _this = this ;
2023-07-01 10:42:40 +02:00
if ( typeof nodes === 'string' ) {
2023-07-05 11:02:15 +02:00
var parse = require ( './parse' ) ;
nodes = cleanSource ( parse ( nodes ) . nodes ) ;
2023-07-01 10:42:40 +02:00
} else if ( Array . isArray ( nodes ) ) {
2023-07-05 11:02:15 +02:00
nodes = nodes . slice ( 0 ) ;
for ( var _iterator8 = _createForOfIteratorHelperLoose ( nodes ) , _step8 ; ! ( _step8 = _iterator8 ( ) ) . done ; ) {
var i = _step8 . value ;
if ( i . parent ) i . parent . removeChild ( i , 'ignore' ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
} else if ( nodes . type === 'root' ) {
nodes = nodes . nodes . slice ( 0 ) ;
for ( var _iterator9 = _createForOfIteratorHelperLoose ( nodes ) , _step9 ; ! ( _step9 = _iterator9 ( ) ) . done ; ) {
var _i2 = _step9 . value ;
if ( _i2 . parent ) _i2 . parent . removeChild ( _i2 , 'ignore' ) ;
2023-07-01 10:42:40 +02:00
}
} else if ( nodes . type ) {
2023-07-05 11:02:15 +02:00
nodes = [ nodes ] ;
2023-07-01 10:42:40 +02:00
} else if ( nodes . prop ) {
if ( typeof nodes . value === 'undefined' ) {
2023-07-05 11:02:15 +02:00
throw new Error ( 'Value field is missed in node creation' ) ;
2023-07-01 10:42:40 +02:00
} else if ( typeof nodes . value !== 'string' ) {
2023-07-05 11:02:15 +02:00
nodes . value = String ( nodes . value ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
nodes = [ new _declaration . default ( nodes ) ] ;
2023-07-01 10:42:40 +02:00
} else if ( nodes . selector ) {
2023-07-05 11:02:15 +02:00
var Rule = require ( './rule' ) ;
nodes = [ new Rule ( nodes ) ] ;
2023-07-01 10:42:40 +02:00
} else if ( nodes . name ) {
2023-07-05 11:02:15 +02:00
var AtRule = require ( './at-rule' ) ;
nodes = [ new AtRule ( nodes ) ] ;
2023-07-01 10:42:40 +02:00
} else if ( nodes . text ) {
2023-07-05 11:02:15 +02:00
nodes = [ new _comment . default ( nodes ) ] ;
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
throw new Error ( 'Unknown node type in node creation' ) ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
var processed = nodes . map ( function ( i ) {
if ( i . parent ) i . parent . removeChild ( i ) ;
2023-07-01 10:42:40 +02:00
if ( typeof i . raws . before === 'undefined' ) {
if ( sample && typeof sample . raws . before !== 'undefined' ) {
2023-07-05 11:02:15 +02:00
i . raws . before = sample . raws . before . replace ( /[^\s]/g , '' ) ;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
i . parent = _this ;
return i ;
} ) ;
return processed ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* @ memberof Container #
* @ member { Node [ ] } nodes An array containing the container ’ s children .
*
* @ example
* const root = postcss . parse ( 'a { color: black }' )
* root . nodes . length //=> 1
* root . nodes [ 0 ] . selector //=> 'a'
* root . nodes [ 0 ] . nodes [ 0 ] . prop //=> 'color'
* /
;
_createClass ( Container , [ {
key : "first" ,
get : function get ( ) {
if ( ! this . nodes ) return undefined ;
return this . nodes [ 0 ] ;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
/ * *
* The container ’ s last child .
*
* @ type { Node }
*
* @ example
* rule . last === rule . nodes [ rule . nodes . length - 1 ]
* /
} , {
key : "last" ,
get : function get ( ) {
if ( ! this . nodes ) return undefined ;
return this . nodes [ this . nodes . length - 1 ] ;
}
} ] ) ;
return Container ;
} ( _node . default ) ;
var _default = Container ;
/ * *
* @ callback childCondition
* @ param { Node } node Container child .
* @ param { number } index Child index .
* @ param { Node [ ] } nodes All container children .
* @ return { boolean }
* /
/ * *
* @ callback childIterator
* @ param { Node } node Container child .
* @ param { number } index Child index .
* @ return { false | undefined } Returning ` false ` will break iteration .
* /
exports . default = _default ;
module . exports = exports . default ;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5lczYiXSwibmFtZXMiOlsiY2xlYW5Tb3VyY2UiLCJub2RlcyIsIm1hcCIsImkiLCJzb3VyY2UiLCJDb250YWluZXIiLCJwdXNoIiwiY2hpbGQiLCJwYXJlbnQiLCJlYWNoIiwiY2FsbGJhY2siLCJsYXN0RWFjaCIsImluZGV4ZXMiLCJpZCIsInVuZGVmaW5lZCIsImluZGV4IiwicmVzdWx0IiwibGVuZ3RoIiwid2FsayIsImUiLCJwb3N0Y3NzTm9kZSIsInN0YWNrIiwidGVzdCIsInMiLCJyZXBsYWNlIiwiaW5wdXQiLCJmcm9tIiwic3RhcnQiLCJsaW5lIiwiY29sdW1uIiwid2Fsa0RlY2xzIiwicHJvcCIsInR5cGUiLCJSZWdFeHAiLCJ3YWxrUnVsZXMiLCJzZWxlY3RvciIsIndhbGtBdFJ1bGVzIiwibmFtZSIsIndhbGtDb21tZW50cyIsImFwcGVuZCIsImNoaWxkcmVuIiwibm9ybWFsaXplIiwibGFzdCIsIm5vZGUiLCJwcmVwZW5kIiwicmV2ZXJzZSIsImZpcnN0IiwidW5zaGlmdCIsImNsZWFuUmF3cyIsImtlZXBCZXR3ZWVuIiwiaW5zZXJ0QmVmb3JlIiwiZXhpc3QiLCJhZGQiLCJzcGxpY2UiLCJpbnNlcnRBZnRlciIsInJlbW92ZUNoaWxkIiwicmVtb3ZlQWxsIiwicmVwbGFjZVZhbHVlcyIsInBhdHRlcm4iLCJvcHRzIiwiZGVjbCIsInByb3BzIiwiaW5kZXhPZiIsImZhc3QiLCJ2YWx1ZSIsImV2ZXJ5IiwiY29uZGl0aW9uIiwic29tZSIsInNhbXBsZSIsInBhcnNlIiwicmVxdWlyZSIsIkFycmF5IiwiaXNBcnJheSIsInNsaWNlIiwiRXJyb3IiLCJTdHJpbmciLCJEZWNsYXJhdGlvbiIsIlJ1bGUiLCJBdFJ1bGUiLCJ0ZXh0IiwiQ29tbWVudCIsInByb2Nlc3NlZCIsInJhd3MiLCJiZWZvcmUiLCJOb2RlIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsU0FBU0EsV0FB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