UNPKG

16.4 kBJavaScriptView Raw
1"use strict";
2var file_utils_1 = require("./file.utils");
3var Rx = require("rx");
4var logger_1 = require("./logger");
5(function (ReporterErrorTypes) {
6 ReporterErrorTypes[ReporterErrorTypes["ReporterFileNotFound"] = "ReporterFileNotfound"] = "ReporterFileNotFound";
7 ReporterErrorTypes[ReporterErrorTypes["ReporterTypeNotSupported"] = "ReporterTypeNotSupported"] = "ReporterTypeNotSupported";
8})(exports.ReporterErrorTypes || (exports.ReporterErrorTypes = {}));
9var ReporterErrorTypes = exports.ReporterErrorTypes;
10(function (ReporterTypes) {
11 ReporterTypes[ReporterTypes["InlineFunction"] = "InlineFunction"] = "InlineFunction";
12 ReporterTypes[ReporterTypes["ExternalFile"] = "ExternalFile"] = "ExternalFile";
13 ReporterTypes[ReporterTypes["UnsupportedValue"] = "UnsupportedValue"] = "UnsupportedValue";
14 ReporterTypes[ReporterTypes["Muted"] = "Muted"] = "Muted";
15})(exports.ReporterTypes || (exports.ReporterTypes = {}));
16var ReporterTypes = exports.ReporterTypes;
17(function (ReportTypes) {
18 ReportTypes[ReportTypes["DuplicateInputFile"] = "DuplicateInputFile"] = "DuplicateInputFile";
19 ReportTypes[ReportTypes["InputFileCreated"] = "InputFileCreated"] = "InputFileCreated";
20 ReportTypes[ReportTypes["InitInputFileTypeNotSupported"] = "InitInputFileTypeNotSupported"] = "InitInputFileTypeNotSupported";
21 ReportTypes[ReportTypes["InputError"] = "InputError"] = "InputError";
22 ReportTypes[ReportTypes["InputFileNotFound"] = "InputFileNotFound"] = "InputFileNotFound";
23 ReportTypes[ReportTypes["InvalidReporter"] = "InvalidReporter"] = "InvalidReporter";
24 ReportTypes[ReportTypes["UsingInputFile"] = "UsingInputFile"] = "UsingInputFile";
25 ReportTypes[ReportTypes["TaskList"] = "TaskList"] = "TaskList";
26 ReportTypes[ReportTypes["TaskTree"] = "TaskTree"] = "TaskTree";
27 ReportTypes[ReportTypes["TaskErrors"] = "TaskErrors"] = "TaskErrors";
28 ReportTypes[ReportTypes["TaskReport"] = "TaskReport"] = "TaskReport";
29 ReportTypes[ReportTypes["NoTasksAvailable"] = "NoTasksAvailable"] = "NoTasksAvailable";
30 ReportTypes[ReportTypes["NoTasksProvided"] = "NoTasksProvided"] = "NoTasksProvided";
31 ReportTypes[ReportTypes["SimpleTaskList"] = "SimpleTaskList"] = "SimpleTaskList";
32 ReportTypes[ReportTypes["BeforeWatchTaskErrors"] = "BeforeWatchTaskErrors"] = "BeforeWatchTaskErrors";
33 ReportTypes[ReportTypes["BeforeTaskList"] = "BeforeTaskList"] = "BeforeTaskList";
34 ReportTypes[ReportTypes["BeforeTasksDidNotComplete"] = "BeforeTasksDidNotComplete"] = "BeforeTasksDidNotComplete";
35 ReportTypes[ReportTypes["BeforeTasksSummary"] = "BeforeTasksSummary"] = "BeforeTasksSummary";
36 ReportTypes[ReportTypes["WatchTaskTasksErrors"] = "WatchTaskTasksErrors"] = "WatchTaskTasksErrors";
37 ReportTypes[ReportTypes["WatchTaskErrors"] = "WatchTaskErrors"] = "WatchTaskErrors";
38 ReportTypes[ReportTypes["WatchTaskReport"] = "WatchTaskReport"] = "WatchTaskReport";
39 ReportTypes[ReportTypes["NoFilesMatched"] = "NoFilesMatched"] = "NoFilesMatched";
40 ReportTypes[ReportTypes["NoWatchersAvailable"] = "NoWatchersAvailable"] = "NoWatchersAvailable";
41 ReportTypes[ReportTypes["NoWatchTasksProvided"] = "NoWatchTasksProvided"] = "NoWatchTasksProvided";
42 ReportTypes[ReportTypes["Watchers"] = "Watchers"] = "Watchers";
43 ReportTypes[ReportTypes["WatcherNames"] = "WatcherNames"] = "WatcherNames";
44 ReportTypes[ReportTypes["WatcherTriggeredTasksCompleted"] = "WatcherTriggeredTasksCompleted"] = "WatcherTriggeredTasksCompleted";
45 ReportTypes[ReportTypes["WatcherTriggeredTasks"] = "WatcherTriggeredTasks"] = "WatcherTriggeredTasks";
46 ReportTypes[ReportTypes["WatcherSummary"] = "WatcherSummary"] = "WatcherSummary";
47 ReportTypes[ReportTypes["DocsAddedToFile"] = "DocsAddedToFile"] = "DocsAddedToFile";
48 ReportTypes[ReportTypes["DocsGenerated"] = "DocsMarkdownGenerated"] = "DocsGenerated";
49 ReportTypes[ReportTypes["DocsInputFileNotFound"] = "DocsInputFileNotFound"] = "DocsInputFileNotFound";
50 ReportTypes[ReportTypes["DocsOutputFileExists"] = "DocsOutputFileExists"] = "DocsOutputFileExists";
51 ReportTypes[ReportTypes["DocsInvalidTasksSimple"] = "DocsInvalidTasksSimple"] = "DocsInvalidTasksSimple";
52 ReportTypes[ReportTypes["HashDirError"] = "HashDirError"] = "HashDirError";
53 ReportTypes[ReportTypes["Summary"] = "Summary"] = "Summary";
54 ReportTypes[ReportTypes["SignalReceived"] = "SignalReceived"] = "SignalReceived";
55 ReportTypes[ReportTypes["CLIParserOutput"] = "CLIParserOutput"] = "CLIParserOutput";
56})(exports.ReportTypes || (exports.ReportTypes = {}));
57var ReportTypes = exports.ReportTypes;
58function getReporters(config, input) {
59 var reporters = (function () {
60 /**
61 * If --outputOnly (-q) was given, the user wants NO
62 * output, other than output from child processes - this
63 * is used for shell expansion within other tasks where
64 * the 'using crossbow.yaml' or completions summaries are
65 * unwanted.
66 */
67 if (config.outputOnly) {
68 return [{
69 type: ReporterTypes.Muted,
70 callable: function () { },
71 errors: [],
72 sources: []
73 }];
74 }
75 /**
76 * At this point, a user may of provided a string (as a path to lookup)
77 * or a function directly, so we use those to resolve the reporters.
78 */
79 return [].concat(config.reporters).map(getOneReporter);
80 })();
81 return {
82 all: reporters,
83 valid: reporters.filter(function (x) { return x.errors.length === 0; }),
84 invalid: reporters.filter(function (x) { return x.errors.length > 0; })
85 };
86 function getOneReporter(reporter) {
87 /**
88 * If a function was given as a reported (eg: inline)
89 * then it's ALWAYS a valid reporter
90 */
91 if (typeof reporter === "function") {
92 return {
93 type: ReporterTypes.InlineFunction,
94 callable: reporter,
95 errors: [],
96 sources: []
97 };
98 }
99 /**
100 * If the reporter was not a string or function
101 * it's definitely an unsupported type
102 */
103 if (typeof reporter !== "string") {
104 return {
105 type: ReporterTypes.UnsupportedValue,
106 errors: [{ type: ReporterErrorTypes.ReporterTypeNotSupported }],
107 sources: [reporter]
108 };
109 }
110 var files = file_utils_1.readFilesFromDisk([reporter], config.cwd);
111 var errors = files
112 .reduce(function (acc, item) {
113 // Convert errors from reading files
114 // into errors about reporters
115 // This is for correct context in logging
116 if (item.errors.length) {
117 return acc.concat({
118 type: ReporterErrorTypes.ReporterFileNotFound,
119 file: item
120 });
121 }
122 return acc;
123 }, []);
124 /**
125 * If any errors occurred, return them
126 */
127 if (errors.length) {
128 return {
129 type: ReporterTypes.ExternalFile,
130 errors: errors,
131 sources: files
132 };
133 }
134 /**
135 * Now try to 'require' the module. If it
136 * does not contain a default export, create an error
137 */
138 var callable = require(files[0].resolved);
139 if (typeof callable !== "function") {
140 return {
141 type: ReporterTypes.UnsupportedValue,
142 errors: [{ type: ReporterErrorTypes.ReporterTypeNotSupported }],
143 sources: [files[0]]
144 };
145 }
146 /**
147 * Here we have a valid external file to return
148 * as a single reporter
149 */
150 return {
151 type: ReporterTypes.ExternalFile,
152 callable: callable,
153 errors: [],
154 sources: files
155 };
156 }
157}
158exports.getReporters = getReporters;
159function getOutputObserver(mergedConfig, outputObserver) {
160 /**
161 * If an outputObserver was passed in with configuration (flags)
162 */
163 if (mergedConfig.outputObserver) {
164 return mergedConfig.outputObserver;
165 }
166 /**
167 * If an output observer was passed in via initial setup (cli fallback)
168 */
169 if (outputObserver) {
170 return outputObserver;
171 }
172 /**
173 * Default is to log each report to the console
174 */
175 var defaultOutputObserver = new Rx.Subject();
176 defaultOutputObserver.subscribe(function (xs) {
177 xs.data.forEach(function (x) {
178 logger_1.default.info(x);
179 });
180 });
181 return defaultOutputObserver;
182}
183exports.getOutputObserver = getOutputObserver;
184function getSignalReporter(mergedConfig, signalObserver) {
185 /**
186 * If an outputObserver was passed in with configuration (flags)
187 */
188 if (mergedConfig.signalObserver) {
189 return mergedConfig.signalObserver;
190 }
191 /**
192 * If an output observer was passed in via initial setup (cli fallback)
193 */
194 if (signalObserver) {
195 return signalObserver;
196 }
197 /**
198 * Default is to log each report to the console
199 */
200 var defaultSignalObserver = new Rx.Subject();
201 defaultSignalObserver.subscribe(function (signal) {
202 // default signals are no-ops
203 });
204 return defaultSignalObserver;
205}
206exports.getSignalReporter = getSignalReporter;
207function getDefaultReporter() {
208 return require("./reporters/defaultReporter").default;
209}
210exports.getDefaultReporter = getDefaultReporter;
211//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0ZXIucmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXBvcnRlci5yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSwyQkFBeUcsY0FBYyxDQUFDLENBQUE7QUFVeEgsSUFBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDMUIsdUJBQW1CLFVBQVUsQ0FBQyxDQUFBO0FBWTlCLFdBQVksa0JBQWtCO0lBQzFCLGdFQUE0QixzQkFBc0IsMEJBQUEsQ0FBQTtJQUNsRCxvRUFBZ0MsMEJBQTBCLDhCQUFBLENBQUE7QUFDOUQsQ0FBQyxFQUhXLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFHN0I7QUFIRCxJQUFZLGtCQUFrQixHQUFsQiwwQkFHWCxDQUFBO0FBUUQsV0FBWSxhQUFhO0lBQ3JCLGdEQUF3QixnQkFBZ0Isb0JBQUEsQ0FBQTtJQUN4Qyw4Q0FBd0IsY0FBYyxrQkFBQSxDQUFBO0lBQ3RDLGtEQUF3QixrQkFBa0Isc0JBQUEsQ0FBQTtJQUMxQyx1Q0FBd0IsT0FBTyxXQUFBLENBQUE7QUFDbkMsQ0FBQyxFQUxXLHFCQUFhLEtBQWIscUJBQWEsUUFLeEI7QUFMRCxJQUFZLGFBQWEsR0FBYixxQkFLWCxDQUFBO0FBUUQsV0FBWSxXQUFXO0lBQ25CLGdEQUFzQyxvQkFBb0Isd0JBQUEsQ0FBQTtJQUMxRCw4Q0FBc0Msa0JBQWtCLHNCQUFBLENBQUE7SUFDeEQsMkRBQXNDLCtCQUErQixtQ0FBQSxDQUFBO0lBQ3JFLHdDQUFzQyxZQUFZLGdCQUFBLENBQUE7SUFDbEQsK0NBQXNDLG1CQUFtQix1QkFBQSxDQUFBO0lBQ3pELDZDQUFzQyxpQkFBaUIscUJBQUEsQ0FBQTtJQUN2RCw0Q0FBc0MsZ0JBQWdCLG9CQUFBLENBQUE7SUFFdEQsc0NBQXNDLFVBQVUsY0FBQSxDQUFBO0lBQ2hELHNDQUFzQyxVQUFVLGNBQUEsQ0FBQTtJQUNoRCx3Q0FBc0MsWUFBWSxnQkFBQSxDQUFBO0lBQ2xELHdDQUFz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
\No newline at end of file