1- import type { AtRule , Rule } from 'postcss' ;
1+ import { type AtRule , type Node , Rule , ChildNode } from 'postcss' ;
22import { isAtRuleNode } from './utils/isAtRuleNode' ;
33import { isChildNode } from './utils/isChildNode' ;
44
@@ -9,8 +9,8 @@ export interface ResolvedTailwindNode {
99
1010export interface UnresolvedTailwindNode {
1111 key : string ;
12- fallbackRule : Rule ;
13- classesPrefixWhenFound : string ;
12+ originalRule : Rule ;
13+ classesPrefix : string ;
1414 tailwindClasses : string [ ] ;
1515}
1616
@@ -40,33 +40,43 @@ export class TailwindNodesManager {
4040
4141 mergeNode ( node : TailwindNode ) {
4242 const nodeIsResolved = isResolvedTailwindNode ( node ) ;
43- const key = nodeIsResolved
43+ const nodeKey = nodeIsResolved
4444 ? TailwindNodesManager . convertRuleToKey ( node . rule )
4545 : node . key ;
46- const foundNode = this . nodesMap . get ( key ) ;
47-
48- if ( ! foundNode ) {
49- if ( nodeIsResolved ) {
50- this . nodesMap . set ( key , node ) ;
51- } else {
52- this . nodesMap . set (
53- TailwindNodesManager . convertRuleToKey ( node . fallbackRule ) ,
54- {
55- rule : node . fallbackRule ,
56- tailwindClasses : node . tailwindClasses ,
57- }
58- ) ;
59- }
46+ const foundNode = this . nodesMap . get ( nodeKey ) ;
47+
48+ if ( foundNode ) {
49+ foundNode . tailwindClasses = foundNode . tailwindClasses . concat (
50+ nodeIsResolved
51+ ? node . tailwindClasses
52+ : node . tailwindClasses . map (
53+ className => `${ node . classesPrefix } ${ className } `
54+ )
55+ ) ;
56+
6057 return ;
6158 }
6259
63- foundNode . tailwindClasses = foundNode . tailwindClasses . concat (
64- nodeIsResolved
65- ? node . tailwindClasses
66- : node . tailwindClasses . map (
67- className => `${ node . classesPrefixWhenFound } ${ className } `
68- )
69- ) ;
60+ if ( nodeIsResolved ) {
61+ this . nodesMap . set ( nodeKey , node ) ;
62+ } else {
63+ const newRule = new Rule ( {
64+ // TODO: CONVERT NODE KEY TO RULE!!
65+ selector : nodeKey ,
66+ } ) ;
67+
68+ const rootChild = this . upToRootChild ( node . originalRule ) ;
69+ if ( rootChild ) {
70+ node . originalRule . root ( ) . insertBefore ( rootChild , newRule ) ;
71+ }
72+
73+ this . nodesMap . set ( nodeKey , {
74+ rule : newRule ,
75+ tailwindClasses : node . tailwindClasses . map (
76+ className => `${ node . classesPrefix } ${ className } `
77+ ) ,
78+ } ) ;
79+ }
7080 }
7181
7282 mergeNodes ( nodes : TailwindNode [ ] ) {
@@ -87,6 +97,21 @@ export class TailwindNodesManager {
8797 return Array . from ( this . nodesMap . values ( ) ) ;
8898 }
8999
100+ protected upToRootChild ( node : Node ) {
101+ let childNode : ChildNode | null = null ;
102+
103+ while (
104+ node . parent &&
105+ node . parent . type !== 'root' &&
106+ isChildNode ( node . parent )
107+ ) {
108+ childNode = node = node . parent ;
109+ continue ;
110+ }
111+
112+ return childNode ;
113+ }
114+
90115 static convertRuleToKey (
91116 rule : Rule ,
92117 overriddenSelector : string | null = null
0 commit comments