{
  "$schema": "https://json-schema.org/draft-07/schema",
  "description": "Configuration files for sql-formatter",
  "title": "SQL Formatter",
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string",
      "description": "The schema to verify this document against."
    },
    "dataTypeCase": {
      "description": "Converts data types to upper- or lowercase.",
      "$ref": "#/$defs/casing"
    },
    "denseOperators": {
      "description": "Toggles spacing around SQL operators. (Does not apply to logical operators (AND, OR, XOR))",
      "type": "boolean",
      "default": false
    },
    "expressionWidth": {
      "description": "Determines maximum length of parenthesized expressions.",
      "type": "number",
      "default": 50,
      "exclusiveMinimum": 0
    },
    "functionCase": {
      "description": "Converts function names to upper- or lowercase.",
      "$ref": "#/$defs/casing"
    },
    "identifierCase": {
      "description": "[Experimental] Converts identifiers to upper- or lowercase. Only unquoted identifiers are converted.",
      "$ref": "#/$defs/casing"
    },
    "keywordCase": {
      "description": "Converts reserved keywords to upper- or lowercase.",
      "$ref": "#/$defs/casing"
    },
    "language": {
      "description": "Specifies the SQL dialect to use.",
      "enum": [
        "sql",
        "bigquery",
        "clickhouse",
        "db2",
        "db2i",
        "duckdb",
        "hive",
        "mariadb",
        "mysql",
        "tidb",
        "n1ql",
        "plsql",
        "postgresql",
        "redshift",
        "singlestoredb",
        "snowflake",
        "spark",
        "sqlite",
        "transactsql",
        "trino"
      ]
    },
    "linesBetweenQueries": {
      "description": "Decides how many empty lines to leave between SQL statements.",
      "type": "number",
      "default": 1,
      "exclusiveMinimum": 0
    },
    "logicalOperatorNewline": {
      "description": "Decides newline placement before or after logical operators (AND, OR, XOR).",
      "enum": ["before", "after"],
      "default": "before"
    },
    "newlineBeforeSemicolon": {
      "description": "Whether to place query separator (;) on a separate line.",
      "type": "boolean",
      "default": false
    },
    "paramTypes": {
      "description": "Specifies parameter types to support when parsing SQL prepared statements.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "positional": {
          "description": "True to enable ? placeholders, false to disable them.",
          "type": "boolean"
        },
        "numbered": {
          "description": "To allow for ?1, :2 and/or $3 syntax for numbered placholders",
          "type": "array",
          "items": {
            "enum": ["?", ":", "$"]
          }
        },
        "named": {
          "description": "To allow for :name, @name and/or $name syntax for named placholders.",
          "type": "array",
          "items": {
            "enum": [":", "@", "$"]
          }
        },
        "quoted": {
          "description": "To allow for :\"name\", @\"name\" and/or $\"name\" syntax for quoted placholders.",
          "type": "array",
          "items": {
            "enum": [":", "@", "$"]
          }
        },
        "custom": {
          "description": "An option to implement custom syntax for parameter placeholders",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "regex": {
                "type": "string"
              }
            },
            "required": ["regex"]
          }
        }
      },
      "examples": [{ "positional": true, "numbered": [], "named": [":", "@"] }]
    },
    "tabWidth": {
      "description": "Specifies amount of spaces to be used for indentation.",
      "type": "integer",
      "exclusiveMinimum": 0
    },
    "useTabs": {
      "description": "Uses TAB characters for indentation. `tabWidth` will be ignored",
      "type": "boolean",
      "default": false
    }
  },
  "required": ["language"],
  "$defs": { "casing": { "enum": ["preserve", "upper", "lower"] } }
}
