import { Duration } from 'aws-cdk-lib';
import * as acm from 'aws-cdk-lib/aws-certificatemanager';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import { Distribution } from 'aws-cdk-lib/aws-cloudfront';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as route53 from 'aws-cdk-lib/aws-route53';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';
import { BaseSiteDomainProps, NextjsBaseProps } from './NextjsBase';
import { NextjsBuild } from './NextjsBuild';
export declare const CONFIG_ENV_JSON_PATH = "next-env.json";
export interface NextjsDomainProps extends BaseSiteDomainProps {
}
export declare type NextjsDistributionCdkOverrideProps = cloudfront.DistributionProps;
export interface NextjsDistributionCdkProps {
    /**
     * Pass in a value to override the default settings this construct uses to
     * create the CloudFront `Distribution` internally.
     */
    readonly distribution?: NextjsDistributionCdkOverrideProps;
}
export interface NextjsCachePolicyProps {
    readonly staticCachePolicy?: cloudfront.ICachePolicy;
    readonly lambdaCachePolicy?: cloudfront.ICachePolicy;
    readonly imageCachePolicy?: cloudfront.ICachePolicy;
    /**
     * Cache-control max-age default for static assets (/_next/*).
     * Default: 30 days.
     */
    readonly staticClientMaxAgeDefault?: Duration;
}
export interface NextjsOriginRequestPolicyProps {
    readonly lambdaOriginRequestPolicy?: cloudfront.IOriginRequestPolicy;
    readonly fallbackOriginRequestPolicy?: cloudfront.IOriginRequestPolicy;
    readonly imageOptimizationOriginRequestPolicy?: cloudfront.IOriginRequestPolicy;
}
export interface NextjsDistributionProps extends NextjsBaseProps {
    /**
     * Bucket containing static assets.
     * Must be provided if you want to serve static files.
     */
    readonly staticAssetsBucket: s3.IBucket;
    /**
     * Lambda function to route all non-static requests to.
     * Must be provided if you want to serve dynamic requests.
     */
    readonly serverFunction: lambda.IFunction;
    /**
     * Lambda function to optimize images.
     * Must be provided if you want to serve dynamic requests.
     */
    readonly imageOptFunction: lambda.IFunction;
    /**
     * Overrides for created CDK resources.
     */
    readonly cdk?: NextjsDistributionCdkProps;
    /**
     * Built NextJS app.
     */
    readonly nextBuild: NextjsBuild;
    /**
     * Override the default CloudFront cache policies created internally.
     */
    readonly cachePolicies?: NextjsCachePolicyProps;
    /**
     * Override the default CloudFront origin request policies created internally.
     */
    readonly originRequestPolicies?: NextjsOriginRequestPolicyProps;
    /**
     * The customDomain for this website. Supports domains that are hosted
     * either on [Route 53](https://aws.amazon.com/route53/) or externally.
     *
     * Note that you can also migrate externally hosted domains to Route 53 by
     * [following this guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html).
     *
     * @example
     * new NextjsDistribution(this, "Dist", {
     *   customDomain: "domain.com",
     * });
     *
     * new NextjsDistribution(this, "Dist", {
     *   customDomain: {
     *     domainName: "domain.com",
     *     domainAlias: "www.domain.com",
     *     hostedZone: "domain.com"
     *   },
     * });
     */
    readonly customDomain?: string | NextjsDomainProps;
    /**
     * Include the name of your deployment stage if present.
     * Used to name the edge functions stack.
     * Required if using SST.
     */
    readonly stageName?: string;
    /**
     * Optional value to prefix the edge function stack
     * It defaults to "Nextjs"
     */
    readonly stackPrefix?: string;
    /**
     * Override lambda function url auth type
     * @default "NONE"
     */
    readonly functionUrlAuthType?: lambda.FunctionUrlAuthType;
    readonly httpBasicAuthCredentials?: string;
}
/**
 * Effectively a Partial<NextjsDistributionProps> to satisfy JSII
 */
export interface NextjsDistributionPropsDefaults extends NextjsBaseProps {
    /**
     * Bucket containing static assets.
     * Must be provided if you want to serve static files.
     */
    readonly staticAssetsBucket?: s3.IBucket;
    /**
     * Lambda function to route all non-static requests to.
     * Must be provided if you want to serve dynamic requests.
     */
    readonly serverFunction?: lambda.IFunction;
    /**
     * Lambda function to optimize images.
     * Must be provided if you want to serve dynamic requests.
     */
    readonly imageOptFunction?: lambda.IFunction;
    /**
     * Overrides for created CDK resources.
     */
    readonly cdk?: NextjsDistributionCdkProps;
    /**
     * Built NextJS app.
     */
    readonly nextBuild?: NextjsBuild;
    /**
     * Override the default CloudFront cache policies created internally.
     */
    readonly cachePolicies?: NextjsCachePolicyProps;
    /**
     * Override the default CloudFront origin request policies created internally.
     */
    readonly originRequestPolicies?: NextjsOriginRequestPolicyProps;
    /**
     * The customDomain for this website. Supports domains that are hosted
     * either on [Route 53](https://aws.amazon.com/route53/) or externally.
     *
     * Note that you can also migrate externally hosted domains to Route 53 by
     * [following this guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html).
     *
     * @example
     * new NextjsDistribution(this, "Dist", {
     *   customDomain: "domain.com",
     * });
     *
     * new NextjsDistribution(this, "Dist", {
     *   customDomain: {
     *     domainName: "domain.com",
     *     domainAlias: "www.domain.com",
     *     hostedZone: "domain.com"
     *   },
     * });
     */
    readonly customDomain?: string | NextjsDomainProps;
    /**
     * Include the name of your deployment stage if present.
     * Used to name the edge functions stack.
     * Required if using SST.
     */
    readonly stageName?: string;
    /**
     * Optional value to prefix the edge function stack
     * It defaults to "Nextjs"
     */
    readonly stackPrefix?: string;
    /**
     * Override lambda function url auth type
     * @default "NONE"
     */
    readonly functionUrlAuthType?: lambda.FunctionUrlAuthType;
    readonly httpBasicAuthCredentials?: string;
}
/**
 * Create a CloudFront distribution to serve a Next.js application.
 */
export declare class NextjsDistribution extends Construct {
    /**
     * The default CloudFront cache policy properties for static pages.
     */
    static staticCachePolicyProps: cloudfront.CachePolicyProps;
    /**
     * The default CloudFront cache policy properties for images.
     */
    static imageCachePolicyProps: cloudfront.CachePolicyProps;
    /**
     * The default CloudFront cache policy properties for the Lambda server handler.
     */
    static lambdaCachePolicyProps: cloudfront.CachePolicyProps;
    /**
     * The default CloudFront lambda origin request policy.
     */
    static lambdaOriginRequestPolicyProps: cloudfront.OriginRequestPolicyProps;
    static fallbackOriginRequestPolicyProps: cloudfront.OriginRequestPolicyProps;
    static imageOptimizationOriginRequestPolicyProps: cloudfront.OriginRequestPolicyProps;
    protected props: NextjsDistributionProps;
    /**
     * The internally created CloudFront `Distribution` instance.
     */
    distribution: Distribution;
    /**
     * The Route 53 hosted zone for the custom domain.
     */
    hostedZone?: route53.IHostedZone;
    /**
     * The AWS Certificate Manager certificate for the custom domain.
     */
    certificate?: acm.ICertificate;
    tempBuildDir: string;
    constructor(scope: Construct, id: string, props: NextjsDistributionProps);
    /**
     * The CloudFront URL of the website.
     */
    get url(): string;
    get customDomainName(): string | undefined;
    /**
     * If the custom domain is enabled, this is the URL of the website with the
     * custom domain.
     */
    get customDomainUrl(): string | undefined;
    /**
     * The ID of the internally created CloudFront Distribution.
     */
    get distributionId(): string;
    /**
     * The domain name of the internally created CloudFront Distribution.
     */
    get distributionDomain(): string;
    private get isFnUrlIamAuth();
    private createCloudFrontDistribution;
    private createCloudFrontStaticCachePolicy;
    private createCloudFrontImageCachePolicy;
    private createLambdaOriginRequestPolicy;
    private createFallbackOriginRequestPolicy;
    private createImageOptimizationOriginRequestPolicy;
    private createCloudFrontLambdaCachePolicy;
    private createCloudFrontDistributionForStub;
    private buildDistributionDomainNames;
    /**
     * Create an edge function to handle requests to the lambda server handler origin.
     * It overrides the host header in the request to be the lambda URL's host.
     * It's needed because we forward all headers to the origin, but the origin is itself an
     *  HTTP server so it needs the host header to be the address of the lambda and not
     *  the distribution.
     *
     */
    private buildLambdaOriginRequestEdgeFunction;
    protected validateCustomDomainSettings(): void;
    protected lookupHostedZone(): route53.IHostedZone | undefined;
    private createCertificate;
    private createRoute53Records;
}
