{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-jsx/src/components/tools/lively-ast-explorer.js"],"names":["Morph","babelDefault","SyntaxChecker","sourcemap","generateUUID","uuid","debounce","flatmap","executeAllTestRunners","promisedEvent","babel","AstExplorer","defaultSourceURL","lively4url","defaultPluginURL","sourceEditor","get","sourceAstInspector","pluginEditor","transformedSourceEditor","sourceURL","getURLString","pluginURL","runTests","checked","value","initLivelyEditorFromAttribute","editor","attributeToRead","defaultPath","filePath","getAttribute","setURL","loadFile","initialize","windowTitle","awaitEditor","then","doSave","saveFile","lively","reloadModule","updateAST","addEventListener","event","setAttribute","detail","url","Promise","all","editorLoaded","enableSyntaxCheckForEditor","evt","checkForSyntaxErrors","on","onSourceSelectionChanged","onTransformedSourceSelectionChanged","dispatchEvent","CustomEvent","src","getValue","filename","syntaxPlugins","map","syntaxPlugin","System","import","m","default","ast","transform","babelrc","plugins","presets","sourceFileName","moduleIds","sourceMaps","compact","comments","code","resolveModuleSource","undefined","inspect","plugin","console","group","config","self","lively4lastSystemJSBabelConfig","error","myconfig","Object","assign","originalPluginURL","replace","filter","ea","livelyLocation","concat","result","err","setValue","notify","name","message","groupEnd","logNode","innerHTML","textContent","oldLog","log","fragments","call","join","transformedSource","modURL","swxURL","unloadModule","fetch","method","body","boundEval","e","livelyPrepareSave","livelyMigrate","other","originalPositionFor","line","column","smc","SourceMapConsumer","generatedPositionFor","source","mapEditorsFromToPosition","fromTextEditor","toTextEditor","backward","range","listSelections","start","anchor","ch","end","head","setSelection","setTimeout","isFocused"],"mappings":"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","file":"lively-ast-explorer.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport babelDefault from 'systemjs-babel-build';\nconst babel = babelDefault.babel;\nimport SyntaxChecker from 'src/client/syntax.js'\nimport sourcemap from 'src/external/source-map.min.js'\nimport { uuid as generateUUID, debounce, flatmap, executeAllTestRunners, promisedEvent } from 'utils';\n\nexport default class AstExplorer extends Morph {\n\n  static get defaultSourceURL() { return lively4url + \"/src/components/tools/lively-ast-explorer-example-source.js\"; }\n  static get defaultPluginURL() { return lively4url + \"/src/components/tools/lively-ast-explorer-example-plugin.js\"; }\n\n  get sourceEditor() { return this.get(\"#source\"); }\n  get sourceAstInspector() { return this.get(\"#sourceAst\") }\n  get pluginEditor() { return this.get(\"#plugin\"); }\n  get transformedSourceEditor() { return this.get(\"#transformedSource\"); }\n  get sourceURL() { return this.sourceEditor.getURLString(); }\n  get pluginURL() { return this.pluginEditor.getURLString(); }\n  \n  get runTests() { return this.get('#run-tests').checked; }\n  set runTests(value) { return this.get('#run-tests').checked = value; }\n\n  async initLivelyEditorFromAttribute(editor, attributeToRead, defaultPath) {\n    var filePath =  this.getAttribute(attributeToRead);\n    if (!filePath) {\n      filePath = defaultPath;\n    }\n    editor.setURL(filePath);\n    await editor.loadFile();\n  }\n\n  async initialize() {\n    this.windowTitle = \"AST Explorer\";\n\n    await this.initLivelyEditorFromAttribute(this.sourceEditor, 'source', AstExplorer.defaultSourceURL);\n    await this.initLivelyEditorFromAttribute(this.pluginEditor, 'plugin', AstExplorer.defaultPluginURL);\n\n    this.pluginEditor.awaitEditor().then(() => {\n      this.pluginEditor.get('#editor').doSave = async () => {\n        await this.pluginEditor.saveFile();\n\n        await lively.reloadModule(\"\" + this.pluginURL);\n        this.updateAST();\n      };\n    });\n    this.sourceEditor.awaitEditor().then(() => {\n      this.sourceEditor.get('#editor').doSave = async () => {\n        await this.sourceEditor.saveFile();\n        this.updateAST();\n      };\n    });\n    \n    this.pluginEditor.addEventListener('url-changed', async event => {\n      this.setAttribute(\"plugin\", event.detail.url);\n      this.updateAST();\n    });\n    this.sourceEditor.addEventListener('url-changed', async event => {\n      this.setAttribute(\"source\", event.detail.url);\n      this.updateAST();\n    });\n\n    await Promise.all([\n      this.pluginEditor.awaitEditor(), // Busy waiting for promise\n      // promisedEvent(this.pluginEditor.get('#editor'), \"editor-loaded\"),\n      this.sourceEditor.awaitEditor(),\n      // promisedEvent(this.sourceEditor.get('#editor'), \"editor-loaded\"),\n      this.transformedSourceEditor.editorLoaded() // check property, fallback to event; #TODO: which is better? Both have a problem: the component class has to be loaded first\n      //promisedEvent(this.outputEditor, \"editor-loaded\"),\n    ]);\n    \n    function enableSyntaxCheckForEditor(editor) {\n      editor.addEventListener(\"change\", (evt => SyntaxChecker.checkForSyntaxErrors(editor.editor))::debounce(200));\n    }\n    enableSyntaxCheckForEditor(this.sourceEditor.get('#editor'));\n    enableSyntaxCheckForEditor(this.pluginEditor.get('#editor'));\n    \n  \tthis.sourceEditor.get('#editor').editor.on(\"beforeSelectionChange\", evt => this.onSourceSelectionChanged(evt));\n    this.transformedSourceEditor.editor.on(\"beforeSelectionChange\", evt => this.onTransformedSourceSelectionChanged(evt));\n   \n    this.dispatchEvent(new CustomEvent(\"initialize\"));\n  }\n  \n  async updateAST() {\n    const src = this.sourceEditor.get('#editor').editor.getValue();\n    \n    const filename = \"tempfile.js\"\n\n    // #HACK: we explicitly enable some syntax plugins for now\n    // #TODO: how to include syntax extensions for ast generation (without the plugin to develop)?\n    const syntaxPlugins = (await Promise.all([\n      'babel-plugin-syntax-jsx',\n      'babel-plugin-syntax-do-expressions',\n      'babel-plugin-syntax-function-bind',\n      'babel-plugin-syntax-async-generators'\n    ]\n      .map(syntaxPlugin => System.import(syntaxPlugin))))\n      .map(m => m.default);\n\n    // get pure ast\n    this.ast = babel.transform(src, {\n        babelrc: false,\n        plugins: syntaxPlugins,\n        presets: [],\n        filename: filename,\n        sourceFileName: filename,\n        moduleIds: false,\n        sourceMaps: true,\n        // inputSourceMap: load.metadata.sourceMap,\n        compact: false,\n        comments: true,\n        code: true,\n        ast: true,\n        resolveModuleSource: undefined\n    }).ast;\n    this.sourceAstInspector.inspect(this.ast);\n\n    \n    // #TODO refactor\n    // this.pluginEditor.editor.getSession().setAnnotations([]);\n\n    var url = \"\" + this.pluginURL;\n    // url +=  \"?\" + Date.now(); // #HACK, we thought we don't have this to do any more, but ran into a problem when dealing with syntax errors...\n    // assumend problem: there is a bad version of the code in either the browser or system.js cache\n    // idea: we have to find and flush it...\n    // wip: the browser does not cache it, but system.js does...\n    const plugin = (await System.import(url)).default;\n    \n    try {\n      console.group(\"PLUGIN TRANSFORMATION\");\n      var config = {\n        babelrc: false,\n        plugins: [...syntaxPlugins, plugin],\n        presets: [],\n        filename: filename,\n        sourceFileName: filename,\n        moduleIds: false,\n        sourceMaps: true,\n        // inputSourceMap: load.metadata.sourceMap,\n        compact: false,\n        comments: true,\n        code: true,\n        ast: true,\n        resolveModuleSource: undefined\n      }\n      \n      if (this.get(\"#systemjs\").checked) {\n        // use SystemJS config do do a full transform\n        if (!self.lively4lastSystemJSBabelConfig) {\n          lively.error(\"lively4lastSystemJSBabelConfig missing\")\n          return\n        }\n        var myconfig = config;\n        config = Object.assign({}, self.lively4lastSystemJSBabelConfig)\n        var originalPluginURL = url.replace(/-dev/,\"\") // name of the original plugin .... the one without -dev\n        // replace the original plugin with the one under development.... e.g. -dev\n        config.plugins = config.plugins.filter(ea => !ea.livelyLocation || !(ea.livelyLocation == originalPluginURL))\n                          .concat([plugin])\n        config.filename = filename\n        config.sourceFileName = filename\n        config.moduleIds = false\n        \n      }\n      this.result = babel.transform(src, config);\n    } catch(err) {\n      console.error(err);\n      this.transformedSourceEditor.editor.setValue(\"Error transforming code: \" + err);\n   \n      // #TODO refactor\n      // #Feature Show Syntax errors in editor... should be generic\n//       this.pluginEditor.editor.getSession().setAnnotations(err.stack.split('\\n')\n//         .filter(line => line.match('updateAST'))\n//         .map(line => {\n//           let [row, column] = line\n//             .replace(/.*<.*>:/, '')\n//             .replace(/\\)/, '')\n//             .split(':')\n//           return {\n//             row: parseInt(row) - 1, column: parseInt(column), text: err.message, type: \"error\"\n//           }\n//         }));\n      \n      lively.notify(err.name, err.message, 5, () => {}, 'red');\n      return;\n    } finally {\n      console.groupEnd();\n    }\n    \n    this.transformedSourceEditor.editor.setValue(this.result.code);\n    \n    let logNode = this.get(\"#result\");\n    logNode.innerHTML = \"\";\n    logNode.textContent = \"\";\n    if (this.get(\"#live\").checked) {\n      var oldLog = console.log\n      try {\n        console.group(\"EXECUTE REWRITTEN FILE\");\n        console.log = (...fragments) => {\n          oldLog.call(console, ...fragments)\n          //typeof fragments[i] === \"string\"\n          // let toPrint = fragments::flatmap((obj, i) => {\n          //   return [<p>{obj}</p>];\n          // });\n          // logNode.appendChild(<div>{toPrint[0]}</div>)\n          logNode.textContent += fragments.join(', ') + \"\\n\"\n        }\n        // #TODO active expressions...\n        var transformedSource = this.transformedSourceEditor.editor.getValue()\n        if (this.get(\"#systemjs\").checked) {\n          // use systemjs to load it's module without any further transformation\n          var url = \"tmp://\" + filename // replace this with local TMP \n          \n          var modURL = lively.swxURL(url)\n          await lively.unloadModule(modURL)\n          await fetch(url, {\n            method: \"PUT\",\n            body: transformedSource \n          })\n          await System.import(modURL)\n        } else {\n          var result ='' + (await this.transformedSourceEditor.boundEval(transformedSource)).value;\n        }\n        \n        // var result ='' + eval(this.outputEditor.editor.getValue());\n        this.get(\"#result\").textContent += \"-> \" + result;       \n      } catch(e) {\n        console.error(e);\n        this.get(\"#result\").textContent += \"Error: \" + e\n      } finally {\n        console.log = oldLog\n        console.groupEnd();\n      }\n    }\n    \n    if(this.runTests) {\n      executeAllTestRunners();\n    }\n  }\n  \n  livelyPrepareSave() {\n    this.setAttribute('source', this.sourceURL);\n    this.setAttribute('plugin', this.pluginURL);\n    console.log(\"PREPARE SAVE\", this.getAttribute('source'), this.getAttribute('plugin'));\n  }\n  \n  livelyMigrate(other) {\n    // #TODO: do we still need this?\n    this.addEventListener(\"initialize\", () => {\n      this.transformedSourceEditor.editor.setValue(other.transformedSourceEditor.editor.getValue()); \n      this.result = other.result;\n      this.runTests = other.runTests;\n      this.updateAST();\n    });\n  }\n\n  originalPositionFor(line, column) {\n    var smc =  new sourcemap.SourceMapConsumer(this.result.map)\n    return smc.originalPositionFor({\n      line: line,\n      column: column\n    })\n  }\n  \n  generatedPositionFor(line, column) {\n    if (!this.result || !this.result.map) return; \n    var smc =  new sourcemap.SourceMapConsumer(this.result.map)\n    return smc.generatedPositionFor({\n      source: \"tempfile.js\",\n      line: line,\n      column: column\n    });\n  }\n  \n  mapEditorsFromToPosition(fromTextEditor, toTextEditor, backward) {\n    if (backward == true) {\n      var method = \"originalPositionFor\"\n    } else {\n      method = \"generatedPositionFor\"\n    }\n    var range = fromTextEditor.listSelections()[0]\n    var start = this[method](range.anchor.line + 1, range.anchor.ch + 1)\n    var end = this[method](range.head.line + 1, range.head.ch + 1)\n\n    //lively.notify(`start ${range.anchor.line} ch ${range.anchor.ch} ->  ${start.line} ch ${start.column} / end ${range.head.line} ch ${range.head.ch} -> ${end.line} c ${end.column}`)\n    if (!start || !end) return;\n\n    toTextEditor.setSelection(\n      {line: start.line - 1, ch:start.column - 1}, {line: end.line -  1, ch: end.column - 1})\n  }\n  \n  onSourceSelectionChanged(evt) {\n    setTimeout(() => {\n      if(this.sourceEditor.get('#editor').isFocused()) {\n        this.mapEditorsFromToPosition(\n          this.sourceEditor.get('#editor').editor, this.transformedSourceEditor.editor, false)\n      }\n    }, 0);\n  }\n  onTransformedSourceSelectionChanged(evt) {\n    setTimeout(() => {\n      if(this.transformedSourceEditor.isFocused()) {\n        this.mapEditorsFromToPosition(\n          this.transformedSourceEditor.editor, this.sourceEditor.get('#editor').editor, true)\n      }\n    }, 0);\n  }\n}\n"]}