/**
 * If given to parse, this callback will be invoked per each found emoji.
 *
 * If this callback returns a falsy value instead of a valid `src` to use for the image, nothing will actually change for that specific emoji.
 *
 * @param icon the lower case HEX code point i.e. "1f4a9"
 * @param options all info for this parsing operation
 * @param variant the optional \uFE0F ("as image") variant, in case this info is anyhow meaningful. By default this is ignored.
 */
export type ParseCallback = (icon: string, options: object, variant: string) => string | false;

export type ReplacerFunction = (substring: string, ...args: any[]) => string;

export type TwemojiOptions = {
  /**
   * Default: Cloudflare
   */
  base?: string;
  /**
   * Default: .png
   */
  ext?: string;
  /**
   * Default: emoji
   */
  className?: string;
  /**
   * Default: 72x72
   */
  size?: string | number;
  /**
   * To render with SVG use `folder: svg, ext: .svg`
   */
  folder?: string;
  /**
   * The function to invoke in order to generate image src(s).
   */
  callback?: ParseCallback
  /**
   * The function to invoke in order to generate additional, custom attributes for the image tag.
   * Default () => ({})
   * @param icon the lower case HEX code point i.e. "1f4a9"
   * @param variant variant the optional \uFE0F ("as image") variant, in case this info is anyhow meaningful. By default this is ignored.
   * 
   */
  attributes?(icon: string, variant: string): object;
}

export type Twemoji = {
  base: string;
  ext: string;
  className: string;
  size: string;
  convert: {
    /**
     * Given an HEX codepoint, returns UTF16 surrogate pairs.
     *
     * @param   codepoint string  generic codepoint, i.e. '1F4A9'
     * @return  string  codepoint transformed into utf16 surrogates pair,
     *          i.e. \uD83D\uDCA9
     *
     * @example
     *  twemoji.convert.fromCodePoint('1f1e8');
     *  // "\ud83c\udde8"
     *
     *  '1f1e8-1f1f3'.split('-').map(twemoji.convert.fromCodePoint).join('')
     *  // "\ud83c\udde8\ud83c\uddf3"
     */
    fromCodePoint(hexCodePoint: string): string;

    /**
     * Given UTF16 surrogate pairs, returns the equivalent HEX codepoint.
     *
     * @param   utf16surrogatePairs   string  generic utf16 surrogates pair, i.e. \uD83D\uDCA9
     * @param   sep                 string  optional separator for double code points, default='-'
     * @return  string  utf16 transformed into codepoint, i.e. '1F4A9'
     *
     * @example
     *  twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3');
     *  // "1f1e8-1f1f3"
     *
     *  twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3', '~');
     *  // "1f1e8~1f1f3"
     */
    toCodePoint(utf16surrogatePairs: string, sep?: string): string;
  };
  parse<T extends string | HTMLElement>(node: T, options?: TwemojiOptions | ParseCallback): T;
  replace(text: string, replacer: string | ReplacerFunction): string;
  test(text: string): boolean;
  onerror(): void;
};

declare module 'twemoji' {
  const twemoji: Twemoji;
  export default twemoji;
}
