137 lines
5.9 KiB
JavaScript
137 lines
5.9 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.uniViteSfcSrcImportPlugin = exports.isSrcImportVue = exports.isSrcImport = void 0;
|
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
const magic_string_1 = __importDefault(require("magic-string"));
|
|
const vue_1 = require("../../vue");
|
|
const utils_1 = require("../utils");
|
|
const preprocess_1 = require("../../preprocess");
|
|
const SRC_IMPORT_RE = /<(template|script|style)[^>]*src\s*=\s*["']([^"']+)["'][^>]*>/;
|
|
const SRC_IMPORT_VUE_RE = /<(template|script|style)[^>]*src\s*=\s*["'](.*\.uvue|.*\.vue)["'][^>]*>/;
|
|
function isSrcImport(code) {
|
|
return SRC_IMPORT_RE.test(code);
|
|
}
|
|
exports.isSrcImport = isSrcImport;
|
|
function isSrcImportVue(code) {
|
|
return SRC_IMPORT_VUE_RE.test(code);
|
|
}
|
|
exports.isSrcImportVue = isSrcImportVue;
|
|
function uniViteSfcSrcImportPlugin({ onlyVue } = { onlyVue: true }) {
|
|
const { parse } = require('@vue/compiler-sfc');
|
|
const hasImport = onlyVue ? isSrcImportVue : isSrcImport;
|
|
const isValidSrc = onlyVue ? vue_1.isVueSfcFile : () => true;
|
|
return {
|
|
name: 'uni:sfc-src-import',
|
|
async transform(code, id) {
|
|
if (!(0, vue_1.isVueSfcFile)(id)) {
|
|
return;
|
|
}
|
|
if (!hasImport(code)) {
|
|
return;
|
|
}
|
|
const s = new magic_string_1.default(code);
|
|
const sourceMap = process.env.NODE_ENV === 'development';
|
|
const createDescriptor = (filename, code, from) => {
|
|
if (from === 'vue' || (0, vue_1.isVueSfcFile)(filename)) {
|
|
const { descriptor, errors } = parse(code, {
|
|
filename,
|
|
sourceMap,
|
|
});
|
|
errors.forEach((error) => this.error((0, utils_1.createRollupError)('', filename, error, code)));
|
|
return descriptor;
|
|
}
|
|
else {
|
|
const descriptor = {
|
|
filename,
|
|
source: fs_extra_1.default.readFileSync(filename, 'utf-8'),
|
|
template: null,
|
|
script: null,
|
|
scriptSetup: null,
|
|
styles: [],
|
|
customBlocks: [],
|
|
};
|
|
if (from === 'template') {
|
|
descriptor.template = {
|
|
content: descriptor.source,
|
|
};
|
|
}
|
|
else if (from === 'script') {
|
|
descriptor.script = {
|
|
content: descriptor.source,
|
|
};
|
|
}
|
|
else if (from === 'style') {
|
|
descriptor.styles = [
|
|
{
|
|
content: descriptor.source,
|
|
},
|
|
];
|
|
}
|
|
return descriptor;
|
|
}
|
|
};
|
|
const descriptor = createDescriptor(id, code, 'vue');
|
|
const cache = new Map();
|
|
const getSrcDescriptor = async (src, from) => {
|
|
if (cache.has(src)) {
|
|
return cache.get(src);
|
|
}
|
|
const resolved = await this.resolve(src, descriptor.filename);
|
|
if (resolved) {
|
|
const filename = resolved.id;
|
|
const srcDescriptor = createDescriptor(filename, (0, preprocess_1.preUVueJs)((0, preprocess_1.preUVueHtml)(fs_extra_1.default.readFileSync(filename, 'utf-8'))), from);
|
|
cache.set(src, srcDescriptor);
|
|
this.addWatchFile(filename);
|
|
return srcDescriptor;
|
|
}
|
|
};
|
|
if (descriptor.template?.src && isValidSrc(descriptor.template.src)) {
|
|
const srcDescriptor = await getSrcDescriptor(descriptor.template.src, 'template');
|
|
if (srcDescriptor && srcDescriptor.template?.content) {
|
|
overwriteContent(s, descriptor.template.loc, srcDescriptor.template.content);
|
|
}
|
|
}
|
|
if (descriptor.script?.src && isValidSrc(descriptor.script.src)) {
|
|
const srcDescriptor = await getSrcDescriptor(descriptor.script.src, 'script');
|
|
if (srcDescriptor && srcDescriptor.script?.content) {
|
|
overwriteContent(s, descriptor.script.loc, srcDescriptor.script.content);
|
|
}
|
|
}
|
|
for (const style of descriptor.styles) {
|
|
if (style.src && isValidSrc(style.src)) {
|
|
const srcDescriptor = await getSrcDescriptor(style.src, 'style');
|
|
if (srcDescriptor && srcDescriptor.styles[0]) {
|
|
overwriteContent(s, style.loc, srcDescriptor.styles[0].content);
|
|
}
|
|
}
|
|
}
|
|
if (!s.hasChanged()) {
|
|
return;
|
|
}
|
|
// 移除所有的 src 属性
|
|
const regex = /(<(template|script|style)[^>]*)src\s*=\s*["']([^"']+)["']([^>]*>)/g;
|
|
let match;
|
|
while ((match = regex.exec(code))) {
|
|
const [_, start, _tag, _src, end] = match;
|
|
s.overwrite(match.index, match.index + _.length, `${start}${end}`);
|
|
}
|
|
return {
|
|
code: s.toString(),
|
|
map: sourceMap ? s.generateMap({ hires: true }) : { mappings: '' },
|
|
};
|
|
},
|
|
};
|
|
}
|
|
exports.uniViteSfcSrcImportPlugin = uniViteSfcSrcImportPlugin;
|
|
function overwriteContent(s, loc, content) {
|
|
if (loc.start.offset === loc.end.offset) {
|
|
s.appendRight(loc.start.offset, content);
|
|
}
|
|
else {
|
|
s.overwrite(loc.start.offset, loc.end.offset, content);
|
|
}
|
|
}
|