/** * External dependencies */ import type { Experiment } from '@nab/types'; export type ExtensionAction = SetExtension< ExtensionName > | RemoveExtension; type ExtensionName = keyof Extensions; type Extensions = Required< Required< Experiment >[ 'extensions' ] >; export function setExtension< TName extends ExtensionName >( name: TName, value: Extensions[ TName ] ): SetExtension< TName > { return { type: 'SET_EXTENSION', name, value, }; } export function removeExtension( name: ExtensionName ): RemoveExtension { return { type: 'REMOVE_EXTENSION', name, }; } // ===== // TYPES // ===== type SetExtension< TName extends ExtensionName > = { readonly type: 'SET_EXTENSION'; readonly name: TName; readonly value: Extensions[ TName ]; }; type RemoveExtension = { readonly type: 'REMOVE_EXTENSION'; readonly name: ExtensionName; };