1 |
|
2 | ;
|
3 | var config_1 = require("./config");
|
4 | var task_runner_1 = require("./task.runner");
|
5 | var cli_1 = require("./cli");
|
6 | var fs_1 = require("fs");
|
7 | var index_1 = require("./index");
|
8 | var logger_1 = require("./logger");
|
9 | var index_2 = require("./index");
|
10 | var reports = require("./reporter.resolve");
|
11 | var file = require("./file.utils");
|
12 | var seq = require("./task.sequence");
|
13 | var Rx = require("rx");
|
14 | var debug = require("debug")("cb:cli");
|
15 | var parsed = cli_1.default(process.argv.slice(2));
|
16 | var cliOutputObserver = new Rx.Subject();
|
17 | cliOutputObserver.subscribe(function (report) {
|
18 | report.data.forEach(function (x) {
|
19 | logger_1.default.info(x);
|
20 | });
|
21 | });
|
22 | var cliSignalObserver = new Rx.Subject();
|
23 | if (parsed.execute) {
|
24 | runFromCli(parsed, cliOutputObserver, cliSignalObserver);
|
25 | }
|
26 | else {
|
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 | }
|
39 | function 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 |