Merge branch 'preview-fixes' into preview-features

This commit is contained in:
the1812 2022-04-05 11:32:04 +08:00
commit baeec35aa9

View File

@ -1,21 +1,44 @@
// /** 数据注入 */
// export interface PluginDataProvider {
// /** 执行数据注入, 参数将由插件注册者提供 */
// insertData: (...args: any[]) => void | Promise<void>
// }
/**
* API
* @module plugins/data
*
* API
*
* key
*
* {@link registerData}
* {@link getData}
* {@link addData} {@link PluginDataProvider}
*
* `registerData` `getData`
* `getData`
*
* `registerData`
*
* `addData` `registerData`
* provider
*
* provider `getData`
* provider provider
*/
/** 执行数据注入, 参数将由插件注册者提供 */
export type PluginDataProvider = (...args: any[]) => void | Promise<void>
const pluginDataMap = new Map<string, {
/** 是否被注册过 ({@link registerData} / {@link registerAndGetData}) */
registered: boolean
/** 数据内容 */
data: any[]
/** 是否被加载过 ({@link getData} / {@link registerAndGetData}) */
loaded: boolean
/** 在被加载前储存的 provider (惰性求值) */
providers: PluginDataProvider[]
}>()
/**
* ,
* @param key ID
* @param data ,
* ,
* @param key
* @param data {@link PluginDataProvider}
*/
export const registerData = (key: string, ...data: any[]) => {
if (pluginDataMap.has(key)) {
@ -35,17 +58,19 @@ export const registerData = (key: string, ...data: any[]) => {
})
}
}
/**
* `key`
* @param key ID
* @param provider
* `key` provider
* @param key
* @param provider
*/
export const addData = (key: string, provider: PluginDataProvider) => {
if (pluginDataMap.has(key)) {
const { providers, registered, data } = pluginDataMap.get(key)
providers.push(provider)
if (registered) {
const { providers, loaded, data } = pluginDataMap.get(key)
if (loaded) {
provider(...data)
} else {
providers.push(provider)
}
} else {
pluginDataMap.set(key, {
@ -57,8 +82,9 @@ export const addData = (key: string, provider: PluginDataProvider) => {
}
}
/**
* `key`,
* @param key ID
* 使 provider
* @param key
* @returns
*/
export const getData = (key: string) => {
if (pluginDataMap.has(key)) {
@ -69,6 +95,7 @@ export const getData = (key: string) => {
if (registered) {
if (!loaded) {
providers.forEach(p => p(...data))
item.providers = []
item.loaded = true
}
return data
@ -78,9 +105,10 @@ export const getData = (key: string) => {
}
/**
* (`registerData`+`getData`)
* @param key ID
* @param data ,
* {@link registerData} + {@link getData}
* @param key
* @param data 使 provider
* @returns
*/
export const registerAndGetData = <T extends any[]> (key: string, ...data: T) => {
registerData(key, ...data)