11const postcss = require ( 'postcss' ) ;
22const fs = require ( 'node:fs' ) ;
3+ const path = require ( 'node:path' ) ;
34
45module . exports = {
56 plugins : [
@@ -17,21 +18,28 @@ function postcssComposes() {
1718 return {
1819 postcssPlugin : '@composes' , // Allows `@composes classname from './file.css'` directive
1920 AtRule : {
20- composes : async ( rule ) => {
21+ composes : async ( rule , { AtRule } ) => {
2122 const cache = { } ;
2223 const sanitizedParams = rule . params . replace ( / [ " ' ] / g, '' ) . trim ( ) ;
2324 const [ selector , from ] = sanitizedParams . split ( / \s + f r o m \s + / ) ;
25+ const resolvedFrom = path . resolve (
26+ path . dirname ( rule . source . input . file ) ,
27+ from ,
28+ ) ;
2429
25- if ( ! cache [ from ] )
26- cache [ from ] = await postcss ( [ ] ) . process ( fs . readFileSync ( from ) , {
27- from,
28- } ) ;
30+ if ( ! cache [ resolvedFrom ] )
31+ cache [ resolvedFrom ] = await postcss ( [ ] ) . process (
32+ fs . readFileSync ( resolvedFrom ) ,
33+ {
34+ from : resolvedFrom ,
35+ } ,
36+ ) ;
2937
30- cache [ from ] . root . walkRules ( ( from ) => {
31- if ( from . selector . startsWith ( `.${ selector } ` ) )
38+ cache [ resolvedFrom ] . root . walkRules ( ( fromRule ) => {
39+ if ( fromRule . selector . startsWith ( `.${ selector } ` ) )
3240 rule . replaceWith (
33- from . clone ( {
34- selector : from . selector . replace ( `.${ selector } ` , '&' ) ,
41+ fromRule . clone ( {
42+ selector : fromRule . selector . replace ( `.${ selector } ` , '&' ) ,
3543 } ) ,
3644 ) ;
3745 } ) ;
0 commit comments