@kephas/core
Version:
Provides a common infrastructure for all the other Kephas Framework components: ambient services, dynamic reflection, composition, application management, and others.
100 lines • 12.5 kB
JavaScript
/**
* Arguments used in command line execution.
*
* @export
* @class Args
* @implements {Expando}
*/
export class Args {
/**
* Creates an instance of Args.
* @param {(string | string[] | {})} [args] The arguments.
* @memberof Args
*/
constructor(args) {
if (typeof args === 'string') {
this._fillArgsFromString(args, this);
}
else if (Array.isArray(args)) {
this._fillArgsFromStringArray(args, this);
}
else if (typeof args === 'object') {
this._fillArgsFromObject(args, this);
}
}
_fillArgsFromObject(source, target) {
for (let key in source) {
target[key] = source[key];
}
return target;
}
_fillArgsFromString(source, target) {
var args = source.split(' ').filter(i => i !== '');
return this._fillArgsFromStringArray(args, target);
}
_fillArgsFromStringArray(source, target) {
let key = '';
let value = null;
let expectedValue = false;
for (let currentArg of source) {
var keyStartIndex = 0;
if (currentArg.startsWith("--")) {
keyStartIndex = 2;
}
else if (currentArg.startsWith("-")) {
keyStartIndex = 1;
}
else if (currentArg.startsWith("/")) {
// "/SomeSwitch" is equivalent to "--SomeSwitch"
keyStartIndex = 1;
}
// if we received a new argument, but we expected a value, add the previous key with the value "true"
if (expectedValue) {
expectedValue = false;
if (keyStartIndex > 0) {
// set the previous key to true and continue with processing the current arg
target[key] = true;
}
else {
target[key] = Args._unescape(currentArg);
continue;
}
}
// currentArg starts a new argument
var separator = currentArg.indexOf('=');
if (separator >= 0) {
// currentArg specifies a key with value
key = Args._unescape(currentArg.substr(keyStartIndex, separator - keyStartIndex));
value = Args._unescape(currentArg.substr(separator + 1));
}
else {
// currentArg specifies only a key
// If there is no prefix in current argument, consider it as a key with value "true"
if (keyStartIndex == 0) {
key = Args._unescape(currentArg);
value = true;
}
else {
key = Args._unescape(currentArg.substr(keyStartIndex));
expectedValue = true;
}
}
// Override value when key is duplicated. So we always have the last argument win.
if (!expectedValue) {
target[key] = value;
}
}
if (expectedValue) {
target[key] = true;
}
return target;
}
static _unescape(value) {
if (value.startsWith("\"") && value.endsWith("\"")) {
value = value.substr(1, value.length - 2);
return value.replace("\\\"", "\"");
}
return value;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlcGhhcy9jb3JlL3NyYy9saWIvY29tbWFuZHMvYXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sSUFBSTtJQUNiOzs7O09BSUc7SUFDSCxZQUFZLElBQTZCO1FBQ3JDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEM7YUFDSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM3QzthQUNJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsTUFBVSxFQUFFLE1BQWU7UUFDbkQsS0FBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUU7WUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFJLE1BQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsTUFBYyxFQUFFLE1BQWU7UUFDdkQsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyx3QkFBd0Is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LyoqXHJcbiAqIEFyZ3VtZW50cyB1c2VkIGluIGNvbW1hbmQgbGluZSBleGVjdXRpb24uXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIEFyZ3NcclxuICogQGltcGxlbWVudHMge0V4cGFuZG99XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQXJncyBpbXBsZW1lbnRzIEV4cGFuZG8ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEFyZ3MuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmcgfCBzdHJpbmdbXSB8IHt9KX0gW2FyZ3NdIFRoZSBhcmd1bWVudHMuXHJcbiAgICAgKiBAbWVtYmVyb2YgQXJnc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihhcmdzPzogc3RyaW5nIHwgc3RyaW5nW10gfCB7fSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsbEFyZ3NGcm9tU3RyaW5nKGFyZ3MsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGxBcmdzRnJvbVN0cmluZ0FycmF5KGFyZ3MsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsbEFyZ3NGcm9tT2JqZWN0KGFyZ3MsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9maWxsQXJnc0Zyb21PYmplY3Qoc291cmNlOiB7fSwgdGFyZ2V0OiBFeHBhbmRvKTogRXhwYW5kbyB7XHJcbiAgICAgICAgZm9yKGxldCBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gKHNvdXJjZSBhcyBFeHBhbmRvKVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2ZpbGxBcmdzRnJvbVN0cmluZyhzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBFeHBhbmRvKTogRXhwYW5kbyB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBzb3VyY2Uuc3BsaXQoJyAnKS5maWx0ZXIoaSA9PiBpICE9PSAnJyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxBcmdzRnJvbVN0cmluZ0FycmF5KGFyZ3MsIHRhcmdldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZmlsbEFyZ3NGcm9tU3RyaW5nQXJyYXkoc291cmNlOiBzdHJpbmdbXSwgdGFyZ2V0OiBFeHBhbmRvKTogRXhwYW5kbyB7XHJcbiAgICAgICAgbGV0IGtleSA9ICcnO1xyXG4gICAgICAgIGxldCB2YWx1ZTogYW55ID0gbnVsbDtcclxuICAgICAgICBsZXQgZXhwZWN0ZWRWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjdXJyZW50QXJnIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICB2YXIga2V5U3RhcnRJbmRleCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudEFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcclxuICAgICAgICAgICAgICAgIGtleVN0YXJ0SW5kZXggPSAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcclxuICAgICAgICAgICAgICAgIGtleVN0YXJ0SW5kZXggPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIFwiL1NvbWVTd2l0Y2hcIiBpcyBlcXVpdmFsZW50IHRvIFwiLS1Tb21lU3dpdGNoXCJcclxuICAgICAgICAgICAgICAgIGtleVN0YXJ0SW5kZXggPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB3ZSByZWNlaXZlZCBhIG5ldyBhcmd1bWVudCwgYnV0IHdlIGV4cGVjdGVkIGEgdmFsdWUsIGFkZCB0aGUgcHJldmlvdXMga2V5IHdpdGggdGhlIHZhbHVlIFwidHJ1ZVwiXHJcbiAgICAgICAgICAgIGlmIChleHBlY3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGtleVN0YXJ0SW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBwcmV2aW91cyBrZXkgdG8gdHJ1ZSBhbmQgY29udGludWUgd2l0aCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGFyZ1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gQXJncy5fdW5lc2NhcGUoY3VycmVudEFyZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGN1cnJlbnRBcmcgc3RhcnRzIGEgbmV3IGFyZ3VtZW50XHJcbiAgICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSBjdXJyZW50QXJnLmluZGV4T2YoJz0nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudEFyZyBzcGVjaWZpZXMgYSBrZXkgd2l0aCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAga2V5ID0gQXJncy5fdW5lc2NhcGUoY3VycmVudEFyZy5zdWJzdHIoa2V5U3RhcnRJbmRleCwgc2VwYXJhdG9yIC0ga2V5U3RhcnRJbmRleCkpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBBcmdzLl91bmVzY2FwZShjdXJyZW50QXJnLnN1YnN0cihzZXBhcmF0b3IgKyAxKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50QXJnIHNwZWNpZmllcyBvbmx5IGEga2V5XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBwcmVmaXggaW4gY3VycmVudCBhcmd1bWVudCwgY29uc2lkZXIgaXQgYXMgYSBrZXkgd2l0aCB2YWx1ZSBcInRydWVcIlxyXG4gICAgICAgICAgICAgICAgaWYgKGtleVN0YXJ0SW5kZXggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEFyZ3MuX3VuZXNjYXBlKGN1cnJlbnRBcmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEFyZ3MuX3VuZXNjYXBlKGN1cnJlbnRBcmcuc3Vic3RyKGtleVN0YXJ0SW5kZXgpKTtcclxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdmFsdWUgd2hlbiBrZXkgaXMgZHVwbGljYXRlZC4gU28gd2UgYWx3YXlzIGhhdmUgdGhlIGxhc3QgYXJndW1lbnQgd2luLlxyXG4gICAgICAgICAgICBpZiAoIWV4cGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChleHBlY3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3VuZXNjYXBlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIlxcXCJcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCJcXFwiXCIpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMik7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKFwiXFxcXFxcXCJcIiwgXCJcXFwiXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==