import type { NonEmptyString } from "../../common/CustomTypes/NonEmptyString";
import type { AwsResourceCommon, Environment, SnapStart, VpcConfig } from "../CloudFormation";
import type { CloudFormationString, CloudFormationValue } from "../CloudFormation/IntrinsicFunctions";
import type { ProvisionedConcurrencyConfiguration } from "../CloudFormation/Lambda/common";
import type { IamPolicyDocument } from "../CloudFormation/PolicyDocument";
import type { FilterPolicy } from "../CloudFormation/SNS/FilterPolicy";
import type { Arn } from "../CustomTypes/Arn";
import type { S3BucketName } from "../CustomTypes/S3BucketName";
import type { ServerlessTags } from "./common";
import type { SAMPolicyTemplate } from "./SAMPolicyTemplates";
export declare type FunctionType = 'AWS::Serverless::Function';
export interface Function extends AwsResourceCommon {
    Type: FunctionType;
    Properties: AwsSamServerlessFunctionProperties;
}
export declare type AwsSamServerlessFunctionProperties = AwsSamServerlessFunctionNoCodeProperties & CodeProvider;
interface ZipCodeProviderBase {
    PackageType?: 'Zip';
    Handler: string;
    Runtime: string;
    SnapStart?: SnapStart;
}
export interface S3CodeProvider extends ZipCodeProviderBase {
    CodeUri: CodeUri;
}
export declare type CodeUri = CloudFormationString | FunctionCode;
export interface FunctionCode {
    Bucket: CloudFormationValue<S3BucketName>;
    Key: CloudFormationString<NonEmptyString>;
    Version?: CloudFormationString;
}
export interface InlineCodeProvider extends ZipCodeProviderBase {
    InlineCode: string;
}
interface ImageCodeProvider {
    PackageType: 'Image';
    ImageConfig?: ImageConfig;
    ImageUri: string;
}
export interface ImageConfig {
    Command?: string[];
    EntryPoint?: string[];
    WorkingDirectory?: string;
}
export declare type CodeProvider = ImageCodeProvider | InlineCodeProvider | S3CodeProvider;
export declare function isS3CodeProvider(codeProvider: CodeProvider): codeProvider is S3CodeProvider;
export declare function isInlineCodeProvider(codeProvider: CodeProvider): codeProvider is InlineCodeProvider;
export interface AwsSamServerlessFunctionNoCodeProperties {
    Layers?: string[];
    Description?: string;
    FunctionName?: string;
    MemorySize?: CloudFormationValue<number>;
    Timeout?: CloudFormationValue<number>;
    Role?: CloudFormationValue<Arn>;
    Policies?: (CloudFormationValue | IamPolicyDocument | SAMPolicyTemplate)[];
    VpcConfig?: VpcConfig;
    Tags?: ServerlessTags;
    Tracing?: Tracing;
    KmsKeyArn?: CloudFormationValue<Arn>;
    DeadLetterQueue?: {
        Type: 'SNS' | 'SQS';
        TargetArn: string;
    };
    DeploymentPreference?: object;
    AutoPublishAlias?: string;
    ReservedConcurrentExecutions?: CloudFormationValue<number>;
    Environment?: Environment;
    Events?: Record<string, FunctionEventSource>;
    AssumeRolePolicyDocument?: object;
    AutoPublishCodeSha256?: string;
    CodeSigningConfigArn?: CloudFormationValue<Arn>;
    EventInvokeConfig?: object;
    FileSystemConfigs?: object[];
    PermissionsBoundary?: CloudFormationValue<Arn>;
    ProvisionedConcurrencyConfig?: ProvisionedConcurrencyConfiguration;
    VersionDescription?: string;
}
export declare type FunctionEventSource = ApiEventSource | KinesisEventSource | QueueEventSource | S3EventSource | SnsEventSource | TableEventSource;
export interface ApiEventSource {
    Type: 'Api';
    Properties: {
        Path: string;
        Method: ApiHttpMethod;
        RestApiId?: CloudFormationString;
        Auth?: {
            Authorizer: string;
        };
    };
}
export declare type StartingPosition = 'LATEST' | 'TRIM_HORIZON';
export interface KinesisEventSource {
    Type: 'Kinesis';
    Properties: {
        Stream: CloudFormationString;
        StartingPosition: StartingPosition;
        BatchSize?: number;
        MaximumBatchingWindowInSeconds?: number;
        MaximumRecordAgeInSeconds?: number;
        MaximumRetryAttempts?: number;
        ParallelizationFactor?: number;
        TumblingWindowInSeconds?: number;
    };
}
export interface TableEventSource {
    Type: 'DynamoDB';
    Properties: {
        Stream: CloudFormationString;
        StartingPosition: StartingPosition;
        BatchSize?: number;
    };
}
export interface QueueEventSource {
    Type: 'SQS';
    Properties: {
        Queue: CloudFormationString;
        BatchSize?: number;
    };
}
export declare type ApiHttpMethod = 'any' | 'delete' | 'get' | 'options' | 'post' | 'put';
export interface SnsEventSource {
    Type: 'SNS';
    Properties: {
        Topic: CloudFormationValue<Arn>;
        Region?: CloudFormationString;
        SqsSubscription?: boolean;
        FilterPolicy?: FilterPolicy;
    };
}
export interface S3EventSource {
    Type: 'S3';
    Properties: {
        Bucket: CloudFormationValue;
        Events: string[] | string;
        Filter?: NotificationFilter;
    };
}
export interface NotificationFilter {
    S3Key: {
        Rules: FilterRule[];
    };
}
export interface FilterRule {
    Name: 'prefix' | 'suffix';
    Value: string;
}
export declare type PackageType = 'Image' | 'Zip';
export declare type Tracing = 'Active' | 'PassThrough';
export {};
