@sprucelabs/spruce-cli
Version: 
Command line interface for building Spruce skills.
79 lines (66 loc) • 2.71 kB
text/typescript
import AbstractSpruceError from '@sprucelabs/error'
import { normalizeSchemaValues } from '@sprucelabs/schema'
import { namesUtil } from '@sprucelabs/spruce-skill-utils'
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
import { SpruceSchemas } from '#spruce/schemas/schemas.types'
import createSchemaActionSchema from '#spruce/schemas/spruceCli/v2020_07_22/createSchemaOptions.schema'
import syncSchemasActionSchema from '#spruce/schemas/spruceCli/v2020_07_22/syncSchemasOptions.schema'
import AbstractAction from '../../AbstractAction'
type OptionsSchema =
    SpruceSchemas.SpruceCli.v2020_07_22.CreateSchemaOptionsSchema
type Options = SpruceSchemas.SpruceCli.v2020_07_22.CreateSchemaOptions
export default class CreateAction extends AbstractAction<OptionsSchema> {
    public optionsSchema = createSchemaActionSchema
    public invocationMessage = 'Creating your schema builder... 📃'
    public async execute(options: Options) {
        const normalizedOptions = this.validateAndNormalizeOptions(options)
        const {
            schemaBuilderDestinationDir,
            nameCamel,
            namePascal,
            nameReadable,
            syncAfterCreate,
            shouldEnableVersioning,
            version,
            ...rest
        } = normalizedOptions
        const resolvedDestination = diskUtil.resolvePath(
            this.cwd,
            schemaBuilderDestinationDir
        )
        let resolvedVersion: string | undefined
        if (shouldEnableVersioning) {
            resolvedVersion = await this.resolveVersion(
                version,
                resolvedDestination
            )
        }
        const generator = this.Writer('schema')
        const results = await generator.writeBuilder(resolvedDestination, {
            ...rest,
            nameCamel,
            shouldEnableVersioning: shouldEnableVersioning ?? undefined,
            version: resolvedVersion,
            nameReadable: nameReadable ?? nameCamel,
            namePascal: namePascal ?? namesUtil.toPascal(nameCamel),
        })
        let errors: AbstractSpruceError<any>[] | undefined
        if (syncAfterCreate) {
            const syncOptions = normalizeSchemaValues(
                syncSchemasActionSchema,
                rest,
                {
                    shouldIncludePrivateFields: true,
                }
            )
            const syncResults = await this.Action('schema', 'sync').execute(
                syncOptions
            )
            results.push(...(syncResults.files ?? []))
            if (syncResults.errors) {
                errors = syncResults.errors
            }
        }
        return { files: results, errors }
    }
}