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.
		
		
		
		
		
			
		
			
				
					
					
						
							190 lines
						
					
					
						
							9.1 KiB
						
					
					
				
			
		
		
	
	
							190 lines
						
					
					
						
							9.1 KiB
						
					
					
				"use strict"; | 
						|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | 
						|
    if (k2 === undefined) k2 = k; | 
						|
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | 
						|
}) : (function(o, m, k, k2) { | 
						|
    if (k2 === undefined) k2 = k; | 
						|
    o[k2] = m[k]; | 
						|
})); | 
						|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | 
						|
    Object.defineProperty(o, "default", { enumerable: true, value: v }); | 
						|
}) : function(o, v) { | 
						|
    o["default"] = v; | 
						|
}); | 
						|
var __importStar = (this && this.__importStar) || function (mod) { | 
						|
    if (mod && mod.__esModule) return mod; | 
						|
    var result = {}; | 
						|
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | 
						|
    __setModuleDefault(result, mod); | 
						|
    return result; | 
						|
}; | 
						|
var __importDefault = (this && this.__importDefault) || function (mod) { | 
						|
    return (mod && mod.__esModule) ? mod : { "default": mod }; | 
						|
}; | 
						|
Object.defineProperty(exports, "__esModule", { value: true }); | 
						|
const t = __importStar(require("@babel/types")); | 
						|
const template_1 = __importDefault(require("@babel/template")); | 
						|
const plugin_syntax_jsx_1 = __importDefault(require("@babel/plugin-syntax-jsx")); | 
						|
const helper_module_imports_1 = require("@babel/helper-module-imports"); | 
						|
const transform_vue_jsx_1 = __importDefault(require("./transform-vue-jsx")); | 
						|
const sugar_fragment_1 = __importDefault(require("./sugar-fragment")); | 
						|
const hasJSX = (parentPath) => { | 
						|
    let fileHasJSX = false; | 
						|
    parentPath.traverse({ | 
						|
        JSXElement(path) { | 
						|
            // skip ts error | 
						|
            fileHasJSX = true; | 
						|
            path.stop(); | 
						|
        }, | 
						|
        JSXFragment(path) { | 
						|
            fileHasJSX = true; | 
						|
            path.stop(); | 
						|
        }, | 
						|
    }); | 
						|
    return fileHasJSX; | 
						|
}; | 
						|
const JSX_ANNOTATION_REGEX = /\*?\s*@jsx\s+([^\s]+)/; | 
						|
exports.default = ({ types }) => ({ | 
						|
    name: 'babel-plugin-jsx', | 
						|
    inherits: plugin_syntax_jsx_1.default, | 
						|
    visitor: Object.assign(Object.assign(Object.assign({}, transform_vue_jsx_1.default), sugar_fragment_1.default), { Program: { | 
						|
            enter(path, state) { | 
						|
                if (hasJSX(path)) { | 
						|
                    const importNames = [ | 
						|
                        'createVNode', | 
						|
                        'Fragment', | 
						|
                        'resolveComponent', | 
						|
                        'withDirectives', | 
						|
                        'vShow', | 
						|
                        'vModelSelect', | 
						|
                        'vModelText', | 
						|
                        'vModelCheckbox', | 
						|
                        'vModelRadio', | 
						|
                        'vModelText', | 
						|
                        'vModelDynamic', | 
						|
                        'resolveDirective', | 
						|
                        'mergeProps', | 
						|
                        'createTextVNode', | 
						|
                        'isVNode', | 
						|
                    ]; | 
						|
                    if ((0, helper_module_imports_1.isModule)(path)) { | 
						|
                        // import { createVNode } from "vue"; | 
						|
                        const importMap = {}; | 
						|
                        importNames.forEach((name) => { | 
						|
                            state.set(name, () => { | 
						|
                                if (importMap[name]) { | 
						|
                                    return types.cloneNode(importMap[name]); | 
						|
                                } | 
						|
                                const identifier = (0, helper_module_imports_1.addNamed)(path, name, 'vue', { | 
						|
                                    ensureLiveReference: true, | 
						|
                                }); | 
						|
                                importMap[name] = identifier; | 
						|
                                return identifier; | 
						|
                            }); | 
						|
                        }); | 
						|
                        const { enableObjectSlots = true } = state.opts; | 
						|
                        if (enableObjectSlots) { | 
						|
                            state.set('@vue/babel-plugin-jsx/runtimeIsSlot', () => { | 
						|
                                if (importMap.runtimeIsSlot) { | 
						|
                                    return importMap.runtimeIsSlot; | 
						|
                                } | 
						|
                                const { name: isVNodeName } = state.get('isVNode')(); | 
						|
                                const isSlot = path.scope.generateUidIdentifier('isSlot'); | 
						|
                                const ast = template_1.default.ast ` | 
						|
                  function ${isSlot.name}(s) { | 
						|
                    return typeof s === 'function' || (Object.prototype.toString.call(s) === '[object Object]' && !${isVNodeName}(s)); | 
						|
                  } | 
						|
                `; | 
						|
                                const lastImport = path.get('body') | 
						|
                                    .filter((p) => p.isImportDeclaration()) | 
						|
                                    .pop(); | 
						|
                                if (lastImport) { | 
						|
                                    lastImport.insertAfter(ast); | 
						|
                                } | 
						|
                                importMap.runtimeIsSlot = isSlot; | 
						|
                                return isSlot; | 
						|
                            }); | 
						|
                        } | 
						|
                    } | 
						|
                    else { | 
						|
                        // var _vue = require('vue'); | 
						|
                        let sourceName; | 
						|
                        importNames.forEach((name) => { | 
						|
                            state.set(name, () => { | 
						|
                                if (!sourceName) { | 
						|
                                    sourceName = (0, helper_module_imports_1.addNamespace)(path, 'vue', { | 
						|
                                        ensureLiveReference: true, | 
						|
                                    }); | 
						|
                                } | 
						|
                                return t.memberExpression(sourceName, t.identifier(name)); | 
						|
                            }); | 
						|
                        }); | 
						|
                        const helpers = {}; | 
						|
                        const { enableObjectSlots = true } = state.opts; | 
						|
                        if (enableObjectSlots) { | 
						|
                            state.set('@vue/babel-plugin-jsx/runtimeIsSlot', () => { | 
						|
                                if (helpers.runtimeIsSlot) { | 
						|
                                    return helpers.runtimeIsSlot; | 
						|
                                } | 
						|
                                const isSlot = path.scope.generateUidIdentifier('isSlot'); | 
						|
                                const { object: objectName } = state.get('isVNode')(); | 
						|
                                const ast = template_1.default.ast ` | 
						|
                  function ${isSlot.name}(s) { | 
						|
                    return typeof s === 'function' || (Object.prototype.toString.call(s) === '[object Object]' && !${objectName.name}.isVNode(s)); | 
						|
                  } | 
						|
                `; | 
						|
                                const nodePaths = path.get('body'); | 
						|
                                const lastImport = nodePaths | 
						|
                                    .filter((p) => p.isVariableDeclaration() | 
						|
                                    && p.node.declarations.some((d) => { var _a; return ((_a = d.id) === null || _a === void 0 ? void 0 : _a.name) === sourceName.name; })) | 
						|
                                    .pop(); | 
						|
                                if (lastImport) { | 
						|
                                    lastImport.insertAfter(ast); | 
						|
                                } | 
						|
                                return isSlot; | 
						|
                            }); | 
						|
                        } | 
						|
                    } | 
						|
                    const { opts: { pragma = '' }, file, } = state; | 
						|
                    if (pragma) { | 
						|
                        state.set('createVNode', () => t.identifier(pragma)); | 
						|
                    } | 
						|
                    if (file.ast.comments) { | 
						|
                        for (const comment of file.ast.comments) { | 
						|
                            const jsxMatches = JSX_ANNOTATION_REGEX.exec(comment.value); | 
						|
                            if (jsxMatches) { | 
						|
                                state.set('createVNode', () => t.identifier(jsxMatches[1])); | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            }, | 
						|
            exit(path) { | 
						|
                const body = path.get('body'); | 
						|
                const specifiersMap = new Map(); | 
						|
                body | 
						|
                    .filter((nodePath) => t.isImportDeclaration(nodePath.node) | 
						|
                    && nodePath.node.source.value === 'vue') | 
						|
                    .forEach((nodePath) => { | 
						|
                    const { specifiers } = nodePath.node; | 
						|
                    let shouldRemove = false; | 
						|
                    specifiers.forEach((specifier) => { | 
						|
                        if (!specifier.loc | 
						|
                            && t.isImportSpecifier(specifier) | 
						|
                            && t.isIdentifier(specifier.imported)) { | 
						|
                            specifiersMap.set(specifier.imported.name, specifier); | 
						|
                            shouldRemove = true; | 
						|
                        } | 
						|
                    }); | 
						|
                    if (shouldRemove) { | 
						|
                        nodePath.remove(); | 
						|
                    } | 
						|
                }); | 
						|
                const specifiers = [...specifiersMap.keys()].map((imported) => specifiersMap.get(imported)); | 
						|
                if (specifiers.length) { | 
						|
                    path.unshiftContainer('body', t.importDeclaration(specifiers, t.stringLiteral('vue'))); | 
						|
                } | 
						|
            }, | 
						|
        } }), | 
						|
}); | 
						|
//# sourceMappingURL=index.js.map
 |