cli-reap
Version:
CLI and ENV parser; indifferent to argument order or runtime
11 lines • 13.8 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../node_modules/globables/dist/index.js", "../src/index.ts"],
"sourcesContent": [
"// src/index.ts\nvar GLOBAL_THIS = /* @__PURE__ */ (() => typeof globalThis === \"object\" ? globalThis : (() => {\n !(function(Object2) {\n function get() {\n const e = this || self;\n e.globalThis = e, delete Object2.prototype._T_;\n }\n \"object\" != typeof globalThis && (this ? get() : (Object2.defineProperty(Object2.prototype, \"_T_\", { configurable: true, get }), _T_));\n })(Object);\n return typeof globalThis === \"object\" ? globalThis : {};\n})())();\nvar ARGV = /* @__PURE__ */ (() => {\n var _a, _b, _c, _d;\n return typeof process === \"undefined\" ? typeof scriptArgs !== \"undefined\" ? scriptArgs : [] : (_d = (GLOBAL_THIS == null ? void 0 : GLOBAL_THIS[\"Deno\"]) ? (_c = (_a = GLOBAL_THIS == null ? void 0 : GLOBAL_THIS[\"Deno\"]) == null ? void 0 : _a.args) != null ? _c : ((_b = process[\"args\"]) == null ? void 0 : _b.length) ? process[\"args\"] : process[\"argv\"] : process[\"argv\"]) != null ? _d : [];\n})();\nvar ARGS = ARGV;\nvar ENV = /* @__PURE__ */ (() => {\n var _a, _b, _c, _d;\n return typeof process === \"undefined\" ? typeof ((_a = GLOBAL_THIS == null ? void 0 : GLOBAL_THIS[\"std\"]) == null ? void 0 : _a.getenviron) === \"function\" ? (_d = (_c = (_b = GLOBAL_THIS[\"std\"]).getenviron) == null ? void 0 : _c.call(_b)) != null ? _d : {} : {} : !(GLOBAL_THIS == null ? void 0 : GLOBAL_THIS[\"Deno\"]) ? process[\"env\"] : (() => {\n var _a2, _b2, _c2, _d2, _e, _f;\n try {\n return (_f = (_c2 = (_b2 = (_a2 = GLOBAL_THIS == null ? void 0 : GLOBAL_THIS[\"Deno\"]) == null ? void 0 : _a2.env) == null ? void 0 : _b2.toObject) == null ? void 0 : _c2.call(_b2)) != null ? _f : ((_d2 = process[\"env\"]) == null ? void 0 : _d2.toObject) ? (_e = process[\"env\"]) == null ? void 0 : _e.toObject() : process[\"env\"];\n } catch (_err) {\n }\n return {};\n })();\n})();\nexport {\n ARGS,\n ARGV,\n ENV,\n GLOBAL_THIS\n};\n//# sourceMappingURL=index.js.map\n",
"import {\n ENV,\n ARGV,\n GLOBAL_THIS,\n} from 'globables';\n\nexport type NonEmptyString = string & { length: number };\n\nexport type CliReap = Readonly<{\n /** finds any value, in order: argv > environment > globalThis > default; removes from 'cur' argv if present */\n any: <R = string>(keys: string | string[], defaultValue?: R)=>\n R extends undefined ? string | true | null : string | true | R;\n /** command portion of argv (executable and script name) */\n cmd: ()=> string[];\n /** current un-consumed argv */\n cur: ()=> string[];\n /** if end-of-options/double-dash (--) delimiter is present in argv */\n end: ()=> boolean;\n /** value from environment variables or globalThis; does not mutate */\n env: (keys: string | string[])=> string | null;\n /** checks for flag presence and removes it from 'cur' argv */\n flag: (keys: string | string[])=> true | null;\n /** retrieves operand value and removes it from 'cur' argv */\n opt: <R extends NonEmptyString>(key: string | string[])=> R | null;\n /** remaining positional arguments (typically called last) */\n pos: ()=> string[];\n}>;\n\n\n/**\n * checks for presence of key (flags) in argv\n * @example --example -flag\n * @param {string | string[]} keys - argv key/id (--key, -key)\n * @param {string[]} [argv=ARGV] - command-line argv\n * @return {boolean}\n */\nexport const hasArgv = (keys: string | string[], argv = ARGV): boolean => !argv?.length\n ? false\n : !!([keys].flat().filter(Boolean).find(key =>\n (new RegExp(`(^|[^\\\\S])(?:--|-)${key}(=|\\\\s|$)`, 'i')).test(argv.join(' '))));\n\n\n/**\n * normalizes and removes matching quotes from string values\n * @param {string} val - string value to normalize\n * @return {string}\n */\nexport const quoteNorm = (val: string): string => ((/^['\"]/).test(val)\n ? val?.replace(/^(['\"])(.*)(['\"])$/, (m, q1, body, q2) => q1 === q2 ? quoteNorm(body) : m)\n : val);\n\n\n/**\n * checks if value is a flag (starts with dashes and is not a number)\n * @param {string} val - value to check\n * @return {boolean}\n */\nexport const isFlag = (val?: string) => (/^-+\\w/).test(val ?? '') && Number.isNaN(Number(val));\n\n\n/**\n * checks if value is option terminator (--)\n * @param {string} val - value to check\n * @return {boolean}\n */\nconst isTerm = (val?: string) => val?.trim() === '--';\n\n\n/**\n * converts key(s) to array with optional loose matching (hyphen/underscore swapping)\n * @param {string|string[]} key - key or array of keys\n * @param {boolean} strict=false - enable strict matching\n * @param {string[]} _keys - internal key array\n * @return {string[]}\n */\nconst toArgvArray = (\n key: string | string[], strict = false, _keys = (Array.isArray(key) ? key : [key]),\n) =>\n (strict\n ? _keys\n // if (not strict) swap '-' and '_' in keys\n : _keys.map(item =>\n [\n item,\n item.replaceAll(...((item.includes('_') ? ['_', '-'] : ['-', '_']) as [string, string])),\n ]).flat());\n\n\n/**\n * creates CLI argument parser that consumes flags, options, and positionals\n * @param {string[]} argv=ARGV - command-line arguments array\n * @param {NodeJS.ProcessEnv} env=ENV - process environment variables\n * @param {typeof globalThis} gthis=GLOBAL_THIS - global object for runtime-set/fallback values\n * @param {boolean} strict=false - enable strict matching no (case/hyphen/underscore insensitive)\n * @return {CliReap}\n */\nexport const cliReap = (argv = ARGV, env = ENV, gthis = GLOBAL_THIS, strict = false): CliReap => {\n // makes assumption of a node-like env - if run second arg we assume bun/deno (bun run index.ts)\n const slice = argv[0] === 'node' ? 2 : (argv[1] === 'run' ? 3 : (isFlag(argv[0]) ? 0 : 1));\n const cur = argv.map(String).slice(slice);\n const cmd = argv.map(String).slice(0, slice);\n const end = !!cur.find(isTerm);\n\n const getArgv = (keys: string | string[], optValue = false) => {\n const keyList = toArgvArray(keys, strict);\n for (let i = 0; i < cur.length; i++) {\n const token = cur[i];\n // the option terminator (--) -> terminates all into positionals (per. POSIX)\n if (isTerm(token)) { break;}\n if (!token || !isFlag(token)) {continue;}\n const hasEq = (/=/).test(token);\n const part = keyList.map(key => {\n // in case literal key passed in such as '--key' or '-key'\n const [k, ...parts] = token.replace(isFlag(key) ? /(?!)/ : /^\\s*?-+/, '')\n // ensures 'f' key doesn't match '--flag'\n .split(hasEq && optValue ? `${key}=` : new RegExp(`^${key}$`, strict ? '' : 'i'));\n return !k?.length ? parts.join(key) : (k === key ? key : null);\n })\n .find(v => v !== null) ?? 0;\n if (part === 0) { continue; }\n\n // if not option handle before others (otherwise might consume positional)\n if (!optValue) {\n cur.splice(i, 1);\n return true;\n }\n // handle --key=value (= already removed from split)\n if (hasEq) {\n cur.splice(i, 1);\n return quoteNorm(part);\n }\n // handle --key value alongside negative numbers\n const next = cur[i + 1];\n if (next !== undefined && !isTerm(next) && (!isFlag(next))) {\n cur.splice(i, 2);\n return quoteNorm(next);\n }\n }\n return null;\n };\n\n // environment arguments (process > globalThis)\n const getEnv = (keys: string | string[]): string | null => (toArgvArray(keys, strict).map(key =>\n ((key in env)\n ? env[key]\n : (key in gthis)\n ? gthis[key as never]\n : null)).filter(Boolean)[0] ?? null);\n\n const getFlag = (keys: string | string[]) =>\n (getArgv(keys, false) !== null ? true : null);\n\n const getOpt = <R extends NonEmptyString>(keys: string | string[]) =>\n getArgv(keys, true) as R | null;\n\n const getAny = <R = string>(keys: string | string[], defaultValue?: R) =>\n (getOpt(keys)\n ?? getFlag(keys)\n ?? getEnv(keys)\n ?? (defaultValue !== undefined ? defaultValue : null)) as R extends undefined\n ? string | true | null\n : string | true | R;\n\n // positional arguments\n const getPos = () => {\n const result: string[] = [];\n for (let i = 0; i < cur.length; i++) {\n const token = cur[i];\n if (!token) {continue;}\n // the option terminator (--) -> terminates all into positionals (per. POSIX)\n if (isTerm(token)) { return [...result, ...cur.slice(i + 1)];}\n if (isFlag(token)) { continue; }\n result.push(token);\n }\n return result;\n };\n\n return {\n any: getAny,\n cmd: () => cmd,\n cur: () => cur,\n end: () => end,\n env: getEnv,\n flag: getFlag,\n opt: getOpt,\n pos: getPos,\n } as const;\n};\n\n/**\n * creates CLI argument parser with strict matching enabled, case-sensitive and\n * must match hyphen/underscore\n * @param {string[]} argv=ARGV - command-line arguments array\n * @param {NodeJS.ProcessEnv} procEnv=ENV - process environment variables\n * @param {typeof globalThis} gthis=GLOBAL_THIS - global object for runtime-set/fallback values\n * @return {CliReap}\n */\nexport const cliReapStrict = (argv = ARGV, procEnv = ENV, gthis = GLOBAL_THIS) =>\n cliReap(argv, procEnv, gthis, true);\n\nexport default cliReap;\n\nexport {\n ENV,\n ARGV,\n};\n"
],
"mappings": "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",
"debugId": "D2A844DF13EB26D664756E2164756E21",
"names": []
}