-
Notifications
You must be signed in to change notification settings - Fork 0
/
local-echo.js.map
1 lines (1 loc) · 67.7 KB
/
local-echo.js.map
1
{"version":3,"sources":["webpack://LocalEchoController/webpack/bootstrap","webpack://LocalEchoController/./node_modules/shell-quote/index.js","webpack://LocalEchoController/./node_modules/jsonify/index.js","webpack://LocalEchoController/./node_modules/jsonify/lib/parse.js","webpack://LocalEchoController/./node_modules/jsonify/lib/stringify.js","webpack://LocalEchoController/./node_modules/array-map/index.js","webpack://LocalEchoController/./node_modules/array-filter/index.js","webpack://LocalEchoController/./node_modules/array-reduce/index.js","webpack://LocalEchoController/./lib/HistoryController.js","webpack://LocalEchoController/./lib/Utils.js","webpack://LocalEchoController/./lib/LocalEchoController.js","webpack://LocalEchoController/./index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","json","undefined","JSON","map","filter","reduce","quote","xs","op","replace","test","String","join","CONTROL","BAREWORD","SINGLE_QUOTE","DOUBLE_QUOTE","TOKEN","Math","pow","random","toString","parse","env","opts","mapped","chunker","RegExp","match","Boolean","commented","j","BS","escape","esc","out","isGlob","len","length","charAt","parseEnvVar","comment","slice","pattern","varend","varname","Error","substr","indexOf","index","_","pre","stringify","getVar","prev","arg","concat","acc","split","x","at","ch","text","escapee","\"","\\","/","b","f","error","message","next","number","string","isFinite","hex","uffff","parseInt","fromCharCode","white","array","push","word","source","reviver","result","walk","holder","k","v","","gap","indent","rep","escapable","meta","\b","\t","\n","\f","\r","lastIndex","a","charCodeAt","replacer","space","str","partial","mind","toJSON","apply","res","hasOwn","arr","fn","ret","hasAcc","arguments","HistoryController","size","_classCallCheck","this","entries","cursor","_createClass","entry","trim","pop","idx","max","min","wordBoundaries","input","leftSide","words","rx","exec","closestLeftBoundary","offset","found","reverse","find","offsetToColRow","maxCols","row","col","countLines","hasTailingWhitespace","LocalEchoController_LocalEchoController","LocalEchoController","term","options","LocalEchoController_classCallCheck","on","handleTermData","handleTermResize","history","historySize","maxAutocompleteEntries","_autocompleteHandlers","_active","_input","_cursor","_activePrompt","_activeCharPrompt","_termSize","cols","rows","_len","args","Array","_key","findIndex","e","splice","prompt","_this","continuationPrompt","Promise","resolve","reject","write","_this2","reason","print","normInput","items","padding","println","itemWidth","width","item","wideCols","floor","wideRows","ceil","rowStr","repeat","applyPrompts","currentPrompt","allRows","_offsetToColRow","applyPromptOffset","moveRows","newInput","clearInput","newPrompt","newCursor","newLines","_offsetToColRow2","moveUpRows","callback","_this3","setCursor","resume","setInput","then","inputWithPrompt","_offsetToColRow3","prevCol","prevRow","_offsetToColRow4","newCol","newRow","dir","num","backspace","data","_this4","normData","from","forEach","handleData","_this5","ofs","ord","getPrevious","getNext","handleCursorMove","handleCursorErase","closestRightBoundary","endsWith","isIncompleteInput","handleReadComplete","handleCursorInsert","inputFragment","hasTailingSpace","candidates","callbacks","tokens","shell_quote","expr","_ref","_toConsumableArray","console","txt","startsWith","collectAutocompleteCandidates","sort","lastToken","getLastToken","printAndRestartPrompt","printWide","readChar","yn","rewind","__webpack_exports__"],"mappings":"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","file":"local-echo.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n","var json = typeof JSON !== undefined ? JSON : require('jsonify');\nvar map = require('array-map');\nvar filter = require('array-filter');\nvar reduce = require('array-reduce');\n\nexports.quote = function (xs) {\n return map(xs, function (s) {\n if (s && typeof s === 'object') {\n return s.op.replace(/(.)/g, '\\\\$1');\n }\n else if (/[\"\\s]/.test(s) && !/'/.test(s)) {\n return \"'\" + s.replace(/(['\\\\])/g, '\\\\$1') + \"'\";\n }\n else if (/[\"'\\s]/.test(s)) {\n return '\"' + s.replace(/([\"\\\\$`!])/g, '\\\\$1') + '\"';\n }\n else {\n return String(s).replace(/([#!\"$&'()*,:;<=>?@\\[\\\\\\]^`{|}])/g, '\\\\$1'); \n }\n }).join(' ');\n};\n\nvar CONTROL = '(?:' + [\n '\\\\|\\\\|', '\\\\&\\\\&', ';;', '\\\\|\\\\&', '[&;()|<>]'\n].join('|') + ')';\nvar META = '|&;()<> \\\\t';\nvar BAREWORD = '(\\\\\\\\[\\'\"' + META + ']|[^\\\\s\\'\"' + META + '])+';\nvar SINGLE_QUOTE = '\"((\\\\\\\\\"|[^\"])*?)\"';\nvar DOUBLE_QUOTE = '\\'((\\\\\\\\\\'|[^\\'])*?)\\'';\n\nvar TOKEN = '';\nfor (var i = 0; i < 4; i++) {\n TOKEN += (Math.pow(16,8)*Math.random()).toString(16);\n}\n\nexports.parse = function (s, env, opts) {\n var mapped = parse(s, env, opts);\n if (typeof env !== 'function') return mapped;\n return reduce(mapped, function (acc, s) {\n if (typeof s === 'object') return acc.concat(s);\n var xs = s.split(RegExp('(' + TOKEN + '.*?' + TOKEN + ')', 'g'));\n if (xs.length === 1) return acc.concat(xs[0]);\n return acc.concat(map(filter(xs, Boolean), function (x) {\n if (RegExp('^' + TOKEN).test(x)) {\n return json.parse(x.split(TOKEN)[1]);\n }\n else return x;\n }));\n }, []);\n};\n\nfunction parse (s, env, opts) {\n var chunker = new RegExp([\n '(' + CONTROL + ')', // control chars\n '(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')*'\n ].join('|'), 'g');\n var match = filter(s.match(chunker), Boolean);\n var commented = false;\n\n if (!match) return [];\n if (!env) env = {};\n if (!opts) opts = {};\n return map(match, function (s, j) {\n if (commented) {\n return;\n }\n if (RegExp('^' + CONTROL + '$').test(s)) {\n return { op: s };\n }\n\n // Hand-written scanner/parser for Bash quoting rules:\n //\n // 1. inside single quotes, all characters are printed literally.\n // 2. inside double quotes, all characters are printed literally\n // except variables prefixed by '$' and backslashes followed by\n // either a double quote or another backslash.\n // 3. outside of any quotes, backslashes are treated as escape\n // characters and not printed (unless they are themselves escaped)\n // 4. quote context can switch mid-token if there is no whitespace\n // between the two quote contexts (e.g. all'one'\"token\" parses as\n // \"allonetoken\")\n var SQ = \"'\";\n var DQ = '\"';\n var DS = '$';\n var BS = opts.escape || '\\\\';\n var quote = false;\n var esc = false;\n var out = '';\n var isGlob = false;\n\n for (var i = 0, len = s.length; i < len; i++) {\n var c = s.charAt(i);\n isGlob = isGlob || (!quote && (c === '*' || c === '?'));\n if (esc) {\n out += c;\n esc = false;\n }\n else if (quote) {\n if (c === quote) {\n quote = false;\n }\n else if (quote == SQ) {\n out += c;\n }\n else { // Double quote\n if (c === BS) {\n i += 1;\n c = s.charAt(i);\n if (c === DQ || c === BS || c === DS) {\n out += c;\n } else {\n out += BS + c;\n }\n }\n else if (c === DS) {\n out += parseEnvVar();\n }\n else {\n out += c;\n }\n }\n }\n else if (c === DQ || c === SQ) {\n quote = c;\n }\n else if (RegExp('^' + CONTROL + '$').test(c)) {\n return { op: s };\n }\n else if (RegExp('^#$').test(c)) {\n commented = true;\n if (out.length){\n return [out, { comment: s.slice(i+1) + match.slice(j+1).join(' ') }];\n }\n return [{ comment: s.slice(i+1) + match.slice(j+1).join(' ') }];\n }\n else if (c === BS) {\n esc = true;\n }\n else if (c === DS) {\n out += parseEnvVar();\n }\n else out += c;\n }\n\n if (isGlob) return {op: 'glob', pattern: out};\n\n return out;\n\n function parseEnvVar() {\n i += 1;\n var varend, varname;\n //debugger\n if (s.charAt(i) === '{') {\n i += 1;\n if (s.charAt(i) === '}') {\n throw new Error(\"Bad substitution: \" + s.substr(i - 2, 3));\n }\n varend = s.indexOf('}', i);\n if (varend < 0) {\n throw new Error(\"Bad substitution: \" + s.substr(i));\n }\n varname = s.substr(i, varend - i);\n i = varend;\n }\n else if (/[*@#?$!_\\-]/.test(s.charAt(i))) {\n varname = s.charAt(i);\n i += 1;\n }\n else {\n varend = s.substr(i).match(/[^\\w\\d_]/);\n if (!varend) {\n varname = s.substr(i);\n i = s.length;\n } else {\n varname = s.substr(i, varend.index);\n i += varend.index - 1;\n }\n }\n return getVar(null, '', varname);\n }\n })\n // finalize parsed aruments\n .reduce(function(prev, arg){\n if (arg === undefined){\n return prev;\n }\n return prev.concat(arg);\n },[]);\n\n function getVar (_, pre, key) {\n var r = typeof env === 'function' ? env(key) : env[key];\n if (r === undefined) r = '';\n\n if (typeof r === 'object') {\n return pre + TOKEN + json.stringify(r) + TOKEN;\n }\n else return pre + r;\n }\n}\n","exports.parse = require('./lib/parse');\nexports.stringify = require('./lib/stringify');\n","var at, // The index of the current character\n ch, // The current character\n escapee = {\n '\"': '\"',\n '\\\\': '\\\\',\n '/': '/',\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t'\n },\n text,\n\n error = function (m) {\n // Call error when something is wrong.\n throw {\n name: 'SyntaxError',\n message: m,\n at: at,\n text: text\n };\n },\n \n next = function (c) {\n // If a c parameter is provided, verify that it matches the current character.\n if (c && c !== ch) {\n error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n }\n \n // Get the next character. When there are no more characters,\n // return the empty string.\n \n ch = text.charAt(at);\n at += 1;\n return ch;\n },\n \n number = function () {\n // Parse a number value.\n var number,\n string = '';\n \n if (ch === '-') {\n string = '-';\n next('-');\n }\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n if (ch === '.') {\n string += '.';\n while (next() && ch >= '0' && ch <= '9') {\n string += ch;\n }\n }\n if (ch === 'e' || ch === 'E') {\n string += ch;\n next();\n if (ch === '-' || ch === '+') {\n string += ch;\n next();\n }\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n }\n number = +string;\n if (!isFinite(number)) {\n error(\"Bad number\");\n } else {\n return number;\n }\n },\n \n string = function () {\n // Parse a string value.\n var hex,\n i,\n string = '',\n uffff;\n \n // When parsing for string values, we must look for \" and \\ characters.\n if (ch === '\"') {\n while (next()) {\n if (ch === '\"') {\n next();\n return string;\n } else if (ch === '\\\\') {\n next();\n if (ch === 'u') {\n uffff = 0;\n for (i = 0; i < 4; i += 1) {\n hex = parseInt(next(), 16);\n if (!isFinite(hex)) {\n break;\n }\n uffff = uffff * 16 + hex;\n }\n string += String.fromCharCode(uffff);\n } else if (typeof escapee[ch] === 'string') {\n string += escapee[ch];\n } else {\n break;\n }\n } else {\n string += ch;\n }\n }\n }\n error(\"Bad string\");\n },\n\n white = function () {\n\n// Skip whitespace.\n\n while (ch && ch <= ' ') {\n next();\n }\n },\n\n word = function () {\n\n// true, false, or null.\n\n switch (ch) {\n case 't':\n next('t');\n next('r');\n next('u');\n next('e');\n return true;\n case 'f':\n next('f');\n next('a');\n next('l');\n next('s');\n next('e');\n return false;\n case 'n':\n next('n');\n next('u');\n next('l');\n next('l');\n return null;\n }\n error(\"Unexpected '\" + ch + \"'\");\n },\n\n value, // Place holder for the value function.\n\n array = function () {\n\n// Parse an array value.\n\n var array = [];\n\n if (ch === '[') {\n next('[');\n white();\n if (ch === ']') {\n next(']');\n return array; // empty array\n }\n while (ch) {\n array.push(value());\n white();\n if (ch === ']') {\n next(']');\n return array;\n }\n next(',');\n white();\n }\n }\n error(\"Bad array\");\n },\n\n object = function () {\n\n// Parse an object value.\n\n var key,\n object = {};\n\n if (ch === '{') {\n next('{');\n white();\n if (ch === '}') {\n next('}');\n return object; // empty object\n }\n while (ch) {\n key = string();\n white();\n next(':');\n if (Object.hasOwnProperty.call(object, key)) {\n error('Duplicate key \"' + key + '\"');\n }\n object[key] = value();\n white();\n if (ch === '}') {\n next('}');\n return object;\n }\n next(',');\n white();\n }\n }\n error(\"Bad object\");\n };\n\nvalue = function () {\n\n// Parse a JSON value. It could be an object, an array, a string, a number,\n// or a word.\n\n white();\n switch (ch) {\n case '{':\n return object();\n case '[':\n return array();\n case '\"':\n return string();\n case '-':\n return number();\n default:\n return ch >= '0' && ch <= '9' ? number() : word();\n }\n};\n\n// Return the json_parse function. It will have access to all of the above\n// functions and variables.\n\nmodule.exports = function (source, reviver) {\n var result;\n \n text = source;\n at = 0;\n ch = ' ';\n result = value();\n white();\n if (ch) {\n error(\"Syntax error\");\n }\n\n // If there is a reviver function, we recursively walk the new structure,\n // passing each name/value pair to the reviver function for possible\n // transformation, starting with a temporary root object that holds the result\n // in an empty key. If there is not a reviver function, we simply return the\n // result.\n\n return typeof reviver === 'function' ? (function walk(holder, key) {\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }({'': result}, '')) : result;\n};\n","var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\nfunction quote(string) {\n // If the string contains no control characters, no quote characters, and no\n // backslash characters, then we can safely slap some quotes around it.\n // Otherwise we must also replace the offending characters with safe escape\n // sequences.\n \n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n}\n\nfunction str(key, holder) {\n // Produce a string from holder[key].\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n mind = gap,\n partial,\n value = holder[key];\n \n // If the value has a toJSON method, call it to obtain a replacement value.\n if (value && typeof value === 'object' &&\n typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n \n // If we were called with a replacer function, then call the replacer to\n // obtain a replacement value.\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n \n // What happens next depends on the value's type.\n switch (typeof value) {\n case 'string':\n return quote(value);\n \n case 'number':\n // JSON numbers must be finite. Encode non-finite numbers as null.\n return isFinite(value) ? String(value) : 'null';\n \n case 'boolean':\n case 'null':\n // If the value is a boolean or null, convert it to a string. Note:\n // typeof null does not produce 'null'. The case is included here in\n // the remote chance that this gets fixed someday.\n return String(value);\n \n case 'object':\n if (!value) return 'null';\n gap += indent;\n partial = [];\n \n // Array.isArray\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n \n // Join all of the elements together, separated with commas, and\n // wrap them in brackets.\n v = partial.length === 0 ? '[]' : gap ?\n '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n \n // If the replacer is an array, use it to select the members to be\n // stringified.\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n else {\n // Otherwise, iterate through all of the keys in the object.\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n \n // Join all of the member texts together, separated with commas,\n // and wrap them in braces.\n\n v = partial.length === 0 ? '{}' : gap ?\n '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n}\n\nmodule.exports = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n \n // If the space parameter is a number, make an indent string containing that\n // many spaces.\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n }\n // If the space parameter is a string, it will be used as the indent string.\n else if (typeof space === 'string') {\n indent = space;\n }\n\n // If there is a replacer, it must be a function or an array.\n // Otherwise, throw an error.\n rep = replacer;\n if (replacer && typeof replacer !== 'function'\n && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n \n // Make a fake root object containing our value under the key of ''.\n // Return the result of stringifying the value.\n return str('', {'': value});\n};\n","module.exports = function (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n var x = xs[i];\n if (hasOwn.call(xs, i)) res.push(f(x, i, xs));\n }\n return res;\n};\n\nvar hasOwn = Object.prototype.hasOwnProperty;\n","/**\n * Array#filter.\n *\n * @param {Array} arr\n * @param {Function} fn\n * @return {Array}\n */\n\nmodule.exports = function (arr, fn) {\n if (arr.filter) return arr.filter(fn);\n var ret = [];\n for (var i = 0; i < arr.length; i++) {\n if (!hasOwn.call(arr, i)) continue;\n if (fn(arr[i], i, arr)) ret.push(arr[i]);\n }\n return ret;\n};\n\nvar hasOwn = Object.prototype.hasOwnProperty;\n","var hasOwn = Object.prototype.hasOwnProperty;\n\nmodule.exports = function (xs, f, acc) {\n var hasAcc = arguments.length >= 3;\n if (hasAcc && xs.reduce) return xs.reduce(f, acc);\n if (xs.reduce) return xs.reduce(f);\n \n for (var i = 0; i < xs.length; i++) {\n if (!hasOwn.call(xs, i)) continue;\n if (!hasAcc) {\n acc = xs[i];\n hasAcc = true;\n continue;\n }\n acc = f(acc, xs[i], i);\n }\n return acc;\n};\n","/**\n * The history controller provides an ring-buffer\n */\nexport class HistoryController {\n constructor(size) {\n this.size = size;\n this.entries = [];\n this.cursor = 0;\n }\n\n /**\n * Push an entry and maintain ring buffer size\n */\n push(entry) {\n // Skip empty entries\n if (entry.trim() === \"\") return;\n // Skip duplicate entries\n const lastEntry = this.entries[this.entries.length - 1];\n if (entry == lastEntry) return;\n // Keep track of entries\n this.entries.push(entry);\n if (this.entries.length > this.size) {\n this.entries.pop(0);\n }\n this.cursor = this.entries.length;\n }\n\n /**\n * Rewind history cursor on the last entry\n */\n rewind() {\n this.cursor = this.entries.length;\n }\n\n /**\n * Returns the previous entry\n */\n getPrevious() {\n const idx = Math.max(0, this.cursor - 1);\n this.cursor = idx;\n return this.entries[idx];\n }\n\n /**\n * Returns the next entry\n */\n getNext() {\n const idx = Math.min(this.entries.length, this.cursor + 1);\n this.cursor = idx;\n return this.entries[idx];\n }\n}\n","import { parse } from \"shell-quote\";\n\n/**\n * Detects all the word boundaries on the given input\n */\nexport function wordBoundaries(input, leftSide = true) {\n let match;\n const words = [];\n const rx = /\\w+/g;\n\n while ((match = rx.exec(input))) {\n if (leftSide) {\n words.push(match.index);\n } else {\n words.push(match.index + match[0].length);\n }\n }\n\n return words;\n}\n\n/**\n * The closest left (or right) word boundary of the given input at the\n * given offset.\n */\nexport function closestLeftBoundary(input, offset) {\n const found = wordBoundaries(input, true)\n .reverse()\n .find(x => x < offset);\n return found == null ? 0 : found;\n}\nexport function closestRightBoundary(input, offset) {\n const found = wordBoundaries(input, false).find(x => x > offset);\n return found == null ? input.length : found;\n}\n\n/**\n * Convert offset at the given input to col/row location\n *\n * This function is not optimized and practically emulates via brute-force\n * the navigation on the terminal, wrapping when they reach the column width.\n */\nexport function offsetToColRow(input, offset, maxCols) {\n let row = 0,\n col = 0;\n\n for (let i = 0; i < offset; ++i) {\n const chr = input.charAt(i);\n if (chr == \"\\n\") {\n col = 0;\n row += 1;\n } else {\n col += 1;\n if (col > maxCols) {\n col = 0;\n row += 1;\n }\n }\n }\n\n return { row, col };\n}\n\n/**\n * Counts the lines in the given input\n */\nexport function countLines(input, maxCols) {\n return offsetToColRow(input, input.length, maxCols).row + 1;\n}\n\n/**\n * Checks if there is an incomplete input\n *\n * An incomplete input is considered:\n * - An input that contains unterminated single quotes\n * - An input that contains unterminated double quotes\n * - An input that ends with \"\\\"\n * - An input that has an incomplete boolean shell expression (&& and ||)\n * - An incomplete pipe expression (|)\n */\nexport function isIncompleteInput(input) {\n // Empty input is not incomplete\n if (input.trim() == \"\") {\n return false;\n }\n\n // Check for dangling single-quote strings\n if ((input.match(/'/g) || []).length % 2 !== 0) {\n return true;\n }\n // Check for dangling double-quote strings\n if ((input.match(/\"/g) || []).length % 2 !== 0) {\n return true;\n }\n // Check for dangling boolean or pipe operations\n if (\n input\n .split(/(\\|\\||\\||&&)/g)\n .pop()\n .trim() == \"\"\n ) {\n return true;\n }\n // Check for tailing slash\n if (input.endsWith(\"\\\\\") && !input.endsWith(\"\\\\\\\\\")) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Returns true if the expression ends on a tailing whitespace\n */\nexport function hasTailingWhitespace(input) {\n return input.match(/[^\\\\][ \\t]$/m) != null;\n}\n\n/**\n * Returns the last expression in the given input\n */\nexport function getLastToken(input) {\n // Empty expressions\n if (input.trim() === \"\") return \"\";\n if (hasTailingWhitespace(input)) return \"\";\n\n // Last token\n const tokens = parse(input);\n return tokens.pop() || \"\";\n}\n\n/**\n * Returns the auto-complete candidates for the given input\n */\nexport function collectAutocompleteCandidates(callbacks, input) {\n const tokens = parse(input);\n let index = tokens.length - 1;\n let expr = tokens[index] || \"\";\n\n // Empty expressions\n if (input.trim() === \"\") {\n index = 0;\n expr = \"\";\n } else if (hasTailingWhitespace(input)) {\n // Expressions with danging space\n index += 1;\n expr = \"\";\n }\n\n // Collect all auto-complete candidates from the callbacks\n const all = callbacks.reduce((candidates, { fn, args }) => {\n try {\n return candidates.concat(fn(index, tokens, ...args));\n } catch (e) {\n console.error(\"Auto-complete error:\", e);\n return candidates;\n }\n }, []);\n\n // Filter only the ones starting with the expression\n return all.filter(txt => txt.startsWith(expr));\n}\n","import { HistoryController } from \"./HistoryController\";\nimport {\n closestLeftBoundary,\n closestRightBoundary,\n collectAutocompleteCandidates,\n countLines,\n getLastToken,\n hasTailingWhitespace,\n isIncompleteInput,\n offsetToColRow\n} from \"./Utils\";\n\n/**\n * A local terminal controller is responsible for displaying messages\n * and handling local echo for the terminal.\n *\n * Local echo supports most of bash-like input primitives. Namely:\n * - Arrow navigation on the input\n * - Alt-arrow for word-boundary navigation\n * - Alt-backspace for word-boundary deletion\n * - Multi-line input for incomplete commands\n * - Auto-complete hooks\n */\nexport default class LocalEchoController {\n constructor(term, options = {}) {\n this.term = term;\n this.term.on(\"data\", this.handleTermData.bind(this));\n this.term.on(\"resize\", this.handleTermResize.bind(this));\n this.history = new HistoryController(options.historySize || 10);\n this.maxAutocompleteEntries = options.maxAutocompleteEntries || 100;\n\n this._autocompleteHandlers = [];\n this._active = false;\n this._input = \"\";\n this._cursor = 0;\n this._activePrompt = null;\n this._activeCharPrompt = null;\n this._termSize = {\n cols: this.term.cols,\n rows: this.term.rows\n };\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // User-Facing API\n /////////////////////////////////////////////////////////////////////////////\n\n /**\n * Register a handler that will be called to satisfy auto-completion\n */\n addAutocompleteHandler(fn, ...args) {\n this._autocompleteHandlers.push({\n fn,\n args\n });\n }\n\n /**\n * Remove a previously registered auto-complete handler\n */\n removeAutocompleteHandler(fn) {\n const idx = this._autocompleteHandlers.findIndex(e => e.fn === fn);\n if (idx === -1) return;\n\n this._autocompleteHandlers.splice(idx, 1);\n }\n\n /**\n * Return a promise that will resolve when the user has completed\n * typing a single line\n */\n read(prompt, continuationPrompt = \"> \") {\n return new Promise((resolve, reject) => {\n this.term.write(prompt);\n this._activePrompt = {\n prompt,\n continuationPrompt,\n resolve,\n reject\n };\n\n this._input = \"\";\n this._cursor = 0;\n this._active = true;\n });\n }\n\n /**\n * Return a promise that will be resolved when the user types a single\n * character.\n *\n * This can be active in addition to `.read()` and will be resolved in\n * priority before it.\n */\n readChar(prompt) {\n return new Promise((resolve, reject) => {\n this.term.write(prompt);\n this._activeCharPrompt = {\n prompt,\n resolve,\n reject\n };\n });\n }\n\n /**\n * Abort a pending read operation\n */\n abortRead(reason = \"aborted\") {\n if (this._activePrompt != null || this._activeCharPrompt != null) {\n this.term.write(\"\\r\\n\");\n }\n if (this._activePrompt != null) {\n this._activePrompt.reject(reason);\n this._activePrompt = null;\n }\n if (this._activeCharPrompt != null) {\n this._activeCharPrompt.reject(reason);\n this._activeCharPrompt = null;\n }\n this._active = false;\n }\n\n /**\n * Prints a message and changes line\n */\n println(message) {\n this.print(message + \"\\n\");\n }\n\n /**\n * Prints a message and properly handles new-lines\n */\n print(message) {\n const normInput = message.replace(/[\\r\\n]+/g, \"\\n\");\n this.term.write(normInput.replace(/\\n/g, \"\\r\\n\"));\n }\n\n /**\n * Prints a list of items using a wide-format\n */\n printWide(items, padding = 2) {\n if (items.length == 0) return println(\"\");\n\n // Compute item sizes and matrix row/cols\n const itemWidth =\n items.reduce((width, item) => Math.max(width, item.length), 0) + padding;\n const wideCols = Math.floor(this._termSize.cols / itemWidth);\n const wideRows = Math.ceil(items.length / wideCols);\n\n // Print matrix\n let i = 0;\n for (let row = 0; row < wideRows; ++row) {\n let rowStr = \"\";\n\n // Prepare columns\n for (let col = 0; col < wideCols; ++col) {\n if (i < items.length) {\n let item = items[i++];\n item += \" \".repeat(itemWidth - item.length);\n rowStr += item;\n }\n }\n this.println(rowStr);\n }\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // Internal API\n /////////////////////////////////////////////////////////////////////////////\n\n /**\n * Apply prompts to the given input\n */\n applyPrompts(input) {\n const prompt = (this._activePrompt || {}).prompt || \"\";\n const continuationPrompt =\n (this._activePrompt || {}).continuationPrompt || \"\";\n\n return prompt + input.replace(/\\n/g, \"\\n\" + continuationPrompt);\n }\n\n /**\n * Advances the `offset` as required in order to accompany the prompt\n * additions to the input.\n */\n applyPromptOffset(input, offset) {\n const newInput = this.applyPrompts(input.substr(0, offset));\n return newInput.length;\n }\n\n /**\n * Clears the current prompt\n *\n * This function will erase all the lines that display the current prompt\n * and move the cursor in the beginning of the first line of the prompt.\n */\n clearInput() {\n const currentPrompt = this.applyPrompts(this._input);\n\n // Get the overall number of lines to clear\n const allRows = countLines(currentPrompt, this._termSize.cols);\n\n // Get the line we are currently in\n const promptCursor = this.applyPromptOffset(this._input, this._cursor);\n const { col, row } = offsetToColRow(\n currentPrompt,\n promptCursor,\n this._termSize.cols\n );\n\n // First move on the last line\n const moveRows = allRows - row - 1;\n for (var i = 0; i < moveRows; ++i) term.write(\"\\x1B[E\");\n\n // Clear current input line(s)\n term.write(\"\\r\\x1B[K\");\n for (var i = 1; i < allRows; ++i) term.write(\"\\x1B[F\\x1B[K\");\n }\n\n /**\n * Replace input with the new input given\n *\n * This function clears all the lines that the current input occupies and\n * then replaces them with the new input.\n */\n setInput(newInput, clearInput = true) {\n // Clear current input\n if (clearInput) this.clearInput();\n\n // Write the new input lines, including the current prompt\n const newPrompt = this.applyPrompts(newInput);\n this.print(newPrompt);\n\n // Trim cursor overflow\n if (this._cursor > newInput.length) {\n this._cursor = newInput.length;\n }\n\n // Move the cursor to the appropriate row/col\n const newCursor = this.applyPromptOffset(newInput, this._cursor);\n const newLines = countLines(newPrompt, this._termSize.cols);\n const { col, row } = offsetToColRow(\n newPrompt,\n newCursor,\n this._termSize.cols\n );\n const moveUpRows = newLines - row - 1;\n\n term.write(\"\\r\");\n for (var i = 0; i < moveUpRows; ++i) term.write(\"\\x1B[F\");\n for (var i = 0; i < col; ++i) this.term.write(\"\\x1B[C\");\n\n // Replace input\n this._input = newInput;\n }\n\n /**\n * This function completes the current input, calls the given callback\n * and then re-displays the prompt.\n */\n printAndRestartPrompt(callback) {\n const cursor = this._cursor;\n\n // Complete input\n this.setCursor(this._input.length);\n this.term.write(\"\\r\\n\");\n\n // Prepare a function that will resume prompt\n const resume = () => {\n this._cursor = cursor;\n this.setInput(this._input);\n };\n\n // Call the given callback to echo something, and if there is a promise\n // returned, wait for the resolution before resuming prompt.\n const ret = callback();\n if (ret == null) {\n resume();\n } else {\n ret.then(resume);\n }\n }\n\n /**\n * Set the new cursor position, as an offset on the input string\n *\n * This function:\n * - Calculates the previous and current\n */\n setCursor(newCursor) {\n if (newCursor < 0) newCursor = 0;\n if (newCursor > this._input.length) newCursor = this._input.length;\n\n // Apply prompt formatting to get the visual status of the display\n const inputWithPrompt = this.applyPrompts(this._input);\n const inputLines = countLines(inputWithPrompt, this._termSize.cols);\n\n // Estimate previous cursor position\n const prevPromptOffset = this.applyPromptOffset(this._input, this._cursor);\n const { col: prevCol, row: prevRow } = offsetToColRow(\n inputWithPrompt,\n prevPromptOffset,\n this._termSize.cols\n );\n\n // Estimate next cursor position\n const newPromptOffset = this.applyPromptOffset(this._input, newCursor);\n const { col: newCol, row: newRow } = offsetToColRow(\n inputWithPrompt,\n newPromptOffset,\n this._termSize.cols\n );\n\n // Adjust vertically\n if (newRow > prevRow) {\n for (let i = prevRow; i < newRow; ++i) term.write(\"\\x1B[B\");\n } else {\n for (let i = newRow; i < prevRow; ++i) term.write(\"\\x1B[A\");\n }\n\n // Adjust horizontally\n if (newCol > prevCol) {\n for (let i = prevCol; i < newCol; ++i) term.write(\"\\x1B[C\");\n } else {\n for (let i = newCol; i < prevCol; ++i) term.write(\"\\x1B[D\");\n }\n\n // Set new offset\n this._cursor = newCursor;\n }\n\n /**\n * Move cursor at given direction\n */\n handleCursorMove(dir) {\n if (dir > 0) {\n const num = Math.min(dir, this._input.length - this._cursor);\n this.setCursor(this._cursor + num);\n } else if (dir < 0) {\n const num = Math.max(dir, -this._cursor);\n this.setCursor(this._cursor + num);\n }\n }\n\n /**\n * Erase a character at cursor location\n */\n handleCursorErase(backspace) {\n const { _cursor, _input } = this;\n if (backspace) {\n if (_cursor <= 0) return;\n const newInput = _input.substr(0, _cursor - 1) + _input.substr(_cursor);\n this.clearInput();\n this._cursor -= 1;\n this.setInput(newInput, false);\n } else {\n const newInput = _input.substr(0, _cursor) + _input.substr(_cursor + 1);\n this.setInput(newInput);\n }\n }\n\n /**\n * Insert character at cursor location\n */\n handleCursorInsert(data) {\n const { _cursor, _input } = this;\n const newInput = _input.substr(0, _cursor) + data + _input.substr(_cursor);\n this._cursor += data.length;\n this.setInput(newInput);\n }\n\n /**\n * Handle input completion\n */\n handleReadComplete() {\n if (this.history) {\n this.history.push(this._input);\n }\n if (this._activePrompt) {\n this._activePrompt.resolve(this._input);\n this._activePrompt = null;\n }\n this.term.write(\"\\r\\n\");\n this._active = false;\n }\n\n /**\n * Handle terminal resize\n *\n * This function clears the prompt using the previous configuration,\n * updates the cached terminal size information and then re-renders the\n * input. This leads (most of the times) into a better formatted input.\n */\n handleTermResize(data) {\n const { rows, cols } = data;\n this.clearInput();\n this._termSize = { cols, rows };\n this.setInput(this._input, false);\n }\n\n /**\n * Handle terminal input\n */\n handleTermData(data) {\n if (!this._active) return;\n\n // If we have an active character prompt, satisfy it in priority\n if (this._activeCharPrompt != null) {\n this._activeCharPrompt.resolve(data);\n this._activeCharPrompt = null;\n this.term.write(\"\\r\\n\");\n return;\n }\n\n // If this looks like a pasted input, expand it\n if (data.length > 3 && data.charCodeAt(0) !== 0x1b) {\n const normData = data.replace(/[\\r\\n]+/g, \"\\r\");\n Array.from(normData).forEach(c => this.handleData(c));\n } else {\n this.handleData(data);\n }\n }\n\n /**\n * Handle a single piece of information from the terminal.\n */\n handleData(data) {\n if (!this._active) return;\n const ord = data.charCodeAt(0);\n let ofs;\n\n // Handle ANSI escape sequences\n if (ord == 0x1b) {\n switch (data.substr(1)) {\n case \"[A\": // Up arrow\n if (this.history) {\n let value = this.history.getPrevious();\n if (value) {\n this.setInput(value);\n this.setCursor(value.length);\n }\n }\n break;\n\n case \"[B\": // Down arrow\n if (this.history) {\n let value = this.history.getNext();\n if (!value) value = \"\";\n this.setInput(value);\n this.setCursor(value.length);\n }\n break;\n\n case \"[D\": // Left Arrow\n this.handleCursorMove(-1);\n break;\n\n case \"[C\": // Right Arrow\n this.handleCursorMove(1);\n break;\n\n case \"[3~\": // Delete\n this.handleCursorErase(false);\n break;\n\n case \"[F\": // End\n this.setCursor(this._input.length);\n break;\n\n case \"[H\": // Home\n this.setCursor(0);\n break;\n\n case \"b\": // ALT + LEFT\n ofs = closestLeftBoundary(this._input, this._cursor);\n if (ofs != null) this.setCursor(ofs);\n break;\n\n case \"f\": // ALT + RIGHT\n ofs = closestRightBoundary(this._input, this._cursor);\n if (ofs != null) this.setCursor(ofs);\n break;\n\n case \"\\x7F\": // CTRL + BACKSPACE\n ofs = closestLeftBoundary(this._input, this._cursor);\n if (ofs != null) {\n this.setInput(\n this._input.substr(0, ofs) + this._input.substr(this._cursor)\n );\n this.setCursor(ofs);\n }\n break;\n }\n\n // Handle special characters\n } else if (ord < 32 || ord === 0x7f) {\n switch (data) {\n case \"\\r\": // ENTER\n if (isIncompleteInput(this._input)) {\n this.handleCursorInsert(\"\\n\");\n } else {\n this.handleReadComplete();\n }\n break;\n\n case \"\\x7F\": // BACKSPACE\n this.handleCursorErase(true);\n break;\n\n case \"\\t\": // TAB\n if (this._autocompleteHandlers.length > 0) {\n const inputFragment = this._input.substr(0, this._cursor);\n const hasTailingSpace = hasTailingWhitespace(inputFragment);\n const candidates = collectAutocompleteCandidates(\n this._autocompleteHandlers,\n inputFragment\n );\n\n // Sort candidates\n candidates.sort();\n\n // Depending on the number of candidates, we are handing them in\n // a different way.\n if (candidates.length === 0) {\n // No candidates? Just add a space if there is none already\n if (!hasTailingSpace) {\n this.handleCursorInsert(\" \");\n }\n } else if (candidates.length === 1) {\n // Just a single candidate? Complete\n const lastToken = getLastToken(inputFragment);\n this.handleCursorInsert(\n candidates[0].substr(lastToken.length) + \" \"\n );\n } else if (candidates.length <= this.maxAutocompleteEntries) {\n // If we are less than maximum auto-complete candidates, print\n // them to the user and re-start prompt\n this.printAndRestartPrompt(() => {\n this.printWide(candidates);\n });\n } else {\n // If we have more than maximum auto-complete candidates, print\n // them only if the user acknowledges a warning\n this.printAndRestartPrompt(() =>\n this.readChar(\n `Display all ${candidates.length} possibilities? (y or n)`\n ).then(yn => {\n if (yn == \"y\" || yn == \"Y\") {\n this.printWide(candidates);\n }\n })\n );\n }\n } else {\n this.handleCursorInsert(\" \");\n }\n break;\n\n case \"\\x03\": // CTRL+C\n this.setCursor(this._input.length);\n this.term.write(\"^C\\r\\n\" + ((this._activePrompt || {}).prompt || \"\"));\n this._input = \"\";\n this._cursor = 0;\n if (this.history) this.history.rewind();\n break;\n }\n\n // Handle visible characters\n } else {\n this.handleCursorInsert(data);\n }\n }\n}\n","import LocalEchoController from \"./lib/LocalEchoController\";\nexport { HistoryController } from './lib/HistoryController';\n\nexport default LocalEchoController;\n"],"sourceRoot":""}