import { type Readable, Writable } from "node:stream";
export declare class RotatingFileStreamError extends Error {
    code: string;
    constructor();
}
export type Compressor = (source: string, dest: string) => string;
export type Generator = (time: number | Date, index?: number) => string;
interface RotatingFileStreamEvents {
    close: () => void;
    drain: () => void;
    error: (err: Error) => void;
    finish: () => void;
    pipe: (src: Readable) => void;
    unpipe: (src: Readable) => void;
    external: (stdout: string, stderr: string) => void;
    history: () => void;
    open: (filename: string) => void;
    removed: (filename: string, number: boolean) => void;
    rotation: () => void;
    rotated: (filename: string) => void;
    warning: (error: Error) => void;
}
export declare interface RotatingFileStream extends Writable {
    addListener<Event extends keyof RotatingFileStreamEvents>(event: Event, listener: RotatingFileStreamEvents[Event]): this;
    emit<Event extends keyof RotatingFileStreamEvents>(event: Event, ...args: Parameters<RotatingFileStreamEvents[Event]>): boolean;
    on<Event extends keyof RotatingFileStreamEvents>(event: Event, listener: RotatingFileStreamEvents[Event]): this;
    once<Event extends keyof RotatingFileStreamEvents>(event: Event, listener: RotatingFileStreamEvents[Event]): this;
    prependListener<Event extends keyof RotatingFileStreamEvents>(event: Event, listener: RotatingFileStreamEvents[Event]): this;
    prependOnceListener<Event extends keyof RotatingFileStreamEvents>(event: Event, listener: RotatingFileStreamEvents[Event]): this;
    removeListener<Event extends keyof RotatingFileStreamEvents>(event: Event, listener: RotatingFileStreamEvents[Event]): this;
}
export type IntervalUnit = "M" | "d" | "h" | "m" | "s";
type HourInterval = 1 | 2 | 3 | 4 | 6 | 8 | 12 | 24;
type MinuteInterval = 1 | 2 | 3 | 4 | 5 | 6 | 10 | 12 | 15 | 20 | 30 | 60;
export type Interval = `${number}${"M" | "d"}` | `${HourInterval}h` | `${MinuteInterval}${"m" | "s"}`;
export type FileSizeUnit = "B" | "K" | "M" | "G";
export type FileSize = `${number}${FileSizeUnit}`;
type IntervalOpt<I extends string = string> = string extends I ? string : I extends Interval ? I : never;
type FileSizeOpt<S extends string = string> = string extends S ? string : S extends FileSize ? S : never;
export interface Options<I extends string = string, MS extends string = string, RS extends string = string> {
    compress?: boolean | "gzip" | Compressor;
    encoding?: BufferEncoding;
    history?: string;
    immutable?: boolean;
    initialRotation?: boolean;
    interval?: IntervalOpt<I>;
    intervalBoundary?: boolean;
    intervalUTC?: boolean;
    maxFiles?: number;
    maxSize?: FileSizeOpt<MS>;
    mode?: number;
    omitExtension?: boolean;
    path?: string;
    rotate?: number;
    size?: FileSizeOpt<RS>;
    teeToStdout?: boolean;
}
interface Opts {
    compress?: boolean | "gzip" | Compressor;
    encoding?: BufferEncoding;
    history?: string;
    immutable?: boolean;
    initialRotation?: boolean;
    interval?: {
        num: number;
        unit: IntervalUnit;
    };
    intervalBoundary?: boolean;
    intervalUTC?: boolean;
    maxFiles?: number;
    maxSize?: number;
    mode?: number;
    omitExtension?: boolean;
    path?: string;
    rotate?: number;
    size?: number;
    teeToStdout?: boolean;
}
export declare class RotatingFileStream extends Writable {
    generator: Generator;
    options: Opts;
    constructor(generator: Generator, options: Opts);
}
export declare const createStream: <I extends string = string, MS extends string = string, RS extends string = string>(filename: string | Generator, options?: Options<I, MS, RS>) => RotatingFileStream;
export {};
