@@ -6,6 +6,7 @@ import Ruleset from './ruleset';
66import Anonymous from './anonymous' ;
77import * as utils from '../utils' ;
88import LessError from '../less-error' ;
9+ import Expression from './expression' ;
910
1011//
1112// CSS @import node
@@ -157,6 +158,20 @@ Import.prototype = Object.assign(new Node(), {
157158 return [ ] ;
158159 }
159160 }
161+ if ( this . features ) {
162+ let featureValue = this . features . value ;
163+ if ( Array . isArray ( featureValue ) && featureValue . length >= 1 ) {
164+ const expr = featureValue [ 0 ] ;
165+ if ( expr . type === 'Expression' && Array . isArray ( expr . value ) && expr . value . length >= 2 ) {
166+ featureValue = expr . value ;
167+ const isLayer = featureValue [ 0 ] . type === 'Keyword' && featureValue [ 0 ] . value === 'layer'
168+ && featureValue [ 1 ] . type === 'Paren' ;
169+ if ( isLayer ) {
170+ this . css = false ;
171+ }
172+ }
173+ }
174+ }
160175 if ( this . options . inline ) {
161176 const contents = new Anonymous ( this . root , 0 ,
162177 {
@@ -165,18 +180,57 @@ Import.prototype = Object.assign(new Node(), {
165180 } , true , true ) ;
166181
167182 return this . features ? new Media ( [ contents ] , this . features . value ) : [ contents ] ;
168- } else if ( this . css ) {
183+ } else if ( this . css || this . layerCss ) {
169184 const newImport = new Import ( this . evalPath ( context ) , features , this . options , this . _index ) ;
185+ if ( this . layerCss ) {
186+ newImport . css = this . layerCss ;
187+ newImport . path . _fileInfo = this . _fileInfo ;
188+ }
170189 if ( ! newImport . css && this . error ) {
171190 throw this . error ;
172191 }
173192 return newImport ;
174193 } else if ( this . root ) {
194+ if ( this . features ) {
195+ let featureValue = this . features . value ;
196+ if ( Array . isArray ( featureValue ) && featureValue . length === 1 ) {
197+ const expr = featureValue [ 0 ] ;
198+ if ( expr . type === 'Expression' && Array . isArray ( expr . value ) && expr . value . length >= 2 ) {
199+ featureValue = expr . value ;
200+ const isLayer = featureValue [ 0 ] . type === 'Keyword' && featureValue [ 0 ] . value === 'layer'
201+ && featureValue [ 1 ] . type === 'Paren' ;
202+ if ( isLayer ) {
203+ this . layerCss = true ;
204+ featureValue [ 0 ] = new Expression ( featureValue . slice ( 0 , 2 ) ) ;
205+ featureValue . splice ( 1 , 1 ) ;
206+ featureValue [ 0 ] . noSpacing = true ;
207+ return this ;
208+ }
209+ }
210+ }
211+ }
175212 ruleset = new Ruleset ( null , utils . copyArray ( this . root . rules ) ) ;
176213 ruleset . evalImports ( context ) ;
177214
178215 return this . features ? new Media ( ruleset . rules , this . features . value ) : ruleset . rules ;
179216 } else {
217+ if ( this . features ) {
218+ let featureValue = this . features . value ;
219+ if ( Array . isArray ( featureValue ) && featureValue . length >= 1 ) {
220+ featureValue = featureValue [ 0 ] . value ;
221+ if ( Array . isArray ( featureValue ) && featureValue . length >= 2 ) {
222+ const isLayer = featureValue [ 0 ] . type === 'Keyword' && featureValue [ 0 ] . value === 'layer'
223+ && featureValue [ 1 ] . type === 'Paren' ;
224+ if ( isLayer ) {
225+ this . css = true ;
226+ featureValue [ 0 ] = new Expression ( featureValue . slice ( 0 , 2 ) ) ;
227+ featureValue . splice ( 1 , 1 ) ;
228+ featureValue [ 0 ] . noSpacing = true ;
229+ return this ;
230+ }
231+ }
232+ }
233+ }
180234 return [ ] ;
181235 }
182236 }
0 commit comments