Skip to content

Commit 319215a

Browse files
author
Martin Hunt
committed
add getResourceDirectories as a build hook
- copied from devkit-core - build hooks now return all responses and which module they came from - build hooks now accept hooks returning promises rather than calling a callback - fix bug returning build result from buildQueue
1 parent 6c44e4f commit 319215a

6 files changed

Lines changed: 146 additions & 27 deletions

File tree

src/build/DirectoryBuilder.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
var path = require('path');
2+
var fs = require('fs');
3+
var logger = require('../util/logging').get('build-directories');
4+
5+
// class for representing a list of resource directories
6+
function DirectoryBuilder(base) {
7+
this._base = base;
8+
this._directories = [];
9+
}
10+
11+
DirectoryBuilder.prototype.add = function (src, target) {
12+
var directory;
13+
if (arguments.length === 1) {
14+
directory = {
15+
src: path.join(this._base, src),
16+
target: src
17+
};
18+
} else {
19+
directory = {
20+
src: src,
21+
target: target
22+
};
23+
}
24+
25+
if (fs.existsSync(directory.src)) {
26+
this._directories.push(directory);
27+
} else {
28+
logger.warn('Directory does not exist, ignoring files from',
29+
directory);
30+
}
31+
};
32+
33+
DirectoryBuilder.prototype.getPaths = function () {
34+
return this._directories.map(function (dir) { return dir.src; });
35+
};
36+
37+
DirectoryBuilder.prototype.getDirectories = function () {
38+
return this._directories;
39+
};
40+
41+
module.exports = DirectoryBuilder;

src/build/index.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,31 @@ exports.build = function (appPath, argv, cb) {
5555
require('./steps/createDirectories').createDirectories(app, config, f());
5656
}, function () {
5757
require('./steps/buildHooks').getDependencies(app, config, f());
58-
}, function (deps) {
59-
// deps is an array of objects, merge them into one object and get all keys with false values
60-
deps = merge.apply(this, deps);
61-
var toRemove = Object.keys(deps).filter(function (name) { return deps[name] === false; });
62-
app.removeModules(toRemove);
58+
}, function (res) {
59+
var modules = res.reduce(function (modules, res) {
60+
var toRemove = Object.keys(res.data)
61+
.filter(function (name) {
62+
return res.data[name] === false;
63+
});
64+
65+
if (toRemove.length) {
66+
logger.log('module', res.module.name, 'getDependencies:');
67+
toRemove.forEach(function (module) {
68+
logger.log(' removing module', module);
69+
});
70+
}
71+
return modules.concat(toRemove);
72+
}, []);
73+
74+
app.removeModules(modules);
6375
}, function () {
6476
require('./steps/addDebugCode')(app, config, f());
6577
}, function () {
6678
require('./steps/moduleConfig').getConfig(app, config, f());
79+
}, function () {
80+
require('./steps/buildHooks').getResourceDirectories(app, config, f());
81+
}, function (directories) {
82+
config.directories = directories;
6783
}, function () {
6884
require('./steps/buildHooks').onBeforeBuild(app, config, f());
6985
}, function () {

src/build/steps/buildHooks.js

Lines changed: 78 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,94 @@
1-
var ff = require('ff');
1+
var path = require('path');
22
var Promise = require('bluebird');
33
var api = require('../../api');
4+
var DirectoryBuilder = require('../DirectoryBuilder');
5+
var fs = require('fs');
6+
7+
var readDir = Promise.promisify(fs.readdir);
8+
var stat = Promise.promisify(fs.stat);
49

510
exports.getDependencies = function (app, config, cb) {
611
app.reloadModules();
712

813
// allows modules to disable other modules
9-
executeHook('getDependencies', app, config, cb);
10-
}
14+
executeHook('getDependencies', app, config)
15+
.nodeify(cb);
16+
};
1117

1218
exports.onBeforeBuild = function (app, config, cb) {
13-
executeHook('onBeforeBuild', app, config, cb);
14-
}
19+
executeHook('onBeforeBuild', app, config)
20+
.nodeify(cb);
21+
};
1522

1623
exports.onAfterBuild = function (app, config, cb) {
17-
executeHook('onAfterBuild', app, config, cb);
18-
}
24+
executeHook('onAfterBuild', app, config)
25+
.nodeify(cb);
26+
};
27+
28+
exports.getResourceDirectories = function (app, config, cb) {
29+
var builder = new DirectoryBuilder(app.paths.root);
30+
builder.add('resources');
31+
executeHook('getResourceDirectories', app, config)
32+
.map(function (res) {
33+
var module = res.module;
34+
var directories = res.data;
35+
directories.forEach(function (directory) {
36+
var target = path.join('modules', module.name, directory.target);
37+
builder.add(directory.src, target);
38+
});
39+
console.log(res);
40+
})
41+
.then(function () {
42+
// add any localized resource directories
43+
return readDir(app.paths.root);
44+
})
45+
.filter(function (filename) {
46+
if (/^resources-/.test(filename)) {
47+
return stat(path.join(app.paths.root, filename)).then(function (info) {
48+
return info.isDirectory();
49+
}, function onStatFail() {
50+
return false;
51+
});
52+
}
53+
54+
return false;
55+
})
56+
.map(function (filename) {
57+
builder.add(filename);
58+
})
59+
.then(function () {
60+
return builder.getDirectories();
61+
})
62+
.nodeify(cb);
63+
};
1964

20-
function executeHook(buildHook, app, config, cb) {
65+
function executeHook(buildHook, app, config) {
2166
var modules = app.getModules();
2267

23-
Promise.all(Object.keys(modules).map(function (moduleName) {
24-
var module = modules[moduleName];
25-
var buildExtension = module.loadExtension('build');
26-
if (!buildExtension || !buildExtension[buildHook]) {
27-
return;
28-
}
68+
return Promise.resolve(Object.keys(modules))
69+
.map(function (moduleName) {
70+
var module = modules[moduleName];
71+
var buildExtension = module.loadExtension('build');
72+
if (!buildExtension || !buildExtension[buildHook]) {
73+
return;
74+
}
75+
return new Promise(function (resolve, reject) {
76+
var retVal = buildExtension[buildHook](api, app.toJSON(), config, function (err, res) {
77+
if (err) {
78+
reject(err);
79+
} else {
80+
resolve(res);
81+
}
82+
});
2983

30-
return Promise.fromNode(buildExtension[buildHook].bind(buildExtension, api, app.toJSON(), config));
31-
})).nodeify(cb);
84+
if (retVal) { resolve(retVal); }
85+
})
86+
.then(function (data) {
87+
return {
88+
module: module,
89+
data: data
90+
};
91+
});
92+
})
93+
.filter(function (res) { return res; });
3294
}

src/build/steps/executeTargetBuild.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ exports.build = function (app, config, cb) {
1212
}
1313

1414
moduleKeys.forEach(function (moduleName) {
15-
console.log(moduleName)
1615
if (!buildModule) {
1716
var module = modules[moduleName];
1817
buildModule = module.loadBuildTarget(config.target);

src/serve/appRoutes.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ exports.addToAPI = function (opts, api) {
5252
}
5353

5454
buildFromRequest(opts)
55-
.then(function (mountInfo) {
55+
.spread(function (mountInfo, buildResult) {
5656
res.json(mountInfo);
5757
})
5858
.catch(function (e) {
@@ -82,9 +82,10 @@ exports.addToAPI = function (opts, api) {
8282
output: mountInfo.buildPath
8383
};
8484

85-
return buildQueue
86-
.add(mountInfo.appPath, buildOpts)
87-
.return(mountInfo);
85+
return buildQueue.add(mountInfo.appPath, buildOpts)
86+
.then(function (buildResult) {
87+
return [mountInfo, buildResult];
88+
});
8889
});
8990
}
9091

src/serve/buildQueue.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ var BuildItem = Class(function () {
107107
this.error = msg.err;
108108
this._reject(this.error);
109109
} else {
110-
this._resolve();
110+
this._resolve(msg.res);
111111
}
112112

113113
checkQueue();

0 commit comments

Comments
 (0)