-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
16,690 additions
and
124 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
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<String, Map<String, UniProvider>> = new Map(); | ||
function getUniProvider<T extends UniProvider>(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<T extends UniProvider>(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<K> { | ||
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<T> { | ||
beforeInvoke?: (args: Object) => boolean | void | string; | ||
beforeAll?: (res: Object) => void; | ||
beforeSuccess?: (res: Object, args: T) => void; | ||
formatArgs?: Map<string, FormatArgsValueType>; | ||
} | ||
interface AsyncMethodOptionLike { | ||
success?: Function | null; | ||
} | ||
const TYPE_MAP = new Map<string, Object>([ | ||
[ | ||
'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<string, ProtocolOptions> | null = null) { | ||
const originalProtocol = {} as Record<string, Object>; | ||
protocol?.forEach((value, key)=>{ | ||
const protocol = originalProtocol[key] = {} as Record<string, Anything>; | ||
protocol.name = value.name; | ||
protocol.type = getPropType(value.type); | ||
protocol.required = value.required; | ||
protocol.validator = value.validator; | ||
}); | ||
return originalProtocol; | ||
} | ||
function buildOptions(options: ApiOptions<AsyncMethodOptionLike> | null = null) { | ||
const originalFormatArgs = {} as Record<string, FormatArgsValueType>; | ||
const originalOptions = {} as Record<string, Anything>; | ||
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<T extends AsyncMethodOptionLike, K>(name: string, fn: (options: T, res: ApiExecutor<K>) => void, protocol: Map<string, ProtocolOptions> | null = null, options: ApiOptions<T> | null = null): Function { | ||
const originalProtocol = buildProtocol(protocol); | ||
const originalOptions = buildOptions(options as ApiOptions<AsyncMethodOptionLike>); | ||
return originalDefineAsyncApi(name, fn, originalProtocol, originalOptions); | ||
} | ||
function defineTaskApi<T, K, TASK>(name: string, fn: (options: T, res: ApiExecutor<K>) => TASK, protocol: Map<string, ProtocolOptions>, options: ApiOptions<T>): Object { | ||
const originalProtocol = buildProtocol(protocol); | ||
const originalOptions = buildOptions(options as ApiOptions<AsyncMethodOptionLike>); | ||
return originalDefineTaskApi(name, fn, originalProtocol, originalOptions); | ||
} | ||
function defineSyncApi<K>(name: string, fn: Function, protocol: Map<string, ProtocolOptions> | null = null, options: ApiOptions<Object> | null = null): (...args: Object[]) => K { | ||
const originalProtocol = buildProtocol(protocol); | ||
const originalOptions = buildOptions(options as ApiOptions<AsyncMethodOptionLike>); | ||
return originalDefineSyncApi(name, fn, originalProtocol, originalOptions); | ||
} | ||
function defineOnApi<T>(name: string, fn: () => void, options: ApiOptions<T> | null = null): Function { | ||
const originalOptions = buildOptions(options as ApiOptions<AsyncMethodOptionLike>); | ||
return originalDefineOnApi(name, fn, originalOptions); | ||
} | ||
function defineOffApi<T>(name: string, fn: () => void, options: ApiOptions<T> | null = null): Function { | ||
const originalOptions = buildOptions(options as ApiOptions<AsyncMethodOptionLike>); | ||
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 }; |
Oops, something went wrong.