1 | ;
|
2 | var command_run_1 = require("./command.run");
|
3 | var watch_runner_1 = require("./watch.runner");
|
4 | var watch_resolve_1 = require("./watch.resolve");
|
5 | var watch_shorthand_1 = require("./watch.shorthand");
|
6 | var watch_before_1 = require("./watch.before");
|
7 | var Rx = require("rx");
|
8 | var Immutable = require("immutable");
|
9 | var watch_file_watcher_1 = require("./watch.file-watcher");
|
10 | var command_watch_interactive_1 = require("./command.watch.interactive");
|
11 | var watch_utils_1 = require("./watch.utils");
|
12 | var reporter_resolve_1 = require("./reporter.resolve");
|
13 | var task_runner_1 = require("./task.runner");
|
14 | var seq = require("./task.sequence");
|
15 | var debug = require("debug")("cb:command.watch");
|
16 | var _ = require("../lodash.custom");
|
17 | var 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 = {}));
|
25 | function 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 | }
|
161 | function 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 | }
|
227 | Object.defineProperty(exports, "__esModule", { value: true });
|
228 | exports.default = handleIncomingWatchCommand;
|
229 | function 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 | }
|
257 | exports.getWatchCommandSetup = getWatchCommandSetup;
|
258 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC53YXRjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLndhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSw2Q0FBMkQ7QUFHM0QsK0NBQWdFO0FBQ2hFLGlEQUE4RDtBQUM5RCxxREFBMEQ7QUFDMUQsK0NBQWdFO0FBQ2hFLHVCQUEwQjtBQUMxQixxQ0FBd0M7QUFDeEMsMkRBQXdHO0FBQ3hHLHlFQUFnRTtBQUNoRSw2Q0FBK0M7QUFDL0MsdURBQStDO0FBRS9DLDZDQUF5RDtBQUN6RCxxQ0FBdUM7QUFHdkMsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUE0QnRDLElBQVksc0JBTVg7QUFORCxXQUFZLHNCQUFzQjtJQUM5Qiw4REFBNEIsWUFBWSxnQkFBQSxDQUFBO0lBQ3hDLDZEQUE0QixXQUFXLGVBQUEsQ0FBQTtJQUN2QyxtRUFBNEIsaUJBQWlCLHFCQUFBLENBQUE7SUFDN0MsdUVBQTRCLHFCQUFxQix5QkFBQSxDQUFBO0lBQ2pELHVFQUE0QixxQkFBcUIseUJBQUEsQ0FBQTtBQUNyRCxDQUFDLEVBTlcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFNakM7QUFFRCw2QkFBNkIsT0FBdUI7SUFFekMsSUFBQSxpQkFBRyxFQUFFLHFCQUFLLEVBQUUsdUJBQU0sRUFBRSwyQkFBUSxDQUFZO0lBRXpDLElBQUEsa0NBQXVFLEVBQXRFLDRCQUFXLEVBQUUsMEJBQVUsRUFBRSw4QkFBWSxDQUFrQztJQUU5RTs7T0FFRztJQUNILEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkMsUUFBUSxDQUFDO1lBQ0wsSUFBSSxFQUFFLDhCQUFXLENBQUMscUJBQXFCO1lB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 |
\ | No newline at end of file |