import { Join, UnionToIntersection, Split, Cast } from '../../utils/type-utils'; import { BaseBot } from './generic'; export type IntegrationInstanceDefinition = BaseBot['integrations'][string]; export type IntegrationInstanceConfigurationDefinition = IntegrationInstanceDefinition['configuration']; export type IntegrationInstanceActionDefinition = IntegrationInstanceDefinition['actions'][string]; export type IntegrationInstanceChannelDefinition = IntegrationInstanceDefinition['channels'][string]; export type IntegrationInstanceMessageDefinition = IntegrationInstanceChannelDefinition['messages'][string]; export type IntegrationInstanceEventDefinition = IntegrationInstanceDefinition['events'][string]; export type IntegrationInstanceStateDefinition = IntegrationInstanceDefinition['states'][string]; export type IntegrationInstanceUserDefinition = IntegrationInstanceDefinition['user']; type ActionKey = string extends TIntegrationName ? string : string extends TActionName ? string : Join<[TIntegrationName, ':', TActionName]>; export type EnumerateActions = UnionToIntersection<{ [TIntegrationName in keyof TBot['integrations']]: { [TActionName in keyof TBot['integrations'][TIntegrationName]['actions'] as ActionKey, Cast>]: TBot['integrations'][TIntegrationName]['actions'][TActionName]; }; }[keyof TBot['integrations']]> & {}; export type EnumerateActionInputs = { [K in keyof EnumerateActions]: Cast[K], IntegrationInstanceActionDefinition>['input']; }; export type EnumerateActionOutputs = { [K in keyof EnumerateActions]: Cast[K], IntegrationInstanceActionDefinition>['output']; }; type EventKey = string extends TIntegrationName ? string : string extends TEventName ? string : Join<[TIntegrationName, ':', TEventName]>; export type EnumerateEvents = UnionToIntersection<{ [TIntegrationName in keyof TBot['integrations']]: { [TEventName in keyof TBot['integrations'][TIntegrationName]['events'] as EventKey, Cast>]: TBot['integrations'][TIntegrationName]['events'][TEventName]; }; }[keyof TBot['integrations']]> & { [TEventName in keyof TBot['events']]: TBot['events'][TEventName]; }; type ChannelKey = string extends TIntegrationName ? string : string extends TChannelName ? string : Join<[TIntegrationName, ':', TChannelName]>; export type EnumerateChannels = UnionToIntersection<{ [TIntegrationName in keyof TBot['integrations']]: { [TChannelName in keyof TBot['integrations'][TIntegrationName]['channels'] as ChannelKey, Cast>]: TBot['integrations'][TIntegrationName]['channels'][TChannelName]; }; }[keyof TBot['integrations']]> & {}; type MessageKey = string extends TIntegrationName ? string : string extends TChannelName ? string : string extends TMessageName ? string : Join<[TIntegrationName, ':', TChannelName, ':', TMessageName]>; export type EnumerateMessages = UnionToIntersection<{ [TIntegrationName in keyof TBot['integrations']]: { [TChannelName in keyof TBot['integrations'][TIntegrationName]['channels']]: { [TMessageName in keyof TBot['integrations'][TIntegrationName]['channels'][TChannelName]['messages'] as MessageKey, Cast, Cast>]: TBot['integrations'][TIntegrationName]['channels'][TChannelName]['messages'][TMessageName]; }; }[keyof TBot['integrations'][TIntegrationName]['channels']]; }[keyof TBot['integrations']]> & {}; export type GetMessages = { [K in keyof EnumerateMessages as Cast[2], string>]: EnumerateMessages[K]; }; export type EnumerateStates = { [K in keyof TBot['states']]: TBot['states'][K]; }; export type EnumerateTables = { [K in keyof TBot['tables']]: TBot['tables'][K]; }; export {};