{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-theresa/src/client/reactive/reactive-jsx/reactive-jsx.js"],"names":["toDOMNode","ActiveExpression","BaseActiveExpression","addMetaData","element","data","jsxMetaData","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","Function","addEventListener","setAttribute","roqsByReferenceNode","WeakMap","handleActiveGroup","nodeOrActiveGroup","referenceNode","set","initActiveGroup","has","activeGroup","get","map","item","enter","parentNode","insertBefore","exit","remove","forEach","child","isPromiseForJSXElement","Symbol","addSourceLocation","sourceLocation","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';\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.jsxMetaData = Object.assign(element.jsxMetaData || {}, 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  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 instanceof Function) {\n      // functions provided as attributes are used to create event listeners\n      tagElement.addEventListener(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 = <unused style=\"position: absotule\"></unused>;\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\nfunction addSourceLocation(element, sourceLocation) {\n  if (sourceLocation) {\n    addMetaData(element, { sourceLocation });\n  }\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        addSourceLocation(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    addSourceLocation(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"]}