-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathindex.js
88 lines (72 loc) · 2.33 KB
/
index.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
var fs = require('fs'),
path = require('path'),
mkdirp = require('mkdirp'),
crypto = require('crypto'),
url = require('url'),
reworkFunction = require('rework-plugin-function');
module.exports = assets;
function assets(options) {
options = options || {};
var srcDir = path.resolve(options.src || '.');
var onFile = options.onFile;
var destDir = options.dest;
var fnName = options.func || 'url';
var onError = options.onError || defaultError;
var prefix = options.prefix || '';
var retainName = typeof options.retainName !== 'undefined'
? options.retainName
: true;
var processed = {};
var fn = {};
fn[fnName] = processAsset;
return reworkFunction(fn, false);
function processAsset(asset) {
var u = url.parse(asset);
if (u.protocol || !u.pathname) {
return original(asset);
}
asset = u.pathname;
var source = this.position && this.position.source;
var baseDir = source
? path.resolve(srcDir, path.dirname(source))
: srcDir;
var srcFile = path.join(baseDir, asset);
if (onFile) { onFile(srcFile); }
if (hasOwn(processed, srcFile)) {
return destUrl(processed[srcFile], u);
}
var contents;
try {
contents = fs.readFileSync(srcFile);
} catch (err) {
onError(err);
return original(asset);
}
var hash = crypto.createHash('sha1')
.update(contents)
.digest('hex')
.substr(0, 16);
var ext = path.extname(asset);
var origName = path.basename(asset, ext);
var name = (retainName ? origName + '-' : '') + hash + ext;
var destFile = path.join(destDir, name);
mkdirp.sync(destDir);
fs.writeFileSync(destFile, contents);
processed[srcFile] = name;
return destUrl(name, u);
}
function original(asset) {
return fnName + '(\'' + asset.replace(/'/g, '\\\'') + '\')';
}
function destUrl(name, url) {
if (url.search) name += url.search;
if (url.hash) name += url.hash;
return 'url(' + prefix + name + ')';
}
}
function defaultError(err) {
throw err;
}
function hasOwn(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}