1 | ;
|
2 | var path_1 = require("path");
|
3 | var fs_1 = require("fs");
|
4 | var task_runner_1 = require("./task.runner");
|
5 | var task_resolve_1 = require("./task.resolve");
|
6 | var _ = require("../lodash.custom");
|
7 | var debug = require("debug")("cb:task-utils");
|
8 | (function (InputErrorTypes) {
|
9 | InputErrorTypes[InputErrorTypes["InputFileNotFound"] = "InputFileNotFound"] = "InputFileNotFound";
|
10 | InputErrorTypes[InputErrorTypes["NoTasksAvailable"] = "NoTasksAvailable"] = "NoTasksAvailable";
|
11 | InputErrorTypes[InputErrorTypes["NoWatchersAvailable"] = "NoWatchersAvailable"] = "NoWatchersAvailable";
|
12 | InputErrorTypes[InputErrorTypes["FileNotFound"] = "FileNotFound"] = "FileNotFound";
|
13 | InputErrorTypes[InputErrorTypes["NotAFile"] = "NotAFile"] = "NotAFile";
|
14 | InputErrorTypes[InputErrorTypes["InvalidYaml"] = "InvalidYaml"] = "InvalidYaml";
|
15 | InputErrorTypes[InputErrorTypes["InvalidInput"] = "InvalidInput"] = "InvalidInput";
|
16 | InputErrorTypes[InputErrorTypes["InvalidJson"] = "InvalidJson"] = "InvalidJson";
|
17 | InputErrorTypes[InputErrorTypes["BinDirectoryNotFound"] = "BinDirectoryNotFound"] = "BinDirectoryNotFound";
|
18 | InputErrorTypes[InputErrorTypes["BinPathNotADirectory"] = "BinPathNotADirectory"] = "BinPathNotADirectory";
|
19 | })(exports.InputErrorTypes || (exports.InputErrorTypes = {}));
|
20 | var InputErrorTypes = exports.InputErrorTypes;
|
21 | function locateModule(config, taskName) {
|
22 | var tasksByName = locateExternalTask(config, taskName);
|
23 | /**
|
24 | * Exit early if this file exists
|
25 | * TODO - allow this lookup to be cached to prevent future file IO
|
26 | * TODO - skip file/node look-ups when key matches top-level task definition
|
27 | */
|
28 | if (tasksByName.length)
|
29 | return tasksByName;
|
30 | var tasksByRequire = locateNodeModule(config, taskName);
|
31 | if (tasksByRequire.length)
|
32 | return tasksByRequire;
|
33 | return [];
|
34 | }
|
35 | exports.locateModule = locateModule;
|
36 | function getChildTaskNames(task) {
|
37 | return task.tasks.map(function (x) { return (task.baseTaskName + ":" + x.baseTaskName); });
|
38 | }
|
39 | exports.getChildTaskNames = getChildTaskNames;
|
40 | function locateExternalTask(config, name) {
|
41 | var dirLookups = config.tasksDir.reduce(function (acc, dir) {
|
42 | return acc.concat([[dir, name + ".js"], [dir, name]]);
|
43 | }, []);
|
44 | var lookups = dirLookups.concat([
|
45 | [name + ".js"],
|
46 | [name]
|
47 | ]);
|
48 | return lookups
|
49 | .map(function (x) { return path_1.resolve.apply(null, [config.cwd].concat(x)); })
|
50 | .filter(fs_1.existsSync)
|
51 | .filter(function (x) { return fs_1.lstatSync(x).isFile(); })
|
52 | .map(function (resolvedFilePath) {
|
53 | return {
|
54 | rawInput: name,
|
55 | parsed: path_1.parse(resolvedFilePath),
|
56 | resolved: resolvedFilePath,
|
57 | relative: path_1.relative(config.cwd, resolvedFilePath),
|
58 | errors: []
|
59 | };
|
60 | });
|
61 | }
|
62 | function locateNodeModule(config, name) {
|
63 | try {
|
64 | var maybe = path_1.join.apply(void 0, [config.cwd].concat(config.nodeModulesPaths, [name]));
|
65 | var required = require.resolve(maybe);
|
66 | return [{
|
67 | rawInput: name,
|
68 | parsed: path_1.parse(required),
|
69 | resolved: required,
|
70 | relative: path_1.relative(config.cwd, required),
|
71 | errors: []
|
72 | }];
|
73 | }
|
74 | catch (e) {
|
75 | if (e.code !== "MODULE_NOT_FOUND") {
|
76 | throw e;
|
77 | }
|
78 | debug("lookup for " + name + " failed", e.message);
|
79 | return [];
|
80 | }
|
81 | }
|
82 | // /**
|
83 | // * Look at an object of any depth and perform string substitutions
|
84 | // * from things like {paths.root}
|
85 | // * @param {Object} item
|
86 | // * @param {Object} root
|
87 | // * @returns {Object}
|
88 | // */
|
89 | // const traverse = require('traverse');
|
90 | // export function transformStrings(item, root) {
|
91 | // return traverse(item).map(function () {
|
92 | // if (this.isLeaf) {
|
93 | // if (typeof this.node === 'string') {
|
94 | // this.update(replaceOne(this.node, root));
|
95 | // }
|
96 | // this.update(this.node);
|
97 | // }
|
98 | // });
|
99 | // }
|
100 | var traverse = require("traverse");
|
101 | /**
|
102 | * Convert a JS object into ENV vars
|
103 | * eg:
|
104 | * var obj = {
|
105 | * options: {
|
106 | * docker: {
|
107 | * port: 8000
|
108 | * }
|
109 | * }
|
110 | * }
|
111 | * ->
|
112 | * envifyObject(obj, 'CB', 'OPTIONS')
|
113 | * ->
|
114 | * CB_OPTIONS_DOCKER_PORT=8000
|
115 | */
|
116 | function envifyObject(object, prefix, objectKeyName) {
|
117 | var subject = _.cloneDeep(object);
|
118 | return traverse(subject).reduce(function (acc, x) {
|
119 | if (this.level > 4) {
|
120 | this.remove();
|
121 | return acc;
|
122 | }
|
123 | if (this.circular) {
|
124 | this.remove();
|
125 | return acc;
|
126 | }
|
127 | if (this.isLeaf) {
|
128 | acc[[prefix, objectKeyName].concat(this.path).join("_").toUpperCase()] = String(this.node);
|
129 | }
|
130 | return acc;
|
131 | }, {});
|
132 | }
|
133 | exports.envifyObject = envifyObject;
|
134 | var merge = require("../lodash.custom").merge;
|
135 | function excludeKeys(input, blacklist) {
|
136 | return Object.keys(input).filter(function (x) { return blacklist.indexOf(x) === -1; }).reduce(function (acc, key) {
|
137 | acc[key] = input[key];
|
138 | return acc;
|
139 | }, {});
|
140 | }
|
141 | exports.excludeKeys = excludeKeys;
|
142 | /**
|
143 | * Currently we add the following from the toplevel of inputs
|
144 | * 1. options
|
145 | * 2. config
|
146 | * 3. CLI trailing args + command
|
147 | * 4. env
|
148 | */
|
149 | var configBlacklist = ["outputObserver", "fileChangeObserver", "signalObserver", "scheduler"];
|
150 | function getCBEnv(trigger) {
|
151 | var prefix = trigger.config.envPrefix;
|
152 | // 1. Crossbow options (from cbfile etc)
|
153 | var cbOptionsEnv = envifyObject(trigger.input.options, prefix, "options");
|
154 | // 2. Crossbow config (from config key or CLI flags)
|
155 | var cbConfigEnv = envifyObject(excludeKeys(trigger.config, configBlacklist), prefix, "config");
|
156 | // 3. command + trailing cli args
|
157 | var _a = trigger.cli, trailing = _a.trailing, command = _a.command;
|
158 | var cbCliEnv = envifyObject({ trailing: trailing, command: command }, prefix, "cli");
|
159 | // 4. env key from input file
|
160 | return merge(cbOptionsEnv, cbConfigEnv, cbCliEnv, trigger.input.env);
|
161 | }
|
162 | exports.getCBEnv = getCBEnv;
|
163 | /**
|
164 | * @param {String} item - the string to replace
|
165 | * @param {Object} root - Root object used for lookups
|
166 | * @returns {*}
|
167 | */
|
168 | function replaceOne(item, root) {
|
169 | return item.replace(/\{\{(.+?)\}\}/g, function () {
|
170 | var match = _.get(root, arguments[1].split("."));
|
171 | if (typeof match === "string") {
|
172 | return replaceOne(match, root);
|
173 | }
|
174 | return match;
|
175 | });
|
176 | }
|
177 | function getFunctionName(fn) {
|
178 | if (fn.name !== "") {
|
179 | return "[Function: " + fn.name + "]";
|
180 | }
|
181 | return "[Function]";
|
182 | }
|
183 | exports.getFunctionName = getFunctionName;
|
184 | exports.removeNewlines = function (x) { return x.replace(/\n|\r/g, " ").trim(); };
|
185 | exports.escapeNewLines = function (x) { return x.replace(/\n|\r/g, "\\n").trim(); };
|
186 | exports.removeTrailingNewlines = function (x) { return x.replace(/(\n|\r)$/, " ").trim(); };
|
187 | function stringifyObj(incoming, max) {
|
188 | if (max === void 0) { max = 100; }
|
189 | var asString = (function () {
|
190 | if (typeof incoming !== "string") {
|
191 | return JSON.stringify(incoming);
|
192 | }
|
193 | return incoming;
|
194 | })();
|
195 | if (asString.length > max || asString) {
|
196 | return asString.slice(0, (max - 3)) + (function () {
|
197 | if (asString.length - max > -3)
|
198 | return "...";
|
199 | return "";
|
200 | })();
|
201 | }
|
202 | if (asString.length > process.stdout.columns) {
|
203 | return asString.slice(0, process.stdout.columns - 3) + "...";
|
204 | }
|
205 | return asString;
|
206 | }
|
207 | exports.stringifyObj = stringifyObj;
|
208 | var toStringTypes = {
|
209 | "obj": "[object Object]",
|
210 | "string": "[object String]",
|
211 | "array": "[object Array]",
|
212 | "function": "[object Function]"
|
213 | };
|
214 | function testType(com, val) {
|
215 | return Object.prototype.toString.call(val) === com;
|
216 | }
|
217 | function isPlainObject(val) {
|
218 | return testType(toStringTypes["obj"], val);
|
219 | }
|
220 | exports.isPlainObject = isPlainObject;
|
221 | function isString(val) {
|
222 | return testType(toStringTypes["string"], val);
|
223 | }
|
224 | exports.isString = isString;
|
225 | function isFunction(val) {
|
226 | return testType(toStringTypes["function"], val);
|
227 | }
|
228 | exports.isFunction = isFunction;
|
229 | function isReport(report) {
|
230 | return report && isString(report.type) &&
|
231 | report.type === task_runner_1.TaskReportType.start ||
|
232 | report.type === task_runner_1.TaskReportType.end ||
|
233 | report.type === task_runner_1.TaskReportType.error;
|
234 | }
|
235 | exports.isReport = isReport;
|
236 | function isPrivateTask(taskName) {
|
237 | return taskName[0] === "_";
|
238 | }
|
239 | exports.isPrivateTask = isPrivateTask;
|
240 | function isPublicTask(taskName) {
|
241 | return taskName[0] !== "_";
|
242 | }
|
243 | exports.isPublicTask = isPublicTask;
|
244 | function isParentGroupName(name) {
|
245 | return name.match(/^\((.+?)\)$/);
|
246 | }
|
247 | exports.isParentGroupName = isParentGroupName;
|
248 | function isParentRef(name, names) {
|
249 | if (names.indexOf(name) > -1)
|
250 | return true;
|
251 | if (names.indexOf("(" + name + ")") > -1)
|
252 | return true;
|
253 | return false;
|
254 | }
|
255 | exports.isParentRef = isParentRef;
|
256 | function getChildItems(name, input) {
|
257 | if (isParentGroupName(name)) {
|
258 | return _.get(input, [name], {});
|
259 | }
|
260 | return _.get(input, [("(" + name + ")")], {});
|
261 | }
|
262 | exports.getChildItems = getChildItems;
|
263 | function getPossibleTaskNames(input) {
|
264 | var allNames = Object.keys(input.tasks);
|
265 | var possibleParents = allNames.filter(function (x) { return isParentGroupName(x); });
|
266 | var possibleDefaults = allNames.filter(function (x) { return !isParentGroupName(x); });
|
267 | var parents = possibleParents.reduce(function (acc, key) {
|
268 | var childKeys = Object.keys(getChildItems(key, input.tasks));
|
269 | var plainName = key.slice(1, -1);
|
270 | return acc.concat(childKeys.map(function (childKey) { return (plainName + ":" + childKey); }));
|
271 | }, []);
|
272 | return possibleDefaults.concat(parents);
|
273 | }
|
274 | exports.getPossibleTaskNames = getPossibleTaskNames;
|
275 | function getChildName(name) {
|
276 | if (isParentGroupName(name))
|
277 | return name;
|
278 | return "(" + name + ")";
|
279 | }
|
280 | exports.getChildName = getChildName;
|
281 | function isInternal(incoming) {
|
282 | return /_internal_fn_\d{0,10}$/.test(incoming);
|
283 | }
|
284 | exports.isInternal = isInternal;
|
285 | var supportedFileExtensions = [".js"];
|
286 | function isSupportedFileType(incoming) {
|
287 | return supportedFileExtensions.indexOf(incoming.toLowerCase()) > -1;
|
288 | }
|
289 | exports.isSupportedFileType = isSupportedFileType;
|
290 | function _e(x) {
|
291 | return x
|
292 | .replace(/\n|\r/g, "")
|
293 | .replace(/\{/g, "\\\{")
|
294 | .replace(/}/g, "\\\}");
|
295 | }
|
296 | exports._e = _e;
|
297 | function __e(x) {
|
298 | return x
|
299 | .replace(/\{/g, "\\\{")
|
300 | .replace(/}/g, "\\\}");
|
301 | }
|
302 | exports.__e = __e;
|
303 | function longestString(col) {
|
304 | return col.reduce(function (val, item) { return item.length > val ? item.length : val; }, 0);
|
305 | }
|
306 | exports.longestString = longestString;
|
307 | function getLongestTaskName(tasks) {
|
308 | var taskNames = tasks.reduce(function (acc, task) {
|
309 | if (task.type === task_resolve_1.TaskTypes.ParentGroup) {
|
310 | return acc.concat(task.baseTaskName + ":" + task.subTasks[0]);
|
311 | }
|
312 | if (task.runMode === task_resolve_1.TaskRunModes.parallel) {
|
313 | return acc.concat(task.baseTaskName + " <p>");
|
314 | }
|
315 | return acc.concat(task.baseTaskName);
|
316 | }, []);
|
317 | return longestString(taskNames);
|
318 | }
|
319 | exports.getLongestTaskName = getLongestTaskName;
|
320 | function padLine(incoming, max) {
|
321 | if (incoming.length <= max) {
|
322 | return incoming + new Array(max - incoming.length + 1).join(" ");
|
323 | }
|
324 | return incoming;
|
325 | }
|
326 | exports.padLine = padLine;
|
327 | function concatProps(tasks, initial, propname) {
|
328 | return tasks.reduce(function (acc, task) {
|
329 | if (task.tasks.length) {
|
330 | return acc.concat(concatProps(task.tasks, [], propname));
|
331 | }
|
332 | if (task[propname].length)
|
333 | return acc.concat(task[propname]);
|
334 | return acc;
|
335 | }, initial);
|
336 | }
|
337 | exports.concatProps = concatProps;
|
338 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YXNrLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxQkFBNkMsTUFBTSxDQUFDLENBQUE7QUFDcEQsbUJBQW9DLElBQUksQ0FBQyxDQUFBO0FBRXpDLDRCQUE2QixlQUFlLENBQUMsQ0FBQTtBQUc3Qyw2QkFBNEMsZ0JBQWdCLENBQUMsQ0FBQTtBQUU3RCxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFaEQsV0FBWSxlQUFlO0lBQ3ZCLHVEQUE0QixtQkFBbUIsdUJBQUEsQ0FBQTtJQUMvQyxzREFBNEIsa0JBQWtCLHNCQUFBLENBQUE7SUFDOUMseURBQTRCLHFCQUFxQix5QkFBQSxDQUFBO0lBQ2pELGtEQUE0QixjQUFjLGtCQUFBLENBQUE7SUFDMUMsOENBQTRCLFVBQVUsY0FBQSxDQUFBO0lBQ3RDLGlEQUE0QixhQUFhLGlCQUFBLENBQUE7SUFDekMsa0RBQTRCLGNBQWMsa0JBQUEsQ0FBQTtJQUMxQyxpREFBNEIsYUFBYSxpQkFBQSxDQUFBO0lBQ3pDLDBEQUE0QixzQkFBc0IsMEJBQUEsQ0FBQTtJQUNsRCwwREFBNEIsc0JBQXNCLDBCQUFBLENBQUE7QUFDdEQsQ0FBQyxFQVhXLHVCQUFlLEtBQWYsdUJBQWUsUUFXMUI7QUFYRCxJQUFZLGVBQWUsR0FBZix1QkFXWCxDQUFBO0FBZUQsc0JBQTZCLE1BQTZCLEVBQUUsUUFBZ0I7SUFFeEUsSUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXpEOzs7O09BSUc7SUFDSCxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUUzQyxJQUFNLGNBQWMs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 |
\ | No newline at end of file |