{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/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","CallExpression","__wrappedInMetaInformation__","isDomCreatingCall","callee","isMemberExpression","computed","object","property","isIdentifier","livelyCreate","documentCreateElement","Preferences"],"mappings":"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","file":"babel-plugin-jsx-lively.js","sourcesContent":["import jsx from \"babel-plugin-syntax-jsx\";\nimport Preferences from 'src/client/preferences.js';\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  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(addCustomTemplate(programState.file, functionName), // builder function\n              [t.stringLiteral(path.get(\"name\").node.name), // key\n              ...additionalParameters]);\n            }\n\n            let attributeValue = path.get(\"value\");\n            if (path.isJSXSpreadAttribute()) {\n              return t.callExpression(addCustomTemplate(programState.file, \"attributeSpread\"), [path.get(\"argument\").node]);\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(addCustomTemplate(programState.file, functionName), // builder function\n              [childSpec]);\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          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(addCustomTemplate(programState.file, \"element\"), [t.stringLiteral(path.get(\"openingElement\").get(\"name\").node.name), t.callExpression(addCustomTemplate(programState.file, \"attributes\"), jSXAttributes.map(jSXAttributeToBuilder)), t.callExpression(addCustomTemplate(programState.file, \"children\"), jSXChildren.map(jSXChildrenToBuilder)), buildSourceLocation(path.node)]);\n\n              path.replaceWith(newNode);\n            },\n            CallExpression(path) {\n              if (path.node.__wrappedInMetaInformation__) {\n                return;\n              }\n              path.node.__wrappedInMetaInformation__ = true;\n\n              function isDomCreatingCall(path) {\n                const callee = path.get('callee');\n                if (!callee.isMemberExpression() || callee.node.computed) {\n                  return false;\n                }\n\n                const object = callee.get('object');\n                const property = callee.get('property');\n\n                if (!object.isIdentifier()) {\n                  return false;\n                }\n                if (!property.isIdentifier()) {\n                  return false;\n                }\n\n                const livelyCreate = object.node.name === 'lively' && property.node.name === 'create';\n                const documentCreateElement = object.node.name === 'document' && property.node.name === 'createElement';\n                return livelyCreate || documentCreateElement;\n              }\n\n              if (isDomCreatingCall(path)) {\n                path.replaceWith(t.callExpression(addCustomTemplate(programState.file, \"addSourceLocation\"), [path.node, buildSourceLocation(path.node)]));\n              }\n            }\n          });\n\n          return path;\n        }\n\n        transformPath(path, state);\n      }\n    }\n  };\n}"]}