UNPKG

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