{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eventsourcing/src/components/widgets/lively-code-mirror-hint.js"],"names":["uniq","utils","searchImports","getCompletions","forAllProps","coffeescriptHint","getCoffeeScriptToken","javascriptHint","scriptHint","Pos","CodeMirror","editor","keywords","getToken","options","cur","getCursor","token","firstTokenInLine","line","string","list","start","end","ch","getLine","state","type","from","to","test","innerMode","getMode","slice","tprop","context","push","javascriptKeywords","e","getTokenAt","registerHelper","charAt","replace","coffeescriptKeywords","stringProps","split","arrayProps","funcProps","obj","callback","Object","getOwnPropertyNames","getPrototypeOf","name","o","forEach","found","global","globalScope","window","maybeAdd","str","lastIndexOf","includes","gatherCompletions","Array","Function","completeUtilsFunctions","keys","filter","ea","startsWith","utilFuncName","text","displayText","hint","cm","self","data","offset","replaceRange","lines","getValue","imports","match","find","funcs","map","sort","join","setValue","prefix","setCursor","length","pop","base","indexOf","additionalContext","undefined","result","codemirror","boundEval","value","useGlobalScope","jQuery","_","prevToken","prevPrevToken","v","localVars","next","globalVars","importsCache","importsCacheTime","Date","now","fetch","lively4url","headers","then","r"],"mappings":"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","file":"lively-code-mirror-hint.js","sourcesContent":["/* JavaScript Hint */\n\nimport {uniq} from \"utils\"\n\nimport * as utils from \"utils\"\n\nvar Pos = CodeMirror.Pos;\n\nasync function scriptHint(editor, keywords, getToken, options) {\n  // Find the token at the cursor\n  var cur = editor.getCursor(), token = getToken(editor, cur);\n\n  // lively.notify('hint ' + cur.ch)\n  var firstTokenInLine = getToken(editor, Pos(cur.line, 1)) \n  if (firstTokenInLine.string == \"import\") {\n    return {list: await getCompletions(\n      {start: 9, end: cur.ch, string: editor.getLine(cur.line), state: token.state, type: null}, \n      null, keywords, options),\n          from: Pos(cur.line, 0),\n          to: Pos(cur.line, cur.ch)};\n  }\n  \n  if (/\\b(?:string|comment)\\b/.test(token.type)) return;\n  token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;\n\n  // If it's not a 'word-style' token, ignore the token.\n  if (!/^[\\w$_]*$/.test(token.string)) {\n    token = {start: cur.ch, end: cur.ch, string: \"\", state: token.state,\n             type: token.string == \".\" ? \"property\" : null};\n  } else if (token.end > cur.ch) {\n    token.end = cur.ch;\n    token.string = token.string.slice(0, cur.ch - token.start);\n  }\n\n  var tprop = token;\n  // If it is a property, find out what it is a property of.\n  while (tprop.type == \"property\") {\n    tprop = getToken(editor, Pos(cur.line, tprop.start));\n    if (tprop.string != \".\") return;\n    tprop = getToken(editor, Pos(cur.line, tprop.start));\n    if (!context) var context = [];\n    context.push(tprop);\n  }\n  return {list: await getCompletions(token, context, keywords, options),\n          from: Pos(cur.line, token.start),\n          to: Pos(cur.line, token.end)};\n}\n\nfunction javascriptHint(editor, options) {\n  return scriptHint(editor, javascriptKeywords,\n                    function (e, cur) {return e.getTokenAt(cur);},\n                    options);\n};\nCodeMirror.registerHelper(\"hint\", \"javascript\", javascriptHint);\n\nfunction getCoffeeScriptToken(editor, cur) {\n// This getToken, it is for coffeescript, imitates the behavior of\n// getTokenAt method in javascript.js, that is, returning \"property\"\n// type and treat \".\" as indepenent token.\n  var token = editor.getTokenAt(cur);\n  if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {\n    token.end = token.start;\n    token.string = '.';\n    token.type = \"property\";\n  }\n  else if (/^\\.[\\w$_]*$/.test(token.string)) {\n    token.type = \"property\";\n    token.start++;\n    token.string = token.string.replace(/\\./, '');\n  }\n  return token;\n}\n\nfunction coffeescriptHint(editor, options) {\n  return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);\n}\nCodeMirror.registerHelper(\"hint\", \"coffeescript\", coffeescriptHint);\n\nvar stringProps = (\"charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight \" +\n                   \"toUpperCase toLowerCase split concat match replace search\").split(\" \");\nvar arrayProps = (\"length concat join splice push pop shift unshift slice reverse sort indexOf \" +\n                  \"lastIndexOf every some filter forEach map reduce reduceRight \").split(\" \");\nvar funcProps = \"prototype apply call bind\".split(\" \");\nvar javascriptKeywords = (\"async await break case catch continue debugger default delete do else false finally for function \" +\n                \"if in instanceof new null return switch throw true try typeof var void while with\").split(\" \");\nvar coffeescriptKeywords = (\"and break catch class continue delete do else extends false finally for \" +\n                \"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes\").split(\" \");\n\nfunction forAllProps(obj, callback) {\n  if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {\n    for (var name in obj) callback(name)\n  } else {\n    for (var o = obj; o; o = Object.getPrototypeOf(o))\n      Object.getOwnPropertyNames(o).forEach(callback)\n  }\n}\n\nasync function getCompletions(token, context, keywords, options) {\n  var found = [], start = token.string, global = options && options.globalScope || window;\n  \n  // options.additionalContext = {\n  //   that: that,\n  //   \"this\": that\n  // }\n  \n  keywords.push(\"import\") //  #TODO move to right place  \n  \n  function maybeAdd(str) {\n    if (str.lastIndexOf(start, 0) == 0 && !found.includes(str)) found.push(str);\n  }\n  \n  function gatherCompletions(obj) {\n    if (typeof obj == \"string\") stringProps.forEach(maybeAdd);\n    else if (obj instanceof Array) arrayProps.forEach(maybeAdd);\n    else if (obj instanceof Function) funcProps.forEach(maybeAdd);\n    forAllProps(obj, maybeAdd)\n  }\n\n  function completeUtilsFunctions() {\n    Object.keys(utils).filter(ea => ea.startsWith(token.string)).forEach(utilFuncName => {\n      found.push({\n        text: utilFuncName,\n        displayText:\"util.\" +utilFuncName,\n        hint: (cm, self, data) => {\n          var offset = 0\n          cm.replaceRange(utilFuncName + \"()\",self.from, self.to)\n          var lines = cm.getValue().split(\"\\n\");\n          var imports = lines\n            .filter(ea => ea.match(/^import .*from ['\"]utils['\"];?/))\n          if (!imports.find(ea => ea.match(utilFuncName))) {\n            var utils = imports.find(ea => ea.match(/import {.*} from 'utils';/))\n            if (utils) {\n              var funcs = utils.replace(/.*{ */,\"\").replace(/ *}.*/,\"\").split(/ *, */)\n              funcs.push(utilFuncName)\n              lines = lines.map(ea => ea == utils ?  \n                  `import { ${funcs.sort().join(\", \")} } from 'utils';` : ea);\n              cm.setValue(lines.join(\"\\n\"))\n            } else {\n              var prefix = `import { ${utilFuncName} } from 'utils';\\n` \n              cm.setValue(prefix+ cm.getValue())\n              offset  += 1                  \n            }\n          }\n          cm.setCursor({line: self.from.line + offset, ch: self.from.ch + utilFuncName.length + \"(\".length})\n        }\n      })\n    });\n  }\n  \n  if (context && context.length) {\n    \n    // If this is a property, see if it belongs to some object we can\n    // find in the current environment.\n    var obj = context.pop(), base;\n    \n    if (obj.type && obj.type.indexOf(\"variable\") === 0) {\n      if (options && options.additionalContext)\n        base = options.additionalContext[obj.string];\n\n      if (base === undefined && obj && obj.string) {\n        // #TODO instead of doing a blackbox evaluation of a string, we could look into the various scopes... \n        // in the module or live prgoramming data structures... e.g. from AST with trace data such as #ContinuousEditor\n        // documentation: getDoitContext() and getTargetModule()\n        var result =  (await options.codemirror.boundEval(obj.string))\n        base = result.value\n      }\n      \n      if (!options || options.useGlobalScope !== false)\n        base = base || global[obj.string];\n    } else if (obj.type == \"string\") {\n      base = \"\";\n    } else if (obj.type == \"atom\") {\n      base = 1;\n    } else if (obj.type == \"function\") {\n      \n      // #TODO make it work for funciton calls such as pt(10,10), too.... \n      \n      if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&\n          (typeof global.jQuery == 'function'))\n        base = global.jQuery();\n      else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))\n        base = global._();\n    }\n    while (base != null && context.length)\n      base = base[context.pop().string];\n    if (base != null) gatherCompletions(base);\n  } else {       \n    if (token.string && (token.string == \"import\" || token.string.startsWith(\"import \"))) {\n      // #TODO make faster with index and caching\n      // but: #TODO what is the workflox / programming XP, we aim for?\n      var text = await searchImports()\n      var imports = text.split(\"\\n\")\n        .map(ea => ea.replace(/.*:/,\"\").replace(/;$/,\"\").replace(/\"/g,\"'\"))\n          .filter(ea => !ea.match('\\'\\.\\.?/'))\n        .filter(ea => ea.startsWith(\"import \")).sort()::uniq();\n      imports.forEach(maybeAdd)\n    } else {\n      let editor = options.codemirror.editor,\n        cur = editor.getCursor(),\n        prevToken = editor.getTokenAt({line: cur.line, ch: token.start - 0  }),\n        prevPrevToken = editor.getTokenAt({line: cur.line, ch: token.start - 1});\n      if ( prevToken.string == \":\" && prevPrevToken.string == \":\") {\n        completeUtilsFunctions()\n      } else {\n        // If not, just look in the global object and any local scope\n        // (reading into JS mode internals to get at the local and global variables)\n        for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);\n        for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);\n        if (!options || options.useGlobalScope !== false)\n          gatherCompletions(global);\n        keywords.forEach(maybeAdd);              \n      }\n    }\n    \n  }\n  return found;\n}\n\n\n\nvar importsCache\nvar importsCacheTime\n\nasync function searchImports() {\n\n  if (!importsCache || (Date.now() - importsCacheTime) > 5 * 60 * 1000 ) {\n    importsCacheTime = Date.now()\n    importsCache = await fetch(lively4url + \"/../_search/files\",  {\n        headers: { \n         \"searchpattern\": \"import\",\n         \"rootdirs\": lively4url.replace(/.*\\//,\"\"),\n         \"excludes\": \"node_modules,src/external,vendor/,lodash-bound.js\",\n      }}).then(r => r.text())   \n  }\n  return importsCache\n}\n\n// lively.bench(() => searchImports())\n\n"]}