-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlift-sass-plugin.js
116 lines (91 loc) · 3.32 KB
/
lift-sass-plugin.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
//lift-sass-plugin.js
//lift sass from all dependencies to first entry
//ideally, return a value (cssOutput) to the loader and not write to fs
var _ = require('lodash');
var path = require('path');
var sass = require('node-sass');
var gutil = require('gulp-util');
//var manifest = require('./example/dist/rev-manifest');
//storage for recursive dependencies and output
var visited = {};
var cssOutput = [];
function getNodes(root) {
if (root.dependencies) {
root.dependencies.forEach(function (child) {
if ( child.module && child.module.userRequest && !visited[child.module.userRequest]) {
visited[child.module.userRequest] = true;
getNodes(child.module);
}
});
}
}
function replaceImages(source, options) {
var manifest = require(options.manifest);
var urlRE = new RegExp('[\\w.\\/\\-]*(png|gif|jpg|jpeg|svg)', 'gi');
var urls = source.match(urlRE) || [];
urls.map(function(url){
var fileRE = new RegExp(url);
var prefix = options.prefix || '';
source = source.replace(fileRE, path.join(prefix, manifest[url]));
//console.log(source);
});
return source;
}
function apply(options, compiler) {
var testString = options.testString || 'scss';
var re = new RegExp('' + testString + '', 'g');
var counter = 0;
compiler.plugin("compilation", function(compilation, params) {
compilation.plugin("after-optimize-modules", function (chunks) {
gutil.log('logging this', counter);
counter++;
});
compilation.plugin("optimize-chunks", function (chunks) {
console.log('optimize chunks');
chunks.forEach(function(chunk) {
var module = chunk.modules[0];
var moduleRequest = module.resource;
gutil.log('lift-sass-plugin working on module', moduleRequest, 'chunk: ', counter);
chunk.modules.map(function(mod){
gutil.log('mod name', mod.resource);
});
this.mainStyle = [];
counter++;
getNodes(module);
//get paths for match
var foundPaths = [];
_.mapKeys(visited, function(value, key) {
if (re.test(key.toString())) {
//console.log('scss', key);
foundPaths.push(key);
}
});
for (var i = 0; i < foundPaths.length; i++) {
var result = sass.renderSync({
file: foundPaths[i]
});
if (options.manifest && require.resolve(options.manifest)) {
cssOutput.push(replaceImages(result.css.toString(), options));
} else {
cssOutput.push(result.css.toString());
}
}
this.mainStyle = cssOutput;
});
});
});
}
module.exports = function(options) {
if (options instanceof Array) {
options = {
include: options
};
}
if (!Array.isArray(options.include)) {
options.include = [ options.include ];
}
console.log('init plugin');
return {
apply: apply.bind(this, options)
};
};