{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/components/tools/lively-plugin-explorer.js"],"names":["Morph","babelDefault","SyntaxChecker","sourcemap","generateUUID","uuid","debounce","flatmap","executeAllTestRunners","promisedEvent","TraceVisualization","files","babel","PluginExplorer","defaultPluginURL","lively4url","defaultWorkspacePath","container","get","executionConsole","sourceEditor","sourceLCM","livelyCodeMirror","sourceCM","editor","sourceText","getValue","sourceAstInspector","transformedAstInspector","pluginEditor","pluginLCM","pluginCM","currentEditor","pluginSource","getPlugin","url","pluginURL","fullUrl","module","System","import","plugin","default","modifiedPlugin","args","result","name","transformedSourceLCM","transformedSourceCM","transformedSourceText","getURLString","workspacePathInput","workspaceURL","value","urlString","onWorkspacePathInputEntered","loadWorkspaceFile","saveDevToMasterButton","displaySaveDevToMasterIfAppropriate","backupPluginURL","workspace","style","display","saveWorkspaceButton","autoSaveWorkspace","bool","classList","toggle","onSaveWorkspace","evt","button","toggleOption","saveWorkspace","updateASTButton","autoUpdateAST","getOption","querySelector","onUpdateAST","updateAST","updateTransformationButton","autoUpdateTransformation","onUpdateTransformation","updateTransformation","runTestsButton","autoRunTests","onRunTests","runTests","executeButton","autoExecute","onExecute","execute","systemJSButton","systemJS","onToggleSystemJs","onDebug","for","pluginSelection","map","data","lively","notify","defaultWorkspace","source","sources","options","optionDefaults","openPlugin1s","extendFileChooserForWorkspaces","chooser","getMenuElements","newFile","JSON","stringify","undefined","updateView","onNewWorkspace","openComponentInWindow","fileName","chooseFile","onSaveDevToMaster","saveFile","setOption","option","loadOptions","Object","entries","initOptions","startsWith","paths","normalizePath","e","initialize","windowTitle","registerButtons","getAllSubmorphs","forEach","addEventListener","preventDefault","stopPropagation","currentTarget","dispatchEvent","MouseEvent","debouncedUpdateAST","debouncedUpdateTransformation","enableSyntaxCheckForEditor","checkForSyntaxErrors","awaitEditor","then","hideToolbar","doSave","reloadModule","on","onTransformedSourceSelectionChanged","editorLoaded","connectLivelyCodeMirror","onSourceSelectionChanged","code","Promise","all","updateTransformedAST","CustomEvent","loadFile","URL","response","fetch","text","error","contents","method","body","ws","parse","loadWorkspace","loadSourceFile","setURL","loadPluginFile","changeSelectedPlugin","saveWorkspaceFile","updatePluginTabs","changeSelectedSource","updateSourceTabs","openEditable","openPlugins","includes","push","updateAllTabs","appendTab","className","parent","changeTo","removeUrl","split","last","close","tab","appendChild","_","updateTabs","tabListElement","list","selectedURL","innerHTML","activeTabFound","length","index","indexOf","splice","newUrl","Math","min","max","path","content","prompt","dialog","sleep","input","s","m","match","select","setSelectionRange","extendFileChooserForSourceFiles","addButton","replace","onSelectPlugins","elm","pluginExplorer","savePluginSelection","selection","ast","toAST","inspect","Error","message","updateAndExecute","plugins","eval","console","group","self","lively4lastSystemJSBabelConfig","config","assign","originalPluginURL","filter","ea","livelyLocation","concat","filename","sourceFileName","moduleIds","transformationResult","transform","sourceMaps","wrapPluginVisitorMethod","pluginAlias","visitorType","callback","log","stack","groupEnd","textContent","oldLog","fragments","call","join","transformedSource","modURL","swxURL","unloadModule","boundEval","document","querySelectorAll","originalPositionFor","line","column","smc","SourceMapConsumer","generatedPositionFor","mapEditorsFromToPosition","fromTextEditor","toTextEditor","backward","positionFor","range","listSelections","start","anchor","ch","end","head","setSelection","setTimeout","isFocused","livelyPrepareSave","setAttribute","BabelWorkspace","serialize","livelyMigrate","other","setValue","runsTests","livelyExample","Source","_name","str","LocalSource","constructor","getContent","setContent","FileSource","normalizedPath","ok","deserialize","json","key","type"],"mappings":"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","file":"lively-plugin-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';\nimport TraceVisualization from 'src/components/tools/trace-visualization.js';\nimport files from \"src/client/files.js\"\n\n\nexport default class PluginExplorer extends Morph {\n\n    static get defaultPluginURL() { return lively4url + \"/src/components/tools/lively-ast-explorer-example-plugin.js\"; }\n\n    static get defaultWorkspacePath() { return \"/src/components/tools/lively-plugin-explorer-playground.workspace\"; }\n\n    /*MD ## UI Accessing MD*/\n\n    get container() { return this.get(\"#content\"); }\n\n    get executionConsole() { return this.get(\"#executionConsole\"); }\n\n    \n    get sourceEditor() { return this.get(\"#source\"); }\n    get sourceLCM() { return this.sourceEditor.livelyCodeMirror(); }\n    get sourceCM() { return this.sourceLCM.editor; }\n    get sourceText() { return this.sourceCM.getValue(); }\n\n    get sourceAstInspector() { return this.get(\"#sourceAst\"); }\n\n    get transformedAstInspector() { return this.get(\"#transformedAst\"); }\n\n\n    get pluginEditor() { return this.get(\"#plugin\"); }\n    get pluginLCM() { return this.pluginEditor.livelyCodeMirror(); }\n    get pluginCM() { return this.pluginEditor.currentEditor(); }\n    get pluginSource() { return this.pluginCM.getValue(); }\n\n    async getPlugin(url = this.pluginURL) {\n        url = this.fullUrl(url) || \"\";\n        const module = await System.import(url);\n\n        // we know no better way to get the plugin-file now, so we append the path to it to the name\n        // and can read it from there later on\n        const plugin = module.default;\n        const modifiedPlugin = function(...args) {\n            const result = plugin(...args)\n            result.name = result.name || 'Please name your plugin!';\n            result.name += ' ' + url\n            return result;\n        }\n\n        return modifiedPlugin;\n    }\n\n    get transformedSourceLCM() { return this.get(\"#transformedSource\"); }\n    get transformedSourceCM() { return this.transformedSourceLCM.editor; }\n    get transformedSourceText() { return this.transformedSourceCM.getValue(); }\n\n    get pluginURL() { return this.pluginEditor.getURLString(); }\n\n    get workspacePathInput() { return this.get(\"#workspace-path\"); }\n    get workspaceURL() { return this.workspacePathInput.value; }\n    set workspaceURL(urlString) { this.workspacePathInput.value = urlString; }\n    onWorkspacePathInputEntered(urlString) { this.loadWorkspaceFile(urlString); }\n    \n    get saveDevToMasterButton() { return this.get('#saveDevToMaster'); }\n    \n    displaySaveDevToMasterIfAppropriate() {\n        const backupPluginURL = 'demos/tom/plugin-backup.js';\n        if(this.workspace.plugin === backupPluginURL) {\n            this.saveDevToMasterButton.style.display = 'block';\n        } else {\n            this.saveDevToMasterButton.style.display = 'none';\n        }\n    }\n\n    /*MD ## Workspace Options MD*/\n\n    get saveWorkspaceButton() { return this.get(\"#saveWorkspace\"); }\n    get autoSaveWorkspace() { return false; } //TODO\n    set autoSaveWorkspace(bool) {\n        this.saveWorkspaceButton.classList.toggle(\"on\", bool);\n    }\n    onSaveWorkspace(evt) {\n        if (evt.button === 2) {\n            this.toggleOption(\"autoSaveWorkspace\");\n        } else {\n            this.saveWorkspace();\n        }\n    }\n\n    get updateASTButton() { return this.get(\"#updateAST\"); }\n    get autoUpdateAST() { return this.getOption(\"autoUpdateAST\"); }\n    set autoUpdateAST(bool) {\n        this.updateASTButton.classList.toggle(\"on\", bool);\n        this.updateASTButton.querySelector(\"i\").classList.toggle(\"fa-spin\", bool);\n    }\n    onUpdateAST(evt) {\n        if (evt.button === 2) {\n            this.toggleOption(\"autoUpdateAST\");\n        } else {\n            this.updateAST();\n        }\n    }\n\n    get updateTransformationButton() { return this.get(\"#updateTransformation\"); }\n    get autoUpdateTransformation() { return this.getOption(\"autoUpdateTransformation\"); }\n    set autoUpdateTransformation(bool) {\n        this.updateTransformationButton.classList.toggle(\"on\", bool);\n        this.updateTransformationButton.querySelector(\"i\").classList.toggle(\"fa-spin\", bool);\n    }\n    onUpdateTransformation(evt) {\n        if (evt.button === 2) {\n            this.toggleOption(\"autoUpdateTransformation\");\n        } else {\n            this.updateTransformation();\n        }\n    }\n\n    get runTestsButton() { return this.get(\"#runTests\"); }\n    get autoRunTests() { return this.getOption(\"autoRunTests\"); }\n    set autoRunTests(bool) {\n        this.runTestsButton.classList.toggle(\"on\", bool);\n    }\n    onRunTests(evt) {\n        if (evt.button === 2) {\n            this.toggleOption(\"autoRunTests\");\n        } else {\n            this.runTests();\n        }\n    }\n\n    get executeButton() { return this.get(\"#execute\"); }\n    get autoExecute() { return this.getOption(\"autoExecute\"); }\n    set autoExecute(bool) {\n        this.executeButton.querySelector(\"i\").classList.toggle(\"fa-spin\", bool);\n        this.executeButton.classList.toggle(\"on\", bool);\n    }\n    onExecute(evt) {\n        if (evt.button === 2) {\n            this.toggleOption(\"autoExecute\");\n        } else {\n            this.execute();\n        }\n    }\n\n    get systemJSButton() { return this.get(\"#toggleSystemJS\"); }\n    get systemJS() { return this.getOption(\"systemJS\"); }\n    set systemJS(bool) {\n        this.systemJSButton.classList.toggle(\"on\", bool);\n    }\n    onToggleSystemJs() { \n        this.toggleOption(\"systemJS\");\n        this.updateAST();\n    }\n\n    onDebug() {\n        if (!this.getOption(\"systemJS\")) {\n            TraceVisualization.for(this.sourceText, this.workspace.pluginSelection.map(({url, data}) => {\n                return {url: this.fullUrl(url), data: data};\n            }));\n        } else {\n            lively.notify(\n                'Visualization does not work together with global SystemJS config. Please disable to use this feature.'\n            );\n        }\n\n    }\n    \n    get defaultWorkspace() {\n        return {\n            source: '/src/components/tools/lively-ast-explorer-example-source.js',\n            sources: ['/src/components/tools/lively-ast-explorer-example-source.js'],\n            options: this.optionDefaults,\n            plugin: 'src/external/babel-plugin-locals.js',\n            openPlugin1s: ['src/external/babel-plugin-locals.js'],\n            pluginSelection: []\n        }\n    }\n    \n    extendFileChooserForWorkspaces(chooser) {\n        chooser.getMenuElements = () => {\n            return [['new workspace-file...', async () => {\n                await this.newFile(chooser.get('#navbar').url  + \"newfile.workspace\", JSON.stringify(this.defaultWorkspace, undefined, 2))\n                chooser.updateView()\n            }]]\n        }\n    }\n    \n    async onNewWorkspace() {\n        let chooser = await lively.openComponentInWindow(\"file-chooser\");\n        this.extendFileChooserForWorkspaces(chooser);\n        const fileName = await chooser.chooseFile(lively4url + '/');\n        \n        if(fileName) {\n            this.loadWorkspaceFile(fileName);\n        }\n    }\n    \n    onSaveDevToMaster() {\n        this.saveFile(this.fullUrl('/demos/tom/babel-plugin-tracer.js'), this.pluginSource);\n        lively.notify('Saved current plugin version in /demos/tom/babel-plugin-tracer.js');\n    }\n\n    /*MD ## Options MD*/\n\n    setOption(option, value) {\n        this.workspace.options[option] = value;\n        this[option] = value;\n    }\n\n    getOption(option) {\n        if (option in this.workspace.options) {\n            return this.workspace.options[option];\n        } else {\n            return this.optionDefaults[option];\n        }\n    }\n\n    toggleOption(option) {\n        this.setOption(option, !this.getOption(option));\n    }\n\n    loadOptions(options) {\n        for (const [option, value] of Object.entries(options)) {\n            this.setOption(option, value);\n        }\n    }\n\n    initOptions() {\n        for (const [option, value] of Object.entries(this.optionDefaults)) {\n            this[option] = value;\n        }\n    }\n\n    get optionDefaults() {\n        return {\n            \"systemJS\": false,\n            \"autoExecute\": true,\n            \"autoRunTests\": false,\n            \"autoUpdateAST\": true,\n            \"autoUpdateTransformation\": true,\n            \"autoSaveWorkspace\": true,\n        }\n    }\n\n    /*MD ## Initialization MD*/\n\n    fullUrl(urlString) {\n        try {\n            if(!urlString.startsWith(lively4url) && urlString[0] !== '/') {\n                urlString = '/' + urlString;\n            }\n            return lively.paths.normalizePath(urlString, \"\");\n        } catch (e) {\n            return null;\n        }\n    }\n\n    async initialize() {\n        this.windowTitle = \"Plugin Explorer\";\n        this.registerButtons();\n\n        this.workspace = {\n            options: {}\n        };\n\n        this.initOptions();\n\n        this.getAllSubmorphs(\"button\").forEach(button => {\n            button.addEventListener('contextmenu', e => {\n                e.preventDefault();\n                e.stopPropagation();\n                e.currentTarget.dispatchEvent(new MouseEvent(\"click\", { button: 2 }));\n            });\n        });\n\n        this.debouncedUpdateAST = this.updateAST::debounce(500);\n        this.debouncedUpdateTransformation = this.updateTransformation::debounce(500);\n\n        function enableSyntaxCheckForEditor(editor) {\n            editor.addEventListener(\"change\", (evt => SyntaxChecker.checkForSyntaxErrors(editor.editor))::debounce(\n                200));\n        }\n\n        this.pluginEditor.awaitEditor().then(() => {\n            this.pluginEditor.hideToolbar();\n            this.pluginLCM.doSave = async () => {\n                await this.pluginEditor.saveFile();\n\n                await lively.reloadModule(\"\" + this.pluginURL);\n                this.updateAST();\n            };\n            enableSyntaxCheckForEditor(this.pluginLCM);\n            // this.pluginLCM.addEventListener(\"change\", evt => {if (this.autoUpdate) this.debouncedUpdateTransformation()});\n            this.transformedSourceCM.on(\"beforeSelectionChange\", evt => this.onTransformedSourceSelectionChanged(\n                evt));\n        });\n\n        this.sourceLCM.editorLoaded().then(() => {\n            this.sourceAstInspector.connectLivelyCodeMirror(this.sourceLCM);\n            this.sourceLCM.doSave = async () => {\n                // TODO: Save source\n                this.updateAST();\n            };\n            enableSyntaxCheckForEditor(this.sourceLCM);\n            this.sourceLCM.addEventListener(\"change\", evt => { if (this.autoUpdateAST) this.debouncedUpdateAST() });\n            this.sourceCM.on(\"beforeSelectionChange\", evt => this.onSourceSelectionChanged(evt));\n        });\n\n        this.workspacePathInput.addEventListener(\"keyup\", evt => {\n            if (evt.code == \"Enter\") this.onWorkspacePathInputEntered(this.workspacePathInput.value);\n        });\n\n        await Promise.all([\n            this.pluginEditor.awaitEditor(),\n            this.sourceLCM.editorLoaded(),\n            this.transformedSourceLCM.editorLoaded().then(() => {\n                this.transformedAstInspector.connectLivelyCodeMirror(this.transformedSourceLCM);\n                this.transformedSourceLCM.doSave = async () => {\n                    // TODO: Save source\n                    this.updateTransformedAST();\n                };\n            }),\n        ]);\n\n        this.dispatchEvent(new CustomEvent(\"initialize\"));\n        \n        this.sourceEditor.hideToolbar();\n    }\n\n    async loadFile(urlString) {\n        try {\n            const url = new URL(this.fullUrl(urlString));\n            const response = await fetch(url);\n            return response.text();\n        } catch (e) {\n            lively.error(`Failed to load file '${urlString}'`);\n            return null;\n        }\n    }\n\n    async saveFile(urlString, contents) {\n        try {\n            const url = new URL(this.fullUrl(urlString));\n            await fetch(url, {\n                method: 'PUT',\n                body: contents,\n            });\n        } catch (e) {\n            lively.error(`Failed to save file '${urlString}'`);\n        }\n    }\n\n    async loadWorkspaceFile(urlString) {\n        try {\n            const text = await this.loadFile(urlString);\n            const ws = JSON.parse(text);\n            this.workspacePathInput.value = urlString;\n            this.loadWorkspace(ws);\n        } catch (e) {\n            lively.error(`Failed to load workspace '${urlString}'`);\n        }\n    }\n    \n    loadSourceFile(url) {\n        this.sourceEditor.setURL(new URL(this.fullUrl(url)));\n        this.sourceEditor.loadFile();\n    }\n\n    loadPluginFile(url) {\n        this.pluginEditor.setURL(new URL(this.fullUrl(url)));\n        this.pluginEditor.loadFile();\n    }\n\n    changeSelectedPlugin(url) {\n        this.workspace.plugin = url;\n        this.saveWorkspaceFile(this.workspaceURL);\n        this.loadPluginFile(this.workspace.plugin);\n        \n        this.displaySaveDevToMasterIfAppropriate();\n        this.updatePluginTabs();\n    }\n    \n    changeSelectedSource(url) {\n        this.workspace.source = url;\n        this.saveWorkspaceFile(this.workspaceURL);\n        this.loadSourceFile(this.workspace.source);\n        \n        this.updateSourceTabs();\n    }\n    \n    openEditable(url) {\n        if(!this.workspace.openPlugins.includes(url)) {\n            this.workspace.openPlugins.push(url);\n        }\n        \n        this.changeSelectedPlugin(url);\n    }\n\n    async loadWorkspace(ws) {\n        this.workspace = ws;\n        this.loadOptions(ws.options);\n        this.loadPluginFile(ws.plugin);\n        this.loadSourceFile(ws.source);\n        \n        this.displaySaveDevToMasterIfAppropriate();\n        \n        this.updateAllTabs();\n    }\n\n    async saveWorkspaceFile(urlString) {\n        try {\n            const text = JSON.stringify(this.workspace, undefined, 2);\n            this.saveFile(urlString, text);\n        } catch (e) {\n            lively.error(`Failed to save workspace '${urlString}'`);\n        }\n    }\n\n    async saveWorkspace() {\n        // this.pluginEditor.saveFile();\n        this.saveWorkspaceFile(this.workspaceURL);\n    }\n\n    /*MD # Plugin & source selection MD*/\n\n    appendTab(url, className, parent, changeTo, removeUrl) {\n        const name = url.split('/').last;\n        \n        const close = <i class=\"fa fa-window-close\"></i>;\n        const tab = <div class={className} title={url}>{name} {close}</div>;\n        parent.appendChild(tab);\n\n        tab.addEventListener('click', _ => {\n            changeTo(url);\n        });\n        \n        close.addEventListener('click', e => {\n            e.stopPropagation();\n            removeUrl(url);\n        }) \n        \n        return tab;\n    }\n    \n    updateAllTabs() {\n        this.updatePluginTabs();\n        this.updateSourceTabs();\n    }\n    \n    updateTabs(tabListElement, list, selectedURL, changeTo, removeUrl) {\n        tabListElement.innerHTML = '';\n        \n        let activeTabFound = false;\n        for (const url of list) {\n            let className = 'tab';\n            if(selectedURL === url) {\n                className += ' active';\n                activeTabFound = true;\n            }\n            this.appendTab(url, className, tabListElement, changeTo, removeUrl);\n        }\n        \n        if(!activeTabFound) {\n            this.appendTab(selectedURL, 'tab notListed', tabListElement, changeTo, removeUrl);\n        }\n    }\n    \n    updatePluginTabs() {\n        this.updateTabs(this.get('#plugin-tabs'), \n                        this.workspace.openPlugins, \n                        this.workspace.plugin,\n                        url => {\n                            this.changeSelectedPlugin(url);\n                            this.updatePluginTabs();\n                        },\n                        url => {\n                            const list = this.workspace.openPlugins;\n                            if(list.length === 1) {\n                                lively.notify('Cannot close all tabs!');\n                                return;\n                            }\n            \n                            const index = list.indexOf(url);\n            \n                            if (index !== -1) {\n                                list.splice(index, 1);\n                            }\n            \n                            if (url === this.workspace.plugin) {\n                                let newUrl;\n                                if (index === -1) {\n                                    newUrl = list.last;\n                                } else {\n                                    newUrl = list[Math.min(Math.max(index-1, 0), list.length-1)];\n                                }\n                                \n                                this.changeSelectedPlugin(newUrl);\n                                return;\n                            }\n            \n                            this.saveWorkspace();\n                            this.updatePluginTabs();\n                      });\n    }\n    \n    \n    // copied from /src/components/tools/lively-container.js#newFile\n    async newFile(path, content) {\n        const fileName = await lively.prompt('Please enter the name of the file', path, async dialog => {\n            // select the filename in the path...\n            await lively.sleep(100) // wait for the new file\n            var input = dialog.get(\"input\")\n            var s = input.value\n            var m = s.match(/([^/.]*)([^/]*)$/)\n            input.select()\n            input.setSelectionRange(m.index,m.index + m[1].length)      \n        });\n        \n        if(!fileName) {\n            return null;\n        }\n        \n        await files.saveFile(fileName, content);\n        lively.notify(\"created \" + fileName);\n        \n        return fileName;\n    }\n    \n    extendFileChooserForSourceFiles(chooser) {\n         chooser.getMenuElements = () => {\n             return [['new source-file...', async () => {\n                await this.newFile(chooser.get('#navbar').url  + \"newfile.js\", '');\n                chooser.updateView()\n            }]];\n         }\n    }\n    \n    updateSourceTabs() {\n        const tabListElement = this.get('#source-tabs');\n        this.updateTabs(tabListElement, \n                        this.workspace.sources, \n                        this.workspace.source,\n                        url => {\n                            this.changeSelectedSource(url);\n                            this.updateSourceTabs();\n                        },\n                        url => {\n                            const list = this.workspace.sources;\n            \n                            if(list.length === 1) {\n                                lively.notify('Cannot close all tabs!');\n                                return;\n                            }\n            \n                            const index = list.indexOf(url);\n                            if (index !== -1) {\n                                list.splice(index, 1);  \n                            }\n            \n                            if (url === this.workspace.source) {\n                                let newUrl;\n                                if (index === -1) {\n                                    newUrl = list.last;\n                                } else {\n                                    newUrl = list[Math.min(Math.max(index-1, 0), list.length-1)];\n                                }\n                                \n                                this.changeSelectedSource(newUrl);\n                                return;\n                            }\n            \n                            this.saveWorkspace();\n                            this.updateSourceTabs();\n                        });\n        \n        const addButton = <button><i class=\"fa fa-plus-square\"/></button>;\n      \n        addButton.addEventListener('click', async e => {\n            let chooser = await lively.openComponentInWindow(\"file-chooser\");\n            this.extendFileChooserForSourceFiles(chooser);\n            let fileName = await chooser.chooseFile(lively4url + '/');\n            fileName = fileName.replace(lively4url, '');\n            \n            if(fileName) {\n                this.changeSelectedSource(fileName);\n                if(!this.workspace.sources.includes(fileName)) {\n                    this.workspace.sources.push(fileName);\n                    this.saveWorkspace();\n                }\n            }\n            \n            this.updateSourceTabs();\n        });\n        tabListElement.appendChild(addButton);\n    }\n    \n    onSelectPlugins() {\n        lively.openComponentInWindow('plugin-selector')\n            .then(elm => elm.pluginExplorer = this);\n    }\n\n    savePluginSelection(selection) {\n        this.workspace.pluginSelection = selection;\n        this.saveWorkspace();\n        \n        this.updateAllTabs();\n    }\n    /*MD ## Execution MD*/\n\n    async updateAST() {\n        try {\n            let ast = this.sourceText.toAST();\n            this.sourceAstInspector.inspect(ast);\n            if (this.autoUpdateTransformation) this.updateTransformation(ast);\n        } catch (e) {\n            this.sourceAstInspector.inspect({ Error: e.message });\n        }\n        this.updateTransformedAST();\n    }\n\n    async updateTransformedAST() {\n        try {\n            let ast = this.transformedSourceText.toAST();\n            this.transformedAstInspector.inspect(ast);\n        } catch (e) {\n            this.transformedAstInspector.inspect({ Error: e.message });\n        }\n    }\n\n    updateAndExecute(code) {\n        this.transformedSourceLCM.value = code;\n\n        if (this.autoExecute) this.execute();\n        if (this.autoRunTests) this.runTests();\n    }\n\n    async updateTransformation(ast) {\n        const selection = this.workspace.pluginSelection;\n        const plugins = await Promise.all(selection.map(({ url, data }) => {\n            let options;\n            let result = this.getPlugin(url);\n            \n            if(data) {\n                try {\n                    options = eval(data)\n                } catch(e) {\n                    lively.notify(`Could not evaluate options for: ${url}.`);\n                    lively.error(e);\n                }\n\n                if(options) {\n                    result = [result, options];\n                }\n            }\n            \n            \n            return result;\n        }));\n        \n        try {\n            console.group(\"PLUGIN TRANSFORMATION\");\n            if (!ast) return;\n            if (this.systemJS) {\n                // use SystemJS config do do a full transform\n                if (!self.lively4lastSystemJSBabelConfig) {\n                    lively.error(\"lively4lastSystemJSBabelConfig missing\");\n                    return;\n                }\n                \n                let config = Object.assign({}, self.lively4lastSystemJSBabelConfig);\n                let url = this.fullUrl(this.pluginURL) || \"\";\n                let 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 ==\n                        originalPluginURL))\n                    .concat(plugins)\n                let filename = \"tempfile.js\";\n                config.filename = filename\n                config.sourceFileName = filename\n                config.moduleIds = false\n                this.transformationResult = babel.transform(this.sourceText, config);\n            } else {\n                const config = {};\n                \n                config.plugins = plugins;\n\n                const filename = 'tempfile.js';\n                config.sourceFileName = filename\n                config.moduleIds = false;\n                config.sourceMaps = true;\n\n\n                // here for documenting the babel hook\n                config.wrapPluginVisitorMethod = (pluginAlias, visitorType, callback) => {\n                    return (...args) => {\n                        console.log(pluginAlias, visitorType)\n                        callback(...args);\n                    }\n                };\n\n                this.transformationResult = babel.transform(this.sourceText, config);\n            }\n            \n            this.updateAndExecute(this.transformationResult.code);\n\n\n        } catch (e) {\n            console.error(e);\n            this.transformedSourceLCM.value = e.stack;\n        } finally {\n            console.groupEnd();\n        }\n    }\n\n    async execute() {\n        const log = this.executionConsole;\n        log.innerHTML = \"\";\n        log.textContent = \"\";\n\n        const oldLog = console.log\n        try {\n            console.group(\"[Plugin Explorer] EXECUTE REWRITTEN FILE\");\n            console.log = (...fragments) => {\n                oldLog.call(console, ...fragments)\n                log.textContent += fragments.join(', ') + \"\\n\"\n            }\n            // #TODO active expressions...\n            var transformedSource = this.transformedSourceCM.getValue()\n            if (this.systemJS) {\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.transformedSourceLCM.boundEval(transformedSource)).value;\n            }\n\n            // var result ='' + eval(this.outputEditor.editor.getValue());\n            this.executionConsole.textContent += \"-> \" + result;\n        } catch (e) {\n            console.error(e);\n            this.executionConsole.textContent += e.stack;\n        } finally {\n            console.log = oldLog\n            console.groupEnd();\n        }\n    }\n\n    async runTests() {\n        if(document.querySelectorAll('lively-testrunner').length === 0) {\n            await lively.openComponentInWindow('lively-testrunner');\n        }\n        executeAllTestRunners();\n    }\n\n    /*MD ## Mapping Sources MD*/\n\n    originalPositionFor(line, column) {\n        var smc = new sourcemap.SourceMapConsumer(this.transformationResult.map)\n        return smc.originalPositionFor({\n            line: line,\n            column: column\n        })\n    }\n\n    generatedPositionFor(line, column) {\n        if (!this.transformationResult || !this.transformationResult.map) return;\n        var smc = new sourcemap.SourceMapConsumer(this.transformationResult.map)\n        return smc.generatedPositionFor({\n            source: \"tempfile.js\",\n            line: line,\n            column: column\n        });\n    }\n\n    mapEditorsFromToPosition(fromTextEditor, toTextEditor, backward) {\n        let positionFor = backward ? this[\"originalPositionFor\"] : this[\"generatedPositionFor\"];\n        \n        var range = fromTextEditor.listSelections()[0]\n        var start = positionFor.call(this, range.anchor.line + 1, range.anchor.ch + 1)\n        var end = positionFor.call(this, 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({ line: start.line - 1, ch: start.column - 1 }, {\n            line: end.line - 1,\n            ch: end.column -\n                1\n        })\n    }\n\n    onSourceSelectionChanged(evt) {\n        setTimeout(() => {\n            if (this.sourceLCM.isFocused()) {\n                this.mapEditorsFromToPosition(\n                    this.sourceCM, this.transformedSourceCM, false)\n            }\n        }, 0);\n    }\n    onTransformedSourceSelectionChanged(evt) {\n        setTimeout(() => {\n            if (this.transformedSourceLCM.isFocused()) {\n                this.mapEditorsFromToPosition(\n                    this.transformedSourceCM, this.sourceCM, true)\n            }\n        }, 0);\n    }\n\n    /*MD ## Lively Integration MD*/\n\n    livelyPrepareSave() {\n        this.setAttribute('workspace', BabelWorkspace.serialize(this.workspace));\n        console.log(\"PREPARE SAVE (Plugin Explorer)\");\n    }\n\n    livelyMigrate(other) {\n        // #TODO: do we still need this?\n        this.addEventListener(\"initialize\", () => {\n            this.workspaceURL = other.workspaceURL;\n            this.loadWorkspace(other.workspace);\n            this.sourceCM.setValue(other.sourceText);\n            this.transformedSourceCM.setValue(other.transformedSourceCM.getValue());\n            this.transformationResult = other.transformationResult;\n            this.runsTests = other.runTests;\n            this.updateAST();\n        });\n    }\n\n    livelyExample() {\n        this.loadWorkspaceFile(PluginExplorer.defaultWorkspacePath);\n    }\n}\n\nclass Source {\n    get name() {\n        return this._name;\n    }\n\n    set name(str) {\n        return this._name = str;\n    }\n}\n\nclass LocalSource extends Source {\n    constructor() {\n        super();\n    }\n\n    async getContent() {\n        return this.content || \"\";\n    }\n\n    async setContent(str) {\n        this.content = str;\n    }\n}\n\nclass FileSource extends Source {\n    constructor() {\n        super();\n    }\n\n    fullUrl() {\n        const normalizedPath = lively.paths.normalizePath(this.url, \"\");\n        return new URL(normalizedPath);\n    }\n\n    async getContent() {\n        try {\n            const url = this.fullUrl();\n            const response = await fetch(url);\n            return response.text();\n        } catch (e) {\n            console.error(e);\n            return null;\n        }\n    }\n\n    async setContent(text) {\n        try {\n            const url = this.fullUrl();\n            const response = await fetch(url, {\n                method: 'PUT',\n                body: text,\n            });\n            return response.ok;\n        } catch (e) {\n            console.error(e);\n            return false;\n        }\n    }\n\n    get name() {\n        return this._name || this.url;\n    }\n}\n\nclass BabelWorkspace {\n    static deserialize(json) {\n        return JSON.parse(json, ([key, value]) => {\n            if (value.type === \"local\") {\n                return Object.assign(new LocalSource(), value);\n            } else if (value.type === \"file\") {\n                return Object.assign(new FileSource(), value);\n            }\n            return value;\n        });\n    }\n\n    static serialize(ws) {\n        return JSON.stringify(ws);\n    }\n}\n"]}