UNPKG

19.9 kBJavaScriptView Raw
1"use strict";
2var command_run_1 = require("./command.run");
3var watch_runner_1 = require("./watch.runner");
4var watch_resolve_1 = require("./watch.resolve");
5var watch_shorthand_1 = require("./watch.shorthand");
6var watch_before_1 = require("./watch.before");
7var Rx = require("rx");
8var Immutable = require("immutable");
9var watch_file_watcher_1 = require("./watch.file-watcher");
10var command_watch_interactive_1 = require("./command.watch.interactive");
11var watch_utils_1 = require("./watch.utils");
12var reporter_resolve_1 = require("./reporter.resolve");
13var task_runner_1 = require("./task.runner");
14var seq = require("./task.sequence");
15var debug = require("debug")("cb:command.watch");
16var _ = require("../lodash.custom");
17var WatchCommandEventTypes;
18(function (WatchCommandEventTypes) {
19 WatchCommandEventTypes[WatchCommandEventTypes["SetupError"] = "SetupError"] = "SetupError";
20 WatchCommandEventTypes[WatchCommandEventTypes["FileEvent"] = "FileEvent"] = "FileEvent";
21 WatchCommandEventTypes[WatchCommandEventTypes["WatchTaskReport"] = "WatchTaskReport"] = "WatchTaskReport";
22 WatchCommandEventTypes[WatchCommandEventTypes["WatchRunnerComplete"] = "WatchRunnerComplete"] = "WatchRunnerComplete";
23 WatchCommandEventTypes[WatchCommandEventTypes["BeforeTasksComplete"] = "BeforeTasksComplete"] = "BeforeTasksComplete";
24})(WatchCommandEventTypes = exports.WatchCommandEventTypes || (exports.WatchCommandEventTypes = {}));
25function executeWatchCommand(trigger) {
26 var cli = trigger.cli, input = trigger.input, config = trigger.config, reporter = trigger.reporter;
27 var _a = getWatchCommandSetup(trigger), beforeTasks = _a.beforeTasks, watchTasks = _a.watchTasks, watchRunners = _a.watchRunners;
28 /**
29 * Never continue if any BEFORE tasks were flagged as invalid
30 */
31 if (beforeTasks.tasks.invalid.length) {
32 reporter({
33 type: reporter_resolve_1.ReportTypes.BeforeWatchTaskErrors,
34 data: {
35 watchTasks: watchTasks, trigger: trigger
36 }
37 });
38 return Rx.Observable.just({
39 setup: {
40 watchTasks: watchTasks,
41 watchRunners: watchRunners,
42 beforeTasks: beforeTasks,
43 errors: [{ type: reporter_resolve_1.ReportTypes.BeforeWatchTaskErrors, data: { watchTasks: watchTasks, trigger: trigger } }]
44 },
45 update$: Rx.Observable.empty()
46 });
47 }
48 /**
49 * Never continue if any tasks were flagged as
50 * // todo, how do we get here
51 */
52 if (watchTasks.invalid.length) {
53 reporter({ type: reporter_resolve_1.ReportTypes.WatchTaskErrors, data: { watchTasks: watchTasks.all, cli: cli, input: input } });
54 return Rx.Observable.just({
55 setup: {
56 watchTasks: watchTasks,
57 watchRunners: watchRunners,
58 beforeTasks: beforeTasks,
59 errors: [{ type: reporter_resolve_1.ReportTypes.WatchTaskErrors, data: { watchTasks: watchTasks, trigger: trigger } }]
60 },
61 update$: Rx.Observable.empty()
62 });
63 }
64 /**
65 * Never continue if any runners are invalid
66 */
67 if (watchRunners.invalid.length) {
68 watchRunners.invalid.forEach(function (runner) {
69 reporter({ type: reporter_resolve_1.ReportTypes.WatchTaskTasksErrors, data: { tasks: runner._tasks.all, runner: runner, config: config } });
70 });
71 return Rx.Observable.just({
72 setup: {
73 watchTasks: watchTasks,
74 watchRunners: watchRunners,
75 beforeTasks: beforeTasks,
76 errors: [{ type: reporter_resolve_1.ReportTypes.WatchTaskTasksErrors }]
77 },
78 update$: Rx.Observable.empty()
79 });
80 }
81 /**
82 * If there are no before tasks to execute, just begin the watchers
83 */
84 if (!beforeTasks.tasks.valid.length) {
85 reporter({ type: reporter_resolve_1.ReportTypes.Watchers, data: { watchTasks: watchTasks.valid, config: config } });
86 return Rx.Observable.just({
87 setup: {
88 watchTasks: watchTasks,
89 watchRunners: watchRunners,
90 beforeTasks: beforeTasks,
91 errors: []
92 },
93 update$: watch_file_watcher_1.createObservablesForWatchers(watchRunners.valid, trigger)
94 });
95 }
96 reporter({ type: reporter_resolve_1.ReportTypes.BeforeTaskList, data: { sequence: beforeTasks.sequence, cli: cli, config: trigger.config } });
97 var withBefore$ = Rx.Observable.zip(
98 /**
99 * Timestamp the beginning
100 */
101 Rx.Observable.just(true).timestamp(config.scheduler).map(function (x) { return x.timestamp; }),
102 /**
103 * Run the tasks
104 */
105 beforeTasks.runner.series().toArray().timestamp(config.scheduler),
106 /**
107 * Combine the start time + report from the runner
108 */
109 function (start, x) {
110 var reports = x.value;
111 var endtime = x.timestamp;
112 return { duration: endtime - start, reports: reports };
113 })
114 .flatMap(function (x) {
115 var duration = x.duration, reports = x.reports;
116 var sequence = seq.decorateSequenceWithReports(beforeTasks.sequence, reports);
117 var errors = reports.filter(function (x) { return x.type === task_runner_1.TaskReportType.error; });
118 reporter({
119 type: reporter_resolve_1.ReportTypes.BeforeTasksSummary,
120 data: {
121 sequence: sequence,
122 cli: cli,
123 config: config,
124 runtime: duration,
125 errors: errors
126 }
127 });
128 var beforeReport = {
129 type: WatchCommandEventTypes.BeforeTasksComplete,
130 data: {
131 reports: reports,
132 errors: errors
133 }
134 };
135 /**
136 * If an error occurred, and the user did not provide --no-fail flag
137 * don't continue with the watchers
138 */
139 if (errors.length && config.fail) {
140 return Rx.Observable.just(beforeReport);
141 }
142 /**
143 * Report running watchers
144 */
145 reporter({ type: reporter_resolve_1.ReportTypes.Watchers, data: { watchTasks: watchTasks.valid, config: config } });
146 /**
147 * Send the before report followed by the following watch task reports
148 */
149 return Rx.Observable.concat(Rx.Observable.just(beforeReport), watch_file_watcher_1.createObservablesForWatchers(watchRunners.valid, trigger));
150 });
151 return Rx.Observable.just({
152 setup: {
153 watchTasks: watchTasks,
154 watchRunners: watchRunners,
155 beforeTasks: beforeTasks,
156 errors: []
157 },
158 update$: withBefore$
159 });
160}
161function handleIncomingWatchCommand(cli, input, config, reporter) {
162 var topLevelWatchers = watch_utils_1.stripBlacklisted(Object.keys(input.watch));
163 debug("top level watchers available", topLevelWatchers);
164 var sharedMap = new Rx.BehaviorSubject(Immutable.Map({}));
165 /**
166 * If the interactive flag was given (-i), always try
167 * that first.
168 */
169 if (config.interactive) {
170 return enterInteractive();
171 }
172 /**
173 * If the user did not provide a watcher name
174 */
175 if (cli.input.length === 1) {
176 if (input.watch.default !== undefined) {
177 var moddedCliInput = cli.input.slice();
178 cli.input = moddedCliInput.concat("default");
179 return executeWatchCommand(watch_shorthand_1.getModifiedWatchContext({
180 shared: sharedMap,
181 cli: cli,
182 input: input,
183 config: config,
184 reporter: reporter,
185 type: command_run_1.TriggerTypes.watcher
186 }));
187 }
188 return enterInteractive();
189 }
190 /**
191 * If no watchers given, or if user has selected interactive mode,
192 * show the UI for watcher selection
193 */
194 function enterInteractive() {
195 if (!topLevelWatchers.length) {
196 reporter({ type: reporter_resolve_1.ReportTypes.NoWatchersAvailable });
197 return Rx.Observable.just({
198 setup: {
199 errors: [{ type: reporter_resolve_1.ReportTypes.NoWatchersAvailable }]
200 },
201 update$: Rx.Observable.empty()
202 });
203 }
204 reporter({ type: reporter_resolve_1.ReportTypes.NoWatchTasksProvided });
205 return command_watch_interactive_1.default(cli, input, config)
206 .flatMap(function (answers) {
207 var cliMerged = _.merge({}, cli, { input: answers.watch });
208 return executeWatchCommand({
209 shared: sharedMap,
210 cli: cliMerged,
211 input: input,
212 config: config,
213 reporter: reporter,
214 type: command_run_1.TriggerTypes.watcher
215 });
216 });
217 }
218 return executeWatchCommand(watch_shorthand_1.getModifiedWatchContext({
219 shared: sharedMap,
220 cli: cli,
221 input: input,
222 config: config,
223 reporter: reporter,
224 type: command_run_1.TriggerTypes.watcher
225 }));
226}
227Object.defineProperty(exports, "__esModule", { value: true });
228exports.default = handleIncomingWatchCommand;
229function getWatchCommandSetup(trigger) {
230 var cli = trigger.cli, input = trigger.input, config = trigger.config, reporter = trigger.reporter;
231 /**
232 * task Tracker for external observers
233 * @type {Subject<T>}
234 */
235 trigger.tracker = new Rx.Subject();
236 trigger.tracker$ = trigger.tracker.share();
237 /**
238 * First Resolve the task names given in input.
239 */
240 var watchTasks = watch_resolve_1.resolveWatchTasks(trigger.cli.input, trigger);
241 /**
242 * Create runners for watch tasks;
243 */
244 // todo - resolve parent+child for watchers
245 var watchRunners = watch_runner_1.createWatchRunners(watchTasks, trigger);
246 /**
247 * Get a special runner that will executeWatchCommand before
248 * watchers begin
249 * @type {BeforeTasks}
250 */
251 var beforeTasks = watch_before_1.getBeforeTaskRunner(trigger, watchTasks);
252 /**
253 *
254 */
255 return { watchRunners: watchRunners, watchTasks: watchTasks, beforeTasks: beforeTasks, errors: [] };
256}
257exports.getWatchCommandSetup = getWatchCommandSetup;
258//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC53YXRjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLndhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSw2Q0FBMkQ7QUFHM0QsK0NBQWdFO0FBQ2hFLGlEQUE4RDtBQUM5RCxxREFBMEQ7QUFDMUQsK0NBQWdFO0FBQ2hFLHVCQUEwQjtBQUMxQixxQ0FBd0M7QUFDeEMsMkRBQXdHO0FBQ3hHLHlFQUFnRTtBQUNoRSw2Q0FBK0M7QUFDL0MsdURBQStDO0FBRS9DLDZDQUF5RDtBQUN6RCxxQ0FBdUM7QUFHdkMsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUE0QnRDLElBQVksc0JBTVg7QUFORCxXQUFZLHNCQUFzQjtJQUM5Qiw4REFBNEIsWUFBWSxnQkFBQSxDQUFBO0lBQ3hDLDZEQUE0QixXQUFXLGVBQUEsQ0FBQTtJQUN2QyxtRUFBNEIsaUJBQWlCLHFCQUFBLENBQUE7SUFDN0MsdUVBQTRCLHFCQUFxQix5QkFBQSxDQUFBO0lBQ2pELHVFQUE0QixxQkFBcUIseUJBQUEsQ0FBQTtBQUNyRCxDQUFDLEVBTlcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFNakM7QUFFRCw2QkFBNkIsT0FBdUI7SUFFekMsSUFBQSxpQkFBRyxFQUFFLHFCQUFLLEVBQUUsdUJBQU0sRUFBRSwyQkFBUSxDQUFZO0lBRXpDLElBQUEsa0NBQXVFLEVBQXRFLDRCQUFXLEVBQUUsMEJBQVUsRUFBRSw4QkFBWSxDQUFrQztJQUU5RTs7T0FFRztJQUNILEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkMsUUFBUSxDQUFDO1lBQ0wsSUFBSSxFQUFFLDhCQUFXLENBQUMscUJBQXFCO1lB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
\No newline at end of file