diff --git a/packages/playground/uts/uni_modules/test-uniplugin/app-ios/index.uts b/packages/playground/uts/uni_modules/test-uniplugin/app-ios/index.uts index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..04c10fea601923536c29f269554b266d32df7844 100644 --- a/packages/playground/uts/uni_modules/test-uniplugin/app-ios/index.uts +++ b/packages/playground/uts/uni_modules/test-uniplugin/app-ios/index.uts @@ -0,0 +1,21 @@ +import { UIDevice } from 'UIKit' + +type GetBatteryInfoOptions = { + success?: (res: UTSJSONObject) => void + fail?: (res: UTSJSONObject) => void + complete?: (res: UTSJSONObject) => void +} + +export default async function getBatteryInfo(options: GetBatteryInfoOptions) { + const res = { + errMsg: 'getBatteryInfo:ok', + level: UIDevice.current.batteryLevel * 100, + isCharging: UIDevice.current.batteryState == UIDevice.BatteryState.charging, + } + if (options.success != null) { + options.success!(res) + } + if (options.complete != null) { + options.complete!(res) + } +} diff --git a/packages/playground/uts/unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift b/packages/playground/uts/unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift new file mode 100644 index 0000000000000000000000000000000000000000..eaa4eb1438ff99f74fc5babad6d7edff77c66357 --- /dev/null +++ b/packages/playground/uts/unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift @@ -0,0 +1,15 @@ +import UIKit; +typealias GetBatteryInfoOptions = { + var success?: (_ res: UTSJSONObject) -> Void; + var fail?: (_ res: UTSJSONObject) -> Void; + var complete?: (_ res: UTSJSONObject) -> Void; +}; +async func getBatteryInfo(_ options: GetBatteryInfoOptions) { + var res = [ + "errMsg": "getBatteryInfo:ok", + "level": UIDevice.current.batteryLevel * 100, + "isCharging": UIDevice.current.batteryState == UIDevice.BatteryState.charging + ]; + if (options.success != nil) options.success!(res); + if (options.complete != nil) options.complete!(res); +} diff --git a/packages/playground/uts/unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift.map b/packages/playground/uts/unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift.map new file mode 100644 index 0000000000000000000000000000000000000000..9ce12d3d16e4f454bbe85a934e4ceab3dd80c98d --- /dev/null +++ b/packages/playground/uts/unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift.map @@ -0,0 +1 @@ +{"version":3,"sources":["/Users/fxy/Projects/GitHub/uni-app/uni-app-next/packages/playground/uts/uni_modules/test-uniplugin/app-ios/index.uts"],"sourcesContent":["import { UIDevice } from 'UIKit'\n\ntype GetBatteryInfoOptions = {\n success?: (res: UTSJSONObject) => void\n fail?: (res: UTSJSONObject) => void\n complete?: (res: UTSJSONObject) => void\n}\n\nexport default async function getBatteryInfo(options: GetBatteryInfoOptions) {\n const res = {\n errMsg: 'getBatteryInfo:ok',\n level: UIDevice.current.batteryLevel * 100,\n isCharging: UIDevice.current.batteryState == UIDevice.BatteryState.charging,\n }\n if (options.success != null) {\n options.success!(res)\n }\n if (options.complete != null) {\n options.complete!(res)\n }\n}\n"],"names":[],"mappings":"AAAA;UAEK,qBAAqB;QACxB,OAAO,MAAI,GAAkB,EAAb,aAAa,KAAK,IAAI;QACtC,IAAI,MAAI,GAAkB,EAAb,aAAa,KAAK,IAAI;QACnC,QAAQ,MAAI,GAAkB,EAAb,aAAa,KAAK,IAAI;;AAG1B,WAAe,cAAc,CAAC,EAAA,OAA8B,EAArB,qBAAqB,EAAE;IAC3E,IAAM,GAAG,GAAG;QACV,CAAA,MAAM,GAAE,mBAAmB;QAC3B,CAAA,KAAK,GAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,GAAG,GAAG;QAC1C,CAAA,UAAU,GAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ;KAC5E;IACD,IAAI,OAAO,CAAC,OAAO,IAAI,GAAI,EACzB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;IAEvB,IAAI,OAAO,CAAC,QAAQ,IAAI,GAAI,EAC1B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;AAE1B"} \ No newline at end of file diff --git a/packages/uni-uts-vite/src/utils/compiler/swift.ts b/packages/uni-uts-vite/src/utils/compiler/swift.ts index ac598727bb6ca04a8561d2990a61cc7157f30e12..18c41b78e67e20c605a2d5af3fa4d221a95612b3 100644 --- a/packages/uni-uts-vite/src/utils/compiler/swift.ts +++ b/packages/uni-uts-vite/src/utils/compiler/swift.ts @@ -1,4 +1,5 @@ import { isInHBuilderX, resolveSourceMapPath } from '@dcloudio/uni-cli-shared' +import { capitalize } from '@vue/shared' import { genUTSPlatformResource, getUtsCompiler, resolvePackage } from './utils' export function parseSwiftPackage(filename: string) { @@ -6,7 +7,7 @@ export function parseSwiftPackage(filename: string) { if (!res) { return '' } - return 'UTSSDK' + (res.is_uni_modules ? 'Modules' : '') + res.name + return 'UTSSDK' + (res.is_uni_modules ? 'Modules' : '') + capitalize(res.name) } export async function compileSwift(filename: string) { @@ -31,7 +32,7 @@ export async function compileSwift(filename: string) { outDir: outputDir, package: '', sourceMap: resolveSourceMapPath(), - extname: 'kt', + extname: 'swift', imports: [], logFilename: true, noColor: isInHBuilderX(), diff --git a/packages/uni-uts-vite/src/utils/compiler/utils.ts b/packages/uni-uts-vite/src/utils/compiler/utils.ts index 091878c9f113c6b4547f1c1689e8f2ef38b0cc33..6c443ae3e6cae9dcbaf0b8445467f25ad5fd74cf 100644 --- a/packages/uni-uts-vite/src/utils/compiler/utils.ts +++ b/packages/uni-uts-vite/src/utils/compiler/utils.ts @@ -44,11 +44,13 @@ export function genUTSPlatformResource( const utsOutputDir = resolveUTSPlatformDir(platformFile, platform) // 拷贝所有非uts文件及目录 - fs.copySync(utsInputDir, utsOutputDir, { - filter(src) { - return path.extname(src) !== '.uts' - }, - }) + if (fs.existsSync(utsInputDir)) { + fs.copySync(utsInputDir, utsOutputDir, { + filter(src) { + return path.extname(src) !== '.uts' + }, + }) + } // 生产模式下,需要将 kt 文件转移到 src 下 const srcDir = path.resolve(utsOutputDir, 'src') diff --git a/packages/uts-darwin-arm64/uts.darwin-arm64.node b/packages/uts-darwin-arm64/uts.darwin-arm64.node index 4c04f62f6c7318ba2a59606e15f7eae1b7cf1617..3f73c3ad19ec7010c5e749a1abae8a976c1aa70e 100755 Binary files a/packages/uts-darwin-arm64/uts.darwin-arm64.node and b/packages/uts-darwin-arm64/uts.darwin-arm64.node differ diff --git a/packages/uts-darwin-x64/uts.darwin-x64.node b/packages/uts-darwin-x64/uts.darwin-x64.node index 1876097c6dc918cf1214b5bbae07a32287dec47f..f0512ddffd54117aebf648506266095f37a07e38 100755 Binary files a/packages/uts-darwin-x64/uts.darwin-x64.node and b/packages/uts-darwin-x64/uts.darwin-x64.node differ diff --git a/packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node b/packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node index 9175bb3f552abda84cba736469811b155b533dca..7823c173d6860c77e1c6c795fc5f5e4ecd5971fe 100644 Binary files a/packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node and b/packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node differ diff --git a/packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node b/packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node index bccdd1827b9e93eb8311082bc25bd2db58d8c266..8bf86baf46055420ae15eccd9fc80f8e9b9bb4ac 100644 Binary files a/packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node and b/packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node differ diff --git a/packages/uts/src/api.ts b/packages/uts/src/api.ts index cdaff0c1a2ab292062becffee9fd03300d2210e7..bdff8d50e34b62576a5ad325b4adcb240468dc97 100644 --- a/packages/uts/src/api.ts +++ b/packages/uts/src/api.ts @@ -63,6 +63,16 @@ export function toKotlin(options: UtsOptions): Promise { .then((res: string) => JSON.parse(res)) } +export function bundleKotlin(options: UtsBundleOptions): Promise { + const bundleOptions = resolveOptions(options) + if (!bundleOptions) { + return Promise.resolve({}) + } + return bindings + .bundleKotlin(toBuffer(bundleOptions)) + .then((res: string) => res) +} + export function toSwift(options: UtsOptions): Promise { const swiftOptions = resolveOptions(options) if (!swiftOptions) { @@ -73,12 +83,14 @@ export function toSwift(options: UtsOptions): Promise { .then((res: string) => JSON.parse(res)) } -export function bundle(options: UtsBundleOptions): Promise { +export function bundleSwift(options: UtsBundleOptions): Promise { const bundleOptions = resolveOptions(options) if (!bundleOptions) { return Promise.resolve({}) } - return bindings.bundle(toBuffer(bundleOptions)).then((res: string) => res) + return bindings + .bundleSwift(toBuffer(bundleOptions)) + .then((res: string) => res) } function toBuffer(t: any): Buffer { diff --git a/packages/uts/src/index.ts b/packages/uts/src/index.ts index 3f04923871419f5473b8998b7e5df9066de79270..9a5b1ff8afa46f7bca2ec383b053a963be85c550 100644 --- a/packages/uts/src/index.ts +++ b/packages/uts/src/index.ts @@ -4,8 +4,9 @@ import glob from 'fast-glob' import chokidar from 'chokidar' -import { toKotlin, toSwift } from './api' +import { bundleKotlin, bundleSwift, toKotlin, toSwift } from './api' import { + UtsBundleOptions, UtsInputOptions, UtsOptions, UtsOutputOptions, @@ -316,7 +317,16 @@ function buildFile( }) } -export { parse, bundle } from './api' +export { parse, bundleKotlin, bundleSwift } from './api' + +export function bundle(target: UtsTarget, opts: UtsBundleOptions) { + if (target === UtsTarget.KOTLIN) { + return bundleKotlin(opts) + } else if (target === UtsTarget.SWIFT) { + return bundleSwift(opts) + } + return Promise.resolve({}) +} export function runDev(target: UtsTarget, opts: ToOptions) { opts = parseOptions('dev', target, opts) diff --git a/scripts/test.js b/scripts/test.js index e93f813160d8af37db6f782a11079108fb733bb9..ed5ca3a518cd0ee5cd6511231b0a625b9310c057 100644 --- a/scripts/test.js +++ b/scripts/test.js @@ -1,9 +1,9 @@ const fs = require('fs') const path = require('path') -const { parse, bundle } = require('../packages/uts/dist') +const { parse, bundle, UtsTarget } = require('../packages/uts/dist') const projectDir = path.resolve(__dirname, '../packages/playground/uts') -let start = Date.now() +const start = Date.now() parse( fs.readFileSync( path.resolve( @@ -16,33 +16,74 @@ parse( console.log('parse: ' + (Date.now() - start) + 'ms') console.log(JSON.stringify(res)) }) -start = Date.now() -bundle({ - input: { - root: projectDir, - filename: path.resolve( - projectDir, - 'uni_modules/test-uniplugin/app-android/index.uts' - ), - }, - output: { - outDir: path.resolve(projectDir, 'unpackage/dist/app'), - package: 'uts.modules.testUniPlugin', - imports: ['kotlinx.coroutines.*', 'io.dcloud.uts.runtime.*'], - sourceMap: true, - extname: 'kt', - logFilename: true, - }, -}).then((res) => { - console.log('bundle: ' + (Date.now() - start) + 'ms') - console.log(JSON.stringify(res)) - console.log( - fs.readFileSync( - path.resolve( +function testKotlin() { + const start = Date.now() + return bundle(UtsTarget.KOTLIN, { + input: { + root: projectDir, + filename: path.resolve( projectDir, - 'unpackage/dist/app/uni_modules/test-uniplugin/app-android/index.kt' + 'uni_modules/test-uniplugin/app-android/index.uts' ), - 'utf8' + }, + output: { + outDir: path.resolve(projectDir, 'unpackage/dist/app'), + package: 'uts.modules.testUniPlugin', + imports: ['kotlinx.coroutines.*', 'io.dcloud.uts.runtime.*'], + sourceMap: true, + extname: 'kt', + logFilename: true, + }, + }).then((res) => { + console.log('bundle: ' + (Date.now() - start) + 'ms') + console.log(JSON.stringify(res)) + console.log( + fs.readFileSync( + path.resolve( + projectDir, + 'unpackage/dist/app/uni_modules/test-uniplugin/app-android/index.kt' + ), + 'utf8' + ) ) - ) -}) + }) +} + +function testSwift() { + const start = Date.now() + return bundle(UtsTarget.SWIFT, { + input: { + root: projectDir, + filename: path.resolve( + projectDir, + 'uni_modules/test-uniplugin/app-ios/index.uts' + ), + }, + output: { + outDir: path.resolve(projectDir, 'unpackage/dist/app'), + package: 'uts.modules.testUniPlugin', + sourceMap: true, + extname: 'swift', + logFilename: true, + }, + }).then((res) => { + console.log('bundle: ' + (Date.now() - start) + 'ms') + console.log(JSON.stringify(res)) + console.log( + fs.readFileSync( + path.resolve( + projectDir, + 'unpackage/dist/app/uni_modules/test-uniplugin/app-ios/index.swift' + ), + 'utf8' + ) + ) + }) +} + +async function test() { + await testKotlin() + await testSwift() +} + +test()