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

wip(uts): compiler

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