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