UNPKG

3.02 kBJavaScriptView Raw
1var _ = require('underscore'),
2 async = require('async'),
3 fu = require('./fileUtil'),
4 resources = require('./util/resources');
5
6/**
7 * Creates a list of all of the resources for the current module.
8 *
9 * Context state: module
10 *
11 * Plugin Calls:
12 * moduleResources
13 * fileFilter
14 * resourceList
15 */
16exports.loadResources = function(context, callback) {
17 var plugins = context.plugins;
18
19 function filterResource(resource) {
20 resource = resources.cast(resource);
21
22 if (exports.filterResource(resource, context)) {
23 return resource;
24 }
25 }
26
27 plugins.moduleResources(context, function(err, files) {
28 if (err) {
29 return callback(err);
30 }
31
32 var fileFilter = plugins.fileFilter(context) || /.*/;
33 fu.fileList(files, fileFilter, function(err, files) {
34 if (err) {
35 return callback(err);
36 }
37
38 async.map(files, function(resource, callback) {
39 var resourceContext = context.clone();
40 resourceContext.resource = resource;
41 plugins.resourceList(resourceContext, callback);
42 },
43 function(err, resources) {
44 resources = _.flatten(resources);
45 resources = _.map(resources, filterResource);
46 resources = _.filter(resources, function(resource) { return resource; });
47 callback(err, resources);
48 });
49 });
50 });
51};
52
53/**
54 * Filters a given resource for platform constraints, if specified.
55 */
56exports.filterResource = function(resource, context) {
57 function check(value, singular, plural) {
58 if (typeof singular !== 'undefined') {
59 return singular.not ? singular.not !== value : singular === value;
60 } else if (plural) {
61 var ret = (plural.not || plural).reduce(function(found, filePlatform) {
62 return found || filePlatform === value;
63 }, false);
64 return plural.not ? !ret : ret;
65 }
66 return true;
67 }
68
69 function checkResource(resource) {
70 return check(context.platform, resource.platform, resource.platforms)
71 && check(context.package, resource.package, resource.packages)
72 && check(!!context.combined, resource.combined);
73 }
74 return checkResource(resource)
75 && (!resource.originalResource || checkResource(resource.originalResource));
76};
77
78
79/**
80 * Runs a set of resources through the resource plugin.
81 *
82 * Context state: module
83 *
84 * Plugin Calls:
85 * resource
86 */
87exports.processResources = function(resources, context, callback) {
88 var plugins = context.plugins;
89
90 async.map(resources, function(resource, callback) {
91 var resourceContext = context.clone();
92 resourceContext.resource = resource;
93 plugins.resource(resourceContext, function(err, newResource) {
94 if (newResource && newResource !== resource) {
95 newResource.originalResource = resource;
96 }
97
98 callback(err, newResource);
99 });
100 },
101 function(err, resources) {
102 if (err) {
103 return callback(err);
104 }
105
106 callback(err, resources.filter(function(resource) { return resource; }));
107 });
108};