{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/demos/tom/plugin-explorer-worker.js"],"names":["importPlugins","importPlugin","decorateNodePathTraverse","decorateFunction","unloadModule","self","window","myPath","lively4url","location","toString","replace","importScripts","System","import","pluginTransformationPlugin","enumerationPlugin","createTraceID","visitor","enter","path","node","traceID","Program","traverse","enumerationConfig","plugins","normalizedPath","normalizeSync","get","then","module","__unload__","e","console","log","registry","delete","undefined","loads","toBeDecorated","decorator","result","arguments","plugin","trace","oldPre","pre","state","preIsAlreadyDecorated","oldTraverse","__proto__","visitors","rest","newVisitors","name","fn","startTraversePlugin","endTraversePlugin","obj","map","exit","call","url","default","modifiedPlugin","pluginData","Promise","all","data","counter","importPromise","onmessage","msg","imports","Trace","babel","wrapAST","config","filename","moduleIds","babelrc","meta","pluginOptions","moduleOptionsNon","traceIdentifierName","modules","sourceFileName","sourceMaps","wrapPluginVisitorMethod","pluginAlias","visitorType","callback","enterPlugin","leavePlugin","startTraversion","ast","transform","source","oldASTAsString","JSON","stringify","transformFromAst","error","postMessage","oldAST","serialize"],"mappings":"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","file":"plugin-explorer-worker.js","sourcesContent":["// first lines copied from src/worker/livelyworker.js\nself.window = self;\n\n// as lively4url would not be defined otherwise we need to compute it here\nconst myPath = '/demos/tom/plugin-explorer-worker.js';\nself.lively4url = self.location.toString().replace(myPath, \"\");\n\n\nimportScripts(lively4url + '/src/external/systemjs/system.src.js');\nimportScripts(lively4url + '/demos/tom/plugin-explorer-systemjs-config.js')\n\n// not sure why I need this but without it I cannot import the plugins\nSystem.import(pluginTransformationPlugin);\n\nconst enumerationPlugin = createTraceID => function() {\n    const visitor = {\n        enter(path) {\n            if (!path.node.traceID) {\n                path.node.traceID = createTraceID();\n            }\n        }\n    };\n\n    return {\n        visitor: {\n            Program(path) {\n                path.node.traceID = createTraceID();\n                path.traverse(visitor)\n            }\n        }\n    }\n}\n\nconst enumerationConfig = createTraceID => {\n    return { plugins: [enumerationPlugin(createTraceID)] }\n}\n\n\n// copied from src/client/lively.js\nasync function unloadModule(path) {\n    var normalizedPath = System.normalizeSync(path)\n    try {\n        // check, to prevent trying to reloading a module a second time if there was an error #375\n        if (System.get(normalizedPath)) {\n            await System.import(normalizedPath).then(module => {\n                if (module && typeof module.__unload__ === \"function\") {\n                    module.__unload__();\n                }\n            });\n        }\n    } catch (e) {\n        console.log(\"WARNING: error while trying to unload \" + path)\n    }\n    System.registry.delete(normalizedPath);\n    // #Hack #issue in SystemJS babel syntax errors do not clear errors\n    System['@@registerRegistry'][normalizedPath] = undefined;\n    delete System.loads[normalizedPath]\n}\n\nfunction decorateFunction(toBeDecorated, decorator) {\n    return function() {\n        const result = toBeDecorated(...arguments);\n        decorator(result);\n        return result;\n    }\n}\n\nfunction decorateNodePathTraverse(plugin, trace) {\n    return decorateFunction(plugin, result => {\n        const oldPre = result.pre;\n        result.pre = function(state) {\n            if (!state.preIsAlreadyDecorated) {\n                const oldTraverse = state.path.__proto__.traverse;\n                state.path.__proto__.traverse = function(visitors, ...rest) {\n                    const newVisitors = {};\n                    for (const name in visitors) {\n                        if (typeof visitors[name] === 'function') {\n                            const fn = visitors[name];\n                            newVisitors[name] = function(path, ...rest) {\n                                trace.startTraversePlugin(name, path.node.traceID);\n                                fn(path, ...rest);\n                                trace.endTraversePlugin(name);\n                            };\n                        } else if (typeof visitors[name] === 'object') {\n                            const obj = visitors[name];\n                            \n                            // Todo: what is if already decorated\n                            if(obj.enter) {\n                                obj.enter = obj.enter.map(fn => function(path, ...rest) {\n                                    trace.startTraversePlugin(name, path.node.traceID);\n                                    fn(path, ...rest);\n                                    trace.endTraversePlugin(name);\n                                })\n                            }\n                            \n                            if(obj.exit) {\n                                obj.exit = obj.exit.map(fn => function(path, ...rest) {\n                                    trace.startTraversePlugin(name, path.node.traceID);\n                                    fn(path, ...rest);\n                                    trace.endTraversePlugin(name);\n                                })\n                            }\n                            \n                            newVisitors[name] = obj;\n                        }\n\n                    }\n\n                    oldTraverse.call(this, newVisitors, ...rest);\n\n                }\n                state.preIsAlreadyDecorated = true;\n            }\n\n            if (oldPre) {\n                oldPre(...arguments);\n            }\n\n        }\n    });\n}\n\n\nasync function importPlugin(url) {\n    const module = await System.import(url);\n    const plugin = module.default;\n\n    let modifiedPlugin = decorateFunction(plugin, result => {\n        result.name = result.name || 'Please name your plugin!';\n    });\n\n    modifiedPlugin\n\n    return modifiedPlugin;\n}\n\nfunction importPlugins(pluginData) {\n    return Promise.all(pluginData.map(({url, data}) => importPlugin(url)))\n        .then(plugins => {\n            let counter = 0;\n            for (const plugin of plugins) {\n                if (plugin.name === 'Please name your plugin!') {\n                    plugin.name += counter;\n                    counter++;\n                }\n            }\n            return plugins;\n        })\n}\n\nconst importPromise = Promise.all(['demos/tom/trace.js', 'systemjs-babel-build', 'demos/tom/wrapAST.js'].map(name =>\n    System.import(name)));\n\nself.onmessage = function(msg) {\n    importPromise.then(function(imports) {\n        const Trace = imports[0].default;\n        const babel = imports[1].default.babel;\n        const wrapAST = imports[2].default;\n\n        const config = {\n            filename: 'tmpfile.js',\n            moduleIds: false,\n            babelrc: false,\n        };\n        System.config({\n            meta: {\n                '*.js': pluginOptions,\n                [pluginTransformationPlugin]: moduleOptionsNon\n            }\n        });\n\n        // const preloadedPlugins = new Set(Object.keys(System['@@registerRegistry']));\n\n\n        const trace = new Trace();\n        // make it globally available for use in plugins\n        window[Trace.traceIdentifierName] = trace;\n\n        function createTraceID() {\n            return trace.createTraceID();\n        }\n\n        importPlugins(msg.data.pluginData)\n            .then(function(modules) {\n                config.plugins = modules;\n                config.sourceFileName = 'tmpfile.js';\n                config.sourceMaps = true;\n\n                config.wrapPluginVisitorMethod = (pluginAlias, visitorType, callback) => {\n                    return (path, ...rest) => {\n                        trace.enterPlugin(pluginAlias, path.node.traceID);\n                        callback(path, ...rest);\n                        trace.leavePlugin(pluginAlias);\n                    }\n                };\n\n                config.plugins = config.plugins.map(plugin => decorateNodePathTraverse(plugin, trace));\n\n                trace.startTraversion();\n                const ast = babel.transform(msg.data.source, enumerationConfig(createTraceID)).ast;\n                const oldASTAsString = JSON.stringify(ast);\n\n                wrapAST(ast, trace);\n                let result\n                try {\n                    result = babel.transformFromAst(ast, undefined, config);\n                } catch (e) {\n                    result = null;\n                    trace.error(e);\n                }\n\n                postMessage({\n                    oldAST: oldASTAsString,\n                    trace: trace.serialize()\n                });\n\n                /* Todo: find the correct files to unload. SystemJS imports plugins + their imports.\n                I could not get them to be unloaded correctly, but they needed to be loaded again in\n                the next use of the worker.\n                \n                const pluginsToUnload = Object.keys(System['@@registerRegistry']).filter(plugin => !\n                    preloadedPlugins.has(plugin));\n\n                Promise.all(pluginsToUnload.map(unloadModule))\n                    .then(_ => {\n                        \n                    })*/\n            })\n    })\n}\n"]}