11import { FileType } from '../enum'
2- import { handleCharacters } from '../utilities'
2+ import { customReplace , handleCharacters } from '../utilities'
33import { Options } from '../interfaces'
44
5- export function transformSelector ( ) {
5+ export function transformSelector ( options : Options ) {
66
77 const processed = Symbol ( 'processed' )
8+ const defaultSpaceBetweenItems = [ 'view' , 'button' , 'text' , 'image' ]
9+ const usersSpaceBetweenItems = options ?. utilitiesSettings ?. spaceBetweenItems || [ ]
10+ const spaceBetweenItems = Array . from ( new Set ( [ ...defaultSpaceBetweenItems , ...usersSpaceBetweenItems ] ) )
11+ const customReplacement = new Map ( )
12+
13+ /**
14+ * A polyfill that is compatible 'space-[x,y]-\d' syntax
15+ * Note that in mini program environment ':not()' selector can only be used when it's combined with other selectors
16+ * e.g. view:not() works but the standalone :not() selector couldn't work
17+ */
18+ customReplacement . set ( / ^ ( \. - ? s p a c e - \w ) ( - .+ ?) \s .* / , spaceBetweenItems . map ( item => `$1$2:not($1-reverse) > ${ item } :not([hidden]):not(:first-child), $1$2$1-reverse > ${ item } :not([hidden]):not(:last-child)` ) . join ( ', ' ) )
19+ customReplacement . set ( / ^ ( \. - ? s p a c e - \w - r e v e r s e ) .* / , spaceBetweenItems . map ( item => `$1 > ${ item } :not([hidden])` ) . join ( ', ' ) )
820
921 return {
1022 postcssPlugin : 'transformSelectorName' ,
@@ -13,6 +25,7 @@ export function transformSelector() {
1325 if ( ! node [ processed ] ) {
1426
1527 node . selector = handleCharacters ( node . selector , FileType . Style )
28+ node . selector = customReplace ( node . selector , customReplacement )
1629 node [ processed ] = true
1730
1831 }
0 commit comments