import { RecordTypes } from '../types.js';
import { type ApiFieldMetadata } from '../models/apiResults.js';
import { type LayoutBase } from '../layouts/layoutBase.js';
import { type Moment } from 'moment';
export type FieldValue = string | number | Moment | Container;
export type Container = null;
export interface Parentable {
    layout: LayoutBase;
    type: RecordTypes;
    endpoint: string;
    portal?: {
        name: string;
    };
}
/**
 * A class representing a field in a record.
 *
 * @template T - The type of the field value.
 */
export declare class Field<T extends FieldValue> {
    #private;
    parent: Parentable;
    id: string;
    protected _value: T | null;
    static firstContainerDownload: Promise<any> | null;
    constructor(record: Parentable, id: string, originalContents: T);
    get edited(): boolean;
    /**
     * Resets the 'edited' state of this field, without changing its value
     */
    updateOriginalContents(): void;
    /**
     * Sets the value of the field.
     *
     * @param {T | null} content - The new content value to be set. Can be either the type T or null.
     * @throws {Error} Cannot set container value using set(). Use upload() instead, if the result is a 'container'.
     */
    set(content: T | null): void;
    get metadata(): ApiFieldMetadata;
    get value(): T | null;
    set value(value: T);
    get string(): string;
    /**
     * Uploads a file to the container field.
     *
     * @param {Buffer} file - The file content as a buffer.
     *
     * @throws {Error} - Cannot upload a file to the field if it's not a container field.
     * @throws {Error} - Upload failed with HTTP error.
     *
     * @returns {Promise<void>} - A promise that resolves when the file is successfully uploaded.
     */
    upload(file: File): Promise<void>;
    stream(): Promise<{
        data: NodeJS.ReadableStream;
        mime: string;
    }>;
    arrayBuffer(): Promise<{
        data: ArrayBuffer;
        mime: string;
    }>;
}
