UNPKG

16.2 kBJavaScriptView Raw
1"use strict";
2var task_resolve_1 = require("./task.resolve");
3var task_utils_1 = require("./task.utils");
4var _ = require("../lodash.custom");
5(function (TaskErrorTypes) {
6 TaskErrorTypes[TaskErrorTypes["TaskNotFound"] = "TaskNotFound"] = "TaskNotFound";
7 TaskErrorTypes[TaskErrorTypes["SubtasksNotInConfig"] = "SubtasksNotInConfig"] = "SubtasksNotInConfig";
8 TaskErrorTypes[TaskErrorTypes["SubtaskNotProvided"] = "SubtaskNotProvided"] = "SubtaskNotProvided";
9 TaskErrorTypes[TaskErrorTypes["SubtaskNotProvidedForParent"] = "SubtaskNotProvidedForParent"] = "SubtaskNotProvidedForParent";
10 TaskErrorTypes[TaskErrorTypes["SubtaskNotFound"] = "SubtaskNotFound"] = "SubtaskNotFound";
11 TaskErrorTypes[TaskErrorTypes["SubtaskWildcardNotAvailable"] = "SubtaskWildcardNotAvailable"] = "SubtaskWildcardNotAvailable";
12 TaskErrorTypes[TaskErrorTypes["AdaptorNotFound"] = "AdaptorNotFound"] = "AdaptorNotFound";
13 TaskErrorTypes[TaskErrorTypes["FlagNotFound"] = "FlagNotFound"] = "FlagNotFound";
14 TaskErrorTypes[TaskErrorTypes["CBFlagNotProvided"] = "CBFlagNotProvided"] = "CBFlagNotProvided";
15 TaskErrorTypes[TaskErrorTypes["InvalidTaskInput"] = "InvalidTaskInput"] = "InvalidTaskInput";
16 TaskErrorTypes[TaskErrorTypes["CircularReference"] = "CircularReference"] = "CircularReference";
17 TaskErrorTypes[TaskErrorTypes["FileTypeNotSupported"] = "FileTypeNotSupported"] = "FileTypeNotSupported";
18})(exports.TaskErrorTypes || (exports.TaskErrorTypes = {}));
19var TaskErrorTypes = exports.TaskErrorTypes;
20function gatherTaskErrors(task, trigger) {
21 return [
22 getModuleErrors,
23 getFileTypeErrors,
24 getCBFlagErrors,
25 getSubTaskErrors,
26 getParentGroupErrors
27 ].reduce(function (all, fn) { return all.concat(fn(task, trigger)); }, []);
28}
29exports.gatherTaskErrors = gatherTaskErrors;
30function getModuleErrors(task, trigger) {
31 if (task.type === task_resolve_1.TaskTypes.ParentGroup)
32 return [];
33 if (task.type === task_resolve_1.TaskTypes.ExternalTask)
34 return [];
35 if (task.type === task_resolve_1.TaskTypes.InlineFunction)
36 return [];
37 /**
38 * If a module was not located, and there are 0 child tasks,
39 * this can be classified as a `module not found error`
40 */
41 if (task.externalTasks.length === 0 && task.tasks.length === 0) {
42 var matchSorter = require('match-sorter');
43 return [{
44 type: TaskErrorTypes.TaskNotFound,
45 taskName: task.taskName,
46 cwd: trigger.config.cwd,
47 possible: matchSorter(task_utils_1.getPossibleTaskNames(trigger.input), task.taskName, { threshold: matchSorter.rankings.NO_MATCH })
48 }];
49 }
50 return [];
51}
52function getFileTypeErrors(task, trigger) {
53 /**
54 * If it's not an external task, this can never be an error
55 */
56 if (task.type !== task_resolve_1.TaskTypes.ExternalTask)
57 return [];
58 var supported = task_utils_1.isSupportedFileType(task.externalTasks[0].parsed.ext);
59 if (supported)
60 return [];
61 return [{
62 type: TaskErrorTypes.FileTypeNotSupported,
63 taskName: task.taskName,
64 externalFile: task.externalTasks[0]
65 }];
66}
67function getCBFlagErrors(task, trigger) {
68 return task.cbflags.reduce(function (all, flag) {
69 /**
70 * if `flag` is an empty string, the user provided an @ after a task
71 * name, but without the right-hand part.
72 * eg:
73 * $ crossbow run build-css@
74 *
75 * when it should of been
76 * $ crossbow run build-css@p
77 *
78 */
79 if (flag === "") {
80 return all.concat({
81 type: TaskErrorTypes.CBFlagNotProvided,
82 taskName: task.taskName
83 });
84 }
85 return all;
86 }, []);
87}
88function getSubTaskErrors(task, trigger) {
89 if (task.type === task_resolve_1.TaskTypes.ParentGroup)
90 return [];
91 /**
92 * Now validate any sub tasks given with colon syntax
93 * eg: sass:dev
94 * -> must have a configuration object under the key sass.dev
95 * -> VALID
96 * config:
97 * sass:
98 * dev: 'input.scss'
99 */
100 return task.subTasks.reduce(function (all, subTaskName) {
101 var configKeys = (function () {
102 var taskOptions = Object.keys(_.get(task, "options", {}));
103 if (taskOptions.length) {
104 return taskOptions;
105 }
106 return Object.keys(_.get(trigger.input, ["options"].concat(task.baseTaskName), {}));
107 })();
108 /**
109 * if `name` is an empty string, the user provided a colon-separated task
110 * name without the right-hand part.
111 * eg:
112 * $ crossbow run sass:
113 *
114 * when it should of been
115 * $ crossbow run sass:site:dev
116 *
117 */
118 if (subTaskName === "") {
119 return all.concat({
120 type: TaskErrorTypes.SubtaskNotProvided,
121 name: subTaskName
122 });
123 }
124 /**
125 * if a star was given as a subTask,
126 * then this item must have configuration
127 * as we'll want to run once with each key
128 */
129 if (subTaskName === "*") {
130 return all.concat(handleWildcardSubtask(configKeys, subTaskName));
131 }
132 /**
133 * Now check if this is an attempt at loading a grouped task
134 */
135 if (subTaskName.length) {
136 var matching = task.tasks.filter(function (x) { return x.taskName === subTaskName; });
137 if (matching.length)
138 return all;
139 }
140 if (!configKeys.length) {
141 return all.concat({
142 type: TaskErrorTypes.SubtasksNotInConfig,
143 name: subTaskName
144 });
145 }
146 /**
147 * Finally check if there's configuration that Matches this
148 * key.
149 */
150 var match = _.get(trigger.input, ["options"].concat(task.baseTaskName, subTaskName));
151 var match2 = _.get(task, ["options"].concat(subTaskName));
152 if (match === undefined && match2 === undefined) {
153 return all.concat({
154 type: TaskErrorTypes.SubtaskNotFound,
155 name: subTaskName
156 });
157 }
158 return all;
159 }, []);
160}
161function getParentGroupErrors(task, trigger) {
162 /**
163 * This only applies to ParentGroups
164 */
165 if (task.type !== task_resolve_1.TaskTypes.ParentGroup)
166 return [];
167 /**
168 * If the type is a ParentGroup, it requires that a sub-task is provided also
169 */
170 if (task.subTasks[0] === "*") {
171 var children = task_utils_1.getChildItems(task.baseTaskName, trigger.input.tasks);
172 if (Object.keys(children).length) {
173 return [];
174 }
175 }
176 if (task.subTasks.length === 0) {
177 var available = (function () {
178 var match = task_utils_1.isParentGroupName(task.baseTaskName);
179 if (match) {
180 return Object.keys(_.get(trigger.input.tasks, [task.baseTaskName], {}));
181 }
182 return Object.keys(_.get(trigger.input.tasks, ["(" + task.baseTaskName + ")"], {}));
183 })();
184 return [{
185 type: TaskErrorTypes.SubtaskNotProvidedForParent,
186 name: task.baseTaskName,
187 available: available
188 }];
189 }
190 function match(name) {
191 return _.get(trigger.input.tasks, [("(" + task.baseTaskName + ")"), name]);
192 }
193 return task.subTasks.reduce(function (acc, subTask) {
194 if (!match(subTask)) {
195 return acc.concat([{
196 type: TaskErrorTypes.SubtaskNotFound,
197 name: subTask
198 }]);
199 }
200 return acc;
201 }, []);
202}
203function handleWildcardSubtask(configKeys, name) {
204 if (configKeys.length) {
205 return [];
206 }
207 return [{
208 type: TaskErrorTypes.SubtaskWildcardNotAvailable,
209 name: name
210 }];
211}
212//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFzay5lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLDZCQUF3QixnQkFBZ0IsQ0FBQyxDQUFBO0FBQ3pDLDJCQUEwRixjQUFjLENBQUMsQ0FBQTtBQUd6RyxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUV0QyxXQUFZLGNBQWM7SUFDdEIsZ0RBQW9CLGNBQWMsa0JBQUEsQ0FBQTtJQUNsQyx1REFBMkIscUJBQXFCLHlCQUFBLENBQUE7SUFDaEQsc0RBQTBCLG9CQUFvQix3QkFBQSxDQUFBO0lBQzlDLCtEQUFtQyw2QkFBNkIsaUNBQUEsQ0FBQTtJQUNoRSxtREFBdUIsaUJBQWlCLHFCQUFBLENBQUE7SUFDeEMsK0RBQW1DLDZCQUE2QixpQ0FBQSxDQUFBO0lBQ2hFLG1EQUF1QixpQkFBaUIscUJBQUEsQ0FBQTtJQUN4QyxnREFBb0IsY0FBYyxrQkFBQSxDQUFBO0lBQ2xDLHFEQUF5QixtQkFBbUIsdUJBQUEsQ0FBQTtJQUM1QyxvREFBd0Isa0JBQWtCLHNCQUFBLENBQUE7SUFDMUMscURBQXlCLG1CQUFtQix1QkFBQSxDQUFBO0lBQzVDLHdEQUE0QixzQkFBc0IsMEJBQUEsQ0FBQTtBQUN0RCxDQUFDLEVBYlcsc0JBQWMsS0FBZCxzQkFBYyxRQWF6QjtBQWJELElBQVksY0FBYyxHQUFkLHNCQWFYLENBQUE7QUFFRCwwQkFBaUMsSUFBVSxFQUFFLE9BQXVCO0lBQ2hFLE1BQU0sQ0FBQztRQUNILGVBQWU7UUFDZixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLGdCQUFnQjtRQUNoQixvQkFBb0I7S0FFdkIsQ0FBQyxNQUFNLENBQUMsVUFBQyxHQUFHLEVBQUUsRUFBRSxJQUFLLE9BQUEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQTdCLENBQTZCLEVBQUUsRUFB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
\No newline at end of file