UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

89 lines (75 loc) 2.68 kB
import { PermissionContractMap } from '@sprucelabs/mercury-types' import { diskUtil, NpmPackage } from '@sprucelabs/spruce-skill-utils' import AbstractFeature, { FeatureDependency, FeatureOptions, InstallResults, } from '../AbstractFeature' import { FeatureCode } from '../features.types' import PermissionWriter from './writers/PermissionWriter' export default class PermissionFeature extends AbstractFeature { public code: FeatureCode = 'permission' public nameReadable = 'permission' public description = 'Manage permissions for your skill' public dependencies: FeatureDependency[] = [] public actionsDir = diskUtil.resolvePath(__dirname, 'actions') public packageDependencies: NpmPackage[] = [ { name: '@sprucelabs/spruce-permission-plugin@latest', }, ] private writer: PermissionWriter public constructor(options: FeatureOptions) { super(options) this.writer = this.Writer('permission') void this.emitter.on( 'feature.did-execute', this.handleDidExecuteAction.bind(this) ) } public async handleDidExecuteAction({ featureCode, actionCode, }: { featureCode: string actionCode: string }) { const isInstalled = await this.features.isInstalled('permission') const isSkillInstalled = await this.features.isInstalled('skill') const isUpgrading = featureCode === 'node' && actionCode === 'upgrade' const isSyncingEvents = featureCode === 'event' && actionCode === 'sync' if (isInstalled && (isUpgrading || isSyncingEvents)) { const combinedFile = isSkillInstalled ? await this.writePlugin() : [] const results = await this.Action('permission', 'sync').execute({}) results.files = [...(results.files ?? []), ...combinedFile] return results } return {} } public async afterPackageInstall(): Promise<InstallResults> { const files = await this.writePlugin() const combinedFile = await this.writeTypesFile() return { files: [...files, ...combinedFile], } } private async writeTypesFile() { return await this.writer.writeTypesFile( this.cwd, {} as PermissionContractMap ) } private async writePlugin() { return this.writer.writePlugin(this.cwd) } } declare module '../../features/features.types' { interface FeatureMap { permission: PermissionFeature } interface FeatureOptionsMap { permission: undefined } }