text: "use strict";
  
  const dedent = require("dedent");
  const coreOptions = require("../main/core-options");
  
  const categoryOrder = [
    coreOptions.CATEGORY_OUTPUT,
    coreOptions.CATEGORY_FORMAT,
    coreOptions.CATEGORY_CONFIG,
    coreOptions.CATEGORY_EDITOR,
    coreOptions.CATEGORY_OTHER
  ];
  
  /**
   * {
   *   [optionName]: {
   *     // The type of the option. For 'choice', see also `choices` below.
   *     // When passing a type other than the ones listed below, the option is
   *     // treated as taking any string as argument, and `--option <${type}>` will
   *     // be displayed in --help.
   *     type: "boolean" | "choice" | "int" | string;
   *
   *     // Default value to be passed to the minimist option `default`.
   *     default?: any;
   *
   *     // Alias name to be passed to the minimist option `alias`.
   *     alias?: string;
   *
   *     // For grouping options by category in --help.
   *     category?: string;
   *
   *     // Description to be displayed in --help. If omitted, the option won't be
   *     // shown at all in --help (but see also `oppositeDescription` below).
   *     description?: string;
   *
   *     // Description for `--no-${name}` to be displayed in --help. If omitted,
   *     // `--no-${name}` won't be shown.
   *     oppositeDescription?: string;
   *
   *     // Indicate if this option is simply passed to the API.
   *     // true: use camelified name as the API option name.
   *     // string: use this value as the API option name.
   *     forwardToApi?: boolean | string;
   *
   *     // Indicate that a CLI flag should be an array when forwarded to the API.
   *     array?: boolean;
   *
   *     // Specify available choices for validation. They will also be displayed
   *     // in --help as <a|b|c>.
   *     // Use an object instead of a string if a choice is deprecated and should
   *     // be treated as `redirect` instead, or if you'd like to add description for
   *     // the choice.
   *     choices?: Array<
   *       | string
   *       | { value: string, description?: string, deprecated?: boolean, redirect?: string }
   *     >;
   *
   *     // If the option has a value that is an exception to the regular value
   *     // constraints, indicate that value here (or use a function for more
   *     // flexibility).
   *     exception?: ((value: any) => boolean);
   *
   *     // Indicate that the option is deprecated. Use a string to add an extra
   *     // message to --help for the option, for example to suggest a replacement
   *     // option.
   *     deprecated?: true | string;
   *   }
   * }
   *
   * Note: The options below are sorted alphabetically.
   */
  const options = {
    check: {
      type: "boolean",
      category: coreOptions.CATEGORY_OUTPUT,
      alias: "c",
      description: dedent`
        Check if the given files are formatted, print a human-friendly summary
        message and paths to unformatted files (see also --list-different).
      `
    },
    color: {
      // The supports-color package (a sub sub dependency) looks directly at
      // `process.argv` for `--no-color` and such-like options. The reason it is
      // listed here is to avoid "Ignored unknown option: --no-color" warnings.
      // See https://github.com/chalk/supports-color/#info for more information.
      type: "boolean",
      default: true,
      description: "Colorize error messages.",
      oppositeDescription: "Do not colorize error messages."
    },
    config: {
      type: "path",
      category: coreOptions.CATEGORY_CONFIG,
      description:
        "Path to a Prettier configuration file (.prettierrc, package.json, prettier.config.js).",
      oppositeDescription: "Do not look for a configuration file.",
      exception: value => value === false
    },
    "config-precedence": {
      type: "choice",
      category: coreOptions.CATEGORY_CONFIG,
      default: "cli-override",
      choices: [
        {
          value: "cli-override",
          description: "CLI options take precedence over config file"
        },
        {
          value: "file-override",
          description: "Config file take precedence over CLI options"
        },
        {
          value: "prefer-file",
          description: dedent`
            If a config file is found will evaluate it and ignore other CLI options.
            If no config file is found CLI options will evaluate as normal.
          `
        }
      ],
      description:
        "Define in which order config files and CLI options should be evaluated."
    },
    "debug-benchmark": {
      // Run the formatting benchmarks. Requires 'benchmark' module to be installed.
      type: "boolean"
    },
    "debug-check": {
      // Run the formatting once again on the formatted output, throw if different.
      type: "boolean"
    },
    "debug-print-doc": {
      type: "boolean"
    },
    "debug-repeat": {
      // Repeat the formatting a few times and measure the average duration.
      type: "int",
      default: 0
    },
    editorconfig: {
      type: "boolean",
      category: coreOptions.CATEGORY_CONFIG,
      description: "Take .editorconfig into account when parsing configuration.",
      oppositeDescription:
        "Don't take .editorconfig into account when parsing configuration.",
      default: true
    },
    "find-config-path": {
      type: "path",
      category: coreOptions.CATEGORY_CONFIG,
      description:
        "Find and print the path to a configuration file for the given input file."
    },
    "file-info": {
      type: "path",
      description: dedent`
        Extract the following info (as JSON) for a given file path. Reported fields:
        * ignored (boolean) - true if file path is filtered by --ignore-path
        * inferredParser (string | null) - name of parser inferred from file path
      `
    },
    help: {
      type: "flag",
      alias: "h",
      description: dedent`
        Show CLI usage, or details about the given flag.
        Example: --help write
      `,
      exception: value => value === ""
    },
    "ignore-path": {
      type: "path",
      category: coreOptions.CATEGORY_CONFIG,
      default: ".prettierignore",
      description: "Path to a file with patterns describing files to ignore."
    },
    "list-different": {
      type: "boolean",
      category: coreOptions.CATEGORY_OUTPUT,
      alias: "l",
      description:
        "Print the names of files that are different from Prettier's formatting (see also --check)."
    },
    loglevel: {
      type: "choice",
      description: "What level of logs to report.",
      default: "log",
      choices: ["silent", "error", "warn", "log", "debug"]
    },
    "only-changed": {
      type: "boolean",
      description: "Only format files changed since last '--write'."
    },
    stdin: {
      type: "boolean",
      description: "Force reading input from stdin."
    },
    "support-info": {
      type: "boolean",
      description: "Print support information as JSON."
    },
    version: {
      type: "boolean",
      alias: "v",
      description: "Print Prettier version."
    },
    "with-node-modules": {
      type: "boolean",
      category: coreOptions.CATEGORY_CONFIG,
      description: "Process files inside 'node_modules' directory."
    },
    write: {
      type: "boolean",
      category: coreOptions.CATEGORY_OUTPUT,
      description: "Edit files in-place. (Beware!)"
    }
  };
  
  const usageSummary = dedent`
    Usage: prettier [options] [file/glob ...]
  
    By default, output is written to stdout.
    Stdin is read if it is piped to Prettier and no files are given.
  `;
  
  module.exports = {
    categoryOrder,
    options,
    usageSummary
  };
  