You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					516 lines
				
				20 KiB
			
		
		
			
		
	
	
					516 lines
				
				20 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = createPlugin; | ||
|  | var _pluginSyntaxJsx = require("@babel/plugin-syntax-jsx"); | ||
|  | var _helperPluginUtils = require("@babel/helper-plugin-utils"); | ||
|  | var _core = require("@babel/core"); | ||
|  | var _helperModuleImports = require("@babel/helper-module-imports"); | ||
|  | var _helperAnnotateAsPure = require("@babel/helper-annotate-as-pure"); | ||
|  | const DEFAULT = { | ||
|  |   importSource: "react", | ||
|  |   runtime: "automatic", | ||
|  |   pragma: "React.createElement", | ||
|  |   pragmaFrag: "React.Fragment" | ||
|  | }; | ||
|  | const JSX_SOURCE_ANNOTATION_REGEX = /^\s*\*?\s*@jsxImportSource\s+([^\s]+)\s*$/m; | ||
|  | const JSX_RUNTIME_ANNOTATION_REGEX = /^\s*\*?\s*@jsxRuntime\s+([^\s]+)\s*$/m; | ||
|  | const JSX_ANNOTATION_REGEX = /^\s*\*?\s*@jsx\s+([^\s]+)\s*$/m; | ||
|  | const JSX_FRAG_ANNOTATION_REGEX = /^\s*\*?\s*@jsxFrag\s+([^\s]+)\s*$/m; | ||
|  | const get = (pass, name) => pass.get(`@babel/plugin-react-jsx/${name}`); | ||
|  | const set = (pass, name, v) => pass.set(`@babel/plugin-react-jsx/${name}`, v); | ||
|  | function hasProto(node) { | ||
|  |   return node.properties.some(value => _core.types.isObjectProperty(value, { | ||
|  |     computed: false, | ||
|  |     shorthand: false | ||
|  |   }) && (_core.types.isIdentifier(value.key, { | ||
|  |     name: "__proto__" | ||
|  |   }) || _core.types.isStringLiteral(value.key, { | ||
|  |     value: "__proto__" | ||
|  |   }))); | ||
|  | } | ||
|  | function createPlugin({ | ||
|  |   name, | ||
|  |   development | ||
|  | }) { | ||
|  |   return (0, _helperPluginUtils.declare)((_, options) => { | ||
|  |     const { | ||
|  |       pure: PURE_ANNOTATION, | ||
|  |       throwIfNamespace = true, | ||
|  |       runtime: RUNTIME_DEFAULT = development ? "automatic" : "classic", | ||
|  |       importSource: IMPORT_SOURCE_DEFAULT = DEFAULT.importSource, | ||
|  |       pragma: PRAGMA_DEFAULT = DEFAULT.pragma, | ||
|  |       pragmaFrag: PRAGMA_FRAG_DEFAULT = DEFAULT.pragmaFrag | ||
|  |     } = options; | ||
|  |     { | ||
|  |       var { | ||
|  |         useSpread = false, | ||
|  |         useBuiltIns = false | ||
|  |       } = options; | ||
|  |       if (RUNTIME_DEFAULT === "classic") { | ||
|  |         if (typeof useSpread !== "boolean") { | ||
|  |           throw new Error("transform-react-jsx currently only accepts a boolean option for " + "useSpread (defaults to false)"); | ||
|  |         } | ||
|  |         if (typeof useBuiltIns !== "boolean") { | ||
|  |           throw new Error("transform-react-jsx currently only accepts a boolean option for " + "useBuiltIns (defaults to false)"); | ||
|  |         } | ||
|  |         if (useSpread && useBuiltIns) { | ||
|  |           throw new Error("transform-react-jsx currently only accepts useBuiltIns or useSpread " + "but not both"); | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |     const injectMetaPropertiesVisitor = { | ||
|  |       JSXOpeningElement(path, state) { | ||
|  |         const attributes = []; | ||
|  |         if (isThisAllowed(path.scope)) { | ||
|  |           attributes.push(_core.types.jsxAttribute(_core.types.jsxIdentifier("__self"), _core.types.jsxExpressionContainer(_core.types.thisExpression()))); | ||
|  |         } | ||
|  |         attributes.push(_core.types.jsxAttribute(_core.types.jsxIdentifier("__source"), _core.types.jsxExpressionContainer(makeSource(path, state)))); | ||
|  |         path.pushContainer("attributes", attributes); | ||
|  |       } | ||
|  |     }; | ||
|  |     return { | ||
|  |       name, | ||
|  |       inherits: _pluginSyntaxJsx.default, | ||
|  |       visitor: { | ||
|  |         JSXNamespacedName(path) { | ||
|  |           if (throwIfNamespace) { | ||
|  |             throw path.buildCodeFrameError(`Namespace tags are not supported by default. React's JSX doesn't support namespace tags. \
 | ||
|  | You can set \`throwIfNamespace: false\` to bypass this warning.`); | ||
|  |           } | ||
|  |         }, | ||
|  |         JSXSpreadChild(path) { | ||
|  |           throw path.buildCodeFrameError("Spread children are not supported in React."); | ||
|  |         }, | ||
|  |         Program: { | ||
|  |           enter(path, state) { | ||
|  |             const { | ||
|  |               file | ||
|  |             } = state; | ||
|  |             let runtime = RUNTIME_DEFAULT; | ||
|  |             let source = IMPORT_SOURCE_DEFAULT; | ||
|  |             let pragma = PRAGMA_DEFAULT; | ||
|  |             let pragmaFrag = PRAGMA_FRAG_DEFAULT; | ||
|  |             let sourceSet = !!options.importSource; | ||
|  |             let pragmaSet = !!options.pragma; | ||
|  |             let pragmaFragSet = !!options.pragmaFrag; | ||
|  |             if (file.ast.comments) { | ||
|  |               for (const comment of file.ast.comments) { | ||
|  |                 const sourceMatches = JSX_SOURCE_ANNOTATION_REGEX.exec(comment.value); | ||
|  |                 if (sourceMatches) { | ||
|  |                   source = sourceMatches[1]; | ||
|  |                   sourceSet = true; | ||
|  |                 } | ||
|  |                 const runtimeMatches = JSX_RUNTIME_ANNOTATION_REGEX.exec(comment.value); | ||
|  |                 if (runtimeMatches) { | ||
|  |                   runtime = runtimeMatches[1]; | ||
|  |                 } | ||
|  |                 const jsxMatches = JSX_ANNOTATION_REGEX.exec(comment.value); | ||
|  |                 if (jsxMatches) { | ||
|  |                   pragma = jsxMatches[1]; | ||
|  |                   pragmaSet = true; | ||
|  |                 } | ||
|  |                 const jsxFragMatches = JSX_FRAG_ANNOTATION_REGEX.exec(comment.value); | ||
|  |                 if (jsxFragMatches) { | ||
|  |                   pragmaFrag = jsxFragMatches[1]; | ||
|  |                   pragmaFragSet = true; | ||
|  |                 } | ||
|  |               } | ||
|  |             } | ||
|  |             set(state, "runtime", runtime); | ||
|  |             if (runtime === "classic") { | ||
|  |               if (sourceSet) { | ||
|  |                 throw path.buildCodeFrameError(`importSource cannot be set when runtime is classic.`); | ||
|  |               } | ||
|  |               const createElement = toMemberExpression(pragma); | ||
|  |               const fragment = toMemberExpression(pragmaFrag); | ||
|  |               set(state, "id/createElement", () => _core.types.cloneNode(createElement)); | ||
|  |               set(state, "id/fragment", () => _core.types.cloneNode(fragment)); | ||
|  |               set(state, "defaultPure", pragma === DEFAULT.pragma); | ||
|  |             } else if (runtime === "automatic") { | ||
|  |               if (pragmaSet || pragmaFragSet) { | ||
|  |                 throw path.buildCodeFrameError(`pragma and pragmaFrag cannot be set when runtime is automatic.`); | ||
|  |               } | ||
|  |               const define = (name, id) => set(state, name, createImportLazily(state, path, id, source)); | ||
|  |               define("id/jsx", development ? "jsxDEV" : "jsx"); | ||
|  |               define("id/jsxs", development ? "jsxDEV" : "jsxs"); | ||
|  |               define("id/createElement", "createElement"); | ||
|  |               define("id/fragment", "Fragment"); | ||
|  |               set(state, "defaultPure", source === DEFAULT.importSource); | ||
|  |             } else { | ||
|  |               throw path.buildCodeFrameError(`Runtime must be either "classic" or "automatic".`); | ||
|  |             } | ||
|  |             if (development) { | ||
|  |               path.traverse(injectMetaPropertiesVisitor, state); | ||
|  |             } | ||
|  |           } | ||
|  | 
 | ||
|  |         }, | ||
|  | 
 | ||
|  |         JSXFragment(path, file) { | ||
|  | 
 | ||
|  |           const frag = memberExpressionToJSX(get(file, "id/fragment")()); | ||
|  |           path.replaceWith(_core.types.inherits(_core.types.jsxElement(_core.types.inherits(_core.types.jsxOpeningElement(frag, []), path.node.openingFragment), _core.types.jsxClosingElement(_core.types.cloneNode(frag)), path.node.children), path.node)); | ||
|  |         }, | ||
|  |         JSXElement: { | ||
|  |           exit(path, file) { | ||
|  |             let callExpr; | ||
|  |             if (get(file, "runtime") === "classic" || shouldUseCreateElement(path)) { | ||
|  |               callExpr = buildCreateElementCall(path, file); | ||
|  |             } else { | ||
|  |               callExpr = buildJSXElementCall(path, file); | ||
|  |             } | ||
|  |             path.replaceWith(_core.types.inherits(callExpr, path.node)); | ||
|  |           } | ||
|  |         }, | ||
|  |         JSXAttribute(path) { | ||
|  |           if (_core.types.isJSXElement(path.node.value)) { | ||
|  |             path.node.value = _core.types.jsxExpressionContainer(path.node.value); | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     function isDerivedClass(classPath) { | ||
|  |       return classPath.node.superClass !== null; | ||
|  |     } | ||
|  | 
 | ||
|  |     function isThisAllowed(scope) { | ||
|  |       do { | ||
|  |         const { | ||
|  |           path | ||
|  |         } = scope; | ||
|  |         if (path.isFunctionParent() && !path.isArrowFunctionExpression()) { | ||
|  |           if (!path.isMethod()) { | ||
|  |             return true; | ||
|  |           } | ||
|  |           if (path.node.kind !== "constructor") { | ||
|  |             return true; | ||
|  |           } | ||
|  |           return !isDerivedClass(path.parentPath.parentPath); | ||
|  |         } | ||
|  |         if (path.isTSModuleBlock()) { | ||
|  |           return false; | ||
|  |         } | ||
|  |       } while (scope = scope.parent); | ||
|  |       return true; | ||
|  |     } | ||
|  |     function call(pass, name, args) { | ||
|  |       const node = _core.types.callExpression(get(pass, `id/${name}`)(), args); | ||
|  |       if (PURE_ANNOTATION != null ? PURE_ANNOTATION : get(pass, "defaultPure")) (0, _helperAnnotateAsPure.default)(node); | ||
|  |       return node; | ||
|  |     } | ||
|  | 
 | ||
|  |     function shouldUseCreateElement(path) { | ||
|  |       const openingPath = path.get("openingElement"); | ||
|  |       const attributes = openingPath.node.attributes; | ||
|  |       let seenPropsSpread = false; | ||
|  |       for (let i = 0; i < attributes.length; i++) { | ||
|  |         const attr = attributes[i]; | ||
|  |         if (seenPropsSpread && _core.types.isJSXAttribute(attr) && attr.name.name === "key") { | ||
|  |           return true; | ||
|  |         } else if (_core.types.isJSXSpreadAttribute(attr)) { | ||
|  |           seenPropsSpread = true; | ||
|  |         } | ||
|  |       } | ||
|  |       return false; | ||
|  |     } | ||
|  |     function convertJSXIdentifier(node, parent) { | ||
|  |       if (_core.types.isJSXIdentifier(node)) { | ||
|  |         if (node.name === "this" && _core.types.isReferenced(node, parent)) { | ||
|  |           return _core.types.thisExpression(); | ||
|  |         } else if (_core.types.isValidIdentifier(node.name, false)) { | ||
|  |           node.type = "Identifier"; | ||
|  |           return node; | ||
|  |         } else { | ||
|  |           return _core.types.stringLiteral(node.name); | ||
|  |         } | ||
|  |       } else if (_core.types.isJSXMemberExpression(node)) { | ||
|  |         return _core.types.memberExpression(convertJSXIdentifier(node.object, node), convertJSXIdentifier(node.property, node)); | ||
|  |       } else if (_core.types.isJSXNamespacedName(node)) { | ||
|  |         return _core.types.stringLiteral(`${node.namespace.name}:${node.name.name}`); | ||
|  |       } | ||
|  | 
 | ||
|  |       return node; | ||
|  |     } | ||
|  |     function convertAttributeValue(node) { | ||
|  |       if (_core.types.isJSXExpressionContainer(node)) { | ||
|  |         return node.expression; | ||
|  |       } else { | ||
|  |         return node; | ||
|  |       } | ||
|  |     } | ||
|  |     function accumulateAttribute(array, attribute) { | ||
|  |       if (_core.types.isJSXSpreadAttribute(attribute.node)) { | ||
|  |         const arg = attribute.node.argument; | ||
|  |         if (_core.types.isObjectExpression(arg) && !hasProto(arg)) { | ||
|  |           array.push(...arg.properties); | ||
|  |         } else { | ||
|  |           array.push(_core.types.spreadElement(arg)); | ||
|  |         } | ||
|  |         return array; | ||
|  |       } | ||
|  |       const value = convertAttributeValue(attribute.node.name.name !== "key" ? attribute.node.value || _core.types.booleanLiteral(true) : attribute.node.value); | ||
|  |       if (attribute.node.name.name === "key" && value === null) { | ||
|  |         throw attribute.buildCodeFrameError('Please provide an explicit key value. Using "key" as a shorthand for "key={true}" is not allowed.'); | ||
|  |       } | ||
|  |       if (_core.types.isStringLiteral(value) && !_core.types.isJSXExpressionContainer(attribute.node.value)) { | ||
|  |         var _value$extra; | ||
|  |         value.value = value.value.replace(/\n\s+/g, " "); | ||
|  | 
 | ||
|  |         (_value$extra = value.extra) == null ? true : delete _value$extra.raw; | ||
|  |       } | ||
|  |       if (_core.types.isJSXNamespacedName(attribute.node.name)) { | ||
|  |         attribute.node.name = _core.types.stringLiteral(attribute.node.name.namespace.name + ":" + attribute.node.name.name.name); | ||
|  |       } else if (_core.types.isValidIdentifier(attribute.node.name.name, false)) { | ||
|  |         attribute.node.name.type = "Identifier"; | ||
|  |       } else { | ||
|  |         attribute.node.name = _core.types.stringLiteral(attribute.node.name.name); | ||
|  |       } | ||
|  |       array.push(_core.types.inherits(_core.types.objectProperty( | ||
|  |       attribute.node.name, value), attribute.node)); | ||
|  |       return array; | ||
|  |     } | ||
|  |     function buildChildrenProperty(children) { | ||
|  |       let childrenNode; | ||
|  |       if (children.length === 1) { | ||
|  |         childrenNode = children[0]; | ||
|  |       } else if (children.length > 1) { | ||
|  |         childrenNode = _core.types.arrayExpression(children); | ||
|  |       } else { | ||
|  |         return undefined; | ||
|  |       } | ||
|  |       return _core.types.objectProperty(_core.types.identifier("children"), childrenNode); | ||
|  |     } | ||
|  | 
 | ||
|  |     function buildJSXElementCall(path, file) { | ||
|  |       const openingPath = path.get("openingElement"); | ||
|  |       const args = [getTag(openingPath)]; | ||
|  |       const attribsArray = []; | ||
|  |       const extracted = Object.create(null); | ||
|  | 
 | ||
|  |       for (const attr of openingPath.get("attributes")) { | ||
|  |         if (attr.isJSXAttribute() && _core.types.isJSXIdentifier(attr.node.name)) { | ||
|  |           const { | ||
|  |             name | ||
|  |           } = attr.node.name; | ||
|  |           switch (name) { | ||
|  |             case "__source": | ||
|  |             case "__self": | ||
|  |               if (extracted[name]) throw sourceSelfError(path, name); | ||
|  |             case "key": | ||
|  |               { | ||
|  |                 const keyValue = convertAttributeValue(attr.node.value); | ||
|  |                 if (keyValue === null) { | ||
|  |                   throw attr.buildCodeFrameError('Please provide an explicit key value. Using "key" as a shorthand for "key={true}" is not allowed.'); | ||
|  |                 } | ||
|  |                 extracted[name] = keyValue; | ||
|  |                 break; | ||
|  |               } | ||
|  |             default: | ||
|  |               attribsArray.push(attr); | ||
|  |           } | ||
|  |         } else { | ||
|  |           attribsArray.push(attr); | ||
|  |         } | ||
|  |       } | ||
|  |       const children = _core.types.react.buildChildren(path.node); | ||
|  |       let attribs; | ||
|  |       if (attribsArray.length || children.length) { | ||
|  |         attribs = buildJSXOpeningElementAttributes(attribsArray, | ||
|  |         children); | ||
|  |       } else { | ||
|  |         attribs = _core.types.objectExpression([]); | ||
|  |       } | ||
|  |       args.push(attribs); | ||
|  |       if (development) { | ||
|  |         var _extracted$key; | ||
|  |         args.push((_extracted$key = extracted.key) != null ? _extracted$key : path.scope.buildUndefinedNode(), _core.types.booleanLiteral(children.length > 1)); | ||
|  |         if (extracted.__source) { | ||
|  |           args.push(extracted.__source); | ||
|  |           if (extracted.__self) args.push(extracted.__self); | ||
|  |         } else if (extracted.__self) { | ||
|  |           args.push(path.scope.buildUndefinedNode(), extracted.__self); | ||
|  |         } | ||
|  |       } else if (extracted.key !== undefined) { | ||
|  |         args.push(extracted.key); | ||
|  |       } | ||
|  |       return call(file, children.length > 1 ? "jsxs" : "jsx", args); | ||
|  |     } | ||
|  | 
 | ||
|  |     function buildJSXOpeningElementAttributes(attribs, children) { | ||
|  |       const props = attribs.reduce(accumulateAttribute, []); | ||
|  | 
 | ||
|  |       if ((children == null ? void 0 : children.length) > 0) { | ||
|  |         props.push(buildChildrenProperty(children)); | ||
|  |       } | ||
|  |       return _core.types.objectExpression(props); | ||
|  |     } | ||
|  | 
 | ||
|  |     function buildCreateElementCall(path, file) { | ||
|  |       const openingPath = path.get("openingElement"); | ||
|  |       return call(file, "createElement", [getTag(openingPath), buildCreateElementOpeningElementAttributes(file, path, openingPath.get("attributes")), | ||
|  |       ..._core.types.react.buildChildren(path.node)]); | ||
|  |     } | ||
|  |     function getTag(openingPath) { | ||
|  |       const tagExpr = convertJSXIdentifier(openingPath.node.name, openingPath.node); | ||
|  |       let tagName; | ||
|  |       if (_core.types.isIdentifier(tagExpr)) { | ||
|  |         tagName = tagExpr.name; | ||
|  |       } else if (_core.types.isStringLiteral(tagExpr)) { | ||
|  |         tagName = tagExpr.value; | ||
|  |       } | ||
|  |       if (_core.types.react.isCompatTag(tagName)) { | ||
|  |         return _core.types.stringLiteral(tagName); | ||
|  |       } else { | ||
|  |         return tagExpr; | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     function buildCreateElementOpeningElementAttributes(file, path, attribs) { | ||
|  |       const runtime = get(file, "runtime"); | ||
|  |       { | ||
|  |         if (runtime !== "automatic") { | ||
|  |           const objs = []; | ||
|  |           const props = attribs.reduce(accumulateAttribute, []); | ||
|  |           if (!useSpread) { | ||
|  |             let start = 0; | ||
|  |             props.forEach((prop, i) => { | ||
|  |               if (_core.types.isSpreadElement(prop)) { | ||
|  |                 if (i > start) { | ||
|  |                   objs.push(_core.types.objectExpression(props.slice(start, i))); | ||
|  |                 } | ||
|  |                 objs.push(prop.argument); | ||
|  |                 start = i + 1; | ||
|  |               } | ||
|  |             }); | ||
|  |             if (props.length > start) { | ||
|  |               objs.push(_core.types.objectExpression(props.slice(start))); | ||
|  |             } | ||
|  |           } else if (props.length) { | ||
|  |             objs.push(_core.types.objectExpression(props)); | ||
|  |           } | ||
|  |           if (!objs.length) { | ||
|  |             return _core.types.nullLiteral(); | ||
|  |           } | ||
|  |           if (objs.length === 1) { | ||
|  |             if (!(_core.types.isSpreadElement(props[0]) && | ||
|  |             _core.types.isObjectExpression(props[0].argument))) { | ||
|  |               return objs[0]; | ||
|  |             } | ||
|  |           } | ||
|  | 
 | ||
|  |           if (!_core.types.isObjectExpression(objs[0])) { | ||
|  |             objs.unshift(_core.types.objectExpression([])); | ||
|  |           } | ||
|  |           const helper = useBuiltIns ? _core.types.memberExpression(_core.types.identifier("Object"), _core.types.identifier("assign")) : file.addHelper("extends"); | ||
|  | 
 | ||
|  |           return _core.types.callExpression(helper, objs); | ||
|  |         } | ||
|  |       } | ||
|  |       const props = []; | ||
|  |       const found = Object.create(null); | ||
|  |       for (const attr of attribs) { | ||
|  |         const name = _core.types.isJSXAttribute(attr) && _core.types.isJSXIdentifier(attr.name) && attr.name.name; | ||
|  |         if (runtime === "automatic" && (name === "__source" || name === "__self")) { | ||
|  |           if (found[name]) throw sourceSelfError(path, name); | ||
|  |           found[name] = true; | ||
|  |         } | ||
|  |         accumulateAttribute(props, attr); | ||
|  |       } | ||
|  |       return props.length === 1 && _core.types.isSpreadElement(props[0]) && | ||
|  |       !_core.types.isObjectExpression(props[0].argument) ? props[0].argument : props.length > 0 ? _core.types.objectExpression(props) : _core.types.nullLiteral(); | ||
|  |     } | ||
|  |   }); | ||
|  |   function getSource(source, importName) { | ||
|  |     switch (importName) { | ||
|  |       case "Fragment": | ||
|  |         return `${source}/${development ? "jsx-dev-runtime" : "jsx-runtime"}`; | ||
|  |       case "jsxDEV": | ||
|  |         return `${source}/jsx-dev-runtime`; | ||
|  |       case "jsx": | ||
|  |       case "jsxs": | ||
|  |         return `${source}/jsx-runtime`; | ||
|  |       case "createElement": | ||
|  |         return source; | ||
|  |     } | ||
|  |   } | ||
|  |   function createImportLazily(pass, path, importName, source) { | ||
|  |     return () => { | ||
|  |       const actualSource = getSource(source, importName); | ||
|  |       if ((0, _helperModuleImports.isModule)(path)) { | ||
|  |         let reference = get(pass, `imports/${importName}`); | ||
|  |         if (reference) return _core.types.cloneNode(reference); | ||
|  |         reference = (0, _helperModuleImports.addNamed)(path, importName, actualSource, { | ||
|  |           importedInterop: "uncompiled", | ||
|  |           importPosition: "after" | ||
|  |         }); | ||
|  |         set(pass, `imports/${importName}`, reference); | ||
|  |         return reference; | ||
|  |       } else { | ||
|  |         let reference = get(pass, `requires/${actualSource}`); | ||
|  |         if (reference) { | ||
|  |           reference = _core.types.cloneNode(reference); | ||
|  |         } else { | ||
|  |           reference = (0, _helperModuleImports.addNamespace)(path, actualSource, { | ||
|  |             importedInterop: "uncompiled" | ||
|  |           }); | ||
|  |           set(pass, `requires/${actualSource}`, reference); | ||
|  |         } | ||
|  |         return _core.types.memberExpression(reference, _core.types.identifier(importName)); | ||
|  |       } | ||
|  |     }; | ||
|  |   } | ||
|  | } | ||
|  | function toMemberExpression(id) { | ||
|  |   return id.split(".").map(name => _core.types.identifier(name)) | ||
|  |   .reduce((object, property) => _core.types.memberExpression(object, property)); | ||
|  | } | ||
|  | function memberExpressionToJSX(expr) { | ||
|  |   switch (expr.type) { | ||
|  |     case "Identifier": | ||
|  |       return _core.types.jsxIdentifier(expr.name); | ||
|  |     case "MemberExpression": | ||
|  |       return _core.types.jsxMemberExpression(memberExpressionToJSX(expr.object), memberExpressionToJSX(expr.property)); | ||
|  |     default: | ||
|  |       throw new Error("Internal error: unknown member expression type"); | ||
|  |   } | ||
|  | } | ||
|  | function makeSource(path, state) { | ||
|  |   const location = path.node.loc; | ||
|  |   if (!location) { | ||
|  |     return path.scope.buildUndefinedNode(); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!state.fileNameIdentifier) { | ||
|  |     const { | ||
|  |       filename = "" | ||
|  |     } = state; | ||
|  |     const fileNameIdentifier = path.scope.generateUidIdentifier("_jsxFileName"); | ||
|  |     path.scope.getProgramParent().push({ | ||
|  |       id: fileNameIdentifier, | ||
|  |       init: _core.types.stringLiteral(filename) | ||
|  |     }); | ||
|  |     state.fileNameIdentifier = fileNameIdentifier; | ||
|  |   } | ||
|  |   return makeTrace(_core.types.cloneNode( | ||
|  |   state.fileNameIdentifier), location.start.line, location.start.column); | ||
|  | } | ||
|  | function makeTrace(fileNameIdentifier, lineNumber, column0Based) { | ||
|  |   const fileLineLiteral = lineNumber != null ? _core.types.numericLiteral(lineNumber) : _core.types.nullLiteral(); | ||
|  |   const fileColumnLiteral = column0Based != null ? _core.types.numericLiteral(column0Based + 1) : _core.types.nullLiteral(); | ||
|  |   return _core.template.expression.ast`{
 | ||
|  |     fileName: ${fileNameIdentifier}, | ||
|  |     lineNumber: ${fileLineLiteral}, | ||
|  |     columnNumber: ${fileColumnLiteral}, | ||
|  |   }`;
 | ||
|  | } | ||
|  | function sourceSelfError(path, name) { | ||
|  |   const pluginName = `transform-react-jsx-${name.slice(2)}`; | ||
|  |   return path.buildCodeFrameError(`Duplicate ${name} prop found. You are most likely using the deprecated ${pluginName} Babel plugin. Both __source and __self are automatically set when using the automatic runtime. Please remove transform-react-jsx-source and transform-react-jsx-self from your Babel config.`); | ||
|  | } | ||
|  | 
 | ||
|  | //# sourceMappingURL=create-plugin.js.map
 |