@@ -18,9 +18,11 @@ const hasParentRule = (rule) => {
1818 if ( ! rule . parent ) {
1919 return false
2020 }
21+
2122 if ( rule . parent . type === 'rule' ) {
2223 return true
2324 }
25+
2426 return hasParentRule ( rule . parent )
2527}
2628
@@ -48,6 +50,7 @@ const parentIsAllowedAtRule = (rule) => {
4850 */
4951const regexpToGlobalRegexp = ( regexp ) => {
5052 let source = regexp instanceof RegExp ? regexp . source : regexp
53+
5154 return new RegExp ( source , 'g' )
5255}
5356
@@ -59,43 +62,56 @@ module.exports = (options = {}) => {
5962 ignoreRoot = true ,
6063 dropRoot = true ,
6164 } = options
65+
6266 selfSelector = regexpToGlobalRegexp ( selfSelector )
67+
6368 const namespaceSelector = ( selector , computedNamespace ) => {
6469 if ( hasSelfSelector ( selector ) ) {
6570 return computedNamespace . split ( ',' ) . map ( namespace => selector . replace ( selfSelector , namespace ) ) . join ( ',' ) ;
6671 }
72+
6773 if ( hasRootSelector ( selector ) ) {
6874 return dropRootSelector ( selector )
6975 }
76+
7077 return computedNamespace . split ( ',' ) . map ( namespace => `${ namespace } ${ selector } ` ) . join ( ',' ) ;
7178 }
79+
7280 const hasSelfSelector = ( selector ) => {
7381 selfSelector . lastIndex = 0
82+
7483 return selfSelector . test ( selector )
7584 }
85+
7686 const hasRootSelector = ( selector ) => {
7787 return ignoreRoot && selector . search ( rootSelector ) === 0
7888 }
89+
7990 const dropRootSelector = ( selector ) => {
8091 if ( dropRoot ) {
8192 return selector . replace ( rootSelector , '' ) . trim ( ) || selector
8293 }
94+
8395 return selector
8496 }
97+
8598 return {
8699 postcssPlugin : 'postcss-selector-namespaces' ,
87100 Once ( root , { result } ) {
88101 const computedNamespace =
89102 typeof namespace === 'string'
90103 ? namespace
91104 : namespace ( root . source . input . file )
105+
92106 if ( ! computedNamespace ) {
93107 return
94108 }
109+
95110 root . walkRules ( rule => {
96111 if ( canNamespaceSelectors ( rule ) ) {
97112 return
98113 }
114+
99115 rule . selectors = rule . selectors . map ( selector =>
100116 namespaceSelector ( selector , computedNamespace ) ,
101117 )
0 commit comments