H5-contact/node_modules/@dcloudio/vite-plugin-uni/dist/uvue/plugins/rewriteImportVue.js

109 lines
4.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rewriteImportVue = exports.rewriteImportVuePlugin = void 0;
const parser_1 = require("@babel/parser");
const es_module_lexer_1 = require("es-module-lexer");
const magic_string_1 = __importDefault(require("magic-string"));
/**
* 如下情况会生成import vue的代码
* 1. uvue页面编译产物通过helpers方式导入的vue相关apidefineComponent、unref等
* 2. 用户代码script中的ref、reactive、computed等
* 3. onLoad等从@dcloudio/uni-app导入的api等
* 4. 用户代码script中import vue的api
*
* 如果在transform中处理需要确保此插件在autoImport之后否则此时2、3尚未生成import vue的代码。
* 如果在renderChunk中处理能保证所有代码都已经生成import vue的代码但是此时热更新会触发所有文件重新处理import vue。
*/
function rewriteImportVuePlugin() {
return {
name: 'uni:rewrite-import-vue',
enforce: 'post',
async transform(source, id) {
await es_module_lexer_1.init;
const [imports] = (0, es_module_lexer_1.parse)(source);
const vueImportRanges = imports.filter((specifier) => specifier.n === 'vue' && specifier.d === -1);
if (!vueImportRanges.length) {
return;
}
const rewritten = rewriteImportVue(source, vueImportRanges);
if (rewritten.hasChanged()) {
return {
code: rewritten.toString(),
// 必须指定hires不然部分情况可能会无法正确映射行号。
map: rewritten.generateMap({ hires: 'boundary' }),
};
}
},
};
}
exports.rewriteImportVuePlugin = rewriteImportVuePlugin;
/**
* import { xx as yy, zz } from 'vue' =>
* const { xx: yy, zz } = globalThis.Vue
*/
function rewriteImportVue(input, importRanges) {
const s = new magic_string_1.default(input);
if (importRanges) {
importRanges.forEach(({ ss, se }) => {
const rewritten = rewriteImportVueStatement(input.slice(ss, se));
if (rewritten !== undefined) {
s.overwrite(ss, se, rewritten);
}
});
}
else {
const ast = (0, parser_1.parse)(input, {
sourceType: 'module',
}).program.body;
ast.forEach((node) => {
if (node.type === 'ImportDeclaration' && node.source.value === 'vue') {
const rewritten = createImportVueReplacement(node);
if (rewritten !== undefined) {
s.overwrite(node.start, node.end, rewritten);
}
}
});
}
return s;
}
exports.rewriteImportVue = rewriteImportVue;
function rewriteImportVueStatement(input) {
const node = (0, parser_1.parse)(input, {
sourceType: 'module',
}).program.body[0];
if (node?.type === 'ImportDeclaration' && node.source.value === 'vue') {
return createImportVueReplacement(node);
}
}
function createImportVueReplacement(node) {
const imports = [];
const declarations = [];
node.specifiers.forEach((specifier) => {
if (specifier.type === 'ImportSpecifier') {
const imported = specifier.imported.name;
const local = specifier.local.name;
if (imported === local) {
imports.push(imported);
}
else {
imports.push(`${imported}: ${local}`);
}
}
else if (specifier.type === 'ImportDefaultSpecifier') {
const local = specifier.local.name;
imports.push(`default: ${local}`);
}
else if (specifier.type === 'ImportNamespaceSpecifier') {
const local = specifier.local.name;
declarations.push(`const ${local} = globalThis.Vue`);
}
});
if (imports.length > 0) {
declarations.push(`const { ${imports.join(', ')} } = globalThis.Vue`);
}
return declarations.join(';');
}