-
Notifications
You must be signed in to change notification settings - Fork 1
/
examples.js
143 lines (120 loc) · 4.41 KB
/
examples.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
var Q = require("q"),
PATH = require("path"),
FS = require("fs"),
EXEC = require("child_process").exec,
UTIL = require("n-util"),
ERROR = require("../lib/util/error");
exports.main = function(options)
{
const PACKAGE_BASE_PATH = FS.realpathSync(options.packageBasePath);
const EXAMPLES_BASE_PATH = PACKAGE_BASE_PATH + ((typeof options.examplesPath !== "undefined")?options.examplesPath:"/examples");
var RELATIVE_PATH = "/..";
if (typeof options.examplesPath !== "undefined") {
if (options.examplesPath === "") {
RELATIVE_PATH = "";
} else {
throw new Error("NYI");
}
}
return linkPackages().then(function(packages)
{
var done = Q.ref();
packages.forEach(function(packageName)
{
done = Q.when(done, function()
{
return installMissingDependencies(EXAMPLES_BASE_PATH + "/" + packageName).then(function()
{
if (options.run === false) return;
console.log("Running example: " + EXAMPLES_BASE_PATH + "/" + packageName);
return require(EXAMPLES_BASE_PATH + "/" + packageName + "/main.js").main().fail(function(err) {
ERROR.logError(err);
throw err;
});
});
});
});
return done;
});
function installMissingDependencies(packageRootPath)
{
var deferred = Q.defer();
EXEC("npm install", {
cwd: packageRootPath
}, function(err, stdout, stderr)
{
if (err) deferred.reject(err);
else if (stderr) deferred.reject(stderr)
else {
process.stdout.write(stdout);
deferred.resolve();
}
});
return deferred.promise;
}
function linkPackages()
{
var packages = [];
if (!PATH.existsSync(PACKAGE_BASE_PATH + "/node_modules"))
{
FS.mkdirSync(PACKAGE_BASE_PATH + "/node_modules", 0775);
}
var ourDescriptor = JSON.parse(FS.readFileSync(PACKAGE_BASE_PATH + "/package.json"));
FS.readdirSync(EXAMPLES_BASE_PATH).concat(options.extraExamples || []).forEach(function(filename)
{
var basePath = EXAMPLES_BASE_PATH + "/" + filename;
if (PATH.existsSync(basePath + "/package.json"))
{
if (filename.split("/").length === 1) {
packages.push(filename);
}
var descriptor = JSON.parse(FS.readFileSync(basePath + "/package.json"));
if (!PATH.existsSync(basePath + "/node_modules"))
{
FS.mkdirSync(basePath + "/node_modules", 0775);
}
var deps = descriptor.devDependencies || {};
UTIL.update(deps, descriptor.dependencies || {});
Object.keys(deps).forEach(function(name)
{
if (name === ourDescriptor.name ||
(ourDescriptor.dependencies && ourDescriptor.dependencies[name] === deps[name]) ||
(ourDescriptor.devDependencies && ourDescriptor.devDependencies[name] === deps[name])
) {
if (name === ourDescriptor.name)
{
try {
// TODO: Find a symlink test that does not throw if it does not exist.
FS.lstatSync(basePath + "/node_modules/" + name);
} catch(e) {
FS.symlinkSync(filename.replace(/[^\/]+/g, "..") + RELATIVE_PATH + "/..", basePath + "/node_modules/" + name);
}
}
else
{
try {
// TODO: Find a symlink test that does not throw if it does not exist.
FS.lstatSync(basePath + "/node_modules/" + name);
} catch(e) {
FS.symlinkSync(filename.replace(/[^\/]+/g, "..") + RELATIVE_PATH + "/../node_modules/" + name, basePath + "/node_modules/" + name);
}
}
}
});
}
});
return Q.call(function() {
return packages;
});
}
}
exports.extraExamples = [
"04-PlatformFeatures/02-BundlerMiddleware",
"04-PlatformFeatures/03-BundlerMiddlewareBundleLoader"
];
if (require.main === module) {
exports.main({
packageBasePath: __dirname + "/..",
extraExamples: exports.extraExamples
}).fail(ERROR.exitProcessWithError);
}