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.

360 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseUTSModuleDeps = exports.capitalize = exports.camelize = exports.parseInjects = exports.parseUniExtApi = exports.parseUniExtApis = exports.getUniExtApiProviderRegisters = exports.formatExtApiProviderName = exports.getUniExtApiPlugins = exports.getUniExtApiProviders = exports.isNonTreeShakingPlugin = exports.getNonTreeShakingPlugins = void 0;
// 重要:此文件编译后的js,需同步至 vue2 编译器中 uni-cli-shared/lib/uts/uni_modules.js
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const extApiProviders = [];
const extApiPlugins = new Set();
function getNonTreeShakingPlugins() {
const result = [];
if (!process.env.UNI_INPUT_DIR || !process.env.UNI_UTS_PLATFORM) {
return result;
}
const uniModulesDir = path_1.default.resolve(process.env.UNI_INPUT_DIR, 'uni_modules');
if (!fs_extra_1.default.existsSync(uniModulesDir)) {
return result;
}
const platform = process.env.UNI_UTS_PLATFORM;
fs_extra_1.default.readdirSync(uniModulesDir).forEach((uniModuleDir) => {
const uniModuleRootDir = path_1.default.resolve(uniModulesDir, uniModuleDir);
const pkgPath = path_1.default.resolve(uniModuleRootDir, 'package.json');
if (!fs_extra_1.default.existsSync(pkgPath)) {
return;
}
try {
/**
"uni_modules": {
"treeShaking": {
"app": {
"android": false,
"ios": true,
"harmony": false
},
"web": false
}
}
*/
const pkg = JSON.parse(fs_extra_1.default.readFileSync(pkgPath, 'utf8'));
if (isPlainObject(pkg.uni_modules)) {
if (isNonTreeShakingPlugin(platform, pkg.uni_modules)) {
result.push(uniModuleDir);
}
}
}
catch (e) { }
});
return result;
}
exports.getNonTreeShakingPlugins = getNonTreeShakingPlugins;
function isNonTreeShakingPlugin(platform, uni_modules) {
const treeShaking = uni_modules.treeShaking;
// uni_modules.treeShaking 为 false,表示不进行treeShaking
if (treeShaking === false) {
return true;
}
else if (isPlainObject(treeShaking)) {
// 如果 treeShaking 为对象,则需要根据平台判断是否进行treeShaking
// uni_modules.treeShaking.web 为 false,表示不进行treeShaking
if (treeShaking[platform] === false) {
return true;
}
else {
const parts = platform.split('-');
if (parts.length === 2) {
const [basePlatform, subPlatform] = parts;
// uni_modules.treeShaking.app 为 false,表示不进行treeShaking
if (treeShaking[basePlatform] === false) {
return true;
// uni_modules.treeShaking.app.android 为 false,表示不进行treeShaking
}
else if (treeShaking[basePlatform]?.[subPlatform] === false) {
return true;
}
}
}
}
return false;
}
exports.isNonTreeShakingPlugin = isNonTreeShakingPlugin;
function getUniExtApiProviders() {
return extApiProviders;
}
exports.getUniExtApiProviders = getUniExtApiProviders;
function getUniExtApiPlugins() {
return [...extApiPlugins].map((plugin) => {
return { plugin };
});
}
exports.getUniExtApiPlugins = getUniExtApiPlugins;
function formatExtApiProviderName(service, name) {
if (service === 'oauth') {
service = 'OAuth';
}
return `Uni${(0, exports.capitalize)((0, exports.camelize)(service))}${(0, exports.capitalize)((0, exports.camelize)(name))}ProviderImpl`;
}
exports.formatExtApiProviderName = formatExtApiProviderName;
function getUniExtApiProviderRegisters() {
const result = [];
extApiProviders.forEach((provider) => {
if (provider.name && provider.service) {
result.push({
name: provider.name,
plugin: provider.plugin,
service: provider.service,
class: `uts.sdk.modules.${(0, exports.camelize)(provider.plugin)}.${formatExtApiProviderName(provider.service, provider.name)}`,
});
}
});
return result;
}
exports.getUniExtApiProviderRegisters = getUniExtApiProviderRegisters;
function parseUniExtApis(vite = true, platform, language = 'javascript') {
if (!process.env.UNI_INPUT_DIR) {
return {};
}
const uniModulesDir = path_1.default.resolve(process.env.UNI_INPUT_DIR, 'uni_modules');
if (!fs_extra_1.default.existsSync(uniModulesDir)) {
return {};
}
const injects = {};
extApiProviders.length = 0;
extApiPlugins.clear();
fs_extra_1.default.readdirSync(uniModulesDir).forEach((uniModuleDir) => {
// 必须以 uni- 开头
if (!uniModuleDir.startsWith('uni-')) {
return;
}
const uniModuleRootDir = path_1.default.resolve(uniModulesDir, uniModuleDir);
const pkgPath = path_1.default.resolve(uniModuleRootDir, 'package.json');
if (!fs_extra_1.default.existsSync(pkgPath)) {
return;
}
try {
let exports;
const pkg = JSON.parse(fs_extra_1.default.readFileSync(pkgPath, 'utf8'));
if (pkg && pkg.uni_modules && pkg.uni_modules['uni-ext-api']) {
exports = pkg.uni_modules['uni-ext-api'];
}
if (exports) {
const provider = exports.provider;
if (provider && provider.service) {
provider.plugin = uniModuleDir;
extApiProviders.push(provider);
}
extApiPlugins.add(uniModuleDir);
const curInjects = parseInjects(vite, platform, language, `@/uni_modules/${uniModuleDir}`, uniModuleRootDir, exports);
Object.assign(injects, curInjects);
}
}
catch (e) { }
});
return injects;
}
exports.parseUniExtApis = parseUniExtApis;
function parseUniExtApi(pluginDir, pluginId, vite = true, platform, language = 'javascript') {
const pkgPath = path_1.default.resolve(pluginDir, 'package.json');
if (!fs_extra_1.default.existsSync(pkgPath)) {
return;
}
let exports;
const pkg = JSON.parse(fs_extra_1.default.readFileSync(pkgPath, 'utf8'));
if (pkg && pkg.uni_modules && pkg.uni_modules['uni-ext-api']) {
exports = pkg.uni_modules['uni-ext-api'];
}
if (exports) {
return parseInjects(vite, platform, language, `@/uni_modules/${pluginId}`, pluginDir, exports);
}
}
exports.parseUniExtApi = parseUniExtApi;
/**
* uni:'getBatteryInfo'
* import getBatteryInfo from '..'
*
* uni:['getBatteryInfo']
* import { getBatteryInfo } from '..'
*
* uni:['openLocation','chooseLocation']
* import { openLocation, chooseLocation } from '..'
*
* uni:{
* onUserCaptureScreen: "onCaptureScreen"
* offUserCaptureScreen: "offCaptureScreen"
* }
*
* uni.getBatteryInfo = getBatteryInfo
* @param source
* @param globalObject
* @param define
* @returns
*/
function parseInjects(vite = true, platform, language, source, uniModuleRootDir, exports = {}) {
if (platform === 'app-plus') {
platform = 'app';
}
let rootDefines = {};
Object.keys(exports).forEach((name) => {
if (name.startsWith('uni')) {
rootDefines[name] = exports[name];
}
});
const injects = {};
if (Object.keys(rootDefines).length) {
const platformIndexFileName = path_1.default.resolve(uniModuleRootDir, 'utssdk', platform);
const rootIndexFileName = path_1.default.resolve(uniModuleRootDir, 'utssdk', 'index.uts');
let hasPlatformFile = uniModuleRootDir
? fs_extra_1.default.existsSync(rootIndexFileName) || fs_extra_1.default.existsSync(platformIndexFileName)
: true;
if (!hasPlatformFile) {
if (platform === 'app') {
hasPlatformFile =
fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'utssdk', 'app-android')) ||
fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'utssdk', 'app-ios')) ||
fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'utssdk', 'app-harmony'));
}
}
// 其他平台修改source,直接指向目标文件,否则 uts2js 找不到类型信息
if (platform !== 'app' &&
platform !== 'app-android' &&
platform !== 'app-ios' &&
platform !== 'app-harmony') {
// uts2js 已经处理了类型信息,无需再处理,否则还要考虑各种文件后缀,比如.ts,.js
// if (fs.existsSync(platformIndexFileName)) {
// source = `${source}/utssdk/${platform}/index.uts`
// } else if (fs.existsSync(rootIndexFileName)) {
// source = `${source}/utssdk/index.uts`
// }
}
else if (process.env.UNI_APP_X_UVUE_SCRIPT_ENGINE === 'js') {
if (fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'utssdk', 'app-js', 'index.uts'))) {
source = `${source}/utssdk/app-js/index.uts`;
}
}
else if (process.env.UNI_UTS_PLATFORM === 'app-harmony') {
// 出于兼容历史项目考虑,鸿蒙优先使用app-harmony,无app-harmony的情况下再使用app-js
if (!fs_extra_1.default.existsSync(platformIndexFileName) &&
fs_extra_1.default.existsSync(path_1.default.resolve(uniModuleRootDir, 'utssdk', 'app-js', 'index.uts'))) {
source = `${source}/utssdk/app-js/index.uts`;
}
}
for (const key in rootDefines) {
Object.assign(injects, parseInject(vite, platform, language, source, 'uni', rootDefines[key], hasPlatformFile));
}
}
return injects;
}
exports.parseInjects = parseInjects;
function parseInject(vite = true, platform, language, source, globalObject, define, hasPlatformFile) {
const injects = {};
if (define === false) {
}
else if (typeof define === 'string') {
// {'uni.getBatteryInfo' : '@dcloudio/uni-getbatteryinfo'}
if (hasPlatformFile) {
injects[globalObject + '.' + define] = vite ? source : [source, 'default'];
}
}
else if (Array.isArray(define)) {
// {'uni.getBatteryInfo' : ['@dcloudio/uni-getbatteryinfo','getBatteryInfo]}
if (hasPlatformFile) {
define.forEach((d) => {
injects[globalObject + '.' + d] = [source, d];
});
}
}
else {
const keys = Object.keys(define);
keys.forEach((d) => {
if (typeof define[d] === 'string') {
if (hasPlatformFile) {
injects[globalObject + '.' + d] = [source, define[d]];
}
}
else {
const defineOptions = define[d];
const p = platform === 'app-android' ||
platform === 'app-ios' ||
platform === 'app-harmony'
? 'app'
: platform;
if (!(p in defineOptions)) {
if (hasPlatformFile) {
injects[globalObject + '.' + d] = [source, defineOptions.name || d];
}
}
else {
if (defineOptions[p] !== false) {
if (p === 'app') {
const appOptions = defineOptions.app;
if (isPlainObject(appOptions)) {
// js engine 下且存在 app-js,不检查
const skipCheck = (process.env.UNI_APP_X_UVUE_SCRIPT_ENGINE === 'js' ||
process.env.UNI_UTS_PLATFORM === 'app-harmony') &&
source.includes('app-js');
if (!skipCheck) {
const targetLanguage = language === 'javascript' ? 'js' : language;
if (targetLanguage && appOptions[targetLanguage] === false) {
return;
}
}
}
injects[globalObject + '.' + d] = [
source,
defineOptions.name || d,
defineOptions.app,
];
}
else {
injects[globalObject + '.' + d] = [
source,
defineOptions.name || d,
];
}
}
}
}
});
}
return injects;
}
const objectToString = Object.prototype.toString;
const toTypeString = (value) => objectToString.call(value);
function isPlainObject(val) {
return toTypeString(val) === '[object Object]';
}
const cacheStringFunction = (fn) => {
const cache = Object.create(null);
return ((str) => {
const hit = cache[str];
return hit || (cache[str] = fn(str));
});
};
const camelizeRE = /-(\w)/g;
/**
* @private
*/
exports.camelize = cacheStringFunction((str) => {
return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
});
/**
* @private
*/
exports.capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));
/**
* 解析 UTS 类型的模块依赖列表
* @param deps
* @param inputDir
* @returns
*/
function parseUTSModuleDeps(deps, inputDir) {
const modulesDir = path_1.default.resolve(inputDir, 'uni_modules');
return deps.filter((dep) => {
const depName = dep.includes(':') ? dep.split(':')[1] : dep;
return fs_extra_1.default.existsSync(path_1.default.resolve(modulesDir, depName, 'utssdk'));
});
}
exports.parseUTSModuleDeps = parseUTSModuleDeps;