import * as pulumi from '@pulumi/pulumi';
import * as aws from '@pulumi/aws';
import * as awsx from '@pulumi/awsx';
import * as upstash from '@upstash/pulumi';
import { Database, DatabaseArgs } from './database';
import { WebServer, WebServerArgs } from './web-server';
import { Mongo, MongoArgs } from './mongo';
import { Redis, RedisArgs } from './redis';
import { StaticSite, StaticSiteArgs } from './static-site';
import { Ec2SSMConnect } from './ec2-ssm-connect';
import { EcsService, EcsServiceArgs } from './ecs-service';
import { NuxtSSR, NuxtSSRArgs } from './nuxt-ssr';
export type Service = Database | Redis | StaticSite | WebServer | NuxtSSR | Mongo | EcsService;
export type Services = Record<string, Service>;
type ServiceArgs = {
    /**
     * The unique name for the service.
     */
    serviceName: string;
};
export type DatabaseServiceOptions = {
    type: 'DATABASE';
} & ServiceArgs & Omit<DatabaseArgs, 'vpcId' | 'vpcCidrBlock' | 'isolatedSubnetIds'>;
export type RedisServiceOptions = {
    type: 'REDIS';
} & ServiceArgs & RedisArgs;
export type StaticSiteServiceOptions = {
    type: 'STATIC_SITE';
} & ServiceArgs & StaticSiteArgs;
export type WebServerServiceOptions = {
    type: 'WEB_SERVER';
    environment?: aws.ecs.KeyValuePair[] | ((services: Services) => aws.ecs.KeyValuePair[]);
    secrets?: aws.ecs.Secret[] | ((services: Services) => aws.ecs.Secret[]);
} & ServiceArgs & Omit<WebServerArgs, 'clusterId' | 'clusterName' | 'vpcId' | 'vpcCidrBlock' | 'publicSubnetIds' | 'environment' | 'secrets'>;
export type NuxtSSRServiceOptions = {
    type: 'NUXT_SSR';
    environment?: aws.ecs.KeyValuePair[] | ((services: Services) => aws.ecs.KeyValuePair[]);
    secrets?: aws.ecs.Secret[] | ((services: Services) => aws.ecs.Secret[]);
} & ServiceArgs & Omit<NuxtSSRArgs, 'clusterId' | 'clusterName' | 'vpcId' | 'vpcCidrBlock' | 'publicSubnetIds' | 'environment' | 'secrets'>;
export type MongoServiceOptions = {
    type: 'MONGO';
} & ServiceArgs & Omit<MongoArgs, 'clusterId' | 'clusterName' | 'vpcId' | 'vpcCidrBlock' | 'privateSubnetIds' | 'environment' | 'secrets'>;
export type EcsServiceOptions = {
    type: 'ECS_SERVICE';
    environment?: aws.ecs.KeyValuePair[] | ((services: Services) => aws.ecs.KeyValuePair[]);
    secrets?: aws.ecs.Secret[] | ((services: Services) => aws.ecs.Secret[]);
} & ServiceArgs & Omit<EcsServiceArgs, 'clusterId' | 'clusterName' | 'vpcId' | 'vpcCidrBlock' | 'subnetIds' | 'environment' | 'secrets'>;
export type ProjectArgs = {
    services: (DatabaseServiceOptions | RedisServiceOptions | StaticSiteServiceOptions | WebServerServiceOptions | NuxtSSRServiceOptions | MongoServiceOptions | EcsServiceOptions)[];
    enableSSMConnect?: pulumi.Input<boolean>;
    numberOfAvailabilityZones?: number;
};
export declare class MissingEcsCluster extends Error {
    constructor();
}
export declare class Project extends pulumi.ComponentResource {
    name: string;
    vpc: awsx.ec2.Vpc;
    cluster?: aws.ecs.Cluster;
    upstashProvider?: upstash.Provider;
    ec2SSMConnect?: Ec2SSMConnect;
    services: Services;
    constructor(name: string, args: ProjectArgs, opts?: pulumi.ComponentResourceOptions);
    private createVpc;
    private createServices;
    private createRedisPrerequisites;
    private createEcsCluster;
    private createDatabaseService;
    private createRedisService;
    private createStaticSiteService;
    private createWebServerService;
    private createNuxtSSRService;
    private createMongoService;
    private createEcsService;
}
export {};
