UNPKG

15 kBJavaScriptView Raw
1"use strict";
2var utils = require("./task.utils");
3var file = require("./file.utils");
4var task_utils_1 = require("./task.utils");
5var task_utils_2 = require("./task.utils");
6var debug = require("debug")("cb:input");
7var _ = require("../lodash.custom");
8(function (InputTypes) {
9 InputTypes[InputTypes["DefaultExternalFile"] = "DefaultExternalFile"] = "DefaultExternalFile";
10 InputTypes[InputTypes["ExternalFile"] = "ExternalFile"] = "ExternalFile";
11 InputTypes[InputTypes["InlineObject"] = "InlineObject"] = "InlineObject";
12 InputTypes[InputTypes["StubInlineObject"] = "StubInlineObject"] = "StubInlineObject";
13 InputTypes[InputTypes["CBFile"] = "CBFile"] = "CBFile";
14 InputTypes[InputTypes["InlineJSON"] = "InlineJSON"] = "InlineJSON";
15})(exports.InputTypes || (exports.InputTypes = {}));
16var InputTypes = exports.InputTypes;
17function getInputs(config, inlineInput) {
18 /**
19 * If the User provided a -c flag we MUST validate this
20 * request first as it may fail and then we don't want to continue
21 */
22 if (config.input.length) {
23 debug("config flag provided " + config.input);
24 var stringInputs = config.input.filter(function (x) { return typeof x === "string"; });
25 var inlineInputs = config.input.filter(function (x) { return task_utils_2.isPlainObject(x); });
26 var fileInputs = file.readInputFiles(stringInputs, config.cwd);
27 var mergedFileInputs = fileInputs.valid.map(function (file) { return file.input; });
28 var mergedInputs = _.merge.apply(_, [generateBaseInput({})].concat(mergedFileInputs, inlineInputs, [inlineInput]));
29 if (fileInputs.invalid.length) {
30 return {
31 type: InputTypes.ExternalFile,
32 errors: fileInputs.invalid.map(function (x) { return x.errors[0]; }),
33 sources: fileInputs.invalid,
34 inputs: [],
35 };
36 }
37 return {
38 type: InputTypes.ExternalFile,
39 errors: [],
40 sources: fileInputs.valid,
41 inputs: [
42 /**
43 * Merged all given configs into a single obj
44 * This is to allow, for example, production
45 * configuration to override dev etc..
46 */
47 mergedInputs
48 ],
49 };
50 }
51 if (config.fromJson) {
52 try {
53 var parsed = JSON.parse(config.fromJson);
54 return {
55 errors: [],
56 sources: [],
57 type: InputTypes.InlineJSON,
58 inputs: [generateBaseInput(parsed)]
59 };
60 }
61 catch (e) {
62 return {
63 errors: [{ type: task_utils_1.InputErrorTypes.InvalidJson, json: config.fromJson, error: e }],
64 sources: [],
65 type: InputTypes.InlineJSON,
66 inputs: []
67 };
68 }
69 }
70 /**
71 * If the User provided --cbfile flag we MUST validate this
72 * request first as it may fail and then we don't want to continue
73 */
74 if (config.cbfile) {
75 debug("'cbfile' flag provided " + config.cbfile);
76 var cbfiles = file.retrieveCBFiles(config);
77 if (cbfiles.invalid.length) {
78 return {
79 type: InputTypes.CBFile,
80 errors: cbfiles.invalid.map(function (x) { return x.errors[0]; }),
81 sources: cbfiles.invalid,
82 inputs: [],
83 };
84 }
85 return {
86 type: InputTypes.CBFile,
87 errors: [],
88 sources: cbfiles.valid,
89 inputs: [],
90 };
91 }
92 /**
93 * Crossbow may be used with a simple object literal input.
94 * This is how the test suit is even possible in such a system
95 */
96 if (utils.isPlainObject(inlineInput)) {
97 debug("plain object given as input " + JSON.stringify(inlineInput));
98 return {
99 type: InputTypes.InlineObject,
100 errors: [],
101 sources: [],
102 inputs: [generateBaseInput(inlineInput)]
103 };
104 }
105 if (!config.loadDefaultInputs) {
106 debug("config.loadDefaultInputs = false, not looking for default file types");
107 return {
108 errors: [],
109 sources: [],
110 type: InputTypes.StubInlineObject,
111 inputs: [generateBaseInput({})]
112 };
113 }
114 /**
115 * Finally, try any cbfiles in the cwd
116 */
117 var defaultCbFiles = file.retrieveCBFiles(config);
118 /**
119 * If a cbfile.js **was** found in the current
120 * directory, it will have been 'required' and therefor
121 * some code will have run, which may of errored.
122 * So here we check for that possible error by
123 * filtering out `InputFileNotFound` errors (which simply mean
124 * a cbfile.js was not found anyway.
125 */
126 var inputErrors = defaultCbFiles.invalid
127 .filter(function (x) { return x.errors[0].type !== task_utils_1.InputErrorTypes.InputFileNotFound; });
128 if (inputErrors.length) {
129 return {
130 type: InputTypes.CBFile,
131 errors: inputErrors.map(function (x) { return x.errors[0]; }),
132 sources: inputErrors,
133 inputs: [],
134 };
135 }
136 if (defaultCbFiles.valid.length) {
137 debug("Default cbfile found " + defaultCbFiles.valid[0].resolved);
138 return {
139 errors: [],
140 type: InputTypes.CBFile,
141 sources: defaultCbFiles.valid,
142 inputs: []
143 };
144 }
145 /**
146 * At this point, the user has not attempted to load any config files manually
147 * so we try to load any defaults that are in the CWD
148 */
149 var defaultInputputFiles = file.retrieveDefaultInputFiles(config);
150 var notMissingFileErrors = defaultInputputFiles.invalid
151 .filter(function (x) { return x.errors[0].type !== task_utils_1.InputErrorTypes.InputFileNotFound; });
152 if (notMissingFileErrors.length) {
153 debug("Default input found with errors " + notMissingFileErrors[0].resolved);
154 return {
155 errors: notMissingFileErrors.reduce(function (acc, x) { return acc.concat(x.errors); }, []),
156 type: InputTypes.DefaultExternalFile,
157 sources: notMissingFileErrors,
158 inputs: []
159 };
160 }
161 if (defaultInputputFiles.valid.length) {
162 debug("Default input found " + defaultInputputFiles.valid[0].resolved);
163 return {
164 errors: [],
165 type: InputTypes.DefaultExternalFile,
166 sources: defaultInputputFiles.valid,
167 inputs: [generateBaseInput(defaultInputputFiles.valid[0].input)]
168 };
169 }
170 /**
171 * If we reach this point, we're working with
172 * 1. NO external input files
173 * 2. NO inline Object literal
174 *
175 * Which means we just need the stub objects, enough
176 * to allow the system to work.
177 */
178 debug("No external input given/found, using default");
179 return {
180 errors: [],
181 sources: [],
182 type: InputTypes.InlineObject,
183 inputs: [generateBaseInput({})]
184 };
185}
186exports.getInputs = getInputs;
187/**
188 * `Input` is the object that is looked at to resolve tasks/options and
189 * watchers
190 */
191function generateBaseInput(incoming) {
192 return _.merge({
193 tasks: {},
194 watch: {
195 before: [],
196 options: {}
197 },
198 options: {},
199 env: {}
200 }, incoming || {});
201}
202exports.generateBaseInput = generateBaseInput;
203//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQucmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnB1dC5yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFHQSxJQUFZLEtBQUssV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUN0QyxJQUFZLElBQUksV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUNyQywyQkFBOEIsY0FBYyxDQUFDLENBQUE7QUFFN0MsMkJBQTRCLGNBQWMsQ0FBQyxDQUFBO0FBRTNDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMzQyxJQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUV0QyxXQUFZLFVBQVU7SUFDbEIsK0NBQTJCLHFCQUFxQix5QkFBQSxDQUFBO0lBQ2hELHdDQUFvQixjQUFjLGtCQUFBLENBQUE7SUFDbEMsd0NBQW9CLGNBQWMsa0JBQUEsQ0FBQTtJQUNsQyw0Q0FBd0Isa0JBQWtCLHNCQUFBLENBQUE7SUFDMUMsa0NBQWMsUUFBUSxZQUFBLENBQUE7SUFDdEIsc0NBQWtCLFlBQVksZ0JBQUEsQ0FBQTtBQUNsQyxDQUFDLEVBUFcsa0JBQVUsS0FBVixrQkFBVSxRQU9yQjtBQVBELElBQVksVUFBVSxHQUFWLGtCQU9YLENBQUE7QUFTRCxtQkFBMkIsTUFBNkIsRUFBRSxXQUFpQjtJQUV2RTs7O09BR0c7SUFDSCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxDQUFDLDBCQUF3QixNQUFNLENBQUMsS0FBTyxDQUFDLENBQUM7UUFFOUMsSUFBTSxZQUFZLEdBQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQXJCLENBQXFCLENBQUMsQ0FBQztRQUN6RSxJQUFNLFlBQVksR0FBTyxN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
\No newline at end of file