EASYAIuniappNewUI/node_modules/@dcloudio/uni-cli-shared/dist/uni_modules.cloud.js
2025-02-08 18:50:38 +08:00

333 lines
13 KiB
JavaScript
Raw 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.parseUniModulesArtifacts = exports.checkEncryptUniModules = exports.resolveEncryptUniModule = exports.initCheckEnv = exports.packUploadEncryptUniModules = exports.findUploadEncryptUniModulesFiles = exports.findEncryptUniModules = exports.parseEasyComComponents = exports.parseUniModulesWithComponents = exports.genEncryptEasyComModuleIndex = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const fast_glob_1 = require("fast-glob");
const utils_1 = require("./utils");
const easycom_1 = require("./easycom");
const messages_1 = require("./messages");
function genEncryptEasyComModuleIndex(platform, components) {
const imports = [];
const ids = [];
Object.keys(components).forEach((component) => {
const id = (0, utils_1.capitalize)((0, utils_1.camelize)(component));
ids.push(id);
let instance = '';
if (platform === 'app-android') {
instance = (0, easycom_1.genUTSComponentPublicInstanceIdent)(component);
// 类型
ids.push(instance);
}
imports.push(`import ${id}${instance ? `, { ${instance} }` : ''} from './components/${component}/${component}${components[component]}'`);
});
return `
${imports.join('\n')}
export {
${ids.join(',\n ')}
}
`;
}
exports.genEncryptEasyComModuleIndex = genEncryptEasyComModuleIndex;
// 目前该函数仅在云端使用目前仅限iOS/web云端编译时提交上来的uni_modules是过滤好的
function parseUniModulesWithComponents(inputDir) {
const modulesDir = path_1.default.resolve(inputDir, 'uni_modules');
const uniModules = {};
if (fs_extra_1.default.existsSync(modulesDir)) {
fs_extra_1.default.readdirSync(modulesDir).forEach((uniModuleDir) => {
if (!fs_extra_1.default.existsSync(path_1.default.resolve(modulesDir, uniModuleDir, 'package.json'))) {
return;
}
// 解析加密的 easyCom 插件列表
const components = parseEasyComComponents(uniModuleDir, inputDir, false);
uniModules[uniModuleDir] = components;
});
}
return uniModules;
}
exports.parseUniModulesWithComponents = parseUniModulesWithComponents;
/**
* 解析 easyCom 组件列表
* @param pluginId
* @param inputDir
* @returns
*/
function parseEasyComComponents(pluginId, inputDir, detectBinary = true) {
const componentsDir = path_1.default.resolve(inputDir, 'uni_modules', pluginId, 'components');
const components = {};
if (fs_extra_1.default.existsSync(componentsDir)) {
fs_extra_1.default.readdirSync(componentsDir).forEach((componentDir) => {
const componentFile = path_1.default.resolve(componentsDir, componentDir, componentDir);
const extname = ['.vue', '.uvue'].find((extname) => {
const filename = componentFile + extname;
// 探测 filename 是否是二进制文件
if (fs_extra_1.default.existsSync(filename)) {
if (detectBinary) {
// 延迟require这个是新增的依赖无法及时同步到内部测试版本HBuilderX中导致报错所以延迟require吧
if (require('isbinaryfile').isBinaryFileSync(filename)) {
return true;
}
}
else {
return true;
}
}
});
if (extname) {
components[componentDir] = extname;
}
});
}
return components;
}
exports.parseEasyComComponents = parseEasyComComponents;
// 查找所有普通加密插件 uni_modules
function findEncryptUniModules(inputDir, cacheDir = '') {
const modulesDir = path_1.default.resolve(inputDir, 'uni_modules');
const uniModules = {};
if (fs_extra_1.default.existsSync(modulesDir)) {
fs_extra_1.default.readdirSync(modulesDir).forEach((uniModuleDir) => {
const uniModuleRootDir = path_1.default.resolve(modulesDir, uniModuleDir);
if (!fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'encrypt'))) {
return;
}
// 仅扫描普通加密插件,无需依赖
if (fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'utssdk'))) {
return;
}
const pkg = require(path_1.default.resolve(uniModuleRootDir, 'package.json'));
uniModules[uniModuleDir] = findEncryptUniModuleCache(uniModuleDir, cacheDir, { version: pkg.version, env: initCheckEnv() });
});
}
return uniModules;
}
exports.findEncryptUniModules = findEncryptUniModules;
function findUploadEncryptUniModulesFiles(uniModules, platform, inputDir) {
const modules = {};
Object.keys(uniModules).forEach((uniModuleId) => {
if (!uniModules[uniModuleId]) {
modules[uniModuleId] = findUniModuleFiles(platform, uniModuleId, inputDir);
}
});
return modules;
}
exports.findUploadEncryptUniModulesFiles = findUploadEncryptUniModulesFiles;
function packUploadEncryptUniModules(uniModules, platform, inputDir, cacheDir) {
const modules = findUploadEncryptUniModulesFiles(uniModules, platform, inputDir);
const uploadModuleIds = Object.keys(modules);
if (uploadModuleIds.length) {
// 延迟 require避免 vue2 编译器需要安装此依赖,目前该方法仅在 vite 编译器中使用
const AdmZip = require('adm-zip');
const zip = new AdmZip();
uploadModuleIds.forEach((moduleId) => {
modules[moduleId].forEach((file) => {
zip.addLocalFile(file, path_1.default.dirname(path_1.default.relative(inputDir, file)));
});
});
const zipFile = path_1.default.resolve(cacheDir, 'cloud-compile-plugins.zip');
zip.writeZip(zipFile);
return {
zipFile,
modules: uploadModuleIds,
};
}
return {
zipFile: '',
modules: [],
};
}
exports.packUploadEncryptUniModules = packUploadEncryptUniModules;
function isEnvExpired(value, other) {
const valueKeys = Object.keys(value);
const otherKeys = Object.keys(other);
if (valueKeys.length !== otherKeys.length) {
return true;
}
if (valueKeys.find((name) => value[name] !== other[name])) {
return true;
}
return false;
}
function findEncryptUniModuleCache(uniModuleId, cacheDir, options) {
if (!cacheDir) {
return;
}
const uniModuleCacheDir = path_1.default.resolve(cacheDir, 'uni_modules', uniModuleId);
if (fs_extra_1.default.existsSync(uniModuleCacheDir)) {
const pkg = require(path_1.default.resolve(uniModuleCacheDir, 'package.json'));
// 插件版本以及各种环境一致
if (pkg.version === options.version &&
!isEnvExpired(pkg.uni_modules?.artifacts?.env || {}, options.env)) {
const declaration = path_1.default.resolve(uniModuleCacheDir, 'utssdk/app-android/index.d.uts');
pkg.uni_modules.artifacts.declaration = fs_extra_1.default.existsSync(declaration)
? declaration
: '';
return pkg;
}
console.log(`插件${uniModuleId} 缓存已过期,需要重新云编译。`);
// 已过期的插件,删除缓存
fs_extra_1.default.rmSync(uniModuleCacheDir, { recursive: true });
}
}
const KNOWN_ASSET_TYPES = [
// images
'png',
'jpe?g',
'gif',
'svg',
'ico',
'webp',
'avif',
// media
'mp4',
'webm',
'ogg',
'mp3',
'wav',
'flac',
'aac',
// fonts
'woff2?',
'eot',
'ttf',
'otf',
// other
'pdf',
'txt',
];
function findUniModuleFiles(platform, id, inputDir) {
return (0, fast_glob_1.sync)(`uni_modules/${id}/**/*`, {
cwd: inputDir,
absolute: true,
ignore: [
'**/*.md',
...(platform !== 'app-android' // 非 android 平台不需要扫描 assets
? [`**/*.{${KNOWN_ASSET_TYPES.join(',')}}`]
: []),
],
});
}
function initCheckEnv() {
return {
// 云端编译的版本号不带日期及小版本
compilerVersion: process.env.UNI_COMPILER_VERSION,
};
}
exports.initCheckEnv = initCheckEnv;
function findLastIndex(array, predicate) {
for (let i = array.length - 1; i >= 0; i--) {
if (predicate(array[i], i, array)) {
return i;
}
}
return -1;
}
let encryptUniModules = {};
function resolveEncryptUniModule(id, platform, isX = true) {
const parts = id.split('?', 2)[0].split('/');
const index = findLastIndex(parts, (part) => part === 'uni_modules');
if (index !== -1) {
const uniModuleId = parts[index + 1];
if (uniModuleId in encryptUniModules) {
if (parts[index + 2]) {
console.warn(messages_1.M['uni_modules.import']
.replace('{0}', uniModuleId)
.replace('{1}', uniModuleId)
.replace('{2}', parts.slice(index + 2).join('/')));
}
// 原生平台走旧的uts-proxy
return (0, utils_1.normalizePath)(path_1.default.join(process.env.UNI_INPUT_DIR, `uni_modules/${uniModuleId}?${isX && platform === 'app-android' ? 'uts-proxy' : 'uni_helpers'}`));
}
}
}
exports.resolveEncryptUniModule = resolveEncryptUniModule;
async function checkEncryptUniModules(inputDir, params) {
// 扫描加密插件云编译
encryptUniModules = findEncryptUniModules(inputDir, process.env.UNI_MODULES_ENCRYPT_CACHE_DIR);
if (!Object.keys(encryptUniModules).length) {
return {};
}
if (!process.env.UNI_HBUILDERX_PLUGINS) {
return {};
}
const cacheDir = process.env.UNI_MODULES_ENCRYPT_CACHE_DIR;
const { zipFile, modules } = packUploadEncryptUniModules(encryptUniModules, process.env.UNI_UTS_PLATFORM, inputDir, cacheDir);
if (zipFile) {
const downloadFile = path_1.default.resolve(cacheDir, 'uni_modules.download.zip');
const { C, D, R, U } = (0, utils_1.requireUniHelpers)();
try {
const isLogin = await C();
const tips = process.env.UNI_UTS_PLATFORM !== 'app-android'
? '(此过程耗时较长)'
: '';
console.log(`正在云编译插件${isLogin ? '' : '(请先登录)'}${tips}${modules.join(',')}...`);
let downloadUrl = '';
try {
downloadUrl = await U({
params,
attachment: zipFile,
});
}
catch (e) {
if (e.message && e.message === '{"error":"UserNotLogin"}') {
console.log('当前项目包含需要云编译的付费插件需要您先登录HBuilderX账号。');
}
else {
console.error(e);
}
process.exit(0);
}
await D(downloadUrl, downloadFile);
// unzip
const AdmZip = require('adm-zip');
const zip = new AdmZip(downloadFile);
zip.extractAllTo(cacheDir, true);
fs_extra_1.default.unlinkSync(zipFile);
fs_extra_1.default.unlinkSync(downloadFile);
R({
dir: process.env.UNI_INPUT_DIR,
cacheDir: process.env.UNI_MODULES_ENCRYPT_CACHE_DIR,
});
console.log(`云编译已完成`);
console.log(`正在编译中...`);
}
catch (e) {
fs_extra_1.default.existsSync(zipFile) && fs_extra_1.default.unlinkSync(zipFile);
fs_extra_1.default.existsSync(downloadFile) && fs_extra_1.default.unlinkSync(downloadFile);
console.error(e);
process.exit(0);
}
}
else {
// android 平台需要在这里初始化
if (params.platform === 'app-android') {
const { R } = (0, utils_1.requireUniHelpers)();
R({
dir: process.env.UNI_INPUT_DIR,
cacheDir: process.env.UNI_MODULES_ENCRYPT_CACHE_DIR,
});
}
}
encryptUniModules = findEncryptUniModules(inputDir, process.env.UNI_MODULES_ENCRYPT_CACHE_DIR);
}
exports.checkEncryptUniModules = checkEncryptUniModules;
function parseUniModulesArtifacts() {
const res = [];
Object.keys(encryptUniModules).forEach((uniModuleId) => {
const pkg = encryptUniModules[uniModuleId];
if (pkg?.uni_modules?.artifacts) {
res.push({
name: uniModuleId,
package: `uts.sdk.modules.${(0, utils_1.camelize)(uniModuleId)}`,
scopedSlots: pkg.uni_modules.artifacts.scopedSlots || [],
declaration: pkg.uni_modules.artifacts.declaration,
});
}
});
return res;
}
exports.parseUniModulesArtifacts = parseUniModulesArtifacts;