UNPKG

3.13 kBJavaScriptView Raw
1const merge = require('lodash/merge');
2const map = require('lodash/map');
3const each = require('lodash/each');
4const assign = require('lodash/assign');
5const find = require('lodash/find');
6const concat = require('lodash/concat');
7const get = require('lodash/get');
8
9const parsingCommandLineArgs = require('./parsingCommandLineArgs');
10const getSavedOptions = require('./getSavedOptions');
11
12const getCommandOptions = require('../command/getCommandOptions');
13
14const getDefaultValues = (options) =>
15 merge(...map(options, (option) => ({ [option.name]: option.defaultValue })));
16
17const getOptionList = (app, command, behaviorals, input) => {
18 const appOptions = app.options;
19 const commandOptions = getCommandOptions(app, command, input);
20 const behavioralOptions = map(app.behaviorals, (b) => {
21 return find(b.values, (v) => v.name === behaviorals[b.optionName]).options;
22 });
23 return concat(appOptions, commandOptions, ...behavioralOptions);
24};
25
26const getExecutionOptions = (argv, app, command, input, wd) => {
27 // get app default options
28 const appDefaults = getDefaultValues(app.options);
29 // resolved app options
30 // combines user input and app default options
31 // this is used for getting user's behavioral settings
32 const resolvedAppOptions = assign({}, appDefaults, input.options);
33 // get user's behavioral settings
34 const behaviorals = merge(...map(
35 app.behaviorals,
36 (b) => ({ [b.optionName]: resolvedAppOptions[b.optionName] })
37 ));
38 // with user's behavioral settings, we pass user's input again this time
39 const optionList = getOptionList(app, command, behaviorals, input);
40 // get saved options
41 const savedOptions = getSavedOptions(app, wd);
42 // reparse user input with full option list
43 const userInput = parsingCommandLineArgs(argv, optionList, savedOptions);
44 // get all default values
45 const allDefaults = getDefaultValues(optionList);
46 // merge all options
47 const options = merge({}, allDefaults, savedOptions, userInput.options);
48
49 // parsing undefault options and pass back to main function.
50
51 const isSavableOption = (name) => {
52 return get(find(optionList, (o) => o.name === name), 'saveToPreference');
53 };
54
55 const isDefaultValue = (name, value) => {
56 return get(
57 find(optionList, (o) => o.name === name),
58 'defaultValue'
59 ) === value;
60 };
61
62 const isPresentInSavedOption = (name) => {
63 return savedOptions[name] !== undefined;
64 };
65
66 const isSameWithSavedOption = (name) => {
67 return isPresentInSavedOption(name)
68 && (savedOptions[name] === options[name]);
69 };
70
71 const undefaultOptions = {};
72
73 each(userInput.options, (value, name) => {
74 if (isSavableOption(name) && !isSameWithSavedOption(name)) {
75 if (isDefaultValue(name, value)) {
76 if (isPresentInSavedOption(name)) {
77 // remove from rc file
78 undefaultOptions[name] = '__delete__';
79 }
80 } else {
81 // update rc file
82 undefaultOptions[name] = value;
83 }
84 }
85 });
86
87 return {
88 options,
89 args: userInput.args,
90 command: userInput.command,
91 undefaultOptions
92 };
93};
94
95module.exports = getExecutionOptions;