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