Initial commit - full huishou project

This commit is contained in:
jiapengyu
2026-07-27 14:07:26 +08:00
commit 60790ad1b3
39127 changed files with 5989265 additions and 0 deletions
@@ -0,0 +1,13 @@
import type { Plugin } from 'vite';
import { type Injects, parseUniExtApis } from '../../../uni_modules';
export declare const parseUniExtApisOnce: typeof parseUniExtApis;
export declare function uniUTSExtApiReplace(): Plugin;
/**
* { 'uni.getBatteryInfo': ['@/uni_modules/uni-getbatteryinfo/utssdk/web/index.uts','getBatteryInfo'] }
* { '@/uni_modules/uni-getbatteryinfo/utssdk/web/index.ts': [['getBatteryInfo', 'uni_getBatteryInfo']] }
* @param injects
*/
export declare function injectsToAutoImports(injects: Injects): {
from: string;
imports: [string, string][];
}[];
+80
View File
@@ -0,0 +1,80 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.injectsToAutoImports = exports.uniUTSExtApiReplace = exports.parseUniExtApisOnce = void 0;
const shared_1 = require("@vue/shared");
const uni_shared_1 = require("@dcloudio/uni-shared");
const vite_1 = __importDefault(require("unplugin-auto-import/vite"));
const uni_modules_1 = require("../../../uni_modules");
const url_1 = require("../../utils/url");
const escape = (str) => str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
exports.parseUniExtApisOnce = (0, uni_shared_1.once)(uni_modules_1.parseUniExtApis);
function uniUTSExtApiReplace() {
const injects = (0, exports.parseUniExtApisOnce)(true, process.env.UNI_UTS_PLATFORM, process.env.UNI_UTS_TARGET_LANGUAGE);
const injectApis = Object.keys(injects);
const firstPass = new RegExp(`(?:${injectApis.map(escape).join('|')})`, 'g');
return {
name: 'uni:uts-ext-api-replace',
configResolved(config) {
const index = config.plugins.findIndex((p) => p.name === 'uts');
if (index > -1) {
if (Object.keys(injects).length) {
// @ts-expect-error
config.plugins.splice(index, 0, (0, vite_1.default)({
include: [/\.[u]?ts$/, /\.[u]?vue/],
exclude: [/[\\/]\.git[\\/]/],
imports: injectsToAutoImports(injects),
dts: false,
}));
}
}
},
transform(code, id) {
if (!injectApis.length) {
return;
}
if (!(0, url_1.isJsFile)(id)) {
return;
}
if (code.search(firstPass) === -1) {
return;
}
injectApis.forEach((api) => {
code = code.replaceAll(api, api.replace('.', '_'));
});
return {
code,
map: { mappings: '' },
};
},
};
}
exports.uniUTSExtApiReplace = uniUTSExtApiReplace;
/**
* { 'uni.getBatteryInfo': ['@/uni_modules/uni-getbatteryinfo/utssdk/web/index.uts','getBatteryInfo'] }
* { '@/uni_modules/uni-getbatteryinfo/utssdk/web/index.ts': [['getBatteryInfo', 'uni_getBatteryInfo']] }
* @param injects
*/
function injectsToAutoImports(injects) {
const autoImports = {};
Object.keys(injects).forEach((api) => {
const options = injects[api];
if ((0, shared_1.isArray)(options) && options.length >= 2) {
const source = options[0];
const name = options[1];
if (!autoImports[source]) {
autoImports[source] = [];
}
autoImports[source].push([name, api.replace('.', '_')]);
}
});
return Object.keys(autoImports).map((source) => {
return {
from: source,
imports: autoImports[source],
};
});
}
exports.injectsToAutoImports = injectsToAutoImports;
@@ -0,0 +1,17 @@
import type { Plugin } from 'vite';
interface UniUTSPluginOptions {
x?: boolean;
extApis?: Record<string, [string, string]>;
isSingleThread?: boolean;
}
export declare function getCurrentCompiledUTSPlugins(): Set<string>;
export declare function uniUTSAppUniModulesPlugin(options?: UniUTSPluginOptions): Plugin;
export declare function buildUniExtApis(): Promise<void>;
export declare function resolveExtApiProvider(pkg: Record<string, any>): {
name?: string | undefined;
plugin?: string | undefined;
service: string;
servicePlugin: string;
} | undefined;
export declare function uniDecryptUniModulesPlugin(): Plugin;
export {};
@@ -0,0 +1,215 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniDecryptUniModulesPlugin = exports.resolveExtApiProvider = exports.buildUniExtApis = exports.uniUTSAppUniModulesPlugin = exports.getCurrentCompiledUTSPlugins = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const uni_shared_1 = require("@dcloudio/uni-shared");
const uts_1 = require("../../../uts");
const utils_1 = require("../../utils");
const uni_modules_1 = require("../../../uni_modules");
const utils_2 = require("../../../utils");
const json_1 = require("../../../json");
const UTSProxyRE = /\?uts-proxy$/;
const UniHelpersRE = /\?uni_helpers$/;
function isUTSProxy(id) {
return UTSProxyRE.test(id);
}
function isUniHelpers(id) {
return UniHelpersRE.test(id);
}
const utsModuleCaches = new Map();
const utsPlugins = new Set();
function getCurrentCompiledUTSPlugins() {
return utsPlugins;
}
exports.getCurrentCompiledUTSPlugins = getCurrentCompiledUTSPlugins;
let uniExtApiCompiler = async () => { };
// 该插件仅限app-android、app-ios、app-harmony
function uniUTSAppUniModulesPlugin(options = {}) {
const inputDir = process.env.UNI_INPUT_DIR;
process.env.UNI_UTS_USING_ROLLUP = 'true';
const compilePlugin = async (pluginDir) => {
utsPlugins.add(path_1.default.basename(pluginDir));
const pkgJson = require(path_1.default.join(pluginDir, 'package.json'));
const isExtApi = !!pkgJson.uni_modules?.['uni-ext-api'];
const extApiProvider = resolveExtApiProvider(pkgJson);
// 如果是 provider 扩展,需要判断 provider 的宿主插件是否在本地,在的话,自动导入该宿主插件包名
let uniExtApiProviderServicePlugin = '';
if (extApiProvider?.servicePlugin) {
if (fs_1.default.existsSync(path_1.default.resolve(inputDir, 'uni_modules', extApiProvider.servicePlugin))) {
uniExtApiProviderServicePlugin = extApiProvider.servicePlugin;
}
}
const compiler = (0, uts_1.resolveUTSCompiler)();
// 处理依赖的 uts 插件
const deps = (0, uni_modules_1.parseUTSModuleDeps)(pkgJson.uni_modules?.dependencies || [], inputDir);
if (deps.length) {
for (const dep of deps) {
await compilePlugin(path_1.default.resolve(inputDir, 'uni_modules', dep));
}
}
if (process.env.UNI_PLATFORM === 'app-harmony') {
return compiler.compileArkTS(pluginDir, {
isX: !!options.x,
isExtApi,
});
}
return compiler.compile(pluginDir, {
isX: !!options.x,
isSingleThread: !!options.isSingleThread,
isPlugin: true,
isExtApi,
extApis: options.extApis,
sourceMap: (0, utils_2.enableSourceMap)(),
uni_modules: deps,
transform: {
uniExtApiProviderName: extApiProvider?.name,
uniExtApiProviderService: extApiProvider?.service,
uniExtApiProviderServicePlugin,
},
});
};
uniExtApiCompiler = async () => {
// 获取 provider 扩展(编译所有uni)
const plugins = (0, uni_modules_1.getUniExtApiPlugins)().filter((provider) => !utsPlugins.has(provider.plugin));
for (const plugin of plugins) {
const result = await compilePlugin(path_1.default.resolve(inputDir, 'uni_modules', plugin.plugin));
if (result) {
// 时机不对,不能addWatch
// result.deps.forEach((dep) => {
// this.addWatchFile(dep)
// })
}
}
};
return {
name: 'uni:uts-uni_modules',
apply: 'build',
enforce: 'pre',
resolveId(id, importer) {
if (isUTSProxy(id) || isUniHelpers(id)) {
return id;
}
// 加密插件缓存目录的css文件
if (id.endsWith('.css')) {
return;
}
const module = (0, uts_1.resolveUTSAppModule)(process.env.UNI_UTS_PLATFORM, id, importer ? path_1.default.dirname(importer) : inputDir, options.x !== true);
if (module) {
// app-js 会直接返回 index.uts 路径,不需要 uts-proxy
if (module.endsWith('.uts')) {
return module;
}
// prefix the polyfill id with \0 to tell other plugins not to try to load or transform it
return module + '?uts-proxy';
}
},
load(id) {
if (isUTSProxy(id)) {
return '';
}
},
buildEnd() {
utsModuleCaches.clear();
},
async transform(_, id, opts) {
if (opts && opts.ssr) {
return;
}
if (!isUTSProxy(id)) {
return;
}
const { filename: pluginDir } = (0, utils_1.parseVueRequest)(id.replace('\0', ''));
// 当 vue 和 nvue 均引用了相同 uts 插件,解决两套编译器会编译两次 uts 插件的问题
// 通过缓存,保证同一个 uts 插件只编译一次
if (utsModuleCaches.get(pluginDir)) {
return utsModuleCaches.get(pluginDir)().then((result) => {
if (result) {
result.deps.forEach((dep) => {
this.addWatchFile(dep);
});
return {
code: result.code,
map: null,
syntheticNamedExports: result.encrypt,
meta: result.meta,
};
}
});
}
const compile = (0, uni_shared_1.once)(() => {
return compilePlugin(pluginDir);
});
utsModuleCaches.set(pluginDir, compile);
const result = await compile();
if (result) {
result.deps.forEach((dep) => {
this.addWatchFile(dep);
});
return {
code: result.code,
map: null,
syntheticNamedExports: result.encrypt,
meta: result.meta,
};
}
},
};
}
exports.uniUTSAppUniModulesPlugin = uniUTSAppUniModulesPlugin;
async function buildUniExtApis() {
await uniExtApiCompiler();
}
exports.buildUniExtApis = buildUniExtApis;
function resolveExtApiProvider(pkg) {
const provider = pkg.uni_modules?.['uni-ext-api']?.provider;
if (provider?.service) {
if (provider.name && !provider.servicePlugin) {
provider.servicePlugin = 'uni-' + provider.service;
}
return provider;
}
}
exports.resolveExtApiProvider = resolveExtApiProvider;
function uniDecryptUniModulesPlugin() {
const inputDir = process.env.UNI_INPUT_DIR;
const isX = process.env.UNI_APP_X === 'true';
return {
name: 'uni:uni_modules-d',
enforce: 'pre',
async configResolved() {
if (isX && process.env.UNI_COMPILE_TARGET !== 'uni_modules') {
const manifest = (0, json_1.parseManifestJsonOnce)(inputDir);
await (0, uni_modules_1.checkEncryptUniModules)(inputDir, {
mode: process.env.NODE_ENV !== 'development'
? 'production'
: 'development',
packType: process.env.UNI_APP_PACK_TYPE ||
(process.env.NODE_ENV !== 'development' ? 'release' : 'debug'),
compilerVersion: process.env.UNI_COMPILER_VERSION,
appid: manifest.appid,
appname: manifest.name,
platform: process.env.UNI_UTS_PLATFORM,
'uni-app-x': isX,
});
}
},
resolveId(id) {
if (isUTSProxy(id) || isUniHelpers(id)) {
return id;
}
if (isX &&
process.env.UNI_COMPILE_TARGET !== 'uni_modules' &&
!id.endsWith('.css')) {
const resolvedId = (0, uni_modules_1.resolveEncryptUniModule)(id, process.env.UNI_UTS_PLATFORM, process.env.UNI_APP_X === 'true');
if (resolvedId) {
return resolvedId;
}
}
},
};
}
exports.uniDecryptUniModulesPlugin = uniDecryptUniModulesPlugin;
@@ -0,0 +1,2 @@
import type { Plugin } from 'vite';
export declare function uniUTSUVueJavaScriptPlugin(options?: {}): Plugin;
+36
View File
@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.uniUTSUVueJavaScriptPlugin = void 0;
const vue_1 = require("../../../vue");
function uniUTSUVueJavaScriptPlugin(options = {}) {
process.env.UNI_UTS_USING_ROLLUP = 'true';
return {
name: 'uni:uts-uvue',
enforce: 'pre',
configResolved(config) {
// 移除自带的 esbuild 处理 ts 文件
const index = config.plugins.findIndex((p) => p.name === 'vite:esbuild');
if (index > -1) {
// @ts-expect-error
config.plugins.splice(index, 1);
}
},
transform(code, id) {
if (!(0, vue_1.isVueSfcFile)(id)) {
return;
}
return {
code: code.replace(/<script([^>]*)>/gi, (match, attributes) => {
// 如果 <script> 标签中没有 lang 属性,添加 lang="uts"
if (!/lang=["']?[^"']*["']?/.test(attributes)) {
return `<script${attributes} lang="uts">`;
}
// 否则,将现有的 lang 属性替换为 lang="uts"
return match.replace(/lang=["']?ts["']?/, 'lang="uts"');
}),
map: { mappings: '' },
};
},
};
}
exports.uniUTSUVueJavaScriptPlugin = uniUTSUVueJavaScriptPlugin;