import events = require('@aws-cdk/aws-events');
import iam = require('@aws-cdk/aws-iam');
import cdk = require('@aws-cdk/cdk');
import { Artifact } from './artifact';
export declare enum ActionCategory {
    Source = "Source",
    Build = "Build",
    Test = "Test",
    Approval = "Approval",
    Deploy = "Deploy",
    Invoke = "Invoke"
}
/**
 * Specifies the constraints on the number of input and output
 * artifacts an action can have.
 *
 * The constraints for each action type are documented on the
 * {@link https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html Pipeline Structure Reference} page.
 */
export interface ActionArtifactBounds {
    readonly minInputs: number;
    readonly maxInputs: number;
    readonly minOutputs: number;
    readonly maxOutputs: number;
}
export declare function defaultBounds(): ActionArtifactBounds;
/**
 * The abstract interface of a Pipeline Stage that is used by Actions.
 */
export interface IStage {
    /**
     * The physical, human-readable name of this Pipeline Stage.
     */
    readonly name: string;
    /**
     * The ARN of the Pipeline.
     */
    readonly pipelineArn: cdk.Arn;
    /**
     * The service Role of the Pipeline.
     */
    readonly pipelineRole: iam.Role;
    /**
     * Grants read & write permissions to the Pipeline's S3 Bucket to the given Identity.
     *
     * @param identity the IAM Identity to grant the permissions to
     */
    grantPipelineBucketReadWrite(identity: iam.IPrincipal): void;
    /**
     * Adds an Action to this Stage.
     * This is an internal operation -
     * an Action is added to a Stage when it's constructed,
     * so there's no need to call this method explicitly.
     *
     * @param action the Action to add to this Stage
     */
    _addAction(action: Action): void;
}
/**
 * Common properties shared by all Actions.
 */
export interface CommonActionProps {
    /**
     * The Pipeline Stage to add this Action to.
     */
    stage: IStage;
}
/**
 * Construction properties of the low-level {@link Action Action class}.
 */
export interface ActionProps extends CommonActionProps {
    category: ActionCategory;
    provider: string;
    artifactBounds: ActionArtifactBounds;
    configuration?: any;
    version?: string;
    owner?: string;
}
/**
 * Low-level class for generic CodePipeline Actions.
 * It is recommended that concrete types are used instead, such as {@link codecommit.PipelineSource} or
 * {@link codebuild.PipelineBuildAction}.
 */
export declare abstract class Action extends cdk.Construct {
    /**
     * The category of the action.
     * The category defines which action type the owner
     * (the entity that performs the action) performs.
     */
    readonly category: ActionCategory;
    /**
     * The service provider that the action calls.
     */
    readonly provider: string;
    /**
     * The action's configuration. These are key-value pairs that specify input values for an action.
     * For more information, see the AWS CodePipeline User Guide.
     *
     * http://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#action-requirements
     */
    readonly configuration?: any;
    /**
     * The order in which AWS CodePipeline runs this action.
     * For more information, see the AWS CodePipeline User Guide.
     *
     * https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#action-requirements
     */
    runOrder: number;
    readonly owner: string;
    readonly version: string;
    private readonly _inputArtifacts;
    private readonly _outputArtifacts;
    private readonly artifactBounds;
    private readonly stage;
    constructor(parent: cdk.Construct, id: string, props: ActionProps);
    validate(): string[];
    onStateChange(name: string, target?: events.IEventRuleTarget, options?: events.EventRuleProps): events.EventRule;
    readonly inputArtifacts: Artifact[];
    readonly outputArtifacts: Artifact[];
    protected addChild(child: cdk.Construct, name: string): void;
    protected addOutputArtifact(name: string): Artifact;
    protected addInputArtifact(artifact: Artifact): Action;
}
