UNPKG

14.6 kBJavaScriptView Raw
1#!/usr/bin/env node
2"use strict";
3var config_1 = require("./config");
4var file_utils_1 = require("./file.utils");
5var input_resolve_1 = require("./input.resolve");
6var reports = require("./reporter.resolve");
7var Rx = require("rx");
8var path_1 = require("path");
9var fs_1 = require("fs");
10var fs_2 = require("fs");
11var fs = require('fs');
12var _ = require("../lodash.custom");
13var debug = require("debug")("cb:init");
14var 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};
26var 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 */
31function 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}
40exports.handleIncoming = handleIncoming;
41function 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 */
56function processInput(cli, input, config, reportFn) {
57 var firstArg = cli.input[0];
58 return require(availableCommands[firstArg]).default.call(null, cli, input, config, reportFn);
59}
60function 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 */
69var 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};
74var 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};
80var 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};
86var 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};
92var 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};
103var 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};
111var 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};
124var 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 */
140function 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}
156exports.getSetup = getSetup;
157function 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}
167Object.defineProperty(exports, "__esModule", { value: true });
168exports.default = default_1;
169//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSx1QkFBNEQsVUFBVSxDQUFDLENBQUE7QUFDdkUsMkJBQTBELGNBQWMsQ0FBQyxDQUFBO0FBQ3pFLDhCQUErQyxpQkFBaUIsQ0FBQyxDQUFBO0FBQ2pFLElBQVksT0FBTyxXQUFNLG9CQUFvQixDQUFDLENBQUE7QUFDOUMsSUFBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7QUFFMUIscUJBQW1CLE1BQU0sQ0FBQyxDQUFBO0FBQzFCLG1CQUF1QixJQUFJLENBQUMsQ0FBQTtBQUk1QixtQkFBMEIsSUFBSSxDQUFDLENBQUE7QUFHL0IsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRXpCLElBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3RDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQXFCMUMsSUFBTSxpQkFBaUIsR0FBRztJQUN0QixHQUFHLEVBQUUsZUFBZTtJQUNwQixDQUFDLEVBQUUsZUFBZTtJQUNsQixLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCLENBQUMsRUFBRSxpQkFBaUI7SUFDcEIsRUFBRSxFQUFFLGlCQUFpQjtJQUNyQixLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCLENBQUMsRUFBRSxpQkFBaUI7SUFDcEIsUUFBUSxFQUFFLG9CQUFvQjtJQUM5QixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7Q0FDekIsQ0FBQztBQUVGLElBQU0sU0FBUyxHQUFHLFVBQUMsS0FBSyxJQUFLLE9BQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBbEQsQ0FBa0QsQ0FBQztBQWdCaEY7OztH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
\No newline at end of file