import type {OverlayComponentResolverContext, OverlayPluginDefinition} from '../types' /** * @public * Helper type to check if an object has required keys */ export type HasRequiredKeys = Record extends T ? false : true /** * @public */ export type OverlayPluginUserFnConfigOptions> = HasRequiredKeys extends true ? {options: O} : {options?: O} /** * @public */ export type OverlayPluginUserFnConfig> = { guard?: OverlayPluginDefinition['guard'] } & OverlayPluginUserFnConfigOptions /** * @public */ export type OverlayPluginUserFn> = HasRequiredKeys extends true ? (config: OverlayPluginUserFnConfig) => OverlayPluginDefinition : (config?: OverlayPluginUserFnConfig) => OverlayPluginDefinition /** * @public */ export type OverlayPluginDefineFn> = ( options: O, ) => OverlayPluginDefinition /** * @public * Define an overlay plugin with conditional options parameter. * Adds a guard that combines the user-provided guard with the plugin's guard. */ export function defineOverlayPlugin = Record>( pluginDefinitionFn: OverlayPluginDefineFn, ): OverlayPluginUserFn { return ((config: Parameters>[0] | undefined) => { const {guard: pluginGuard, ...pluginDefinition} = pluginDefinitionFn( config?.options ?? ({} as O), ) return { ...pluginDefinition, guard: (context: OverlayComponentResolverContext) => { const pluginGuardResult = pluginGuard?.(context) if (pluginGuardResult === false) { return false } return config?.guard?.(context) ?? true }, } }) as OverlayPluginUserFn }