-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathindex.js
70 lines (56 loc) · 1.88 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
var path = require('path');
var loaderUtils = require('loader-utils');
var steed = require('steed');
function resolveImageSrc(loaderContext, image, callback) {
if (typeof image.src !== 'string') {
return callback(new Error('Missing image "src" property in Web App Manifest'));
}
var dirname = path.dirname(loaderContext.resourcePath);
// Resolve the image filename relative to the manifest file
loaderContext.resolve(dirname, image.src, function(err, filename) {
if (err) {
return callback(err);
}
// Ensure Webpack knows that the image is a dependency of the manifest
loaderContext.dependency && loaderContext.dependency(filename);
// Asynchronously pass the image through the loader pipeline
loaderContext.loadModule(filename, function(err, source, map, module) {
if (err) {
return callback(err);
}
// Update the image src property to match the generated filename
// Is it always the first key in the assets object?
image.src = Object.keys(module.assets)[0];
callback(null);
});
});
}
function resolveImages(loaderContext, manifest, key, callback) {
if (!Array.isArray(manifest[key])) {
return callback(null);
}
steed.map(manifest[key], resolveImageSrc.bind(null, loaderContext), function(err) {
if (err) {
return callback(err);
}
callback(null);
});
}
module.exports = function(source) {
var loaderContext = this;
var callback = loaderContext.async();
try {
var manifest = JSON.parse(source);
} catch (err) {
return callback(new Error('Invalid JSON in Web App Manifest'));
}
steed.parallel([
resolveImages.bind(null, loaderContext, manifest, 'splash_screens'),
resolveImages.bind(null, loaderContext, manifest, 'icons')
], function(err) {
if (err) {
return callback(err);
}
callback(null, JSON.stringify(manifest, null, 2));
});
};