import type { AnyTypeValidation, ObjectOfTypeValidation } from '@altostra/type-validations';
import type { AwsResourceCommon } from "./common";
import type { CloudFormationString } from "./IntrinsicFunctions";
import type { TemplateParameter } from "./TemplateParameter";
import type { CloudFormationResource } from "./Types";
export interface AwsCfnTemplate<TResources extends AwsResourceCommon = CloudFormationResource> {
    AWSTemplateFormatVersion?: '2010-09-09';
    Transform?: string[] | string;
    Description?: string;
    Globals?: {
        Function?: {
            Timeout?: number;
        };
    };
    Resources: Record<string, TResources>;
    Parameters?: Record<string, TemplateParameter>;
    Outputs?: Record<string, AwsTemplateOutput>;
    Conditions?: Record<string, object>;
    Metadata?: Record<string, any>;
    Mappings?: Record<string, Mapping>;
}
export declare type Mapping = Record<string, TopLevelMap>;
export declare type TopLevelMap = Record<string, SecondLevelMap>;
export declare type SecondLevelMap = Record<string, MappedValue>;
export declare type MappedValue = boolean[] | number[] | string[] | boolean | number | string;
export interface AwsTemplateOutput {
    Description?: string;
    Value: CloudFormationString;
    Export?: {
        Name: CloudFormationString;
    };
}
export declare const isAwsTemplateOutput: ObjectOfTypeValidation<AwsTemplateOutput>;
export declare function mergeTemplates(firstTemplate: AwsCfnTemplate, ...templates: AwsCfnTemplate[]): AwsCfnTemplate;
export declare function createCFNTemplateValidation<T extends AwsResourceCommon>(isValidResource: AnyTypeValidation<T>, allowedTransforms?: AnyTypeValidation<string>): ObjectOfTypeValidation<AwsCfnTemplate<T>>;
export declare const isCfnTemplate: ObjectOfTypeValidation<AwsCfnTemplate<AwsResourceCommon>>;
