{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/client/reactive/reactive-jsx/reactive-jsx.js"],"names":["toDOMNode","ActiveExpression","BaseActiveExpression","_","addMetaData","element","data","elementMetaData","Object","assign","basicCreateElement","tagName","document","createElement","timeOffset","performance","now","getPendingNode","icon","classList","add","span","style","color","appendChild","createTextNode","getErrorNode","e","getExpressionNode","expression","Promise","promNode","then","val","replaceWith","catch","call","value","node","aexpr","ensureDOMNode","nodeOrObject","Node","toString","isActiveGroup","obj","composeElement","tagElement","attributes","children","key","entries","startsWith","props","substring","Function","setAttribute","roqsByReferenceNode","WeakMap","handleActiveGroup","nodeOrActiveGroup","referenceNode","position","set","initActiveGroup","has","activeGroup","get","map","item","enter","parentNode","insertBefore","exit","remove","forEach","child","isPromiseForJSXElement","Symbol","addSourceLocation","sourceLocation","addJSXSourceLocation","jsx","isWebComponent","includes","handleAsync","some","resolvedTag","returnPromise","resolve","lively","create","all","c","resolvedChildren","tag","attrs","attributeStringLiteral","attributeEmpty","attributeExpression","attributeSpread","concat","childText","text","childElement","jSXElement","childExpression","childSpread","array"],"mappings":"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","file":"reactive-jsx.js","sourcesContent":["import { toDOMNode } from \"./ui-aexpr.js\";\nimport { BaseActiveExpression as ActiveExpression } from 'active-expression';\nimport _ from 'src/external/lodash/lodash.js';\n\n/**\n * Resources for JSX Semantics\n * Web components in react: https://facebook.github.io/react/docs/web-components.html\n * Child lists and keys: https://facebook.github.io/react/docs/lists-and-keys.html\n * JSX babel transform helpers: https://github.com/babel/babel/blob/7.0/packages/babel-helper-builder-react-jsx/src/index.js\n */\n\nfunction addMetaData(element, data = {}) {\n  return element.elementMetaData = Object.assign(element.elementMetaData || {}, data);\n}\n\nfunction basicCreateElement(tagName) {\n  const element = document.createElement(tagName);\n  \n  addMetaData(element, { timeOffset: performance.now() });\n  \n  return element;\n}\n\n// cannot use JSX elements in implementation of JSX elements :(\nfunction getPendingNode() {\n  const icon = basicCreateElement(\"i\");\n  icon.classList.add(\"fa\", \"fa-spinner\", \"fa-pulse\", \"fa-fw\")\n  const span = document.createElement(\"span\");\n  span.style.color = \"yellow\";\n  span.appendChild(icon);\n  span.appendChild(document.createTextNode(\"pending\"));\n  return span;\n}\n\nfunction getErrorNode(e) {\n  const icon = basicCreateElement(\"i\");\n  icon.classList.add(\"fa\", \"fa-exclamation-triangle\")\n  const span = document.createElement(\"span\");\n  span.style.color = \"red\";\n  span.appendChild(icon);\n  span.appendChild(document.createTextNode(e));\n  return span;\n}\n\nfunction getExpressionNode(expression) {\n  if(expression instanceof Promise) {\n    let promNode = getPendingNode();\n    expression\n      .then(val => promNode.replaceWith(getExpressionNode(val)))\n      .catch(e => promNode.replaceWith(getErrorNode(e)));\n    return promNode;\n  }\n  if(expression instanceof ActiveExpression) {\n    return toDOMNode.call(expression, value => {\n      const node = getExpressionNode(value);\n      // TODO: jsx-ray does not work on TextNodes, yet\n      addMetaData(element, { aexpr: expression });\n      return node;\n    });\n  }\n  return ensureDOMNode(expression);\n}\n\nfunction ensureDOMNode(nodeOrObject) {\n  if (nodeOrObject instanceof Node) {\n    return nodeOrObject;\n  }\n  \n  // Symbols needexplicitly need to be converted to strings\n  if (typeof nodeOrObject === 'symbol') {\n    return document.createTextNode(nodeOrObject.toString());\n  }\n\n  // handle objects created with `Object.create(null)`\n  if (!(nodeOrObject instanceof Object) && typeof nodeOrObject === 'object') {\n    return document.createTextNode(Object.assign({}, nodeOrObject));\n  }\n\n  return document.createTextNode(nodeOrObject);\n}\n\nfunction isActiveGroup(obj) {\n  return obj && obj.isActiveGroup;\n}\n\nfunction composeElement(tagElement, attributes, children) {\n  for (let [key, value] of Object.entries(attributes)) {\n    if (!value) continue;\n    if (key.startsWith('v-')) {\n      _.assign(\n        tagElement.props || (tagElement.props = {}),\n        { [key.substring(2)]: value }\n      );\n    } else if(value instanceof Function) {\n      // functions provided as attributes are used to create event listeners\n      // tagElement.addEventListener(key, value);\n      tagElement[`on${key}`] = value;\n    } else {\n      tagElement.setAttribute(key, value.toString());\n    }\n  }\n  \n  const roqsByReferenceNode = new WeakMap();\n  function handleActiveGroup(nodeOrActiveGroup) {\n    if(isActiveGroup(nodeOrActiveGroup)) {\n      const referenceNode = document.createElement('unused');\n      referenceNode.style.position = \"absolute\";\n      roqsByReferenceNode.set(referenceNode, nodeOrActiveGroup);\n      return referenceNode; // use to insert elements of the ActiveGroup in the corresponding place\n    } else {\n      return nodeOrActiveGroup;\n    }\n  }\n  function initActiveGroup(referenceNode) {\n    if(roqsByReferenceNode.has(referenceNode)) {\n      const activeGroup = roqsByReferenceNode.get(referenceNode);\n      \n      activeGroup\n        .map(item => {\n          const node = getExpressionNode(item)\n          addMetaData(node, { item, activeGroup });\n          return node;\n        })\n        .enter(node => {\n          referenceNode.parentNode.insertBefore(node, referenceNode)\n        })\n        .exit(node => node.remove());\n    }\n  }\n\n  children\n    .map(handleActiveGroup)\n    .map(ensureDOMNode)\n    .forEach(child => {\n      tagElement.appendChild(child);\n      initActiveGroup(child);\n    });\n  \n  return tagElement;\n}\n\nexport const isPromiseForJSXElement = Symbol('isPromiseForJSXElement');\n\nexport function addSourceLocation(element, sourceLocation) {\n  if (element) {\n    if (element instanceof Promise) {\n      element.then(e => addSourceLocation(e, sourceLocation));\n    } else {\n      if (sourceLocation) {\n        addMetaData(element, { sourceLocation });\n      }\n    }\n  }\n  return element;\n}\n\nfunction addJSXSourceLocation(element, sourceLocation) {\n  addSourceLocation(element, sourceLocation);\n  addMetaData(element, { jsx: true });\n}\n\nexport function element(tagName, attributes, children, sourceLocation) {\n  const isWebComponent = tagName.includes('-');\n  const handleAsync = isWebComponent || children.some(child => child &&\n                                                      child instanceof Promise &&\n                                                      child[isPromiseForJSXElement]);\n  if(handleAsync) {\n    let resolvedTag;\n    const returnPromise = Promise.resolve(isWebComponent ?\n                               lively.create(tagName) :\n                               basicCreateElement(tagName))\n      .then(element => {\n        resolvedTag = element;\n        addJSXSourceLocation(resolvedTag, sourceLocation);\n        return Promise.all(children.map(c => Promise.resolve(c)));\n      })\n      .then(resolvedChildren => composeElement(resolvedTag, attributes, resolvedChildren));\n    returnPromise[isPromiseForJSXElement] = true;\n    return returnPromise;\n  } else {\n    const tag = basicCreateElement(tagName);\n    addJSXSourceLocation(tag, sourceLocation);\n    return composeElement(tag, attributes, children);\n  }\n}\n\nexport function attributes(...attrs) {\n  return Object.assign({}, ...attrs);\n}\n\nexport function attributeStringLiteral(key, value) {\n  return { [key]: value };\n}\n\nexport function attributeEmpty(key) {\n  return { [key]: key };\n}\n\nexport function attributeExpression(key, value) {\n  return { [key]: value };\n}\n\nexport function attributeSpread(obj) {\n  return obj;\n}\n\nexport function children(...children) {\n  return [].concat(...children);\n}\n\nexport function childText(text) {\n  return [ensureDOMNode(text)];\n}\n\nexport function childElement(jSXElement) {\n  return [jSXElement];\n}\n\n// can take:\n// - a DOM node\n// - a JavaScript object or primitive\n// - a Promise\n// - an Active Expression\nexport function childExpression(expression) {\n  return [getExpressionNode(expression)];\n}\n\nexport function childSpread(array) {\n  // #TODO: <ul>{active-group}</ul> also gets the reactive behavior, do we want this?\n  if(isActiveGroup(array)) {\n    return [array];\n  } else {\n    return array;\n  }\n}\n\n"]}