118 lines
5.1 KiB
JavaScript
118 lines
5.1 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.uniAppUVuePlugin = void 0;
|
||
const path_1 = __importDefault(require("path"));
|
||
const fs_extra_1 = __importDefault(require("fs-extra"));
|
||
const shared_1 = require("@vue/shared");
|
||
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
||
const descriptorCache_1 = require("./descriptorCache");
|
||
const utils_1 = require("../utils");
|
||
const style_1 = require("./code/style");
|
||
const main_1 = require("./sfc/main");
|
||
function uniAppUVuePlugin() {
|
||
const options = (0, descriptorCache_1.getResolvedOptions)();
|
||
const appVue = (0, uni_cli_shared_1.resolveAppVue)(process.env.UNI_INPUT_DIR);
|
||
function isAppVue(id) {
|
||
return (0, uni_cli_shared_1.normalizePath)(id) === appVue;
|
||
}
|
||
return {
|
||
name: 'uni:app-uvue',
|
||
apply: 'build',
|
||
async resolveId(id) {
|
||
// serve sub-part requests (*?vue) as virtual modules
|
||
if ((0, uni_cli_shared_1.parseVueRequest)(id).query.vue) {
|
||
return id;
|
||
}
|
||
},
|
||
load(id) {
|
||
const { filename, query } = (0, uni_cli_shared_1.parseVueRequest)(id);
|
||
// select corresponding block for sub-part virtual modules
|
||
if (query.vue) {
|
||
if (query.src) {
|
||
return fs_extra_1.default.readFileSync(filename, 'utf-8');
|
||
}
|
||
const descriptor = (0, descriptorCache_1.getDescriptor)(filename, options);
|
||
let block;
|
||
if (query.type === 'style') {
|
||
block = descriptor.styles[query.index];
|
||
}
|
||
else if (query.index != null) {
|
||
block = descriptor.customBlocks[query.index];
|
||
}
|
||
if (block) {
|
||
return {
|
||
code: block.content,
|
||
map: block.map,
|
||
};
|
||
}
|
||
}
|
||
},
|
||
async transform(code, id) {
|
||
const { filename, query } = (0, uni_cli_shared_1.parseVueRequest)(id);
|
||
if (!(0, utils_1.isVue)(filename)) {
|
||
return;
|
||
}
|
||
if (!query.vue) {
|
||
// main request
|
||
return (0, main_1.transformMain)((0, utils_1.transformUniCloudMixinDataCom)(code), filename, {
|
||
...options,
|
||
componentType: isAppVue(filename)
|
||
? 'app'
|
||
: query.type === 'page'
|
||
? 'page'
|
||
: 'component',
|
||
}, this);
|
||
}
|
||
else {
|
||
// sub block request
|
||
const descriptor = query.src
|
||
? (0, descriptorCache_1.getSrcDescriptor)(filename)
|
||
: (0, descriptorCache_1.getDescriptor)(filename, options);
|
||
if (query.type === 'style') {
|
||
return (0, style_1.transformStyle)(code, descriptor, Number(query.index), options, this, filename);
|
||
}
|
||
}
|
||
},
|
||
generateBundle(_, bundle) {
|
||
// 遍历vue文件,填充style,尽量减少全局变量
|
||
Object.keys(bundle).forEach((name) => {
|
||
const file = bundle[name];
|
||
if (file &&
|
||
file.type === 'asset' &&
|
||
isVueFile(file.fileName) &&
|
||
(0, shared_1.isString)(file.source)) {
|
||
let fileName = (0, uni_cli_shared_1.normalizePath)(file.fileName);
|
||
if (process.env.UNI_APP_X_TSC === 'true') {
|
||
fileName = fileName.replace('.ts', '');
|
||
}
|
||
const className = process.env.UNI_COMPILE_TARGET === 'ext-api'
|
||
? // components/map/map.vue => UniMap
|
||
(0, uni_cli_shared_1.genUTSClassName)(path_1.default.basename(fileName), options.classNamePrefix)
|
||
: (0, uni_cli_shared_1.genUTSClassName)(fileName, options.classNamePrefix);
|
||
const classNameComment = `/*${className}Styles*/`;
|
||
if (file.source.includes(classNameComment)) {
|
||
const styleAssetName = fileName + '.style.uts';
|
||
const styleAsset = bundle[styleAssetName];
|
||
if (styleAsset &&
|
||
styleAsset.type === 'asset' &&
|
||
(0, shared_1.isString)(styleAsset.source)) {
|
||
file.source = file.source.replace(classNameComment, styleAsset.source.replace('export ', ''));
|
||
delete bundle[styleAssetName];
|
||
}
|
||
}
|
||
}
|
||
});
|
||
},
|
||
};
|
||
}
|
||
exports.uniAppUVuePlugin = uniAppUVuePlugin;
|
||
function isVueFile(filename) {
|
||
return (filename.endsWith('.uvue') ||
|
||
filename.endsWith('.vue') ||
|
||
filename.endsWith('.uvue.ts') ||
|
||
filename.endsWith('.vue.ts'));
|
||
}
|