diff --git a/packages/shims-node.d.ts b/packages/shims-node.d.ts index 7f36f061458..fb282d08bdd 100644 --- a/packages/shims-node.d.ts +++ b/packages/shims-node.d.ts @@ -75,6 +75,7 @@ declare namespace NodeJS { UNI_APP_HARMONY_PROJECT_PATH?: string UNI_COMPILE_EXT_API_INPUT?: string + UNI_APP_NEXT_WORKSPACE?: string } } diff --git a/packages/uni-app-uts/src/plugins/android/index.ts b/packages/uni-app-uts/src/plugins/android/index.ts index f3b59f37c33..cbd1b2b647b 100644 --- a/packages/uni-app-uts/src/plugins/android/index.ts +++ b/packages/uni-app-uts/src/plugins/android/index.ts @@ -18,7 +18,7 @@ import { uniCloudPlugin } from './unicloud' export function init() { return [ - uniDecryptUniModulesPlugin(), + ...(isNormalCompileTarget() ? [uniDecryptUniModulesPlugin()] : []), uniPrePlugin(), ...(isNormalCompileTarget() ? [ diff --git a/packages/uni-app-uts/src/plugins/android/unicloud.ts b/packages/uni-app-uts/src/plugins/android/unicloud.ts index 9608d0df4bc..a9edd36bd83 100644 --- a/packages/uni-app-uts/src/plugins/android/unicloud.ts +++ b/packages/uni-app-uts/src/plugins/android/unicloud.ts @@ -11,12 +11,17 @@ import { ENTRY_FILENAME, getUniCloudSpaceList } from './utils' const uniCloudSpaceList = getUniCloudSpaceList() export function uniCloudPlugin(): Plugin { - addUTSEasyComAutoImports( - normalizePath( - path.resolve(resolveComponentsLibPath(), 'unicloud-db', 'index.uts') - ), - ['mixinDatacom', 'uniCloudMixinDatacom'] - ) + if ( + process.env.UNI_COMPILE_TARGET !== 'ext-api' && + process.env.UNI_APP_NEXT_WORKSPACE + ) { + addUTSEasyComAutoImports( + normalizePath( + path.resolve(resolveComponentsLibPath(), 'unicloud-db', 'index.uts') + ), + ['mixinDatacom', 'uniCloudMixinDatacom'] + ) + } return { name: 'uni:app-unicloud', apply: 'build', diff --git a/packages/uni-app-uts/src/plugins/ios/index.ts b/packages/uni-app-uts/src/plugins/ios/index.ts index 04b4dcd02b3..7c779057b41 100644 --- a/packages/uni-app-uts/src/plugins/ios/index.ts +++ b/packages/uni-app-uts/src/plugins/ios/index.ts @@ -1,6 +1,7 @@ import * as path from 'path' import { UNI_EASYCOM_EXCLUDE, + isNormalCompileTarget, parseUniExtApiNamespacesOnce, resolveUTSCompiler, uniDecryptUniModulesPlugin, @@ -22,7 +23,7 @@ import * as uniCliShared from '@dcloudio/uni-cli-shared' export function init() { return [ - uniDecryptUniModulesPlugin(), + ...(isNormalCompileTarget() ? [uniDecryptUniModulesPlugin()] : []), uniHBuilderXConsolePlugin('uni.__log__'), uniUTSAppUniModulesPlugin({ x: true, diff --git a/packages/uni-cli-shared/src/resolve.ts b/packages/uni-cli-shared/src/resolve.ts index 9675efcedae..4f59d7ef7b5 100644 --- a/packages/uni-cli-shared/src/resolve.ts +++ b/packages/uni-cli-shared/src/resolve.ts @@ -145,3 +145,9 @@ export function resolveComponentsLibPath() { } return componentsLibPath } + +export function resolveComponentsLibDirs() { + return process.env.UNI_COMPILE_TARGET === 'ext-api' + ? [] + : [resolveComponentsLibPath()] +} diff --git a/packages/uni-cli-shared/src/uts.ts b/packages/uni-cli-shared/src/uts.ts index 7bee3ec9ba7..0608baf6a6b 100644 --- a/packages/uni-cli-shared/src/uts.ts +++ b/packages/uni-cli-shared/src/uts.ts @@ -138,6 +138,15 @@ function resolveUTSFile( export function resolveUTSCompiler(): typeof UTSCompiler { let compilerPath: string = '' + if ( + process.env.UNI_COMPILE_TARGET === 'ext-api' && + process.env.UNI_APP_NEXT_WORKSPACE + ) { + return require(path.resolve( + process.env.UNI_APP_NEXT_WORKSPACE, + 'packages/uni-uts-v1' + )) + } if (isInHBuilderX()) { try { compilerPath = require.resolve( @@ -565,3 +574,14 @@ export function uvueOutDir( export function tscOutDir(platform: 'app-android' | 'app-ios' | 'app-harmony') { return path.join(process.env.UNI_APP_X_TSC_DIR, platform) } + +const UTSProxyRE = /\?uts-proxy$/ +const UniHelpersRE = /\?uni_helpers$/ + +export function isUTSProxy(id: string) { + return UTSProxyRE.test(id) +} + +export function isUniHelpers(id: string) { + return UniHelpersRE.test(id) +} diff --git a/packages/uni-cli-shared/src/vite/extApi.ts b/packages/uni-cli-shared/src/vite/extApi.ts index 04543aac217..1e7e622610e 100644 --- a/packages/uni-cli-shared/src/vite/extApi.ts +++ b/packages/uni-cli-shared/src/vite/extApi.ts @@ -1,4 +1,5 @@ import type { Plugin } from 'vite' +import { isUTSProxy } from '../uts' export function uniUniModulesExtApiPlugin(): Plugin { return { @@ -21,5 +22,15 @@ export function uniUniModulesExtApiPlugin(): Plugin { }, } }, + load(id) { + if (isUTSProxy(id)) { + return '' + } + }, + generateBundle(_, bundle) { + Object.keys(bundle).forEach((fileName) => { + console.log('fileName', fileName) + }) + }, } } diff --git a/packages/uni-cli-shared/src/vite/plugins/uts/uni_modules.ts b/packages/uni-cli-shared/src/vite/plugins/uts/uni_modules.ts index ecc5e5b6e39..3d2391216d9 100644 --- a/packages/uni-cli-shared/src/vite/plugins/uts/uni_modules.ts +++ b/packages/uni-cli-shared/src/vite/plugins/uts/uni_modules.ts @@ -9,6 +9,8 @@ import { genUniExtApiDeclarationFileOnce, initUTSKotlinAutoImportsOnce, initUTSSwiftAutoImportsOnce, + isUTSProxy, + isUniHelpers, parseKotlinPackageWithPluginId, parseSwiftPackageWithPluginId, resolveUTSAppModule, @@ -34,9 +36,6 @@ import { initScopedPreContext } from '../../../preprocess/context' /* eslint-disable no-restricted-globals */ const { preprocess } = require('../../../../lib/preprocess') -const UTSProxyRE = /\?uts-proxy$/ -const UniHelpersRE = /\?uni_helpers$/ - function createUniModulesSyncFilePreprocessor( platform: UniApp.PLATFORM, utsPlatform: 'app-android' | 'app-ios' | 'app-harmony', @@ -130,14 +129,6 @@ const createUniXAppHarmonyUniModulesSyncFilePreprocessorOnce = once(() => { return createUniModulesSyncFilePreprocessor('app', 'app-harmony', true) }) -function isUTSProxy(id: string) { - return UTSProxyRE.test(id) -} - -function isUniHelpers(id: string) { - return UniHelpersRE.test(id) -} - const utsModuleCaches = new Map< string, () => Promise { const { filter, refresh, options } = initEasycomsOnce( process.env.UNI_INPUT_DIR, { - dirs: [resolveComponentsLibPath()], + dirs: resolveComponentsLibDirs(), platform: process.env.UNI_PLATFORM, isX: process.env.UNI_APP_X === 'true', } diff --git a/packages/vite-plugin-uni/src/utils/plugin.ts b/packages/vite-plugin-uni/src/utils/plugin.ts index 46929a08cf5..b8e66ddff46 100644 --- a/packages/vite-plugin-uni/src/utils/plugin.ts +++ b/packages/vite-plugin-uni/src/utils/plugin.ts @@ -1,4 +1,5 @@ import path from 'path' +import fs from 'fs-extra' import type { Plugin } from 'vite' import { extend, isArray, isFunction, isString } from '@vue/shared' import { @@ -13,6 +14,7 @@ import type { VitePluginUniResolvedOptions } from '..' interface PluginConfig { id: string name: string + pluginPath: string apply?: UniApp.PLATFORM | UniApp.PLATFORM[] uvue?: boolean config: { @@ -92,20 +94,24 @@ export function initExtraPlugins( ) { return initPlugins( cliRoot, - resolvePlugins(cliRoot, platform, options.uvue), + process.env.UNI_COMPILE_TARGET === 'ext-api' && + process.env.UNI_APP_NEXT_WORKSPACE + ? resolvePluginsByWorkSpace( + process.env.UNI_APP_NEXT_WORKSPACE, + platform, + options.uvue + ) + : resolvePluginsByCliRoot(cliRoot, platform, options.uvue), options ) } function initPlugin( - cliRoot: string, - { id, config: { main } }: PluginConfig, + _cliRoot: string, + { pluginPath, config: { main } }: PluginConfig, options: VitePluginUniResolvedOptions ): Plugin | void { - let plugin = require(require.resolve( - path.join(id, main || '/lib/uni.plugin.js'), - { paths: [cliRoot] } - )) + let plugin = require(path.join(pluginPath, main || '/lib/uni.plugin.js')) plugin = plugin.default || plugin if (isFunction(plugin)) { plugin = plugin(options) @@ -131,20 +137,73 @@ function initPlugins( .flat() } -function resolvePlugins( +interface Pkg { + name: string + pluginPath: string + 'uni-app'?: PluginConfig +} + +function resolvePluginsByCliRoot( cliRoot: string, platform: UniApp.PLATFORM, uvue: boolean = false ) { const pkg = require(path.join(cliRoot, 'package.json')) - return Object.keys(pkg.devDependencies || {}) - .concat(Object.keys(pkg.dependencies || {})) - .map((id) => { + return resolvePlugins( + Object.keys(pkg.devDependencies || {}) + .concat(Object.keys(pkg.dependencies || {})) + .map((id) => { + try { + const pkgFileName = require.resolve(id + '/package.json', { + paths: [cliRoot], + }) + const pkg = require(pkgFileName) + return { + ...pkg, + pluginPath: path.dirname(pkgFileName), + } + } catch (e) {} + }) + .filter(Boolean as any), + platform, + uvue + ) +} + +function resolvePluginsByWorkSpace( + workspaceFolder: string, + platform: UniApp.PLATFORM, + uvue: boolean = false +) { + const pkgDirs = path.resolve(workspaceFolder, 'packages') + return resolvePlugins( + fs + .readdirSync(pkgDirs) + .map((dir) => { + const pluginPath = path.join(pkgDirs, dir) + const pkgFileName = path.join(pluginPath, 'package.json') + if (fs.existsSync(pkgFileName)) { + return { + ...require(pkgFileName), + pluginPath, + } as Pkg + } + }) + .filter(Boolean as any), + platform, + uvue + ) +} + +function resolvePlugins( + pkgs: Pkg[], + platform: UniApp.PLATFORM, + uvue: boolean = false +) { + return pkgs + .map((pkg) => { try { - const pluginPkg = require(require.resolve(id + '/package.json', { - paths: [cliRoot], - })) - const config = pluginPkg['uni-app'] as PluginConfig + const config = pkg['uni-app'] as PluginConfig if (!config || !config.name) { return } @@ -165,8 +224,9 @@ function resolvePlugins( return } return { - id, + id: pkg.name, name: config.name, + pluginPath: pkg.pluginPath, config, } } catch (e) {}