UNPKG

25 kBJavaScriptView Raw
1"use strict";
2var task_resolve_1 = require("./task.resolve");
3var cli_parse_1 = require("./cli.parse");
4var task_resolve_2 = require("./task.resolve");
5var task_utils_1 = require("./task.utils");
6var task_errors_1 = require("./task.errors");
7var _ = require("../lodash.custom");
8var qs = require("qs");
9var flagRegex = /(.+?)@(.+)?$/;
10var inlineFnCount = 0;
11function preprocessTask(taskName, trigger, parents) {
12 var output = (function () {
13 if (typeof taskName === "function") {
14 return handleFunctionInput(taskName, trigger.input, parents);
15 }
16 if (typeof taskName === "string") {
17 return handleStringInput(taskName, trigger, parents);
18 }
19 if (task_utils_1.isPlainObject(taskName)) {
20 return handleObjectInput(taskName, trigger.input, parents);
21 }
22 if (Array.isArray(taskName)) {
23 return handleArrayInput(taskName, trigger.input, parents);
24 }
25 })();
26 /**
27 * Mark this item as 'skipped' if the task name matches
28 * one given in the --skip flag via CLI
29 *
30 * Note: this is separate to individual task config
31 *
32 * eg:
33 * crossbow run deploy --skip build-js
34 *
35 * -> All tasks under deploy still run, but build-js will be skipped
36 */
37 if (trigger.config.skip.length) {
38 if (trigger.config.skip.indexOf(output.baseTaskName) > -1) {
39 output.skipped = true;
40 }
41 }
42 return output;
43}
44exports.preprocessTask = preprocessTask;
45var objectCount = 0;
46function handleObjectInput(taskLiteral, input, parents) {
47 /**
48 * Any value on the 'tasks' property
49 */
50 if (taskLiteral.tasks) {
51 var name_1 = "AnonObject_" + objectCount++;
52 var out = task_resolve_2.createTask(_.assign({
53 baseTaskName: name_1,
54 taskName: name_1,
55 rawInput: JSON.stringify(taskLiteral),
56 valid: true,
57 parents: parents,
58 origin: task_resolve_2.TaskOriginTypes.InlineObject,
59 type: task_resolve_2.TaskTypes.TaskGroup
60 }, taskLiteral));
61 return out;
62 }
63 if (typeof taskLiteral.input === "string") {
64 return stubAdaptor(taskLiteral.input, taskLiteral, parents);
65 }
66 if (typeof taskLiteral.adaptor === "string" && typeof taskLiteral.command === "string") {
67 taskLiteral.adaptor = taskLiteral.adaptor.replace(/^@/, "");
68 return stubAdaptor("@" + taskLiteral.adaptor + " " + taskLiteral.command, taskLiteral, parents);
69 }
70 return task_resolve_2.createTask({
71 rawInput: task_utils_1.stringifyObj(taskLiteral),
72 taskName: "",
73 type: task_resolve_2.TaskTypes.Adaptor,
74 origin: task_resolve_2.TaskOriginTypes.Adaptor,
75 adaptor: "",
76 errors: [{
77 type: task_errors_1.TaskErrorTypes.InvalidTaskInput,
78 input: taskLiteral
79 }]
80 });
81}
82exports.handleObjectInput = handleObjectInput;
83function handleArrayInput(taskItems, input, parents) {
84 var name = "AnonGroup_" + taskItems.join(",").slice(0, 10) + "...";
85 return task_resolve_2.createTask({
86 runMode: task_resolve_2.TaskRunModes.parallel,
87 baseTaskName: name,
88 taskName: name,
89 rawInput: taskItems.toString(),
90 valid: true,
91 parents: parents,
92 origin: task_resolve_2.TaskOriginTypes.InlineArray,
93 type: task_resolve_2.TaskTypes.TaskGroup,
94 tasks: taskItems
95 });
96}
97exports.handleArrayInput = handleArrayInput;
98function stubAdaptor(inputString, taskLiteral, parents) {
99 var taskLiteralAdaptor = task_resolve_2.createAdaptorTask(inputString, parents);
100 return _.assign({}, taskLiteralAdaptor, taskLiteral);
101}
102/**
103 * String can be given that may be task themselves, like NPM tasks
104 * or shell commands, but they can also be an alias for other tasks
105 *
106 * examples:
107 *
108 * - @npm webpack --config webpack.dev.js
109 * - build (which may be an alias for many other tasks)
110 */
111function handleStringInput(taskName, trigger, parents) {
112 var input = trigger.input;
113 /**
114 * Never modify the current task if it begins
115 * with a `@` - instead just return early with
116 * a adaptors task
117 * eg: `@npm webpack`
118 */
119 if (taskName.match(/^@/)) {
120 return task_resolve_2.createAdaptorTask(taskName, parents);
121 }
122 /**
123 * Split any end cbflags from the main task name
124 * @type {SplitTaskAndFlags}
125 */
126 var split = getSplitFlags(taskName, input);
127 /**
128 * Split the incoming taskname on colons
129 * eg: sass:site:dev
130 * -> ['sass', 'site', 'dev']
131 * @type {Array}
132 */
133 var splitTask = split.taskName.split(":");
134 /**
135 * Take the first (or the only) item as the base task name
136 * eg: uglify:*
137 * -> 'uglify'
138 * @type {string}
139 */
140 var baseTaskName = splitTask[0];
141 var subTasks = splitTask.slice(1);
142 var isParentName = /^\(.+?\)$/.test(baseTaskName);
143 var inputMatchesParentName = (function () {
144 if (input.tasks["(" + splitTask[0] + ")"]) {
145 return true;
146 }
147 if (splitTask[0].match(/^\(.+?\)$/) && input.tasks[splitTask[0]]) {
148 return true;
149 }
150 })();
151 var normalisedTaskName = (function () {
152 if (isParentName)
153 return baseTaskName.slice(1, -1);
154 return baseTaskName;
155 })();
156 // Before we create the base task, check if this is an alias
157 // to another top-level task
158 var topLevel = (function () {
159 var base = task_resolve_1.getTopLevelValue(normalisedTaskName, input);
160 if (inputMatchesParentName && subTasks.length) {
161 return _.get(base, [subTasks], {});
162 }
163 return base;
164 })();
165 var topLevelOptions = (function () {
166 if (inputMatchesParentName && subTasks.length) {
167 return _.get(input.options, [normalisedTaskName].concat(subTasks), {});
168 }
169 return _.get(input.options, [normalisedTaskName], {});
170 })();
171 /**
172 * Create the base task
173 */
174 var incomingTask = (function () {
175 // if it's not an alias
176 if (!topLevel && trigger.config.binExecutables.length) {
177 // if the normalised task name matches an executable
178 if (trigger.config.binExecutables.indexOf(normalisedTaskName) !== -1) {
179 return task_resolve_2.createTask({
180 baseTaskName: taskName,
181 valid: true,
182 adaptor: 'sh',
183 taskName: taskName,
184 rawInput: taskName,
185 parents: parents,
186 command: taskName,
187 runMode: task_resolve_2.TaskRunModes.series,
188 origin: task_resolve_2.TaskOriginTypes.Adaptor,
189 type: task_resolve_2.TaskTypes.Adaptor
190 });
191 }
192 }
193 var base = task_resolve_2.createTask({
194 cbflags: split.cbflags,
195 query: split.query,
196 flags: split.flags,
197 baseTaskName: normalisedTaskName,
198 subTasks: subTasks,
199 taskName: normalisedTaskName,
200 rawInput: taskName,
201 options: topLevelOptions
202 });
203 if (task_utils_1.isPlainObject(topLevel) && topLevel.tasks) {
204 /**
205 * Create the base task
206 */
207 return _.merge({}, base, topLevel, {
208 origin: task_resolve_2.TaskOriginTypes.InlineChildObject,
209 type: inputMatchesParentName ? task_resolve_2.TaskTypes.ParentGroup : task_resolve_2.TaskTypes.TaskGroup
210 });
211 }
212 return base;
213 })();
214 if (inputMatchesParentName) {
215 incomingTask.type = task_resolve_2.TaskTypes.ParentGroup;
216 }
217 /**
218 * Now pass it off to allow any flags to applied
219 */
220 return processFlags(incomingTask);
221}
222/**
223 * Function can be given inline so this methods handles that
224 */
225function handleFunctionInput(taskName, input, parents) {
226 var fnName = taskName["name"];
227 var identifier = "_inline_fn_" + inlineFnCount++ + "_" + fnName;
228 return task_resolve_2.createTask({
229 runMode: task_resolve_2.TaskRunModes.series,
230 baseTaskName: identifier,
231 taskName: identifier,
232 rawInput: identifier,
233 inlineFunctions: [taskName],
234 valid: true,
235 parents: parents,
236 origin: task_resolve_2.TaskOriginTypes.InlineFunction,
237 type: task_resolve_2.TaskTypes.InlineFunction
238 });
239}
240/**
241 *
242 */
243function getSplitFlags(taskName, input) {
244 /**
245 * Split up the task name from any flags/queries/cbflags etc
246 * @type {{baseName: string, flags: {}}}
247 */
248 var baseNameAndFlags = getBaseNameAndFlags(taskName);
249 /**
250 * Split tasks based on whether or not they have flags
251 * eg: crossbow run '@npm run webpack@p'
252 * -> taskName: '@npm run webpack'
253 * -> cbflags: ['p']
254 * @type {RegExpMatchArray}
255 */
256 var splitCBFlags = baseNameAndFlags.baseName.match(flagRegex);
257 /**
258 * If splitFlags is falsey, there was no flag so return
259 * an empty array and the full task name
260 */
261 if (!splitCBFlags) {
262 var splitQuery_1 = baseNameAndFlags.baseName.split("?");
263 var query_1 = getQuery(splitQuery_1);
264 /**
265 * Next, look at the top-level input,
266 * is this taskname going to match, and if so, does it contain any flags?
267 */
268 var cbflags_1 = Object.keys(input.tasks).reduce(function (all, key) {
269 var firstSectionOfTaskName = taskName.split(' ')[0];
270 var match = key.match(new RegExp("^" + firstSectionOfTaskName + "@(.+)"));
271 if (match) {
272 return all.concat(match[1].split(""));
273 }
274 return all;
275 }, []);
276 return { taskName: splitQuery_1[0], query: query_1, cbflags: cbflags_1, flags: baseNameAndFlags.flags };
277 }
278 /**
279 * At this point, there was at LEAST an @ at the end of the task name
280 * @type {string}
281 */
282 var base = splitCBFlags[1];
283 var splitQuery = base.split("?");
284 var query = getQuery(splitQuery);
285 var cbflags = (function () {
286 /**
287 * If the 3rd item in the regex match is undefined, it means
288 * the @ was used at the end of the task name, but a value was not given.
289 * In that case we return an empty string to allow the error collection
290 * to kick in later
291 * @type {string[]}
292 */
293 if (splitCBFlags[2] === undefined) {
294 return [""];
295 }
296 /**
297 * Default case is where there are chars after the @, so we split them up
298 * eg: crossbow run '@npm run webpack@pas'
299 * -> flags: ['p', 'a', 's']
300 */
301 return splitCBFlags[2].split("");
302 })();
303 return {
304 taskName: splitQuery[0],
305 query: query,
306 cbflags: cbflags,
307 flags: baseNameAndFlags.flags
308 };
309}
310function getQuery(splitQuery) {
311 if (splitQuery.length > 1) {
312 return qs.parse(splitQuery[1]);
313 }
314 return {};
315}
316/**
317 * Apply any transformations to options based on
318 * CB flags
319 * // todo refactor this
320 * @param task
321 * @returns {any}
322 */
323function processFlags(task) {
324 var runMode = (function () {
325 if (task.runMode === task_resolve_2.TaskRunModes.parallel)
326 return task_resolve_2.TaskRunModes.parallel;
327 if (task.cbflags.indexOf("p") > -1) {
328 return task_resolve_2.TaskRunModes.parallel;
329 }
330 return task_resolve_2.TaskRunModes.series;
331 })();
332 return _.assign({}, task, {
333 runMode: runMode
334 });
335}
336/**
337 * Split basename + opts
338 * @param taskName
339 * @returns {{baseName: any, flags: {}}}
340 */
341function getBaseNameAndFlags(taskName) {
342 var splitFlags = taskName.trim().split(/^(.+?) /);
343 /**
344 * Basename is everything upto the first space
345 * @type {string}
346 */
347 var baseName = (function () {
348 if (splitFlags.length === 1) {
349 return splitFlags[0];
350 }
351 return splitFlags[1];
352 })();
353 /**
354 * Flags is an object containing anything after the first space,
355 * parsed as CLI input
356 * @type {Flags|{}}
357 */
358 var flags = (function () {
359 if (splitFlags.length === 3) {
360 return cli_parse_1.default(splitFlags[1] + " " + splitFlags[2]).flags;
361 }
362 return {};
363 })();
364 return { baseName: baseName, flags: flags };
365}
366//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5wcmVwcm9jZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rhc2sucHJlcHJvY2Vzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQXNEO0FBQ3RELHlDQUFnQztBQUVoQywrQ0FHd0I7QUFDeEIsMkNBQXlEO0FBRXpELDZDQUE2QztBQUs3QyxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekIsSUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO0FBRWpDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUV0Qix3QkFBK0IsUUFBMEIsRUFBRSxPQUF1QixFQUFFLE9BQWlCO0lBRWpHLElBQUksTUFBTSxHQUFHLENBQUM7UUFDVixFQUFFLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsMEJBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsZ0JB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
\No newline at end of file