UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

110 lines (86 loc) 2.93 kB
import { diskUtil } from '@sprucelabs/spruce-skill-utils' import { StoreTemplateItem, StoreTemplateOptions, } from '@sprucelabs/spruce-templates' import SpruceError from '../../../errors/SpruceError' import { GeneratedFile } from '../../../types/cli.types' import AbstractWriter from '../../../writers/AbstractWriter' export default class StoreWriter extends AbstractWriter { public async writeStore( destination: string, options: StoreTemplateOptions ) { const { namePascalPlural } = options const files: GeneratedFile[] = [] const filename = `${namePascalPlural}.store.ts` const fileDest = diskUtil.resolvePath( destination, 'src', 'stores', filename ) if (diskUtil.doesFileExist(fileDest)) { throw new SpruceError({ code: 'STORE_EXISTS' }) } const contents = this.templates.store(options) diskUtil.writeFile(fileDest, contents) await this.lint(fileDest) files.push({ action: 'generated', name: filename, path: fileDest, }) return files } public writePlugin(cwd: string) { const destination = diskUtil.resolveHashSprucePath( cwd, 'features', 'store.plugin.ts' ) const pluginContents = this.templates.storePlugin() const results = this.writeFileIfChangedMixinResults( destination, pluginContents, 'Loads all your data stores and connects you to any databases you have configured.' ) return results } public async writeTypesAndMap( destination: string, options: { stores: StoreTemplateItem[] } ) { const [types, map] = await Promise.all([ this.writeTypes(destination, options), this.writeMap(destination, options), ]) return [...types, ...map] } public async writeTypes( destination: string, options: { stores: StoreTemplateItem[] } ) { const file = diskUtil.resolvePath(destination, 'stores.types.ts') const typesContent = this.templates.storeTypes(options) const files = this.writeFileIfChangedMixinResults( file, typesContent, 'The type merging for so the StoreFactory properly types you stores.' ) return files } public async writeMap( destination: string, options: { stores: StoreTemplateItem[] } ) { const file = diskUtil.resolvePath(destination, 'stores.ts') const mapContent = this.templates.stores(options) const files = this.writeFileIfChangedMixinResults( file, mapContent, 'A reference to all your data stores for easy inclusion.' ) return files } }