@@ -358,7 +358,7 @@ function getWebpackResolver(
358358 }
359359
360360 const isDartSass = implementation . info . includes ( "dart-sass" ) ;
361- const sassResolve = promiseResolve (
361+ const sassModuleResolve = promiseResolve (
362362 resolverFactory ( {
363363 alias : [ ] ,
364364 aliasFields : [ ] ,
@@ -373,7 +373,22 @@ function getWebpackResolver(
373373 preferRelative : true ,
374374 } )
375375 ) ;
376- const webpackResolve = promiseResolve (
376+ const sassImportResolve = promiseResolve (
377+ resolverFactory ( {
378+ alias : [ ] ,
379+ aliasFields : [ ] ,
380+ conditionNames : [ ] ,
381+ descriptionFiles : [ ] ,
382+ extensions : [ ".sass" , ".scss" , ".css" ] ,
383+ exportsFields : [ ] ,
384+ mainFields : [ ] ,
385+ mainFiles : [ "_index.import" , "_index" , "index.import" , "index" ] ,
386+ modules : [ ] ,
387+ restrictions : [ / \. ( ( s a | s c | c ) s s ) $ / i] ,
388+ preferRelative : true ,
389+ } )
390+ ) ;
391+ const webpackModuleResolve = promiseResolve (
377392 resolverFactory ( {
378393 dependencyType : "sass" ,
379394 conditionNames : [ "sass" , "style" ] ,
@@ -384,8 +399,19 @@ function getWebpackResolver(
384399 preferRelative : true ,
385400 } )
386401 ) ;
402+ const webpackImportResolve = promiseResolve (
403+ resolverFactory ( {
404+ dependencyType : "sass" ,
405+ conditionNames : [ "sass" , "style" ] ,
406+ mainFields : [ "sass" , "style" , "main" , "..." ] ,
407+ mainFiles : [ "_index.import" , "_index" , "index.import" , "index" , "..." ] ,
408+ extensions : [ ".sass" , ".scss" , ".css" ] ,
409+ restrictions : [ / \. ( ( s a | s c | c ) s s ) $ / i] ,
410+ preferRelative : true ,
411+ } )
412+ ) ;
387413
388- return ( context , request ) => {
414+ return ( context , request , fromImport ) => {
389415 // See https://github.com/webpack/webpack/issues/12340
390416 // Because `node-sass` calls our importer before `1. Filesystem imports relative to the base file.`
391417 // custom importer may not return `{ file: '/path/to/name.ext' }` and therefore our `context` will be relative
@@ -434,7 +460,7 @@ function getWebpackResolver(
434460 // `node-sass` calls our importer before `1. Filesystem imports relative to the base file.`, so we need emulate this too
435461 if ( ! isDartSass ) {
436462 resolutionMap = resolutionMap . concat ( {
437- resolve : sassResolve ,
463+ resolve : fromImport ? sassImportResolve : sassModuleResolve ,
438464 context : path . dirname ( context ) ,
439465 possibleRequests : sassPossibleRequests ,
440466 } ) ;
@@ -444,7 +470,7 @@ function getWebpackResolver(
444470 // eslint-disable-next-line no-shadow
445471 includePaths . map ( ( context ) => {
446472 return {
447- resolve : sassResolve ,
473+ resolve : fromImport ? sassImportResolve : sassModuleResolve ,
448474 context,
449475 possibleRequests : sassPossibleRequests ,
450476 } ;
@@ -455,7 +481,7 @@ function getWebpackResolver(
455481 const webpackPossibleRequests = getPossibleRequests ( request , true ) ;
456482
457483 resolutionMap = resolutionMap . concat ( {
458- resolve : webpackResolve ,
484+ resolve : fromImport ? webpackImportResolve : webpackModuleResolve ,
459485 context : path . dirname ( context ) ,
460486 possibleRequests : webpackPossibleRequests ,
461487 } ) ;
@@ -464,7 +490,7 @@ function getWebpackResolver(
464490 } ;
465491}
466492
467- const matchCss = / \. c s s $ / i;
493+ const MATCH_CSS = / \. c s s $ / i;
468494
469495function getWebpackImporter ( loaderContext , implementation , includePaths ) {
470496 const resolve = getWebpackResolver (
@@ -473,16 +499,18 @@ function getWebpackImporter(loaderContext, implementation, includePaths) {
473499 includePaths
474500 ) ;
475501
476- return ( originalUrl , prev , done ) => {
477- resolve ( prev , originalUrl )
502+ return function importer ( originalUrl , prev , done ) {
503+ const { fromImport } = this ;
504+
505+ resolve ( prev , originalUrl , fromImport )
478506 . then ( ( result ) => {
479507 // Add the result as dependency.
480508 // Although we're also using stats.includedFiles, this might come in handy when an error occurs.
481509 // In this case, we don't get stats.includedFiles from node-sass/sass.
482510 loaderContext . addDependency ( path . normalize ( result ) ) ;
483511
484512 // By removing the CSS file extension, we trigger node-sass to include the CSS file instead of just linking it.
485- done ( { file : result . replace ( matchCss , "" ) } ) ;
513+ done ( { file : result . replace ( MATCH_CSS , "" ) } ) ;
486514 } )
487515 // Catch all resolving errors, return the original file and pass responsibility back to other custom importers
488516 . catch ( ( ) => {
0 commit comments