UNPKG

9.41 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10var __generator = (this && this.__generator) || function (thisArg, body) {
11 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13 function verb(n) { return function (v) { return step([n, v]); }; }
14 function step(op) {
15 if (f) throw new TypeError("Generator is already executing.");
16 while (_) try {
17 if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
18 if (y = 0, t) op = [0, t.value];
19 switch (op[0]) {
20 case 0: case 1: t = op; break;
21 case 4: _.label++; return { value: op[1], done: false };
22 case 5: _.label++; y = op[1]; op = [0]; continue;
23 case 7: op = _.ops.pop(); _.trys.pop(); continue;
24 default:
25 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29 if (t[2]) _.ops.pop();
30 _.trys.pop(); continue;
31 }
32 op = body.call(thisArg, _);
33 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35 }
36};
37Object.defineProperty(exports, "__esModule", { value: true });
38require("source-map-support/register");
39var RequiredFlagError_1 = require("./errors/RequiredFlagError");
40var Parser = (function () {
41 function Parser(input) {
42 this.input = input;
43 input.args = input.args || [];
44 input.flags = input.flags || {};
45 }
46 Parser.prototype.parse = function (output) {
47 if (output === void 0) { output = {}; }
48 return __awaiter(this, void 0, void 0, function () {
49 var _this = this;
50 var argv, parseFlag, findLongFlag, findShortFlag, parsingFlags, maxArgs, minArgs, arg, argDefinition, _i, _a, name_1, flag, _b, _c;
51 return __generator(this, function (_d) {
52 switch (_d.label) {
53 case 0:
54 argv = (output.argv || []);
55 output.flags = output.flags || {};
56 output.argv = [];
57 output.args = {};
58 parseFlag = function (arg) {
59 var long = arg.startsWith('--');
60 var name = long ? findLongFlag(arg) : findShortFlag(arg);
61 if (!name) {
62 var i = arg.indexOf('=');
63 if (i !== -1) {
64 var sliced = arg.slice(i + 1);
65 argv.unshift(sliced);
66 var equalsParsed = parseFlag(arg.slice(0, i));
67 if (!equalsParsed) {
68 argv.shift();
69 }
70 return equalsParsed;
71 }
72 else if (_this.input.cmd && !_this.input.cmd.constructor.allowAnyFlags) {
73 throw new Error("Unknown flag " + arg);
74 }
75 return false;
76 }
77 var flag = _this.input.flags[name];
78 var cur = output.flags[name];
79 if (flag.parse) {
80 // TODO: handle multiple flags
81 if (cur) {
82 throw new Error("Flag --" + name + " already provided");
83 }
84 var input = (long || arg.length < 3) ? argv.shift() : arg.slice(arg[2] === '=' ? 3 : 2);
85 if (!input) {
86 throw new Error("Flag --" + name + " expects a value");
87 }
88 output.flags[name] = input;
89 }
90 else {
91 if (!cur) {
92 output.flags[name] = true;
93 }
94 // push the rest of the short characters back on the stack
95 if (!long && arg.length > 2) {
96 argv.unshift("-" + arg.slice(2));
97 }
98 }
99 return true;
100 };
101 findLongFlag = function (arg) {
102 var name = arg.slice(2);
103 if (_this.input.flags[name]) {
104 return name;
105 }
106 return null;
107 };
108 findShortFlag = function (arg) {
109 for (var _i = 0, _a = Object.keys(_this.input.flags); _i < _a.length; _i++) {
110 var k = _a[_i];
111 if (_this.input.flags[k].char === arg[1]) {
112 return k;
113 }
114 }
115 return null;
116 };
117 parsingFlags = true;
118 maxArgs = this.input.args.length;
119 minArgs = this.input.args.filter(function (a) { return a.required; }).length;
120 while (argv.length) {
121 arg = argv.shift();
122 if (parsingFlags && arg.startsWith('-')) {
123 // attempt to parse as flag
124 if (arg === '--') {
125 parsingFlags = false;
126 continue;
127 }
128 if (parseFlag(arg)) {
129 continue;
130 }
131 // not actually a flag if it reaches here so parse as an arg
132 }
133 argDefinition = this.input.args[output.argv.length];
134 if (argDefinition) {
135 output.args[argDefinition.name] = arg;
136 }
137 output.argv.push(arg);
138 }
139 // TODO find better solution
140 if (!this.input.variableArgs && output.argv.length > maxArgs + 2) {
141 throw new Error("Unexpected argument " + output.argv[maxArgs]);
142 }
143 if (output.argv.length < minArgs) {
144 throw new Error("Missing required argument " + this.input.args[output.argv.length].name);
145 }
146 _i = 0, _a = Object.keys(this.input.flags);
147 _d.label = 1;
148 case 1:
149 if (!(_i < _a.length)) return [3 /*break*/, 4];
150 name_1 = _a[_i];
151 flag = this.input.flags[name_1];
152 if (!flag.parse) return [3 /*break*/, 3];
153 _b = output.flags;
154 _c = name_1;
155 return [4 /*yield*/, flag.parse(['string', 'number', 'boolean'].includes(typeof output.flags[name_1]) ? String(output.flags[name_1]) : undefined, this.input.cmd, name_1)];
156 case 2:
157 _b[_c] = _d.sent();
158 if (flag.required && !output.flags[name_1]) {
159 throw new RequiredFlagError_1.RequiredFlagError(name_1);
160 }
161 _d.label = 3;
162 case 3:
163 _i++;
164 return [3 /*break*/, 1];
165 case 4: return [2 /*return*/, output];
166 }
167 });
168 });
169 };
170 return Parser;
171}());
172exports.Parser = Parser;
173//# sourceMappingURL=Parser.js.map
\No newline at end of file