提交 08d0e25d 编写于 作者: fxy060608's avatar fxy060608

wip(uts): compiler

上级 8e31cfa8
...@@ -12,7 +12,14 @@ module.exports = { ...@@ -12,7 +12,14 @@ module.exports = {
__VUE_PROD_DEVTOOLS__: false, __VUE_PROD_DEVTOOLS__: false,
uni: { uni: {
requireNativePlugin(name) { requireNativePlugin(name) {
return {} return {
invokeSync(args, callback) {
console.log(`invoke`, JSON.stringify(args))
},
invokeAsync(args, callback) {
console.log(`invokeAsync`, JSON.stringify(args))
},
}
}, },
}, },
}, },
......
import { normalizeArg } from '../module' import { normalizeArg, initModule } from '../module'
describe('uts-module', () => { describe('uts-module', () => {
test('normalize args', () => { test('normalize args', () => {
...@@ -33,4 +33,27 @@ describe('uts-module', () => { ...@@ -33,4 +33,27 @@ describe('uts-module', () => {
success: 6, success: 6,
}) })
}) })
test(`invoke`, () => {
const wifi = initModule('wifi', {
preparePermission: { async: true },
})
/**
* {"module":"wifi","method":"preparePermission","params":[{"name":"foo","age":10,"success":7,"fail":8},9]}
*/
wifi.preparePermission(
{
name: 'foo',
age: 10,
success(res: any) {
console.log('success', res)
},
fail(res: any) {
console.log('fail', res)
},
},
(res: any) => {
console.log('callback', res)
}
)
})
}) })
const moduleName = '__MODULE_NAME__'; const moduleName = '__MODULE_NAME__';
const moduleDefine = '__MODULE_DEFINE__'; const moduleDefine = '__MODULE_DEFINE__';
var module = initModule(moduleDefine); var module = initModule(moduleName, moduleDefine);
let callbackId = 1; let callbackId = 1;
const objectToString = Object.prototype.toString; const objectToString = Object.prototype.toString;
const toTypeString = (value) => objectToString.call(value); const toTypeString = (value) => objectToString.call(value);
...@@ -59,22 +59,22 @@ function moduleGetter(proxy, module, method, defines) { ...@@ -59,22 +59,22 @@ function moduleGetter(proxy, module, method, defines) {
return proxy.invoke(invokeArgs, invokeCallback); return proxy.invoke(invokeArgs, invokeCallback);
}; };
} }
function initModule(moduleDefine) { function initModule(name, defines, proxyModuleName = 'ProxyModule') {
let proxy; let proxy;
const moduleProxy = {}; const moduleProxy = {};
for (const methodName in moduleDefine) { for (const method in moduleDefine) {
Object.defineProperty(moduleProxy, methodName, { Object.defineProperty(moduleProxy, method, {
enumerable: true, enumerable: true,
configurable: true, configurable: true,
get: () => { get: () => {
if (!proxy) { if (!proxy) {
proxy = uni.requireNativePlugin('proxy-module'); proxy = uni.requireNativePlugin(proxyModuleName);
} }
return moduleGetter(proxy, moduleName, methodName, moduleDefine[methodName]); return moduleGetter(proxy, name, method, defines[method]);
}, },
}); });
} }
return moduleProxy; return moduleProxy;
} }
export { module as default, normalizeArg }; export { module as default, initModule, normalizeArg };
...@@ -13,7 +13,7 @@ interface ModuleMethodDefine { ...@@ -13,7 +13,7 @@ interface ModuleMethodDefine {
async?: boolean async?: boolean
} }
export default initModule(moduleDefine) export default initModule(moduleName, moduleDefine)
let callbackId = 1 let callbackId = 1
...@@ -79,10 +79,10 @@ function moduleGetter( ...@@ -79,10 +79,10 @@ function moduleGetter(
} }
return (...args: unknown[]) => { return (...args: unknown[]) => {
const params = args.map((arg) => normalizeArg(arg)) const params = args.map((arg) => normalizeArg(arg))
const invokeArgs = { module, method, params, async: !!defines.async } const invokeArgs = { module, method, params }
if (defines.async) { if (defines.async) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
proxy.invoke(invokeArgs, (res: ProxyInvokeResponse) => { proxy.invokeAsync(invokeArgs, (res: ProxyInvokeResponse) => {
if (isProxyInvokeCallbackResponse(res)) { if (isProxyInvokeCallbackResponse(res)) {
invokeCallback(res) invokeCallback(res)
} else { } else {
...@@ -95,27 +95,26 @@ function moduleGetter( ...@@ -95,27 +95,26 @@ function moduleGetter(
}) })
}) })
} }
return proxy.invoke(invokeArgs, invokeCallback) return proxy.invokeSync(invokeArgs, invokeCallback)
} }
} }
function initModule(moduleDefine: Record<string, ModuleMethodDefine>) { export function initModule(
name: string,
defines: Record<string, ModuleMethodDefine>,
proxyModuleName = 'ProxyModule'
) {
let proxy: any let proxy: any
const moduleProxy = {} const moduleProxy: Record<string, Function> = {}
for (const methodName in moduleDefine) { for (const method in defines) {
Object.defineProperty(moduleProxy, methodName, { Object.defineProperty(moduleProxy, method, {
enumerable: true, enumerable: true,
configurable: true, configurable: true,
get: () => { get: () => {
if (!proxy) { if (!proxy) {
proxy = uni.requireNativePlugin('proxy-module') proxy = uni.requireNativePlugin(proxyModuleName)
} }
return moduleGetter( return moduleGetter(proxy, name, method, defines[method])
proxy,
moduleName,
methodName,
moduleDefine[methodName]
)
}, },
}) })
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册