@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
112 lines (97 loc) • 3.4 kB
text/typescript
import AgentStore from '../features/agent/stores/AgentStore'
import ConversationStore from '../features/conversation/stores/ConversationStore'
import EventStore from '../features/event/stores/EventStore'
import ListenerStore from '../features/event/stores/ListenerStore'
import OnboardingStore from '../features/onboard/stores/OnboardingStore'
import OrganizationStore from '../features/organization/stores/OrganizationStore'
import PermissionStore from '../features/permission/stores/PermissionStore'
import SchemaStore from '../features/schema/stores/SchemaStore'
import SkillStoreImpl, {
SkillStoreOptions,
} from '../features/skill/stores/SkillStore'
import StoreStore from '../features/store/stores/StoreStore'
import ViewStore from '../features/view/stores/ViewStore'
import { GlobalEmitter } from '../GlobalEmitter'
import ServiceFactory from '../services/ServiceFactory'
import { ApiClientFactory } from '../types/apiClient.types'
export default class StoreFactory {
private serviceFactory: ServiceFactory
private cwd: string
private homeDir: string
private apiClientFactory: ApiClientFactory
private emitter: GlobalEmitter
public constructor(options: StoreFactoryOptions) {
const { cwd, serviceFactory, homeDir, apiClientFactory, emitter } =
options
this.cwd = cwd
this.serviceFactory = serviceFactory
this.homeDir = homeDir
this.apiClientFactory = apiClientFactory
this.emitter = emitter
}
public Store<C extends StoreCode>(
code: C,
options?: CreateStoreOptions<C>
): StoreMap[C] {
const storeOptions = {
cwd: options?.cwd ?? this.cwd,
serviceFactory: this.serviceFactory,
homeDir: this.homeDir,
apiClientFactory:
options?.apiClientFactory ?? this.apiClientFactory,
emitter: this.emitter,
...options,
}
if (!storeMap[code]) {
throw new Error(`Could not find store with code '${code}'.`)
}
const store = new storeMap[code](storeOptions as any)
return store as StoreMap[C]
}
}
interface UniversalOptions {
cwd?: string
apiClientFactory?: ApiClientFactory
}
export type CreateStoreOptions<Code extends StoreCode> =
Code extends keyof StoreOptionsMap
? //@ts-ignore
StoreOptionsMap[Code] & UniversalOptions
: UniversalOptions
export interface StoreMap {
onboarding: OnboardingStore
schema: SchemaStore
event: EventStore
skill: SkillStoreImpl
organization: OrganizationStore
conversation: ConversationStore
store: StoreStore
view: ViewStore
listener: ListenerStore
permission: PermissionStore
agent: AgentStore
}
const storeMap = {
onboarding: OnboardingStore,
schema: SchemaStore,
event: EventStore,
skill: SkillStoreImpl,
organization: OrganizationStore,
conversation: ConversationStore,
store: StoreStore,
view: ViewStore,
listener: ListenerStore,
permission: PermissionStore,
agent: AgentStore,
}
export type StoreCode = keyof StoreMap
export interface StoreFactoryOptions {
cwd: string
serviceFactory: ServiceFactory
homeDir: string
apiClientFactory: ApiClientFactory
emitter: GlobalEmitter
}
export interface StoreOptionsMap {
skill: SkillStoreOptions
}