declare type DataCustomIdFieldValue = string | string[];
declare type EncodableDataCustomIdFieldValue = boolean | number | number[] | null | DataCustomIdFieldValue;
export interface DataCustomIdFields {
    [key: string]: DataCustomIdFieldValue | EncodableDataCustomIdFieldValue;
}
export interface DataCustomIdEncodeOptions {
    /**
     * Saves Custom ID space by not encoding [falsy values](https://developer.mozilla.org/en-US/docs/Glossary/Falsy).
     * This means values like `0`, `false`, `""`, `[]`, etc. will be omitted from serialization.
     *
     * Defaults to `true`.
     *
     * Helps save space, but means that falsy values will not be encoded at all-- if your fields object
     * looks like `{ foo: "", bar: 0 }`, after encoding and decoding, your resulting fields
     * object will be `{}`, as both `""` and `0` are falsy.
     *
     * Both `!originalFields.foo` and `!originalFields.bar` are true, and so are `!fields.foo` and `!fields.bar`.
     * However, `typeof originalFields.foo === "string"` whereas `typeof fields.foo === "undefined"`.
     *
     * If you use helper functions like `getStringField`, `getNumberField`, etc., you can use this option safely--
     * those helper functions will return an empty value (`""` for string, `0` for number, etc.) if the field doesn't exist.
     * However, if you read raw fields, this might matter.
     *
     * @default true
     */
    skipFalsyValues?: boolean;
    /**
     * Saves space by encoding the value `true` as `1` instead of `"true"`.
     *
     * Defaults to `false`, because, sometimes, an empty value can mean something other than plain `false`.
     *
     * If you use the helper function `getBooleanField`, you can use this option safely-- it will return `true`.
     * However, if you read raw fields, this might matter.
     *
     * @default false
     */
    convertTrueToOne?: boolean;
}
export declare const defaultEncodeOptions: DataCustomIdEncodeOptions;
/**
 * DataCustomIdLengthError is thrown by `DataCustomId.toString()` when the
 * length of the resulting string is greater than Discord's maximum length of 100 characters.
 */
export declare class DataCustomIdLengthError extends Error {
    constructor(message: string);
}
/**
 * DataCustomId lets you store data inside Discord's Custom ID system.
 * This is useful for storing state within multi-interaction flows.
 *
 * Data is stored using a system similar to URL query strings appended to
 * the provided custom ID.
 *
 * It's important to note that you **can not** guarantee data integrity.
 * Custom IDs are sent by the client, and can be modified by users.
 * **DO NOT INCLUDE SENSITIVE DATA IN CUSTOM IDS!**.
 *
 * Once instances are created, the raw Custom ID (`customId.rawId`) is immutable.
 * If you want to keep the current state and change the raw ID, you can
 * create a new instance with the new raw ID, then call `newCustomId.copyFieldsFrom(oldCustomId)`.
 *
 * @author iamtheyammer
 */
export default class DataCustomId {
    /**
     * The raw Custom ID string.
     */
    readonly rawId: string;
    readonly pathParts: string[];
    private fields;
    /**
     * Creates a new DataCustomId instance with a given Custom ID which
     * may or may not contain data.
     *
     * Fields should be strings, optionally separated by `/` characters.
     * This will allow you to use `customId.pathParts`.
     *
     * If a custom ID is provided, it will be parsed,
     * allowing you to use methods like `getFields` and `addFields`.
     *
     * Custom IDs with**out** data must not have `?` or `&` characters.
     * Those characters are used to store data.
     *
     * Discord limits Custom IDs to 100 characters, but this limit is not enforced
     * until you call `toString()`.
     *
     * @param id {string} The raw custom ID with or without fields appended.
     */
    constructor(id?: string);
    /**
     * Adds a field to the custom ID.
     *
     * Keep names and values short to avoid hitting Discord's limit, which is not enforced
     * until you call `toString()`.
     *
     * @param key The key (name) of the field.
     * @param value Its value: a string, array of strings, or boolean.
     */
    addField(key: string, value: EncodableDataCustomIdFieldValue): DataCustomId;
    /**
     * Add multiple fields to the custom ID.
     * Overwrites existing fields with the same name.
     * @param fields Fields to add to the custom ID.
     * @returns The current instance for chaining.
     */
    addFields(fields: DataCustomIdFields): DataCustomId;
    /**
     * Removes a field from the custom ID.
     * @param key The key (name) of the field to remove.
     * @returns The current instance for chaining.
     */
    removeField(key: string): DataCustomId;
    /**
     * Copies all fields from another custom ID to this custom ID.
     * Useful for continuing state from one custom ID to another.
     *
     * Overwrites existing fields with the same name.
     * @param other DataCustomId instance to copy fields from.
     * @returns The current instance for chaining.
     */
    copyFieldsFrom(other: DataCustomId): DataCustomId;
    /**
     * Returns all the Custom ID's fields.
     */
    getFields(): DataCustomIdFields;
    /**
     * Returns the value of a field, coalesced to a string.
     *
     * @param key The key (name) of the field.
     * @returns A string with the value, or `""` if the field does not exist.
     */
    getStringField(key: string): string;
    /**
     * Returns the value of a field, coalesced to a string array.
     * @param key The key (name) of the field.
     * @returns An array of strings, or an empty array if the field does not exist.
     */
    getStringArrayField(key: string): string[];
    /**
     * Returns the value of a field, coalesced to a number or float.
     *
     * Floats can only have base 10.
     *
     * @param key The key (name) of the field.
     * @param float Whether the number should be parsed with `parseFloat()`. Doesn't support bases. Default false.
     * @param base The base to parse the number in. Numbers only (no floats). Default 10.
     * @returns A number or `NaN` if the field doesn't exist or isn't a number.
     */
    getNumericField(key: string, float?: boolean, base?: number): number;
    /**
     * Returns the value of a field, coalesced to a number array.
     * If the value contains non-numbers, they will be in the return value as NaN.
     * Remember to use isNaN() to check for NaN values, not `value === NaN` (that _does not_ work!).
     *
     * @param key The key (name) of the field.
     * @param float Whether the numbers should be parsed with `parseFloat()`. Doesn't support bases. Default false.
     * @param base The base to parse the number in. Numbers only (no floats). Default 10.
     * @returns A number array, or an empty array if the field does not exist.
     */
    getNumericArrayField(key: string, float?: boolean, base?: number): number[];
    /**
     * Returns the value of a field, coalesced to a boolean.
     * If the value of the field is not `true` or `1`, it will be `false`.
     *
     * @param key The key (name) of the field.
     * @returns A boolean with the value, or `false` if the field does not exist.
     */
    getBooleanField(key: string): boolean;
    /**
     * Compresses fields based on the passed-in compression options.
     * @param fields The fields to compress.
     * @param options Compression options.
     * @returns A new object with compressed fields.
     * @private
     */
    private static compressFields;
    /**
     * Returns the raw ID string with all fields encoded.
     *
     * A Custom ID `/ban` with fields `{ "reason": "spam"}` should return `/ban?reason=spam`.
     * `true` and falsy values may or may not be encoded depending on selected options.
     *
     * @throws {DataCustomIdLengthError} if the serialized string is over Discord's 100-character limit.
     * @returns The Custom ID value with all fields encoded. Use this as the value for the Custom ID field in a Discord API request.
     */
    toString(compressionOptions?: DataCustomIdEncodeOptions): string;
}
export {};
