UNPKG

21.1 kBJavaScriptView Raw
1#!/usr/bin/env node
2"use strict";
3var config_1 = require("./config");
4var task_runner_1 = require("./task.runner");
5var cli_1 = require("./cli");
6var fs_1 = require("fs");
7var index_1 = require("./index");
8var logger_1 = require("./logger");
9var index_2 = require("./index");
10var reports = require("./reporter.resolve");
11var file = require("./file.utils");
12var seq = require("./task.sequence");
13var Rx = require("rx");
14var debug = require("debug")("cb:cli");
15var parsed = cli_1.default(process.argv.slice(2));
16var cliOutputObserver = new Rx.Subject();
17cliOutputObserver.subscribe(function (report) {
18 report.data.forEach(function (x) {
19 logger_1.default.info(x);
20 });
21});
22var cliSignalObserver = new Rx.Subject();
23if (parsed.execute) {
24 runFromCli(parsed, cliOutputObserver, cliSignalObserver);
25}
26else {
27 if (parsed.cli.flags.version) {
28 console.log(parsed.output[0]);
29 }
30 else {
31 if (parsed.output.length) {
32 cliOutputObserver.onNext({
33 origin: reports.ReportTypes.CLIParserOutput,
34 data: parsed.output
35 });
36 }
37 }
38}
39function runFromCli(parsed, cliOutputObserver, cliSignalObserver) {
40 var prepared = index_2.prepareInput(parsed.cli, null, cliOutputObserver, cliSignalObserver);
41 var killSwitches$ = new Rx.Subject();
42 killSwitches$.subscribe(function () {
43 process.exit(1);
44 });
45 /**
46 * Handle file-writes
47 * @type {Rx.Observable<CBSignal<FileWriteSignal>>|Rx.Observable<T>}
48 */
49 cliSignalObserver
50 .filter(function (x) { return x.type === config_1.SignalTypes.FileWrite; })
51 .do(function (x) {
52 if (prepared.config.dryRun) {
53 }
54 else {
55 file.writeFileToDisk(x.data.file, x.data.content);
56 }
57 }).subscribe();
58 /**
59 * Any errors found on input preparation
60 * will be sent to the output observer and
61 * requires no further work other than to exit
62 * with a non-zero code
63 */
64 if (prepared.errors.length) {
65 return killSwitches$.onNext(true);
66 }
67 if (parsed.cli.command === "run") {
68 var setUp$_1 = new Rx.BehaviorSubject({});
69 var progress$_1 = new Rx.BehaviorSubject([]);
70 var summaryGiven_1 = false; // todo remove the need for this as it breaks the encapsulation
71 var exitSignal$ = cliSignalObserver
72 .filter(function (x) { return x.type === config_1.SignalTypes.Exit; })
73 .do(function (cbSignal) { return prepared.reportFn({
74 type: reports.ReportTypes.SignalReceived,
75 data: cbSignal.data
76 }); })
77 .withLatestFrom(setUp$_1, progress$_1, function (signal, setup, reports) {
78 return { reports: reports, setup: setup, signal: signal };
79 });
80 var exits$ = Rx.Observable.zip(Rx.Observable.just(true).timestamp(prepared.config.scheduler), exitSignal$.timestamp(prepared.config.scheduler), function (begin, signal) {
81 return { begin: begin, signal: signal };
82 }).do(function (incoming) {
83 var signal = incoming.signal, begin = incoming.begin;
84 var setup = signal.value.setup;
85 var reports = signal.value.reports;
86 var startTime = begin.timestamp;
87 var endTime = signal.timestamp;
88 /**
89 * Main summary report, although here it could be partial
90 * (as an exit command could occur at any time)
91 */
92 if ((setup.tasks.valid.length * 2) !== reports.length) {
93 if (!summaryGiven_1) {
94 summaryGiven_1 = true;
95 handleCompletion(reports, setup, endTime - startTime);
96 }
97 }
98 else {
99 console.log("Exit signal, but summary given from main handler");
100 }
101 });
102 var reports$ = index_1.handleIncoming(prepared)
103 .do(function (x) { return setUp$_1.onNext(x.setup); }) // first item is the setup
104 .flatMap(function (x) {
105 if (x.setup.errors.length) {
106 killSwitches$.onNext(true);
107 return Rx.Observable.empty();
108 }
109 if (x.setup.tasks.invalid.length) {
110 killSwitches$.onNext(true);
111 return Rx.Observable.empty();
112 }
113 return x.update$;
114 })
115 .do(function (x) { return progress$_1.onNext(progress$_1.getValue().concat(x)); })
116 .do(function (report) {
117 prepared.reportFn({
118 type: reports.ReportTypes.TaskReport,
119 data: {
120 report: report,
121 config: prepared.config
122 }
123 });
124 })
125 .takeUntil(exits$)
126 .toArray()
127 .filter(function (reports) { return reports.length > 0; })
128 .timestamp(prepared.config.scheduler)
129 .withLatestFrom(setUp$_1, function (incoming, setup) {
130 return {
131 setup: setup,
132 reports: incoming.value,
133 timestamp: incoming.timestamp
134 };
135 });
136 Rx.Observable.zip(Rx.Observable.just(true).timestamp(prepared.config.scheduler), reports$, function (begin, result) {
137 return { begin: begin, result: result };
138 }).subscribe(function (incoming) {
139 if (!summaryGiven_1) {
140 summaryGiven_1 = true;
141 handleCompletion(incoming.result.reports, incoming.result.setup, incoming.result.timestamp - incoming.begin.timestamp);
142 }
143 });
144 }
145 /**
146 * Because errors are handled by reports, task executions ALWAYS complete
147 * and we handle that here.
148 */
149 function handleCompletion(taskReports, setup, runtime) {
150 /**
151 * Merge sequence tree with Task Reports
152 */
153 var decoratedSequence = seq.decorateSequenceWithReports(setup.sequence, taskReports);
154 /**
155 * Push a 'Completion report' onto the $complete Observable.
156 * This means consumers will get everything when they call
157 */
158 var errors = taskReports.filter(function (x) { return x.type === task_runner_1.TaskReportType.error; });
159 var completeData = {
160 errors: errors,
161 runtime: runtime,
162 taskErrors: errors,
163 sequence: decoratedSequence,
164 cli: prepared.cli,
165 config: prepared.config
166 };
167 /**
168 * Main summary report
169 */
170 prepared.reportFn({
171 type: reports.ReportTypes.Summary,
172 data: completeData
173 });
174 require("./command.run.post-execution").postCliExecution(completeData);
175 }
176 if (parsed.cli.command === "tasks" || parsed.cli.command === "ls") {
177 index_1.handleIncoming(prepared)
178 .subscribe(function (x) {
179 var _a = x.setup, groups = _a.groups, tasks = _a.tasks;
180 var invalid = groups.reduce(function (acc, group) { return acc.concat(group.tasks.invalid); }, []);
181 if (invalid.length || prepared.config.verbose === 1 /* Verbose */) {
182 return prepared.reportFn({
183 type: reports.ReportTypes.TaskTree,
184 data: {
185 tasks: tasks,
186 config: prepared.config,
187 title: invalid.length ? "Errors found:" : "Available Tasks:"
188 }
189 });
190 }
191 if (!groups.length) {
192 return prepared.reportFn({ type: reports.ReportTypes.NoTasksAvailable });
193 }
194 prepared.reportFn({
195 type: reports.ReportTypes.SimpleTaskList,
196 data: { setup: x.setup }
197 });
198 });
199 }
200 if (parsed.cli.command === "docs") {
201 index_1.handleIncoming(prepared)
202 .pluck("setup")
203 .subscribe(function (setup) {
204 if (setup.errors.length || setup.tasks.invalid.length) {
205 return killSwitches$.onNext(true);
206 }
207 setup.output.forEach(function (outputItem) {
208 file.writeFileToDisk(outputItem.file, outputItem.content);
209 });
210 });
211 }
212 if (parsed.cli.command === "init") {
213 index_1.handleIncoming(prepared)
214 .pluck("setup")
215 .subscribe(function (setup) {
216 if (setup.errors.length) {
217 return killSwitches$.onNext(true);
218 }
219 fs_1.writeFileSync(setup.outputFilePath, fs_1.readFileSync(setup.templateFilePath));
220 });
221 }
222 if (parsed.cli.command === "watchers") {
223 index_1.handleIncoming(prepared)
224 .pluck("setup")
225 .subscribe(function (setup) {
226 if (setup.errors.length) {
227 return killSwitches$.onNext(true);
228 }
229 prepared.reportFn({
230 type: reports.ReportTypes.WatcherNames,
231 data: { setup: setup }
232 });
233 });
234 }
235 if (parsed.cli.command === "watch") {
236 index_1.handleIncoming(prepared)
237 .flatMap(function (x) {
238 if (x.setup.errors.length) {
239 killSwitches$.onNext(true);
240 return Rx.Observable.empty();
241 }
242 return x.update$;
243 })
244 .subscribe();
245 }
246}
247//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSx1QkFBaUUsVUFBVSxDQUFDLENBQUE7QUFHNUUsNEJBQXlDLGVBQWUsQ0FBQyxDQUFBO0FBS3pELG9CQUFnQixPQUFPLENBQUMsQ0FBQTtBQUN4QixtQkFBMEMsSUFBSSxDQUFDLENBQUE7QUFDL0Msc0JBQTZCLFNBQVMsQ0FBQyxDQUFBO0FBQ3ZDLHVCQUFtQixVQUFVLENBQUMsQ0FBQTtBQUU5QixzQkFBMkIsU0FBUyxDQUFDLENBQUE7QUFFckMsSUFBWSxPQUFPLFdBQU0sb0JBQW9CLENBQUMsQ0FBQTtBQUM5QyxJQUFZLElBQUksV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUNyQyxJQUFZLEdBQUcsV0FBTSxpQkFBaUIsQ0FBQyxDQUFBO0FBRXZDLElBQU8sRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDO0FBRzFCLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QyxJQUFNLE1BQU0sR0FBRyxhQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxQyxJQUFNLGlCQUFpQixHQUFHLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBMEIsQ0FBQztBQUNuRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxNQUFNO0lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUMzQixnQkFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQXdCLENBQUM7QUFFakUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFD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
\No newline at end of file