import { PolicyProps } from '../../aws/iam/role/PolicyProps';
import { Value } from "../Value";
import { Action } from "./iamActions";
export type Principal = '*' | {
    AWS: Value<string>[];
} | {
    Federated: Value<string>[];
} | {
    Service: Value<string>[];
};
export interface PolicyDocument {
    id?: string;
    version?: '2008-10-17' | '2012-10-17' | string;
    statement: PolicyStatement[];
}
export interface PolicyStatement {
    action?: Value<string> | Value<string[]> | Value<string>[] | Action | Action[];
    notAction?: Value<string> | Value<string[]> | Value<string>[] | Action | Action[];
    effect: 'Allow' | 'Deny';
    resource?: Value<string> | Value<string[]> | Value<string>[];
    notResource?: Value<string> | Value<string[]> | Value<string>[];
    sid?: Value<string>;
    principal?: Principal;
    notPrincipal?: Principal;
    condition?: any;
}
export declare function iamPolicy(policyDocument: PolicyDocument): PolicyDocument;
export declare class Policy {
    readonly document: PolicyDocument;
    private constructor();
    grant(action: Action | Action[], effect: PolicyStatement['effect'], onResource: PolicyStatement['resource']): this;
    allow(action: Action | Action[], onResource: PolicyStatement['resource']): this;
    deny(action: Action | Action[], onResource: PolicyStatement['resource']): this;
    static allow(action: Action | Action[], onResource: PolicyStatement['resource']): Policy;
    static deny(action: Action | Action[], onResource: PolicyStatement['resource']): Policy;
}
export declare class Iam<T extends {
    properties: {
        managedPolicyArns?: Value<Value<string>[]>;
        policies?: PolicyProps[];
    };
}> {
    private roleLike;
    private constructor();
    add(policyName: string, policy: Policy): this;
    withManagedPolicies(...arns: Value<string>[]): this;
    static policy(creator: () => Policy): Policy;
    static from<T extends {
        properties: {
            managedPolicyArns?: Value<Value<string>[]>;
            policies?: PolicyProps[];
        };
    }>(roleLike: T): Iam<T>;
}
