{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-theresa/src/client/script-manager.js"],"names":["functionFromString","funcOrString","eval","toString","isLively4Script","object","tagName","toLocaleLowerCase","type","persistToDOM","funcString","name","DOMScript","appendChild","removeFromDOM","children","querySelectorAll","length","Error","forEach","ea","remove","prepareFunction","func","isString","executable","bindFunctionToObject","options","bind","isScript","initializeScriptsMap","__scripts__","scriptExists","addFunctionToScriptsMap","persistScript","hasOwnProperty","persist","_","ScriptManager","findLively4Script","parent","shadow","shadowRoot","child","scriptName","dataset","initializeScript","textContent","e","lively","notify","openWorkspace","console","error","load","loadScriptsFromDOM","document","attachScriptsFromShadowDOM","root","updateScript","removeScript","addScript","checkExists","callScript","optionalArgs","splice","call","arguments","apply"],"mappings":"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","file":"script-manager.js","sourcesContent":["import * as _ from '../external/underscore.js';\n\nexport function functionFromString(funcOrString) {\n  if (typeof funcOrString === 'function') {\n    return funcOrString;\n  }\n  // this makes sure we always create a function\n  return eval('(' + funcOrString.toString() + ')');\n}\n\nfunction isLively4Script(object) {\n  return object.tagName.toLocaleLowerCase() == \"script\" &&\n    object.type == 'lively4script';\n}\n\nfunction persistToDOM(object, funcString, name) {\n  var DOMScript = <script type='lively4script' data-name={name}>{funcString}</script>\n  object.appendChild(DOMScript);\n}\n\nfunction removeFromDOM(object, name) {\n  var children = object.querySelectorAll('script[type=\"lively4script\"][data-name=\"' + name + '\"]');\n\n  if (children.length > 1) {\n    throw new Error('multiple children detected ' + children);\n  }\n  children.forEach(ea => ea.remove());\n}\n\nfunction prepareFunction(funcOrString, name) {\n  var func = functionFromString(funcOrString);\n  if (typeof func !== 'function') {\n    throw 'no valid function provided!';\n  }\n  name = name || func.name;\n  if (!_.isString(name)) {\n    throw new Error(\"name should be a string, but it is \", name) \n  }\n  if (!name) {\n    throw 'cannot update script without name!';\n  }\n\n  return {\n    executable: func,\n    name: name\n  };\n}\n\nfunction bindFunctionToObject(object, func, options) {\n  object[func.name] = func.executable.bind(object);\n  object[func.name].isScript = true;\n}\n\nfunction initializeScriptsMap(object) {\n  if (typeof object.__scripts__ === 'undefined') {\n    object.__scripts__ = {};\n  }\n}\n\nfunction scriptExists(object, name) {\n  return typeof object.__scripts__ !== 'undefined' &&\n    typeof object.__scripts__[name] !== 'undefined';\n}\n\nfunction addFunctionToScriptsMap(object, name, funcOrString) {\n  object.__scripts__[name] = funcOrString.toString();\n}\n\nfunction persistScript(object, name, funcOrString, options) {\n  if (!options.hasOwnProperty(\"persist\") || options.persist == true) {\n    \n    persistToDOM(object, funcOrString.toString(), name);\n  }\n}\n\nexport default class ScriptManager {\n\n  static findLively4Script(parent, shadow) {\n    // if shadow is set, look for the scripts in the shadow root\n    var children = shadow ? parent.shadowRoot.children : parent.children;\n\n    if (!children) return;\n    for (let child of children) {\n      if (isLively4Script(child)) {\n        var scriptName = child.dataset.name;\n        \n        try {\n          this.initializeScript(parent, child.textContent, false, {\n            name: scriptName,\n            persist: false\n          });\n\n        } catch (e) {\n          lively.notify('Error adding function: ' + scriptName + ' to object: ' + parent,\n            \"\" + e, 20, () => lively.openWorkspace(\"\" + e + \"Source: \" + child.textContent));\n          console.error('Error while adding function ' + scriptName + ' to object:');\n          console.error(parent);\n          console.error(e);\n        }\n      } else {\n        this.findLively4Script(child, false);\n      }\n    }\n  }\n\n\n  static load() {\n    this.loadScriptsFromDOM();\n  }\n\n  static loadScriptsFromDOM() {\n    this.findLively4Script(document);\n  }\n\n  static attachScriptsFromShadowDOM(root) {\n    this.findLively4Script(root, true);\n  }\n\n  static updateScript(object, funcOrString, options = {}) {\n    var func = prepareFunction(funcOrString, options.name);\n    \n    this.removeScript(object, func.name);\n    this.addScript(object, func.executable, options);\n  }\n\n  static initializeScript(object, funcOrString, checkExists, options = {}) {\n    var func = prepareFunction(funcOrString, options.name);\n    if (checkExists && scriptExists(object, func.name)) {\n      throw 'script name \"' + func.name + '\" is already reserved!';\n    }\n    initializeScriptsMap(object);\n    bindFunctionToObject(object, func, options);\n    addFunctionToScriptsMap(object, func.name, funcOrString);    \n    return func\n  }\n  \n  static addScript(object, funcOrString, options = {}) {\n    var func = this.initializeScript(object, funcOrString, true, options) \n\n    persistScript(object, func.name, funcOrString, options);\n  }\n\n  static removeScript(object, name) {\n    if (!scriptExists(object, name)) {\n      throw 'script name \"' + name + '\" does not exist!';\n    }\n    delete object.__scripts__[name];\n    delete object[name];\n    removeFromDOM(object, name);\n  }\n\n  static callScript(object, name) {\n    var optionalArgs = [].splice.call(arguments, 2);\n    if (!scriptExists(object, name)) {\n      throw 'unknown script \"' + name + '\"!';\n    }\n\n    return object[name].apply(object, optionalArgs);\n  }\n}\n\nScriptManager.load()\n"]}