import DirectoryNode, { DirNode } from "../fileSystemTree";
import type { SettingsFile } from "../types/settings";
import File, { type FileOptions } from "./File";
export declare class Template {
    /**
     * Name of template
     */
    name: any;
    /**
     * The Directory were the template code lives
     */
    location: any;
    /**
     * Settings file of the template
     */
    settingsFile: SettingsFile;
    /**
     * Template's packages. By default all packages arent loaded into memory and only
     * packages that are requests are loaded
     */
    packages: Record<string, DirNode>;
    /**
     * Packages used
     */
    packagesUsed: string[];
    /**
     * Compiled Files
     */
    compiledFiles: File[];
    /**
     * Def files
     */
    defs: Record<string, string>;
    /**
     * Get a template
     */
    static get(templateName: string): Promise<Template>;
    private static fetchSettingsFile;
    static fetchTemplateLocation(templateName: string): Promise<string | null>;
    /**
     * Extra Relative directories to create in instances
     *
     * TODO: This is not the best way to do this but at the moment
     */
    extraDirectories: string[];
    constructor(
    /**
     * Name of template
     */
    name: any, 
    /**
     * The Directory were the template code lives
     */
    location: any, 
    /**
     * Settings file of the template
     */
    settingsFile: SettingsFile, 
    /**
     * Template's packages. By default all packages arent loaded into memory and only
     * packages that are requests are loaded
     */
    packages?: Record<string, DirNode>, 
    /**
     * Packages used
     */
    packagesUsed?: string[], 
    /**
     * Compiled Files
     */
    compiledFiles?: File[], 
    /**
     * Def files
     */
    defs?: Record<string, string>);
    /**
     * Fetch packages contents so they can be included in rendered instance.
     */
    fetchPackages(newPackages: string | string[]): Promise<void>;
    /**
     * Fetch a package contents so they can be included in rendered instance.
     *
     * @param newPackage - package from the template you would like to use
     */
    fetchPackage(newPackageName: string): Promise<void>;
    /**
     * packages that will be used in the render process
     */
    usedPackages(): DirectoryNode[];
    createFile(file: string, content: string, options?: Partial<FileOptions>): void;
    /**
     * Create a directory in the template. When instances are created these directories
     * will be created in the instance
     */
    createDirectory(dir: string): void;
}
