import { defineAsyncApi as originalDefineAsyncApi, defineOffApi as originalDefineOffApi, defineOnApi as originalDefineOnApi, defineSyncApi as originalDefineSyncApi, defineTaskApi as originalDefineTaskApi } from "@dcloudio/uni-mp-sdk"; interface UniProvider { id: string; description: string; } const providers: Map> = new Map(); function getUniProvider(service: string, providerName: String): T | null { return providers.get(service)?.get(providerName) as T | null; } function getUniProviders(service: string): UniProvider[] { const result: UniProvider[] = []; providers.get(service)?.forEach((provider)=>{ result.push(provider); }); return result; } function registerUniProvider(service: string, providerName: string, provider: T) { if (!providers.has(service)) { providers.set(service, new Map()); } providers.get(service)?.set(providerName, provider); } type Anything = Object | null | undefined; type NullType = null | undefined; type FormatArgsValueType = Function | string | number | boolean; interface AsyncApiSuccessResult { } interface AsyncApiResult { } interface ApiError { errMsg?: string | null; errCode?: number | null; } interface ApiExecutor { resolve: (res?: K | void) => void; reject: (errMsg?: string, errRes?: ApiError) => void; } interface ProtocolOptions { name?: string | null; type?: string | null; required?: boolean | null; validator?: (value: Object) => boolean | undefined | string; } interface ApiOptions { beforeInvoke?: (args: Object) => boolean | void | string; beforeAll?: (res: Object) => void; beforeSuccess?: (res: Object, args: T) => void; formatArgs?: Map; } interface AsyncMethodOptionLike { success?: Function | null; } const TYPE_MAP = new Map([ [ 'string', String ], [ 'number', Number ], [ 'boolean', Boolean ], [ 'array', Array ], [ 'object', Object ] ]); function getPropType(type: string | NullType): Anything { if (!type) { return; } return TYPE_MAP.get(type); } function buildProtocol(protocol: Map | null = null) { const originalProtocol = {} as Record; protocol?.forEach((value, key)=>{ const protocol = originalProtocol[key] = {} as Record; protocol.name = value.name; protocol.type = getPropType(value.type); protocol.required = value.required; protocol.validator = value.validator; }); return originalProtocol; } function buildOptions(options: ApiOptions | null = null) { const originalFormatArgs = {} as Record; const originalOptions = {} as Record; if (options) { if (options.formatArgs) { options.formatArgs.forEach((value, key)=>{ originalFormatArgs[key] = value; }); } originalOptions.beforeInvoke = options.beforeInvoke; originalOptions.beforeAll = options.beforeAll; originalOptions.beforeSuccess = options.beforeSuccess; originalOptions.formatArgs = originalFormatArgs; } return originalOptions; } function defineAsyncApi(name: string, fn: (options: T, res: ApiExecutor) => void, protocol: Map | null = null, options: ApiOptions | null = null): Function { const originalProtocol = buildProtocol(protocol); const originalOptions = buildOptions(options as ApiOptions); return originalDefineAsyncApi(name, fn, originalProtocol, originalOptions); } function defineTaskApi(name: string, fn: (options: T, res: ApiExecutor) => TASK, protocol: Map, options: ApiOptions): Object { const originalProtocol = buildProtocol(protocol); const originalOptions = buildOptions(options as ApiOptions); return originalDefineTaskApi(name, fn, originalProtocol, originalOptions); } function defineSyncApi(name: string, fn: Function, protocol: Map | null = null, options: ApiOptions | null = null): (...args: Object[]) => K { const originalProtocol = buildProtocol(protocol); const originalOptions = buildOptions(options as ApiOptions); return originalDefineSyncApi(name, fn, originalProtocol, originalOptions); } function defineOnApi(name: string, fn: () => void, options: ApiOptions | null = null): Function { const originalOptions = buildOptions(options as ApiOptions); return originalDefineOnApi(name, fn, originalOptions); } function defineOffApi(name: string, fn: () => void, options: ApiOptions | null = null): Function { const originalOptions = buildOptions(options as ApiOptions); return originalDefineOffApi(name, fn, originalOptions); } export { UniProvider as UniProvider, getUniProvider as getUniProvider, getUniProviders as getUniProviders, registerUniProvider as registerUniProvider }; export { AsyncApiSuccessResult as AsyncApiSuccessResult }; export { AsyncApiResult as AsyncApiResult }; export { ApiError as ApiError }; export { ApiExecutor as ApiExecutor }; export { ProtocolOptions as ProtocolOptions }; export { ApiOptions as ApiOptions }; export { defineAsyncApi as defineAsyncApi }; export { defineTaskApi as defineTaskApi }; export { defineSyncApi as defineSyncApi }; export { defineOnApi as defineOnApi }; export { defineOffApi as defineOffApi };