type TimeWindow = `${number}${'s' | 'm' | 'h'}` | {
    value: number;
    unit: 'seconds' | 'minutes' | 'hours';
};
interface EdgeRequest {
    method: string;
    path: string;
    queryString: string;
    queryParams: Record<string, string | string[]>;
    headers: Record<string, string | string[]>;
    ip: string;
    jwt: Record<string, unknown> | null;
    operation: 'query' | 'mutation' | 'subscription';
    rootFields: {
        name: string;
        alias: string | null;
        args: Record<string, unknown>;
    }[];
}
interface ComplexityLimit {
    type: 'QueryComplexity';
    budget: number;
    warning?: number;
    window: TimeWindow;
}
interface RequestLimit {
    type: 'RequestCount';
    budget: number;
    warning?: number;
    window: TimeWindow;
}
type RateLimitGroupBy = 'ip' | {
    header: string;
} | {
    cookie: string;
} | {
    jwt: string;
} | {
    consumerIdentifier: string;
};
interface BaseRateLimitRule {
    name: string;
    description?: string;
    state?: 'enabled' | 'disabled' | 'dryRun';
    allowList?: readonly string[];
    limit: ComplexityLimit | RequestLimit;
}
type DynamicRateLimitRule = BaseRateLimitRule & ({
    groupBy: RateLimitGroupBy;
} | {
    group: string | number;
});

declare function isQuery(req: EdgeRequest): boolean;
declare function isMutation(req: EdgeRequest): boolean;
declare function hasRootField(req: EdgeRequest, rootField: string): boolean;
type FieldConfigMap = {
    [rootFieldName: string]: Omit<RequestLimit, 'type'>;
};
type OmitLimitKey<Type> = {
    [Key in keyof Type as Exclude<Key, 'limit'>]: Type[Key];
};
type ByFieldConfig = OmitLimitKey<DynamicRateLimitRule> & {
    queryFields?: FieldConfigMap;
    mutationFields?: FieldConfigMap;
};
declare function byField(req: EdgeRequest, { queryFields, mutationFields, ...baseConfig }: ByFieldConfig): DynamicRateLimitRule[];

export { byField, hasRootField, isMutation, isQuery };
