{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-croquet/src/client/script-manager.js"],"names":["_","persistScript","addFunctionToScriptsMap","scriptExists","initializeScriptsMap","bindFunctionToObject","prepareFunction","removeFromDOM","persistToDOM","isLively4Script","functionFromString","funcOrString","eval","toString","object","tagName","toLocaleLowerCase","type","funcString","name","DOMScript","appendChild","children","querySelectorAll","length","Error","forEach","ea","remove","func","isString","executable","options","bind","isScript","__scripts__","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"]}