UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

90 lines (73 loc) 2.95 kB
import { buildSchema, SchemaValues } from '@sprucelabs/schema' import { diskUtil } from '@sprucelabs/spruce-skill-utils' import AbstractAction from '../../AbstractAction' import { FeatureActionResponse } from '../../features.types' const pullOptionsSchema = buildSchema({ id: 'pullActionSchema', description: 'Pulls the event contracts from Mercury down to a single file for easy distribution.', fields: { destination: { type: 'text', label: 'Destination', hint: 'File is always named `events.contract.ts`.', }, }, }) type PullOptionsSchema = typeof pullOptionsSchema type Options = SchemaValues<PullOptionsSchema> export default class PullAction extends AbstractAction<PullOptionsSchema> { public commandAliases = ['pull.event.contracts'] public optionsSchema = pullOptionsSchema public invocationMessage = 'Pulling combined event contract... 🜒' public async execute(options: Options): Promise<FeatureActionResponse> { let { destination = '.' } = this.validateAndNormalizeOptions(options) const filename = 'events.contract.ts' destination = diskUtil.resolvePath(this.cwd, destination, filename) const { contracts } = await this.Store('event').fetchEventContracts({ namespaces: ['core'], }) let buildEventContractImport = `import { buildEventContract } from '@sprucelabs/mercury-types' import '${'#spruce'}/permissions/permissions.types'` const contents = `${buildEventContractImport} const eventContracts = [${contracts .map((c) => `buildEventContract(${JSON.stringify(c, null, 2)})`) .join(',\n')}] as const export default eventContracts export type CoreEventContract = ${contracts .map((_, idx) => `typeof eventContracts[${idx}]`) .join(' & ')} ` const action = diskUtil.doesFileExist(destination) ? 'updated' : 'generated' diskUtil.writeFile(destination, contents) const typesFiles = await this.syncPermissions() return { files: [ ...typesFiles, { name: filename, path: destination, action, description: 'All your Mercury core events ready for testing!', }, ], } } private async syncPermissions() { const permissions = this.Store('permission') const coreMap = await permissions.fetchContracts({ shouldSyncCorePermissions: true, }) const heartwoodMap = await permissions.fetchContracts({ shouldSyncCorePermissions: true, }) const typesFiles = await this.Writer('permission').writeTypesFile( this.cwd, { ...coreMap, ...heartwoodMap } ) return typesFiles } }