{"version":3,"sources":["https://lively-kernel.org/lively4/lively-connectors/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":["\nimport _ from 'src/external/lodash/lodash.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"]}