UNPKG

20 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");
17(function (WatchCommandEventTypes) {
18 WatchCommandEventTypes[WatchCommandEventTypes["SetupError"] = "SetupError"] = "SetupError";
19 WatchCommandEventTypes[WatchCommandEventTypes["FileEvent"] = "FileEvent"] = "FileEvent";
20 WatchCommandEventTypes[WatchCommandEventTypes["WatchTaskReport"] = "WatchTaskReport"] = "WatchTaskReport";
21 WatchCommandEventTypes[WatchCommandEventTypes["WatchRunnerComplete"] = "WatchRunnerComplete"] = "WatchRunnerComplete";
22 WatchCommandEventTypes[WatchCommandEventTypes["BeforeTasksComplete"] = "BeforeTasksComplete"] = "BeforeTasksComplete";
23})(exports.WatchCommandEventTypes || (exports.WatchCommandEventTypes = {}));
24var 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC53YXRjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLndhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSw0QkFBMkMsZUFBZSxDQUFDLENBQUE7QUFHM0QsNkJBQStDLGdCQUFnQixDQUFDLENBQUE7QUFDaEUsOEJBQTRDLGlCQUFpQixDQUFDLENBQUE7QUFDOUQsZ0NBQXNDLG1CQUFtQixDQUFDLENBQUE7QUFDMUQsNkJBQStDLGdCQUFnQixDQUFDLENBQUE7QUFDaEUsSUFBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDMUIsSUFBTyxTQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDeEMsbUNBQWlGLHNCQUFzQixDQUFDLENBQUE7QUFDeEcsMENBQWtDLDZCQUE2QixDQUFDLENBQUE7QUFDaEUsNEJBQStCLGVBQWUsQ0FBQyxDQUFBO0FBQy9DLGlDQUEwQixvQkFBb0IsQ0FBQyxDQUFBO0FBRS9DLDRCQUF5QyxlQUFlLENBQUMsQ0FBQTtBQUN6RCxJQUFZLEdBQUcsV0FBTSxpQkFBaUIsQ0FBQyxDQUFBO0FBR3ZDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ25ELElBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBNEJ0QyxXQUFZLHNCQUFzQjtJQUM5Qiw4REFBNEIsWUFBWSxnQkFBQSxDQUFBO0lBQ3hDLDZEQUE0QixXQUFXLGVBQUEsQ0FBQTtJQUN2QyxtRUFBNEIsaUJBQWlCLHFCQUFBLENBQUE7SUFDN0MsdUVBQTRCLHFCQUFxQix5QkFBQSxDQUFBO0lBQ2pELHVFQUE0QixxQkFBcUIseUJBQUEsQ0FBQTtBQUNyRCxDQUFDLEVBTlcsOEJBQXNCLEtBQXRCLDhCQUFzQixRQU1qQztBQU5ELElBQVksc0JBQXNCLEdBQXRCLDhCQU1YLENBQUE7QUFFRCw2QkFBNkIsT0FBdUI7SUFFekMs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
\No newline at end of file