UNPKG

26.9 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 InputErrorTypes[InputErrorTypes["BinDirectoryNotFound"] = "BinDirectoryNotFound"] = "BinDirectoryNotFound";
18 InputErrorTypes[InputErrorTypes["BinPathNotADirectory"] = "BinPathNotADirectory"] = "BinPathNotADirectory";
19})(exports.InputErrorTypes || (exports.InputErrorTypes = {}));
20var InputErrorTypes = exports.InputErrorTypes;
21function 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}
35exports.locateModule = locateModule;
36function getChildTaskNames(task) {
37 return task.tasks.map(function (x) { return (task.baseTaskName + ":" + x.baseTaskName); });
38}
39exports.getChildTaskNames = getChildTaskNames;
40function 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}
62function 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// }
100var 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 */
116function 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}
133exports.envifyObject = envifyObject;
134var merge = require("../lodash.custom").merge;
135function 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}
141exports.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 */
149var configBlacklist = ["outputObserver", "fileChangeObserver", "signalObserver", "scheduler"];
150function 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}
162exports.getCBEnv = getCBEnv;
163/**
164 * @param {String} item - the string to replace
165 * @param {Object} root - Root object used for lookups
166 * @returns {*}
167 */
168function 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}
177function getFunctionName(fn) {
178 if (fn.name !== "") {
179 return "[Function: " + fn.name + "]";
180 }
181 return "[Function]";
182}
183exports.getFunctionName = getFunctionName;
184exports.removeNewlines = function (x) { return x.replace(/\n|\r/g, " ").trim(); };
185exports.escapeNewLines = function (x) { return x.replace(/\n|\r/g, "\\n").trim(); };
186exports.removeTrailingNewlines = function (x) { return x.replace(/(\n|\r)$/, " ").trim(); };
187function 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}
207exports.stringifyObj = stringifyObj;
208var toStringTypes = {
209 "obj": "[object Object]",
210 "string": "[object String]",
211 "array": "[object Array]",
212 "function": "[object Function]"
213};
214function testType(com, val) {
215 return Object.prototype.toString.call(val) === com;
216}
217function isPlainObject(val) {
218 return testType(toStringTypes["obj"], val);
219}
220exports.isPlainObject = isPlainObject;
221function isString(val) {
222 return testType(toStringTypes["string"], val);
223}
224exports.isString = isString;
225function isFunction(val) {
226 return testType(toStringTypes["function"], val);
227}
228exports.isFunction = isFunction;
229function 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}
235exports.isReport = isReport;
236function isPrivateTask(taskName) {
237 return taskName[0] === "_";
238}
239exports.isPrivateTask = isPrivateTask;
240function isPublicTask(taskName) {
241 return taskName[0] !== "_";
242}
243exports.isPublicTask = isPublicTask;
244function isParentGroupName(name) {
245 return name.match(/^\((.+?)\)$/);
246}
247exports.isParentGroupName = isParentGroupName;
248function 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}
255exports.isParentRef = isParentRef;
256function getChildItems(name, input) {
257 if (isParentGroupName(name)) {
258 return _.get(input, [name], {});
259 }
260 return _.get(input, [("(" + name + ")")], {});
261}
262exports.getChildItems = getChildItems;
263function 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}
274exports.getPossibleTaskNames = getPossibleTaskNames;
275function getChildName(name) {
276 if (isParentGroupName(name))
277 return name;
278 return "(" + name + ")";
279}
280exports.getChildName = getChildName;
281function isInternal(incoming) {
282 return /_internal_fn_\d{0,10}$/.test(incoming);
283}
284exports.isInternal = isInternal;
285var supportedFileExtensions = [".js"];
286function isSupportedFileType(incoming) {
287 return supportedFileExtensions.indexOf(incoming.toLowerCase()) > -1;
288}
289exports.isSupportedFileType = isSupportedFileType;
290function _e(x) {
291 return x
292 .replace(/\n|\r/g, "")
293 .replace(/\{/g, "\\\{")
294 .replace(/}/g, "\\\}");
295}
296exports._e = _e;
297function __e(x) {
298 return x
299 .replace(/\{/g, "\\\{")
300 .replace(/}/g, "\\\}");
301}
302exports.__e = __e;
303function longestString(col) {
304 return col.reduce(function (val, item) { return item.length > val ? item.length : val; }, 0);
305}
306exports.longestString = longestString;
307function 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}
319exports.getLongestTaskName = getLongestTaskName;
320function padLine(incoming, max) {
321 if (incoming.length <= max) {
322 return incoming + new Array(max - incoming.length + 1).join(" ");
323 }
324 return incoming;
325}
326exports.padLine = padLine;
327function 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}
337exports.concatProps = concatProps;
338//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YXNrLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxxQkFBNkMsTUFBTSxDQUFDLENBQUE7QUFDcEQsbUJBQW9DLElBQUksQ0FBQyxDQUFBO0FBRXpDLDRCQUE2QixlQUFlLENBQUMsQ0FBQTtBQUc3Qyw2QkFBNEMsZ0JBQWdCLENBQUMsQ0FBQTtBQUU3RCxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFaEQsV0FBWSxlQUFlO0lBQ3ZCLHVEQUE0QixtQkFBbUIsdUJBQUEsQ0FBQTtJQUMvQyxzREFBNEIsa0JBQWtCLHNCQUFBLENBQUE7SUFDOUMseURBQTRCLHFCQUFxQix5QkFBQSxDQUFBO0lBQ2pELGtEQUE0QixjQUFjLGtCQUFBLENBQUE7SUFDMUMsOENBQTRCLFVBQVUsY0FBQSxDQUFBO0lBQ3RDLGlEQUE0QixhQUFhLGlCQUFBLENBQUE7SUFDekMsa0RBQTRCLGNBQWMsa0JBQUEsQ0FBQTtJQUMxQyxpREFBNEIsYUFBYSxpQkFBQSxDQUFBO0lBQ3pDLDBEQUE0QixzQkFBc0IsMEJBQUEsQ0FBQTtJQUNsRCwwREFBNEIsc0JBQXNCLDBCQUFBLENBQUE7QUFDdEQsQ0FBQyxFQVhXLHVCQUFlLEtBQWYsdUJBQWUsUUFXMUI7QUFYRCxJQUFZLGVBQWUsR0FBZix1QkFXWCxDQUFBO0FBZUQsc0JBQTZCLE1BQTZCLEVBQUUsUUFBZ0I7SUFFeEUsSUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXpEOzs7O09BSUc7SUFDSCxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUUzQyxJQUFNLGNBQWMs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
\No newline at end of file