11var loaderUtils = require ( 'loader-utils' ) ;
22var postcss = require ( 'postcss' ) ;
3+ var assign = require ( './lib/assign' ) ;
4+ var getConfiguration = require ( './lib/configuration' ) ;
35
46function PostCSSLoaderError ( error ) {
57 Error . call ( this ) ;
@@ -25,83 +27,72 @@ module.exports = function (source, map) {
2527 var file = this . resourcePath ;
2628 var params = loaderUtils . parseQuery ( this . query ) ;
2729
28- var opts = {
29- from : file ,
30- to : file ,
31- map : {
32- inline : params . sourceMap === 'inline' ,
33- annotation : false
30+ var options = this . options . postcss ;
31+ var pack = params . pack ;
32+ var loader = this ;
33+ var callback = this . async ( ) ;
34+
35+ getConfiguration ( options , pack , function ( err , config ) {
36+ if ( err ) {
37+ callback ( err ) ;
38+ return ;
3439 }
35- } ;
3640
37- if ( typeof map === 'string' ) map = JSON . parse ( map ) ;
38- if ( map && map . mappings ) opts . map . prev = map ;
41+ var plugins = config . plugins ;
42+ var exec = config . exec ;
3943
40- var options = this . options . postcss ;
41- if ( typeof options === 'function' ) {
42- options = options . call ( this , this ) ;
43- }
44+ var opts = assign ( { } , config . options , {
45+ from : file ,
46+ to : file ,
47+ map : {
48+ inline : params . sourceMap === 'inline' ,
49+ annotation : false
50+ }
51+ } ) ;
4452
45- var plugins ;
46- var exec ;
47- if ( typeof options === 'undefined' ) {
48- plugins = [ ] ;
49- } else if ( Array . isArray ( options ) ) {
50- plugins = options ;
51- } else {
52- plugins = options . plugins || options . defaults ;
53- opts . stringifier = options . stringifier ;
54- opts . parser = options . parser ;
55- opts . syntax = options . syntax ;
56- exec = options . exec ;
57- }
58- if ( params . pack ) {
59- plugins = options [ params . pack ] ;
60- if ( ! plugins ) {
61- throw new Error ( 'PostCSS plugin pack is not defined in options' ) ;
62- }
63- }
53+ if ( typeof map === 'string' ) map = JSON . parse ( map ) ;
54+ if ( map && map . mappings ) opts . map . prev = map ;
6455
65- if ( params . syntax ) {
66- opts . syntax = require ( params . syntax ) ;
67- }
68- if ( params . parser ) {
69- opts . parser = require ( params . parser ) ;
70- }
71- if ( params . stringifier ) {
72- opts . stringifier = require ( params . stringifier ) ;
73- }
74- if ( params . exec ) {
75- exec = params . exec ;
76- }
56+ if ( params . syntax ) {
57+ opts . syntax = require ( params . syntax ) ;
58+ }
59+ if ( params . parser ) {
60+ opts . parser = require ( params . parser ) ;
61+ }
62+ if ( params . stringifier ) {
63+ opts . stringifier = require ( params . stringifier ) ;
64+ }
65+ if ( params . exec ) {
66+ exec = params . exec ;
67+ }
7768
78- var loader = this ;
79- var callback = this . async ( ) ;
69+ if ( params . parser === 'postcss-js' || exec ) {
70+ source = loader . exec ( source , loader . resource ) ;
71+ }
8072
81- if ( params . parser === 'postcss-js' || exec ) {
82- source = this . exec ( source , this . resource ) ;
83- }
73+ // Allow plugins to add or remove postcss plugins
74+ plugins = loader . _compilation . applyPluginsWaterfall (
75+ 'postcss-loader-before-processing' ,
76+ [ ] . concat ( plugins ) ,
77+ params
78+ ) ;
8479
85- // Allow plugins to add or remove postcss plugins
86- plugins = this . _compilation . applyPluginsWaterfall (
87- 'postcss-loader-before-processing' ,
88- [ ] . concat ( plugins ) ,
89- params
90- ) ;
80+ postcss ( plugins ) . process ( source , opts )
81+ . then ( function ( result ) {
82+ result . warnings ( ) . forEach ( function ( msg ) {
83+ loader . emitWarning ( msg . toString ( ) ) ;
84+ } ) ;
9185
92- postcss ( plugins ) . process ( source , opts )
93- . then ( function ( result ) {
94- result . warnings ( ) . forEach ( function ( msg ) {
95- loader . emitWarning ( msg . toString ( ) ) ;
96- } ) ;
97- callback ( null , result . css , result . map ? result . map . toJSON ( ) : null ) ;
98- return null ;
99- } )
100- . catch ( function ( error ) {
101- if ( error . name === 'CssSyntaxError' ) {
102- callback ( new PostCSSLoaderError ( error ) ) ;
103- } else {
104- callback ( error ) ;
105- }
106- } ) ;
86+ var resultMap = result . map ? result . map . toJSON ( ) : null ;
87+ callback ( null , result . css , resultMap ) ;
88+ return null ;
89+ } )
90+ . catch ( function ( error ) {
91+ if ( error . name === 'CssSyntaxError' ) {
92+ callback ( new PostCSSLoaderError ( error ) ) ;
93+ } else {
94+ callback ( error ) ;
95+ }
96+ } ) ;
97+ } ) ;
10798} ;
0 commit comments