{"version":3,"sources":["https://lively-kernel.org/lively4/swt21-debugging/src/components/widgets/lively-code-mirror-widget-import.js"],"names":["Morph","babelDefault","promisedEvent","through","generateUUID","uuid","babel","filesPromise","Promise","resolve","lively","lively4url","files","keys","SystemJS","filter","file","endsWith","replace","LivelyCodeMirrorWidgetImport","getAST","src","filename","transform","babelrc","plugins","presets","sourceFileName","moduleIds","sourceMaps","compact","comments","code","ast","resolveModuleSource","undefined","e","warn","createWidgetContainer","widget","createElement","assign","whiteSpace","importWidgetForRange","cm","m","from","to","marks","existingMarker","find","ea","notify","container","marker","replacedWith","create","importWidget","initWidget","initialize","evt","onModulePathKeyDown","fileList","get","modulePath","prepareFileList","then","forEach","appendChild","onFileChanged","success","input","range","on","posEq","a","b","direction","onEnter","inspector","inspect","hideWorkspace","enter","module","focus"],"mappings":"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","file":"lively-code-mirror-widget-import.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport babelDefault from 'systemjs-babel-build';\nconst babel = babelDefault.babel;\nimport { promisedEvent, through, uuid as generateUUID } from 'utils';\n\nconst filesPromise = new Promise(resolve => {\n  return lively.files.walkDir(lively4url)\n    .then(files => Object.keys(SystemJS['@@loader-config'].map)\n      .concat(files\n        .filter(file => file.endsWith('.js'))\n        .map(file => file.replace(lively4url, ''))\n      )\n    )\n    .then(resolve)\n})\n\nexport default class LivelyCodeMirrorWidgetImport extends Morph {\n\n  static getAST(src) {\n    try {\n      const filename = \"tempfile.js\"\n      // get pure ast\n      return babel.transform(src, {\n          babelrc: false,\n          plugins: [], // no need for any syntax plugins (other than the SystemJS internal) as we only parse import statements\n          presets: [],\n          filename: filename,\n          sourceFileName: filename,\n          moduleIds: false,\n          sourceMaps: false,\n          // inputSourceMap: load.metadata.sourceMap,\n          compact: false,\n          comments: false,\n          code: false,\n          ast: true,\n          resolveModuleSource: undefined\n      }).ast;\n    } catch(e) {\n      lively.warn('could not get ast for import statement', e);\n    }\n  }\n  \n  \n  static createWidgetContainer() {\n    var widget = document.createElement(\"span\")\n    Object.assign(widget.style, {\n      whiteSpace: \"normal\"\n    });\n    return widget;\n  }\n  \n  static async importWidgetForRange(cm, m) {\n    const ast = this.getAST(m[0]);\n    if(!ast) { return; }\n\n    const from = cm.editor.posFromIndex(m.index);\n    const to = cm.editor.posFromIndex(m.index + m[0].length);\n    \n    let marks = cm.editor.findMarks(from, to)\n    let existingMarker = marks.find(ea => ea.importWidget)\n    if (existingMarker) {\n      lively.notify(\"found import widget\")\n      // do we have to update it?\n      return\n    }\n\n    var container = this.createWidgetContainer();\n    // #TODO, we assume that it will keep the first widget, and further replacements do not work.... and get therefore thrown away\n    var marker = cm.editor.doc.markText(from, to, {\n      replacedWith: container\n    });\n    marker.importWidget = container\n    // lively.warn('return after container replacement')\n    // return;\n    await lively.create('lively-code-mirror-widget-import', container)\n      .then(importWidget => importWidget.initWidget(cm, m, ast, marker));\n  }\n\n  async initialize() {\n    this.windowTitle = \"LivelyCodeMirrorWidgetImport\";\n     \n    this.modulePath.addEventListener(\"keydown\", evt => this.onModulePathKeyDown(evt))\n  }\n  \n  get fileList() { return this.get('#fileList'); }\n  \n  get modulePath() { return this.get('#modulePath'); }\n\n  prepareFileList() {\n    filesPromise.then(files => {\n      const fileList = this.fileList;\n      files.forEach(file => {\n        fileList.appendChild(<option value={file}></option>);\n      })\n    })\n  }\n  \n  onFileChanged() {\n    lively.success('file changed to', this.modulePath.value)\n  }\n  \n  onModulePathKeyDown(evt) {\n    var input = this.modulePath\n    var range = this.marker.find()\n    if (evt.keyCode == 13) { // ENTER\n      // #TODO how to replace // update text without replacing widgets\n      // this.cm.editor.replaceRange(input.value, range.from, range.to) // @Stefan, your welcome! ;-)\n      // this.wrapLinks() // don't wait and do what you can now\n    }\n    if (evt.keyCode == 37) { // Left\n      if (input.selectionStart == 0) {\n        this.cm.editor.setSelection(range.from, range.from)\n        this.cm.focus()\n      }\n    }\n\n    if (evt.keyCode == 39) { // Right\n      if (input.selectionStart == input.value.length) {\n        this.cm.editor.setSelection(range.to, range.to)\n        this.cm.focus()\n      }\n    }    \n  }\n  \n  async initWidget(cm, m, ast, marker) {\n    this.cm = cm;\n    this.ast = ast;\n    this.marker = marker;\n    \n    // this.modulePath.onfocus= e => lively.notify('FOCUSSED')\n    // this.modulePath.onblur = e =>{\n    //   lively.notify('BLURRED')\n    // } \n    \n    this.prepareFileList();\n\n    CodeMirror.on(marker, \"beforeCursorEnter\", e => {\n      function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}\n      var direction = posEq(this.cm.editor.getCursor(), this.marker.find().from) ? 'left' : 'right';\n      this.cm.editor.widgetEnter = () => this.onEnter(direction);\n    });\n\n    await lively.create('lively-inspector', this)\n      .through(inspector => inspector.inspect(ast))\n      .through(inspector => inspector.hideWorkspace())\n    this.cm.editor.refresh()\n  }\n  \n  onEnter(direction) {\n    // lively.success('ENTER FROM ' + direction)\n    if (!this.marker.find()) {\n      this.cm.editor.refresh();\n    } else {\n      // setTimeout(() => {\n       this.enter(direction);\n      // }, 50);\n    }\n  }\n  \n  enter(direction) {\n    var module = this.modulePath;\n    // this.focus()\n    module.focus();\n    setTimeout(() => {\n      module.focus(); // #Hack, code mirror itself (match-highlighter, etc will snatch the focus... ok, make thatt that the body has it\n    }, 101);\n    // const position = direction === 'left' ? 0 : module.value.length;\n    // module.setSelectionRange(position, position);\n  }\n}\n"]}