1 |
|
2 | ;
|
3 | var config_1 = require("./config");
|
4 | var file_utils_1 = require("./file.utils");
|
5 | var input_resolve_1 = require("./input.resolve");
|
6 | var reports = require("./reporter.resolve");
|
7 | var Rx = require("rx");
|
8 | var path_1 = require("path");
|
9 | var fs_1 = require("fs");
|
10 | var fs_2 = require("fs");
|
11 | var fs = require('fs');
|
12 | var _ = require("../lodash.custom");
|
13 | var debug = require("debug")("cb:init");
|
14 | var availableCommands = {
|
15 | run: "./command.run",
|
16 | r: "./command.run",
|
17 | tasks: "./command.tasks",
|
18 | t: "./command.tasks",
|
19 | ls: "./command.tasks",
|
20 | watch: "./command.watch",
|
21 | w: "./command.watch",
|
22 | watchers: "./command.watchers",
|
23 | init: "./command.init",
|
24 | docs: "./command.docs",
|
25 | };
|
26 | var isCommand = function (input) { return Object.keys(availableCommands).indexOf(input) > -1; };
|
27 | /**
|
28 | * This the the proxy that allows command/run mode to be handled
|
29 | * @param preparedInput
|
30 | */
|
31 | function handleIncoming(preparedInput) {
|
32 | var cli = preparedInput.cli, userInput = preparedInput.userInput, config = preparedInput.config, reportFn = preparedInput.reportFn;
|
33 | // if the user provided a --cbfile flag, the type 'CBFile'
|
34 | // must be available, otherwise this is an error state
|
35 | if (userInput.type === input_resolve_1.InputTypes.CBFile) {
|
36 | return handleCBfileMode(cli, config, reportFn);
|
37 | }
|
38 | return processInput(cli, userInput.inputs[0], config, reportFn);
|
39 | }
|
40 | exports.handleIncoming = handleIncoming;
|
41 | function handleCBfileMode(cli, config, reportFn) {
|
42 | var createFilePaths = file_utils_1.getRequirePaths(config);
|
43 | var input = require(createFilePaths.valid[0].resolved);
|
44 | input.default.config = processConfigs(_.merge({}, config, input.default.config), cli.flags);
|
45 | input.default.cli = cli;
|
46 | input.default.reporter = reportFn;
|
47 | if (isCommand(cli.input[0])) {
|
48 | return require(availableCommands[cli.input[0]]).default.call(null, cli, input.default, input.default.config, reportFn);
|
49 | }
|
50 | cli.input = ["run"].concat(cli.input);
|
51 | return require(availableCommands["run"]).default.call(null, cli, input.default, input.default.config, reportFn);
|
52 | }
|
53 | /**
|
54 | * Now decide who should handle the current command
|
55 | */
|
56 | function processInput(cli, input, config, reportFn) {
|
57 | var firstArg = cli.input[0];
|
58 | return require(availableCommands[firstArg]).default.call(null, cli, input, config, reportFn);
|
59 | }
|
60 | function processConfigs(config, flags) {
|
61 | var cbConfig = _.merge({}, config, flags);
|
62 | return config_1.merge(cbConfig);
|
63 | }
|
64 | /**
|
65 | * This is the default export that can be
|
66 | * used as a convenience method.
|
67 | * Note: types are lost when using this method.
|
68 | */
|
69 | var mergeConfigs = function (userInput, merged, flags) {
|
70 | return userInput.type !== input_resolve_1.InputTypes.StubInlineObject && userInput.type !== input_resolve_1.InputTypes.CBFile
|
71 | ? file_utils_1.Right(config_1.merge(_.merge({}, userInput.inputs[0].config, flags)))
|
72 | : file_utils_1.Right(merged);
|
73 | };
|
74 | var getConfig = function (flags, input) {
|
75 | return file_utils_1.Right(config_1.merge(flags))
|
76 | .chain(function (merged) { return getUserInput(merged, input)
|
77 | .chain(function (userInput) { return mergeConfigs(userInput, merged, flags)
|
78 | .map(function (config) { return ({ config: config, userInput: userInput }); }); }); });
|
79 | };
|
80 | var getUserInput = function (merged, input) {
|
81 | return file_utils_1.Right(input_resolve_1.getInputs(merged, input))
|
82 | .chain(function (userInput) { return userInput.errors.length
|
83 | ? file_utils_1.Left({ type: reports.ReportTypes.InputError, data: userInput })
|
84 | : file_utils_1.Right(userInput); });
|
85 | };
|
86 | var getBins = function (dir, cwd) {
|
87 | return file_utils_1.Right(file_utils_1.getBinLookups(dir, cwd))
|
88 | .chain(function (x) { return x.invalid.length
|
89 | ? file_utils_1.Left({ type: reports.ReportTypes.BinOptionError, data: x })
|
90 | : file_utils_1.Right(x); });
|
91 | };
|
92 | var addBinLookups = function (config) {
|
93 | return config.bin.length
|
94 | ? getBins(config.bin, config.cwd)
|
95 | .map(function (bindirs) {
|
96 | return _.assign({}, config, {
|
97 | binDirectories: bindirs.valid,
|
98 | binExecutables: getExecutables(bindirs.valid)
|
99 | });
|
100 | })
|
101 | : file_utils_1.Right(config);
|
102 | };
|
103 | var addReporters = function (config) {
|
104 | return file_utils_1.Right(reports.getReporters(config))
|
105 | .chain(function (reporters) {
|
106 | return reporters.invalid.length
|
107 | ? file_utils_1.Left({ type: reports.ReportTypes.InvalidReporter, data: { reporters: reporters } })
|
108 | : file_utils_1.Right(reporters.valid);
|
109 | });
|
110 | };
|
111 | var getExecutables = function (dirs) {
|
112 | return dirs.reduce(function (acc, lookup) {
|
113 | var items = fs_2.readdirSync(lookup.resolved);
|
114 | return acc.concat(items.filter(function (dir) {
|
115 | try {
|
116 | return fs_1.statSync(path_1.join(lookup.resolved, dir)).isFile();
|
117 | }
|
118 | catch (e) {
|
119 | return false;
|
120 | }
|
121 | }));
|
122 | }, []);
|
123 | };
|
124 | var getReportFn = function (reporters) { return function () {
|
125 | var args = [];
|
126 | for (var _i = 0; _i < arguments.length; _i++) {
|
127 | args[_i - 0] = arguments[_i];
|
128 | }
|
129 | return reporters.forEach(function (x) { return x.callable.apply(null, args); });
|
130 | }; };
|
131 | /**
|
132 | * Handle any type of init. It could be from the CLI, or via the API.
|
133 | * eg, any command from the CLI ultimately ends up in the following call
|
134 | * $ crossbow run task1 -c conf/cb.js
|
135 | * -> handleIncoming({
|
136 | * input: ['run', 'task1'],
|
137 | * flags: {c: 'conf/cb.js'}
|
138 | * });
|
139 | */
|
140 | function getSetup(cli, input) {
|
141 | return getConfig(cli.flags, input)
|
142 | .chain(function (setup) {
|
143 | return addBinLookups(setup.config)
|
144 | .chain(function (config) { return addReporters(config)
|
145 | .map(function (reporters) {
|
146 | return {
|
147 | reporters: reporters,
|
148 | config: config,
|
149 | userInput: setup.userInput,
|
150 | cli: cli,
|
151 | reportFn: getReportFn(reporters)
|
152 | };
|
153 | }); });
|
154 | });
|
155 | }
|
156 | exports.getSetup = getSetup;
|
157 | function default_1(cli, input) {
|
158 | return getSetup(cli, input)
|
159 | .fold(function (e) {
|
160 | return Rx.Observable.just({
|
161 | errors: [e]
|
162 | });
|
163 | }, function (prepared) {
|
164 | return handleIncoming(prepared);
|
165 | });
|
166 | }
|
167 | Object.defineProperty(exports, "__esModule", { value: true });
|
168 | exports.default = default_1;
|
169 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSx1QkFBNEQsVUFBVSxDQUFDLENBQUE7QUFDdkUsMkJBQTBELGNBQWMsQ0FBQyxDQUFBO0FBQ3pFLDhCQUErQyxpQkFBaUIsQ0FBQyxDQUFBO0FBQ2pFLElBQVksT0FBTyxXQUFNLG9CQUFvQixDQUFDLENBQUE7QUFDOUMsSUFBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFFMUIscUJBQW1CLE1BQU0sQ0FBQyxDQUFBO0FBQzFCLG1CQUF1QixJQUFJLENBQUMsQ0FBQTtBQUk1QixtQkFBMEIsSUFBSSxDQUFDLENBQUE7QUFHL0IsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRXpCLElBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3RDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQXFCMUMsSUFBTSxpQkFBaUIsR0FBRztJQUN0QixHQUFHLEVBQUUsZUFBZTtJQUNwQixDQUFDLEVBQUUsZUFBZTtJQUNsQixLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCLENBQUMsRUFBRSxpQkFBaUI7SUFDcEIsRUFBRSxFQUFFLGlCQUFpQjtJQUNyQixLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCLENBQUMsRUFBRSxpQkFBaUI7SUFDcEIsUUFBUSxFQUFFLG9CQUFvQjtJQUM5QixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7Q0FDekIsQ0FBQztBQUVGLElBQU0sU0FBUyxHQUFHLFVBQUMsS0FBSyxJQUFLLE9BQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBbEQsQ0FBa0QsQ0FBQztBQWdCaEY7OztH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 |
\ | No newline at end of file |