forked from regularjs/regular-loader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
style-rewriter.js
132 lines (117 loc) · 3.05 KB
/
style-rewriter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
var postcss = require( 'postcss' );
var selectorParser = require( 'postcss-selector-parser' );
var loaderUtils = require( 'loader-utils' );
var assign = require( 'object-assign' );
var autoprefixer = require( 'autoprefixer' );
function isObject( val ) {
return val && typeof val === 'object'
}
var addId = postcss.plugin( 'add-id', function( opts ) {
return function( root ) {
root.each( function rewriteSelector( node ) {
if (!node.selector) {
// handle media queries
if (node.type === 'atrule' && node.name === 'media') {
node.each( rewriteSelector )
}
return
}
node.selector = selectorParser( function( selectors ) {
selectors.each( function( selector ) {
var firstNode = null;
var node = null
selector.each( function( n, i ) {
if (n.type !== 'pseudo') {
if( i === 0 ) {
firstNode = n;
}
node = n
}
} )
selector.insertAfter( firstNode, selectorParser.attribute( {
attribute: opts.id
} ) )
if( firstNode !== node ) {
selector.insertAfter( node, selectorParser.attribute( {
attribute: opts.id
} ) )
}
} )
} ).process( node.selector ).result
} )
}
} )
module.exports = function( content, map ) {
this.cacheable();
var cb = this.async();
var query = loaderUtils.parseQuery( this.query );
var options = this.options.pure || {};
var autoprefixOptions = options.autoprefixer
var postcssOptions = options.postcss
// postcss plugins
var plugins
if (Array.isArray( postcssOptions )) {
plugins = postcssOptions
} else if (typeof postcssOptions === 'function') {
plugins = postcssOptions.call( this, this )
} else if (isObject( postcssOptions ) && postcssOptions.plugins) {
plugins = postcssOptions.plugins
}
plugins = plugins ? plugins.slice() : [] // make sure to copy it
// scoped css
if (query.scoped) {
plugins.push( addId( {
id: query.id
} ) )
}
// autoprefixer
if (autoprefixOptions !== false) {
autoprefixOptions = assign(
{},
// also respect autoprefixer-loader options
this.options.autoprefixer,
autoprefixOptions
)
var autoprefixer = require( 'autoprefixer' )( autoprefixOptions )
plugins.push( autoprefixer )
}
// postcss options, for source maps
var file = this.resourcePath
var opts
opts = {
from: file,
to: file,
map: false
}
if (
this.sourceMap &&
!this.minimize &&
options.cssSourceMap !== false &&
process.env.NODE_ENV !== 'production' &&
!(isObject( postcssOptions ) && postcssOptions.options && postcssOptions.map)
) {
opts.map = {
inline: false,
annotation: false,
prev: map
}
}
// postcss options from configuration
if (isObject( postcssOptions ) && postcssOptions.options) {
for (var option in postcssOptions.options) {
if (!opts.hasOwnProperty( option )) {
opts[option] = postcssOptions.options[option]
}
}
}
postcss( plugins )
.process( content )
.then( function( result ) {
// var map = result.map && result.map.toJSON()
cb(null, result.css, map)
} )
.catch( function() {
console.log( e );
cb( e );
} )
};