import { SettingsService } from '@sprucelabs/spruce-skill-utils';
import { DirectoryTemplateCode, Templates } from '@sprucelabs/spruce-templates';
import LintService from '../services/LintService';
import { FileDescription, GeneratedFile, UpgradeMode } from '../types/cli.types';
import { GraphicsInterface } from '../types/cli.types';
export default abstract class AbstractWriter {
    protected templates: Templates;
    protected ui: GraphicsInterface;
    private linter?;
    private upgradeMode;
    private fileDescriptions;
    private shouldConfirmBeforeWriting;
    private firstFileWriteMessage?;
    private hasShownFirstWriteMessage;
    private settings;
    protected isLintEnabled: boolean;
    constructor(options: WriterOptions);
    protected lint(file: string): Promise<void>;
    protected writeDirectoryTemplate(options: WriteDirectoryTemplateOptions): Promise<WriteResults>;
    protected writeFileIfChangedMixinResults(destination: string, contents: string, description: string, results?: WriteResults, cwd?: string): Promise<WriteResults>;
    private isFileDifferent;
    private cleanFilename;
    private shouldOverwriteIfChanged;
    private getFileDescription;
    private shouldAskForOverwrite;
    protected resolveFilenameWithFallback(dirOrFile: string, fallbackFileName: string): string;
}
export type WriteResults = GeneratedFile[];
export interface WriterOptions {
    templates: Templates;
    term: GraphicsInterface;
    upgradeMode?: UpgradeMode;
    fileDescriptions: FileDescription[];
    linter?: LintService;
    settings: SettingsService;
}
export interface WriteDirectoryTemplateOptions {
    destinationDir: string;
    code: DirectoryTemplateCode;
    filesToWrite?: string[];
    filesToSkip?: string[];
    context: any;
    shouldConfirmBeforeWriting?: boolean;
    firstFileWriteMessage?: string;
}
