/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import {Options} from 'yargs';
import {Config} from '@jest/types';

export declare const createDidYouMeanMessage: (
  unrecognized: string,
  allowedOptions: Array<string>,
) => string;

declare type DeprecatedOptionFunc = (arg: Record<string, unknown>) => string;

export declare type DeprecatedOptions = Record<string, DeprecatedOptionFunc>;

export declare const format: (value: unknown) => string;

export declare const logValidationWarning: (
  name: string,
  message: string,
  comment?: string | null,
) => void;

export declare function multipleValidOptions<T extends Array<unknown>>(
  ...args: T
): T[number];

declare type Title = {
  deprecation?: string;
  error?: string;
  warning?: string;
};

export declare const validate: (
  config: Record<string, unknown>,
  options: ValidationOptions,
) => {
  hasDeprecationWarnings: boolean;
  isValid: boolean;
};

export declare function validateCLIOptions(
  argv: Config.Argv,
  options?: Record<string, Options> & {
    deprecationEntries?: DeprecatedOptions;
  },
  rawArgv?: Array<string>,
): boolean;

export declare class ValidationError extends Error {
  name: string;
  message: string;
  constructor(name: string, message: string, comment?: string | null);
}

declare type ValidationOptions = {
  comment?: string;
  condition?: (option: unknown, validOption: unknown) => boolean;
  deprecate?: (
    config: Record<string, unknown>,
    option: string,
    deprecatedOptions: DeprecatedOptions,
    options: ValidationOptions,
  ) => boolean;
  deprecatedConfig?: DeprecatedOptions;
  error?: (
    option: string,
    received: unknown,
    defaultValue: unknown,
    options: ValidationOptions,
    path?: Array<string>,
  ) => void;
  exampleConfig: Record<string, unknown>;
  recursive?: boolean;
  recursiveDenylist?: Array<string>;
  title?: Title;
  unknown?: (
    config: Record<string, unknown>,
    exampleConfig: Record<string, unknown>,
    option: string,
    options: ValidationOptions,
    path?: Array<string>,
  ) => void;
};

export {};
