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.

143 lines
7.0 KiB

2 months ago
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniEntryPlugin = exports.parseComponentStyleIsolation = exports.isUniComponentUrl = exports.isUniPageUrl = exports.parseVirtualComponentPath = exports.parseVirtualPagePath = exports.virtualComponentPath = exports.virtualPagePath = void 0;
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
const uniPagePrefix = 'uniPage://';
const uniComponentPrefix = 'uniComponent://';
function virtualPagePath(filepath) {
return uniPagePrefix + (0, uni_cli_shared_1.encodeBase64Url)(filepath);
}
exports.virtualPagePath = virtualPagePath;
function virtualComponentPath(filepath) {
return uniComponentPrefix + (0, uni_cli_shared_1.encodeBase64Url)(filepath);
}
exports.virtualComponentPath = virtualComponentPath;
function parseVirtualPagePath(uniPageUrl) {
return (0, uni_cli_shared_1.decodeBase64Url)(uniPageUrl.replace(uniPagePrefix, ''));
}
exports.parseVirtualPagePath = parseVirtualPagePath;
function parseVirtualComponentPath(uniComponentUrl) {
return (0, uni_cli_shared_1.decodeBase64Url)(uniComponentUrl.replace(uniComponentPrefix, ''));
}
exports.parseVirtualComponentPath = parseVirtualComponentPath;
function isUniPageUrl(id) {
return id.startsWith(uniPagePrefix);
}
exports.isUniPageUrl = isUniPageUrl;
function isUniComponentUrl(id) {
return id.startsWith(uniComponentPrefix);
}
exports.isUniComponentUrl = isUniComponentUrl;
const styleIsolationRE = [
/defineOptions\s*[\s\S]*?styleIsolation\s*:\s*['"](isolated|apply-shared|shared)['"]/,
/export\s+default\s+[\s\S]*?styleIsolation\s*:\s*['|"](isolated|apply-shared|shared)['|"]/,
];
function parseComponentStyleIsolation(content) {
for (const regex of styleIsolationRE) {
const matches = content.match(regex);
if (matches) {
return matches[1];
}
}
}
exports.parseComponentStyleIsolation = parseComponentStyleIsolation;
function uniEntryPlugin({ global, template, style, }) {
const inputDir = process.env.UNI_INPUT_DIR;
const manifestJson = (0, uni_cli_shared_1.parseManifestJsonOnce)(inputDir);
const platformOptions = manifestJson[process.env.UNI_PLATFORM] || {};
const easycomEncryptComponentPaths = new Set();
return {
name: 'uni:virtual',
enforce: 'pre',
resolveId(id) {
if (isUniPageUrl(id) || isUniComponentUrl(id)) {
return id;
}
},
buildStart() {
easycomEncryptComponentPaths.clear();
},
load(id) {
if (isUniPageUrl(id)) {
const filepath = (0, uni_cli_shared_1.normalizePath)(path_1.default.resolve(inputDir, parseVirtualPagePath(id)));
this.addWatchFile(filepath);
return {
code: `import MiniProgramPage from '${filepath}'
${global}.createPage(MiniProgramPage)`,
};
}
else if (isUniComponentUrl(id)) {
const filepath = (0, uni_cli_shared_1.normalizePath)(path_1.default.resolve(inputDir, parseVirtualComponentPath(id)));
this.addWatchFile(filepath);
const relativePath = (0, uni_cli_shared_1.normalizePath)(path_1.default.relative(inputDir, filepath));
// 判断当前插件是否是easycom加密插件
if (relativePath.startsWith('uni_modules')) {
const pluginId = relativePath.split('/')[1];
const encryptType = (0, uni_cli_shared_1.getUniModulesEncryptType)(pluginId);
if (encryptType === 'easycom') {
const componentName = (0, uni_cli_shared_1.capitalize)((0, uni_cli_shared_1.camelize)((0, uni_cli_shared_1.removeExt)(path_1.default.basename(relativePath))));
easycomEncryptComponentPaths.add((0, uni_cli_shared_1.removeExt)(relativePath));
return {
code: `import { defineComponent${componentName} } from '@/uni_modules/${pluginId}?uni_helpers'
defineComponent${componentName}()`,
};
}
}
const json = {
component: true,
styleIsolation: undefined,
};
if (process.env.UNI_PLATFORM === 'mp-alipay') {
json.styleIsolation =
parseComponentStyleIsolation(fs_1.default.readFileSync(filepath, 'utf-8')) ||
platformOptions.styleIsolation ||
'apply-shared';
}
// 微信小程序json文件中的styleIsolation优先级比options中的高为了兼容旧版本不能设置默认值并且只有在manifest.json中配置styleIsolation才会静态分析组件的styleIsolation
if (process.env.UNI_PLATFORM === 'mp-weixin') {
if (platformOptions.styleIsolation) {
json.styleIsolation =
parseComponentStyleIsolation(fs_1.default.readFileSync(filepath, 'utf-8')) || platformOptions.styleIsolation;
}
}
(0, uni_cli_shared_1.addMiniProgramComponentJson)((0, uni_cli_shared_1.removeExt)((0, uni_cli_shared_1.normalizeMiniProgramFilename)(filepath, inputDir)), json);
if (process.env.UNI_COMPILE_TARGET === 'uni_modules') {
// 云编译时组件的代码会直接内联到入口文件中以方法对外导出不能立刻执行createComponent
return {
code: `import Component from '${filepath}
export default Component`,
};
}
return {
code: `import Component from '${filepath}'
${global}.createComponent(Component)`,
};
}
},
generateBundle() {
const cacheDir = process.env.UNI_MODULES_ENCRYPT_CACHE_DIR;
if (cacheDir) {
for (const componentPath of easycomEncryptComponentPaths) {
const componentCachePath = path_1.default.resolve(cacheDir, componentPath);
['.json', template.extname, style.extname].forEach((extname) => {
const filename = componentCachePath + extname;
if (fs_1.default.existsSync(filename)) {
this.emitFile({
fileName: componentPath + extname,
type: 'asset',
source: fs_1.default.readFileSync(filename, 'utf-8'),
});
}
});
}
}
},
};
}
exports.uniEntryPlugin = uniEntryPlugin;