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 reports = require("./reporter.resolve");
|
10 | var file = require("./file.utils");
|
11 | var seq = require("./task.sequence");
|
12 | var Rx = require("rx");
|
13 | var file_utils_1 = require("./file.utils");
|
14 | var debug = require("debug")("cb:cli");
|
15 | var _ = require('../lodash.custom');
|
16 | var parsed = cli_1.default(process.argv.slice(2));
|
17 | var defaultReporter = reports.getDefaultReporter();
|
18 | var defaultReporterFn = function (input) {
|
19 | var output = defaultReporter(input);
|
20 | if (output.data.length) {
|
21 | output.data.forEach(function (line) { return logger_1.default.info(line); });
|
22 | }
|
23 | };
|
24 | if (parsed.execute) {
|
25 | runFromCli(parsed, defaultReporterFn);
|
26 | }
|
27 | else {
|
28 | if (parsed.cli.flags.version) {
|
29 | console.log(parsed.output[0]);
|
30 | }
|
31 | else {
|
32 | if (parsed.output.length) {
|
33 | parsed.output.forEach(function (line) {
|
34 | logger_1.default.info(line);
|
35 | });
|
36 | }
|
37 | }
|
38 | }
|
39 | function runFromCli(parsed, cliDefaultReporter) {
|
40 | var addReporterIfMissing = function (setup, fn) {
|
41 | return setup.reporters.length > 0
|
42 | ? setup
|
43 | : _.assign({}, setup, { reportFn: fn });
|
44 | };
|
45 | var addSignalFnIfMissing = function (setup, obs) {
|
46 | return setup.config.signalObserver
|
47 | ? setup
|
48 | : _.set(setup, 'config.signalObserver', obs);
|
49 | };
|
50 | var addLoadDefaultsIfUndefined = function (cli) {
|
51 | return typeof cli.flags.loadDefaultInputs === "undefined"
|
52 | ? _.set(cli, 'flags.loadDefaultInputs', true)
|
53 | : cli;
|
54 | };
|
55 | var cliSignalObserver = new Rx.Subject();
|
56 | var killSwitches$ = new Rx.Subject();
|
57 | killSwitches$.subscribe(function () {
|
58 | process.exit(1);
|
59 | });
|
60 | file_utils_1.Right(parsed.cli)
|
61 | .map(function (cli) { return addLoadDefaultsIfUndefined(cli); })
|
62 | .chain(function (cli) { return index_1.getSetup(cli); })
|
63 | .map(function (x) { return addReporterIfMissing(x, cliDefaultReporter); })
|
64 | .map(function (x) { return addSignalFnIfMissing(x, cliSignalObserver); })
|
65 | .fold(function (err) {
|
66 | // todo log input errors
|
67 | cliDefaultReporter(err);
|
68 | killSwitches$.onNext(true);
|
69 | return err;
|
70 | }, function (setup) {
|
71 | setup.reportFn({
|
72 | type: reports.ReportTypes.UsingInputFile, data: { sources: setup.userInput.sources }
|
73 | });
|
74 | if (parsed.cli.command === 'run') {
|
75 | runWithSetup(setup, killSwitches$);
|
76 | }
|
77 | if (parsed.cli.command === 'docs') {
|
78 | docsWithSetup(setup, killSwitches$);
|
79 | }
|
80 | if (parsed.cli.command === 'init') {
|
81 | initWithSetup(setup, killSwitches$);
|
82 | }
|
83 | if (parsed.cli.command === 'tasks' || parsed.cli.command === 'ls') {
|
84 | tasksWithSetup(setup, killSwitches$);
|
85 | }
|
86 | if (parsed.cli.command === 'watch') {
|
87 | watchWithSetup(setup, killSwitches$);
|
88 | }
|
89 | if (parsed.cli.command === 'watchers') {
|
90 | watchersWithSetup(setup, killSwitches$);
|
91 | }
|
92 | });
|
93 | }
|
94 | function runWithSetup(prepared, killSwitches$) {
|
95 | var setUp$ = new Rx.BehaviorSubject({});
|
96 | var progress$ = new Rx.BehaviorSubject([]);
|
97 | var summaryGiven = false; // todo remove the need for this as it breaks the encapsulation
|
98 | var exitSignal$ = prepared.config.signalObserver
|
99 | .filter(function (x) { return x.type === config_1.SignalTypes.Exit; })
|
100 | .do(function (cbSignal) { return prepared.reportFn({
|
101 | type: reports.ReportTypes.SignalReceived,
|
102 | data: cbSignal.data
|
103 | }); })
|
104 | .withLatestFrom(setUp$, progress$, function (signal, setup, reports) {
|
105 | return { reports: reports, setup: setup, signal: signal };
|
106 | });
|
107 | var exits$ = Rx.Observable.zip(Rx.Observable.just(true).timestamp(prepared.config.scheduler), exitSignal$.timestamp(prepared.config.scheduler), function (begin, signal) {
|
108 | return { begin: begin, signal: signal };
|
109 | }).do(function (incoming) {
|
110 | var signal = incoming.signal, begin = incoming.begin;
|
111 | var setup = signal.value.setup;
|
112 | var reports = signal.value.reports;
|
113 | var startTime = begin.timestamp;
|
114 | var endTime = signal.timestamp;
|
115 | /**
|
116 | * Main summary report, although here it could be partial
|
117 | * (as an exit command could occur at any time)
|
118 | */
|
119 | if ((setup.tasks.valid.length * 2) !== reports.length) {
|
120 | if (!summaryGiven) {
|
121 | summaryGiven = true;
|
122 | handleCompletion(reports, setup, endTime - startTime);
|
123 | }
|
124 | }
|
125 | else {
|
126 | console.log("Exit signal, but summary given from main handler");
|
127 | }
|
128 | });
|
129 | var reports$ = index_1.handleIncoming(prepared)
|
130 | .do(function (x) { return setUp$.onNext(x.setup); }) // first item is the setup
|
131 | .flatMap(function (x) {
|
132 | if (x.setup.errors.length) {
|
133 | killSwitches$.onNext(true);
|
134 | return Rx.Observable.empty();
|
135 | }
|
136 | if (x.setup.tasks.invalid.length) {
|
137 | killSwitches$.onNext(true);
|
138 | return Rx.Observable.empty();
|
139 | }
|
140 | return x.update$;
|
141 | })
|
142 | .do(function (x) { return progress$.onNext(progress$.getValue().concat(x)); })
|
143 | .do(function (report) {
|
144 | prepared.reportFn({
|
145 | type: reports.ReportTypes.TaskReport,
|
146 | data: {
|
147 | report: report,
|
148 | config: prepared.config
|
149 | }
|
150 | });
|
151 | })
|
152 | .takeUntil(exits$)
|
153 | .toArray()
|
154 | .filter(function (reports) { return reports.length > 0; })
|
155 | .timestamp(prepared.config.scheduler)
|
156 | .withLatestFrom(setUp$, function (incoming, setup) {
|
157 | return {
|
158 | setup: setup,
|
159 | reports: incoming.value,
|
160 | timestamp: incoming.timestamp
|
161 | };
|
162 | });
|
163 | Rx.Observable.zip(Rx.Observable.just(true).timestamp(prepared.config.scheduler), reports$, function (begin, result) {
|
164 | return { begin: begin, result: result };
|
165 | }).subscribe(function (incoming) {
|
166 | if (!summaryGiven) {
|
167 | summaryGiven = true;
|
168 | handleCompletion(incoming.result.reports, incoming.result.setup, incoming.result.timestamp - incoming.begin.timestamp);
|
169 | }
|
170 | });
|
171 | /**
|
172 | * Handle file-writes
|
173 | * @type {Rx.Observable<CBSignal<FileWriteSignal>>|Rx.Observable<T>}
|
174 | */
|
175 | prepared.config.signalObserver
|
176 | .filter(function (x) { return x.type === config_1.SignalTypes.FileWrite; })
|
177 | .do(function (x) {
|
178 | if (prepared.config.dryRun) {
|
179 | }
|
180 | else {
|
181 | file.writeFileToDisk(x.data.file, x.data.content);
|
182 | }
|
183 | }).subscribe();
|
184 | /**
|
185 | * Because errors are handled by reports, task executions ALWAYS complete
|
186 | * and we handle that here.
|
187 | */
|
188 | function handleCompletion(taskReports, setup, runtime) {
|
189 | /**
|
190 | * Merge sequence tree with Task Reports
|
191 | */
|
192 | var decoratedSequence = seq.decorateSequenceWithReports(setup.sequence, taskReports);
|
193 | /**
|
194 | * Push a 'Completion report' onto the $complete Observable.
|
195 | * This means consumers will get everything when they call
|
196 | */
|
197 | var errors = taskReports.filter(function (x) { return x.type === task_runner_1.TaskReportType.error; });
|
198 | var completeData = {
|
199 | errors: errors,
|
200 | runtime: runtime,
|
201 | taskErrors: errors,
|
202 | sequence: decoratedSequence,
|
203 | cli: prepared.cli,
|
204 | config: prepared.config
|
205 | };
|
206 | /**
|
207 | * Main summary report
|
208 | */
|
209 | prepared.reportFn({
|
210 | type: reports.ReportTypes.Summary,
|
211 | data: completeData
|
212 | });
|
213 | require("./command.run.post-execution").postCliExecution(completeData);
|
214 | }
|
215 | }
|
216 | function docsWithSetup(prepared, killSwitches$) {
|
217 | index_1.handleIncoming(prepared)
|
218 | .pluck("setup")
|
219 | .subscribe(function (setup) {
|
220 | if (setup.errors.length) {
|
221 | return killSwitches$.onNext(true);
|
222 | }
|
223 | if (setup.output) {
|
224 | setup.output.forEach(function (outputItem) {
|
225 | file.writeFileToDisk(outputItem.file, outputItem.content);
|
226 | });
|
227 | }
|
228 | });
|
229 | }
|
230 | function initWithSetup(prepared, killSwitches$) {
|
231 | index_1.handleIncoming(prepared)
|
232 | .pluck("setup")
|
233 | .subscribe(function (setup) {
|
234 | if (setup.errors.length) {
|
235 | return killSwitches$.onNext(true);
|
236 | }
|
237 | fs_1.writeFileSync(setup.outputFilePath, fs_1.readFileSync(setup.templateFilePath));
|
238 | });
|
239 | }
|
240 | function tasksWithSetup(prepared, killSwitches$) {
|
241 | index_1.handleIncoming(prepared)
|
242 | .subscribe(function (x) {
|
243 | var _a = x.setup, groups = _a.groups, tasks = _a.tasks;
|
244 | var invalid = groups.reduce(function (acc, group) { return acc.concat(group.tasks.invalid); }, []);
|
245 | if (invalid.length || prepared.config.verbose === 1 /* Verbose */) {
|
246 | return prepared.reportFn({
|
247 | type: reports.ReportTypes.TaskTree,
|
248 | data: {
|
249 | tasks: tasks,
|
250 | config: prepared.config,
|
251 | title: invalid.length ? "Errors found:" : "Available Tasks:"
|
252 | }
|
253 | });
|
254 | }
|
255 | if (!groups.length) {
|
256 | return prepared.reportFn({ type: reports.ReportTypes.NoTasksAvailable });
|
257 | }
|
258 | prepared.reportFn({
|
259 | type: reports.ReportTypes.SimpleTaskList,
|
260 | data: { setup: x.setup }
|
261 | });
|
262 | });
|
263 | }
|
264 | function watchWithSetup(prepared, killSwitches$) {
|
265 | index_1.handleIncoming(prepared)
|
266 | .flatMap(function (x) {
|
267 | if (x.setup.errors.length) {
|
268 | killSwitches$.onNext(true);
|
269 | return Rx.Observable.empty();
|
270 | }
|
271 | return x.update$; // start the watchers
|
272 | })
|
273 | .subscribe();
|
274 | }
|
275 | function watchersWithSetup(prepared, killSwitches$) {
|
276 | index_1.handleIncoming(prepared)
|
277 | .pluck("setup")
|
278 | .subscribe(function (setup) {
|
279 | if (setup.errors.length) {
|
280 | return killSwitches$.onNext(true);
|
281 | }
|
282 | prepared.reportFn({
|
283 | type: reports.ReportTypes.WatcherNames,
|
284 | data: { setup: setup }
|
285 | });
|
286 | });
|
287 | }
|
288 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSx1QkFBaUUsVUFBVSxDQUFDLENBQUE7QUFHNUUsNEJBQXlDLGVBQWUsQ0FBQyxDQUFBO0FBS3pELG9CQUFnQixPQUFPLENBQUMsQ0FBQTtBQUN4QixtQkFBMEMsSUFBSSxDQUFDLENBQUE7QUFDL0Msc0JBQXNELFNBQVMsQ0FBQyxDQUFBO0FBQ2hFLHVCQUFtQixVQUFVLENBQUMsQ0FBQTtBQUc5QixJQUFZLE9BQU8sV0FBTSxvQkFBb0IsQ0FBQyxDQUFBO0FBQzlDLElBQVksSUFBSSxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBQ3JDLElBQVksR0FBRyxXQUFNLGlCQUFpQixDQUFDLENBQUE7QUFFdkMsSUFBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDMUIsMkJBQW9CLGNBQWMsQ0FBQyxDQUFBO0FBRW5DLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QyxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxJQUFNLE1BQU0sR0FBRyxhQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxQyxJQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNyRCxJQUFNLGlCQUFpQixHQUFHLFVBQUMsS0FBSztJQUM1QixJQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxD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 |
\ | No newline at end of file |