{"version":3,"sources":["https://lively-kernel.org/lively4S2/lively4-theresa/src/client/reactive/reactive-jsx/babel-plugin-jsx-lively.js"],"names":["detectUnsupportedNodes","path","filename","gainPrintableFullPath","fullPath","unshift","node","type","parentPath","map","nodeType","index","repeat","join","traverse","JSXMemberExpression","state","SyntaxError","loc","start","line","JSXEmptyExpression","JSXNamespacedName","types","t","template","GENERATED_IMPORT_IDENTIFIER","Symbol","addCustomTemplate","file","name","declar","declarations","identifier","addImport","inherits","jsx","visitor","Program","opts","fileName","log","sourceLocation","buildSourceLocation","END_COLUMN","numericLiteral","end","column","END_LINE","START_COLUMN","START_LINE","expression","transformPath","programState","jSXAttributeToBuilder","getCallExpressionFor","functionName","additionalParameters","callExpression","stringLiteral","get","attributeValue","isJSXSpreadAttribute","value","isStringLiteral","isJSXExpressionContainer","isJSXElement","Error","jSXChildrenToBuilder","child","childSpec","isJSXText","isJSXSpreadChild","JSXElement","jSXAttributes","jSXChildren","newNode","replaceWith"],"mappings":"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","file":"babel-plugin-jsx-lively.js","sourcesContent":["import jsx from \"babel-plugin-syntax-jsx\";\n\nfunction detectUnsupportedNodes(path, filename) {\n  function gainPrintableFullPath(path) {\n    let fullPath = [];\n    \n    while(path) {\n      fullPath.unshift(path.node.type);\n      path = path.parentPath;\n    }\n    \n    return fullPath.map((nodeType, index) => '  '.repeat(index) + nodeType).join('\\n');\n  }\n  \n  path.traverse({\n    /**\n     * No support for JSXMemberExpression yet. #TODO: what are the semantics outside of react for this?\n     * \n     * <foo.bar></foo.bar>\n     */\n    JSXMemberExpression(path, state) {\n      throw new SyntaxError(`JSXMemberExpression not yet supported.\n${gainPrintableFullPath(path)}`, filename, path.node.loc.start.line);\n    },\n    /**\n     * No support for JSXEmptyExpression yet. #TODO: where is this feature even useful?\n     * \n     * <div id={}></div>\n     * or\n     * <div>{}</div>\n     */\n    JSXEmptyExpression(path, state) {\n      throw new SyntaxError(`JSXEmptyExpression not yet supported.\n${gainPrintableFullPath(path)}`, filename);\n    },\n    /**\n     * No support for jSXNamespacedName yet.\n     * \n     * <div ns:attr=\"val\" />;\n     */\n    JSXNamespacedName(path, state) {\n      throw new SyntaxError(`jSXNamespacedName not yet supported.\n${gainPrintableFullPath(path)}`, filename, path.node.loc.start.line);\n    }\n  });\n}\n\n/**\n * Resources for JSX Syntax\n * JSX babel Preset: https://github.com/babel/babel/blob/master/packages/babel-preset-react/src/index.js\n * JSX spec draft: https://github.com/facebook/jsx\n * JSX Syntax definition in babel: https://github.com/babel/babel/blob/master/packages/babel-types/src/definitions/jsx.js#L10\n * Babel nodes list: https://babeljs.io/docs/core-packages/babel-types/#apij-sxidentifier\n */\nexport default function ({ types: t, template, traverse }) {\n  const GENERATED_IMPORT_IDENTIFIER = Symbol(\"generated import identifier\");\n\n  // #TODO: duplicate with aexpr transform -> extract it\n  function addCustomTemplate(file, name) {\n    let declar = file.declarations[name];\n    if (declar) return declar;\n\n    let identifier = file.declarations[name] = file.addImport(\"reactive-jsx\", name, name);\n    identifier[GENERATED_IMPORT_IDENTIFIER] = true;\n    return identifier;\n  }\n\n  \n  return {\n    inherits: jsx,\n    visitor: {\n      Program(path, state) {\n        detectUnsupportedNodes(path, state && state.opts && state.opts.filename);\n        \n        const fileName = (state && state.file && state.file.log && state.file.log.filename) || 'no_file_given';\n        const sourceLocation = template(`({\n        file: '${fileName}',\n        end: {\n          column: END_COLUMN,\n          line: END_LINE\n        },\n        start: {\n          column: START_COLUMN,\n          line: START_LINE\n        }\n      })`);\n        function buildSourceLocation(node) {\n          return sourceLocation({\n            END_COLUMN: t.numericLiteral(node.loc.end.column),\n            END_LINE: t.numericLiteral(node.loc.end.line),\n            START_COLUMN: t.numericLiteral(node.loc.start.column),\n            START_LINE: t.numericLiteral(node.loc.start.line)\n          }).expression;\n        }\n\n        function transformPath(path, programState) {\n          function jSXAttributeToBuilder(path) {\n\n            function getCallExpressionFor(functionName, ...additionalParameters) {\n              return t.callExpression(\n                addCustomTemplate(programState.file, functionName), // builder function\n                [\n                  t.stringLiteral(path.get(\"name\").node.name), // key\n                  ...additionalParameters\n                ]\n              );\n            }\n            \n            let attributeValue = path.get(\"value\");\n            if(path.isJSXSpreadAttribute()) {\n              return t.callExpression(\n                addCustomTemplate(programState.file, \"attributeSpread\"),\n                [ path.get(\"argument\").node ]\n              );\n            } else if(!path.node.value) {\n              return getCallExpressionFor(\"attributeEmpty\");\n            } else if(attributeValue.isStringLiteral()) {\n              return getCallExpressionFor(\"attributeStringLiteral\", attributeValue.node);\n            } else if(attributeValue.isJSXExpressionContainer()) {\n              return getCallExpressionFor(\"attributeExpression\", attributeValue.node.expression);\n            } else if(attributeValue.isJSXElement()) {\n              // #TODO: what would that even mean?\n              throw new SyntaxError(`JSXElement as property value of JSXAttribute not yet supported.`);\n            }\n\n            throw new Error('unknown node type in JSXAttribute value ' + attributeValue.node.type);\n          }\n          \n          function jSXChildrenToBuilder(child) {\n            function getCallExpressionFor(functionName, childSpec) {\n              return t.callExpression(\n                addCustomTemplate(programState.file, functionName), // builder function\n                [\n                  childSpec\n                ]\n              );\n            }\n\n            if(child.isJSXText()) {\n              return getCallExpressionFor(\"childText\", t.stringLiteral(child.node.value));\n            }\n            if(child.isJSXElement()) {\n              return getCallExpressionFor(\"childElement\", child.node);\n            }\n            if(child.isJSXExpressionContainer()) {\n              return getCallExpressionFor(\"childExpression\", child.get(\"expression\").node);\n            }\n            if(child.isJSXSpreadChild()) {\n              return getCallExpressionFor(\"childSpread\", child.get(\"expression\").node);\n              //throw new SyntaxError(`JSXSpreadChild as child of JSXElement not yet supported.`);\n            }\n            throw new Error('unknown node type in children of JSXElement ' + child.node.type);\n          }\n          \n          \n          path.traverse({\n            JSXElement(path, state) {\n              const jSXAttributes = path.get(\"openingElement\").get(\"attributes\");\n              const jSXChildren = path.get(\"children\");\n\n              let newNode = t.callExpression(\n                addCustomTemplate(programState.file, \"element\"),\n                [\n                  t.stringLiteral(path.get(\"openingElement\").get(\"name\").node.name),\n                  t.callExpression(\n                    addCustomTemplate(programState.file, \"attributes\"),\n                    jSXAttributes.map(jSXAttributeToBuilder)\n                  ),\n                  t.callExpression(\n                    addCustomTemplate(programState.file, \"children\"),\n                    jSXChildren.map(jSXChildrenToBuilder)\n                  ),\n                  buildSourceLocation(path.node)\n                ]\n              );\n\n              path.replaceWith(newNode);\n            }\n          })\n          \n          return path;\n        }\n\n        transformPath(path, state);\n      }\n    }\n  };\n}\n"]}