import { resources } from './aws-resources';
import { customResource } from './cloudformation';
import { TemplateBuilder } from './template/template-builder';
type AwsServiceList = (typeof resources)['aws'];
export type AwsServices = keyof AwsServiceList;
declare class Builder<AWS> {
    private readonly aws;
    constructor(aws: AWS);
    create<C extends string = string>(outputFileName?: string, parametersFileName?: string): TemplateBuilder<AWS, {}, C>;
}
type Get<T extends {
    [key: string]: {
        load: () => Promise<any>;
    };
}> = {
    [K in keyof T]: T[K]['load'] extends () => Promise<infer R> ? R : never;
};
export type BuiltIns = {
    logicalName(prefix: string): string;
    customResource: typeof customResource;
};
export type AWSResourcesFor<S extends AwsServices> = {
    [k in S]: Get<(typeof resources)['aws'][k]>;
} & BuiltIns;
export declare class AwsLoader<AWS> {
    aws: {};
    private promises;
    private constructor();
    private add;
    register<S extends AwsServices[]>(...service: S): AwsLoader<BuiltIns & AWS & AWSResourcesFor<S[number]>>;
    static register<S extends AwsServices[]>(...resource: S): AwsLoader<BuiltIns & {
        [k in S[number]]: Get<(typeof resources)['aws'][k]>;
    }>;
    load(): Promise<Builder<AWS>>;
}
export {};
