1 | ;
|
2 | var file_utils_1 = require("./file.utils");
|
3 | var Rx = require("rx");
|
4 | var logger_1 = require("./logger");
|
5 | (function (ReporterErrorTypes) {
|
6 | ReporterErrorTypes[ReporterErrorTypes["ReporterFileNotFound"] = "ReporterFileNotfound"] = "ReporterFileNotFound";
|
7 | ReporterErrorTypes[ReporterErrorTypes["ReporterTypeNotSupported"] = "ReporterTypeNotSupported"] = "ReporterTypeNotSupported";
|
8 | })(exports.ReporterErrorTypes || (exports.ReporterErrorTypes = {}));
|
9 | var 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 = {}));
|
16 | var 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 = {}));
|
57 | var ReportTypes = exports.ReportTypes;
|
58 | function 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 | }
|
158 | exports.getReporters = getReporters;
|
159 | function 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 | }
|
183 | exports.getOutputObserver = getOutputObserver;
|
184 | function 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 | }
|
206 | exports.getSignalReporter = getSignalReporter;
|
207 | function getDefaultReporter() {
|
208 | return require("./reporters/defaultReporter").default;
|
209 | }
|
210 | exports.getDefaultReporter = getDefaultReporter;
|
211 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0ZXIucmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXBvcnRlci5yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSwyQkFBeUcsY0FBYyxDQUFDLENBQUE7QUFVeEgsSUFBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFDMUIsdUJBQW1CLFVBQVUsQ0FBQyxDQUFBO0FBWTlCLFdBQVksa0JBQWtCO0lBQzFCLGdFQUE0QixzQkFBc0IsMEJBQUEsQ0FBQTtJQUNsRCxvRUFBZ0MsMEJBQTBCLDhCQUFBLENBQUE7QUFDOUQsQ0FBQyxFQUhXLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFHN0I7QUFIRCxJQUFZLGtCQUFrQixHQUFsQiwwQkFHWCxDQUFBO0FBUUQsV0FBWSxhQUFhO0lBQ3JCLGdEQUF3QixnQkFBZ0Isb0JBQUEsQ0FBQTtJQUN4Qyw4Q0FBd0IsY0FBYyxrQkFBQSxDQUFBO0lBQ3RDLGtEQUF3QixrQkFBa0Isc0JBQUEsQ0FBQTtJQUMxQyx1Q0FBd0IsT0FBTyxXQUFBLENBQUE7QUFDbkMsQ0FBQyxFQUxXLHFCQUFhLEtBQWIscUJBQWEsUUFLeEI7QUFMRCxJQUFZLGFBQWEsR0FBYixxQkFLWCxDQUFBO0FBUUQsV0FBWSxXQUFXO0lBQ25CLGdEQUFzQyxvQkFBb0Isd0JBQUEsQ0FBQTtJQUMxRCw4Q0FBc0Msa0JBQWtCLHNCQUFBLENBQUE7SUFDeEQsMkRBQXNDLCtCQUErQixtQ0FBQSxDQUFBO0lBQ3JFLHdDQUFzQyxZQUFZLGdCQUFBLENBQUE7SUFDbEQsK0NBQXNDLG1CQUFtQix1QkFBQSxDQUFBO0lBQ3pELDZDQUFzQyxpQkFBaUIscUJBQUEsQ0FBQTtJQUN2RCw0Q0FBc0MsZ0JBQWdCLG9CQUFBLENBQUE7SUFFdEQsc0NBQXNDLFVBQVUsY0FBQSxDQUFBO0lBQ2hELHNDQUFzQyxVQUFVLGNBQUEsQ0FBQTtJQUNoRCx3Q0FBc0MsWUFBWSxnQkFBQSxDQUFBO0lBQ2xELHdDQUFz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 |
\ | No newline at end of file |