{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Oxfmtrc",
  "description": "Configuration options for Oxfmt.\n\nMost options are the same as Prettier's options, but not all of them.\nIn addition, some options are our own extensions.",
  "type": "object",
  "properties": {
    "arrowParens": {
      "description": "Include parentheses around a sole arrow function parameter.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"always\"`",
      "allOf": [
        {
          "$ref": "#/definitions/ArrowParensConfig"
        }
      ],
      "markdownDescription": "Include parentheses around a sole arrow function parameter.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"always\"`"
    },
    "associations": {
      "description": "Format matched files as the given language, instead of detecting it from the file name.\ne.g. Angular templates named `*.html`, or `*.wxml` files formatted as HTML.\nWhen a file matches multiple associations, the later one takes precedence (array order matters).\n\n- Default: `[]`",
      "type": "array",
      "items": {
        "$ref": "#/definitions/OxfmtAssociationConfig"
      },
      "markdownDescription": "Format matched files as the given language, instead of detecting it from the file name.\ne.g. Angular templates named `*.html`, or `*.wxml` files formatted as HTML.\nWhen a file matches multiple associations, the later one takes precedence (array order matters).\n\n- Default: `[]`"
    },
    "astro": {
      "description": "Options for `prettier-plugin-astro`.\n\nPass `true` or an object to enable `.astro` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-astro` requires the `@astrojs/compiler-rs` package at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Astro\n- Default: Disabled",
      "allOf": [
        {
          "$ref": "#/definitions/AstroUserConfig"
        }
      ],
      "markdownDescription": "Options for `prettier-plugin-astro`.\n\nPass `true` or an object to enable `.astro` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-astro` requires the `@astrojs/compiler-rs` package at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Astro\n- Default: Disabled"
    },
    "bracketSameLine": {
      "description": "Put the `>` of a multi-line element at the end of the last line,\ninstead of being alone on the next line (does not apply to self-closing elements).\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`",
      "type": "boolean",
      "markdownDescription": "Put the `>` of a multi-line element at the end of the last line,\ninstead of being alone on the next line (does not apply to self-closing elements).\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`"
    },
    "bracketSpacing": {
      "description": "Print spaces between brackets in object literals.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5, GraphQL, YAML\n- Default: `true`",
      "type": "boolean",
      "markdownDescription": "Print spaces between brackets in object literals.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5, GraphQL, YAML\n- Default: `true`"
    },
    "embeddedLanguageFormatting": {
      "description": "Control whether to format embedded parts in the file.\nFor example:\n- CSS-in-JS: template literal\n- JS-in-Vue: `<script>` block\n- JS-in-Markdown: code fence\n- YAML-in-CSS/Markdown: front matter\n\nWith `\"off\"`, these parts are kept as-is.\n\nNOTE: Some languages behave differently.\nFor Svelte, formatting fails with `\"off\"`, a limitation of `prettier-plugin-svelte`.\nFor Astro, the frontmatter is still formatted, but by Prettier instead of Oxfmt (use `astro.skipFrontmatter` to keep it as-is).\n\n- Languages: JS, JSX, TS, TSX, CSS, SCSS, Less, HTML, Vue, Angular, Svelte, Astro, Markdown, MDX\n- Default: `\"auto\"`",
      "allOf": [
        {
          "$ref": "#/definitions/EmbeddedLanguageFormattingConfig"
        }
      ],
      "markdownDescription": "Control whether to format embedded parts in the file.\nFor example:\n- CSS-in-JS: template literal\n- JS-in-Vue: `<script>` block\n- JS-in-Markdown: code fence\n- YAML-in-CSS/Markdown: front matter\n\nWith `\"off\"`, these parts are kept as-is.\n\nNOTE: Some languages behave differently.\nFor Svelte, formatting fails with `\"off\"`, a limitation of `prettier-plugin-svelte`.\nFor Astro, the frontmatter is still formatted, but by Prettier instead of Oxfmt (use `astro.skipFrontmatter` to keep it as-is).\n\n- Languages: JS, JSX, TS, TSX, CSS, SCSS, Less, HTML, Vue, Angular, Svelte, Astro, Markdown, MDX\n- Default: `\"auto\"`"
    },
    "endOfLine": {
      "description": "Which end of line characters to apply.\n\nNOTE: `\"auto\"` is not supported.\n\n- Languages: All\n- Default: `\"lf\"`\n- Overrides `.editorconfig.end_of_line`",
      "allOf": [
        {
          "$ref": "#/definitions/EndOfLineConfig"
        }
      ],
      "markdownDescription": "Which end of line characters to apply.\n\nNOTE: `\"auto\"` is not supported.\n\n- Languages: All\n- Default: `\"lf\"`\n- Overrides `.editorconfig.end_of_line`"
    },
    "experimentalOperatorPosition": {
      "description": "When expressions wrap lines, print operators at the start of new lines (`\"start\"`)\nor at the end of previous lines (`\"end\"`).\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"end\"`",
      "allOf": [
        {
          "$ref": "#/definitions/OperatorPositionConfig"
        }
      ],
      "markdownDescription": "When expressions wrap lines, print operators at the start of new lines (`\"start\"`)\nor at the end of previous lines (`\"end\"`).\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"end\"`"
    },
    "htmlWhitespaceSensitivity": {
      "description": "Specify the global whitespace sensitivity.\n\n- Languages: HTML, Angular, Vue, Handlebars, Svelte\n- Default: `\"css\"`",
      "allOf": [
        {
          "$ref": "#/definitions/HtmlWhitespaceSensitivityConfig"
        }
      ],
      "markdownDescription": "Specify the global whitespace sensitivity.\n\n- Languages: HTML, Angular, Vue, Handlebars, Svelte\n- Default: `\"css\"`"
    },
    "ignorePatterns": {
      "description": "Ignore files matching these glob patterns.\nPatterns use gitignore-style matching, rooted at the directory containing the configuration file.\nFiles outside that directory cannot be matched; patterns containing `..` are rejected as a configuration error.\n\n- Default: `[]`",
      "type": "array",
      "items": {
        "type": "string"
      },
      "markdownDescription": "Ignore files matching these glob patterns.\nPatterns use gitignore-style matching, rooted at the directory containing the configuration file.\nFiles outside that directory cannot be matched; patterns containing `..` are rejected as a configuration error.\n\n- Default: `[]`"
    },
    "insertFinalNewline": {
      "description": "Whether to insert a final newline at the end of the file.\n\n- Languages: All\n- Default: `true`\n- Overrides `.editorconfig.insert_final_newline`",
      "type": "boolean",
      "markdownDescription": "Whether to insert a final newline at the end of the file.\n\n- Languages: All\n- Default: `true`\n- Overrides `.editorconfig.insert_final_newline`"
    },
    "jsdoc": {
      "description": "Enable JSDoc comment formatting.\n\nNormalizes JSDoc comments: tag aliases are canonicalized, descriptions are capitalized,\nlong lines are wrapped, and short comments are collapsed to single-line.\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled",
      "allOf": [
        {
          "$ref": "#/definitions/JsdocUserConfig"
        }
      ],
      "markdownDescription": "Enable JSDoc comment formatting.\n\nNormalizes JSDoc comments: tag aliases are canonicalized, descriptions are capitalized,\nlong lines are wrapped, and short comments are collapsed to single-line.\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled"
    },
    "jsxSingleQuote": {
      "description": "Use single quotes instead of double quotes in JSX.\n\n- Languages: JSX, TSX\n- Default: `false`",
      "type": "boolean",
      "markdownDescription": "Use single quotes instead of double quotes in JSX.\n\n- Languages: JSX, TSX\n- Default: `false`"
    },
    "objectWrap": {
      "description": "How to wrap object literals when they could fit on one line or span multiple lines.\n\nBy default, formats objects as multi-line if there is a newline prior to the first property.\nAuthors can use this heuristic to contextually improve readability, though it has some downsides.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5\n- Default: `\"preserve\"`",
      "allOf": [
        {
          "$ref": "#/definitions/ObjectWrapConfig"
        }
      ],
      "markdownDescription": "How to wrap object literals when they could fit on one line or span multiple lines.\n\nBy default, formats objects as multi-line if there is a newline prior to the first property.\nAuthors can use this heuristic to contextually improve readability, though it has some downsides.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5\n- Default: `\"preserve\"`"
    },
    "overrides": {
      "description": "File-specific overrides.\nWhen a file matches multiple overrides, the later override takes precedence (array order matters).\n\n- Default: `[]`",
      "type": "array",
      "items": {
        "$ref": "#/definitions/OxfmtOverrideConfig"
      },
      "markdownDescription": "File-specific overrides.\nWhen a file matches multiple overrides, the later override takes precedence (array order matters).\n\n- Default: `[]`"
    },
    "printWidth": {
      "description": "Specify the line length that the printer will wrap on.\n\nIf you don't want line wrapping when formatting Markdown, you can set the `proseWrap` option to disable it.\n\n- Languages: All\n- Default: `100`\n- Overrides `.editorconfig.max_line_length`",
      "type": "integer",
      "format": "uint16",
      "minimum": 0.0,
      "markdownDescription": "Specify the line length that the printer will wrap on.\n\nIf you don't want line wrapping when formatting Markdown, you can set the `proseWrap` option to disable it.\n\n- Languages: All\n- Default: `100`\n- Overrides `.editorconfig.max_line_length`"
    },
    "proseWrap": {
      "description": "How to wrap prose.\n\n- `\"always\"`: Wrap prose to the print width\n- `\"never\"`: Put each prose block on a single line, relying on editor/viewer soft wrapping\n- `\"preserve\"`: Keep wrapping as-is\n\nBy default, wrapping is preserved, since some services use a linebreak-sensitive renderer (e.g. GitHub comments, BitBucket).\n\n- Languages: Markdown, MDX, YAML\n- Default: `\"preserve\"`",
      "allOf": [
        {
          "$ref": "#/definitions/ProseWrapConfig"
        }
      ],
      "markdownDescription": "How to wrap prose.\n\n- `\"always\"`: Wrap prose to the print width\n- `\"never\"`: Put each prose block on a single line, relying on editor/viewer soft wrapping\n- `\"preserve\"`: Keep wrapping as-is\n\nBy default, wrapping is preserved, since some services use a linebreak-sensitive renderer (e.g. GitHub comments, BitBucket).\n\n- Languages: Markdown, MDX, YAML\n- Default: `\"preserve\"`"
    },
    "quoteProps": {
      "description": "Change when properties in objects are quoted.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"as-needed\"`",
      "allOf": [
        {
          "$ref": "#/definitions/QuotePropsConfig"
        }
      ],
      "markdownDescription": "Change when properties in objects are quoted.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"as-needed\"`"
    },
    "semi": {
      "description": "Print semicolons at the ends of statements.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `true`",
      "type": "boolean",
      "markdownDescription": "Print semicolons at the ends of statements.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `true`"
    },
    "singleAttributePerLine": {
      "description": "Enforce single attribute per line.\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`",
      "type": "boolean",
      "markdownDescription": "Enforce single attribute per line.\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`"
    },
    "singleQuote": {
      "description": "Use single quotes instead of double quotes.\n\nFor JSX, you can set the `jsxSingleQuote` option.\n\n- Languages: JS, JSX, TS, TSX, CSS, Less, SCSS, Markdown, MDX, YAML, Handlebars, Svelte, Astro\n- Default: `false`\n- Overrides `.editorconfig.quote_type`",
      "type": "boolean",
      "markdownDescription": "Use single quotes instead of double quotes.\n\nFor JSX, you can set the `jsxSingleQuote` option.\n\n- Languages: JS, JSX, TS, TSX, CSS, Less, SCSS, Markdown, MDX, YAML, Handlebars, Svelte, Astro\n- Default: `false`\n- Overrides `.editorconfig.quote_type`"
    },
    "sortImports": {
      "description": "Sort import statements.\n\nUses a similar algorithm to [eslint-plugin-perfectionist/sort-imports](https://perfectionist.dev/rules/sort-imports).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled",
      "allOf": [
        {
          "$ref": "#/definitions/SortImportsUserConfig"
        }
      ],
      "markdownDescription": "Sort import statements.\n\nUses a similar algorithm to [eslint-plugin-perfectionist/sort-imports](https://perfectionist.dev/rules/sort-imports).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled"
    },
    "sortPackageJson": {
      "description": "Sort `package.json` keys.\n\nThe order is NOT compatible with [prettier-plugin-packagejson](https://github.com/matzkoh/prettier-plugin-packagejson),\nbut we believe it is clearer and easier to navigate.\n\n- Languages: JSON (`package.json` only)\n- Default: `true`",
      "allOf": [
        {
          "$ref": "#/definitions/SortPackageJsonUserConfig"
        }
      ],
      "markdownDescription": "Sort `package.json` keys.\n\nThe order is NOT compatible with [prettier-plugin-packagejson](https://github.com/matzkoh/prettier-plugin-packagejson),\nbut we believe it is clearer and easier to navigate.\n\n- Languages: JSON (`package.json` only)\n- Default: `true`"
    },
    "sortTailwindcss": {
      "description": "Sort Tailwind CSS classes.\n\nUses the same algorithm as [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).\nOption names omit the `tailwind` prefix used in the original plugin (e.g. `config` instead of `tailwindConfig`).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX, HTML, Vue, Angular, Handlebars, CSS, SCSS, Less, Svelte, Astro\n- Default: Disabled",
      "allOf": [
        {
          "$ref": "#/definitions/SortTailwindcssUserConfig"
        }
      ],
      "markdownDescription": "Sort Tailwind CSS classes.\n\nUses the same algorithm as [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).\nOption names omit the `tailwind` prefix used in the original plugin (e.g. `config` instead of `tailwindConfig`).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX, HTML, Vue, Angular, Handlebars, CSS, SCSS, Less, Svelte, Astro\n- Default: Disabled"
    },
    "svelte": {
      "description": "Options for `prettier-plugin-svelte`.\n\nPass `true` or an object to enable `.svelte` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-svelte` requires the `svelte` package (`svelte/compiler`) at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Svelte\n- Default: Disabled",
      "allOf": [
        {
          "$ref": "#/definitions/SvelteUserConfig"
        }
      ],
      "markdownDescription": "Options for `prettier-plugin-svelte`.\n\nPass `true` or an object to enable `.svelte` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-svelte` requires the `svelte` package (`svelte/compiler`) at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Svelte\n- Default: Disabled"
    },
    "tabWidth": {
      "description": "Specify the number of spaces per indentation-level.\n\n- Languages: All\n- Default: `2`\n- Overrides `.editorconfig.indent_size` (falls back to `.editorconfig.tab_width`)",
      "type": "integer",
      "format": "uint8",
      "minimum": 0.0,
      "markdownDescription": "Specify the number of spaces per indentation-level.\n\n- Languages: All\n- Default: `2`\n- Overrides `.editorconfig.indent_size` (falls back to `.editorconfig.tab_width`)"
    },
    "trailingComma": {
      "description": "Print trailing commas wherever possible in multi-line comma-separated syntactic structures.\n\nA single-line array, for example, never gets trailing commas.\n\n- Languages: JS, JSX, TS, TSX, JSONC, JSON5, TOML, CSS, Less, SCSS, YAML\n- Default: `\"all\"`",
      "allOf": [
        {
          "$ref": "#/definitions/TrailingCommaConfig"
        }
      ],
      "markdownDescription": "Print trailing commas wherever possible in multi-line comma-separated syntactic structures.\n\nA single-line array, for example, never gets trailing commas.\n\n- Languages: JS, JSX, TS, TSX, JSONC, JSON5, TOML, CSS, Less, SCSS, YAML\n- Default: `\"all\"`"
    },
    "useTabs": {
      "description": "Indent lines with tabs instead of spaces.\n\n- Languages: All\n- Default: `false`\n- Overrides `.editorconfig.indent_style`",
      "type": "boolean",
      "markdownDescription": "Indent lines with tabs instead of spaces.\n\n- Languages: All\n- Default: `false`\n- Overrides `.editorconfig.indent_style`"
    },
    "vueIndentScriptAndStyle": {
      "description": "Whether or not to indent the code inside `<script>` and `<style>` tags in Vue files.\n\n- Languages: Vue\n- Default: `false`",
      "type": "boolean",
      "markdownDescription": "Whether or not to indent the code inside `<script>` and `<style>` tags in Vue files.\n\n- Languages: Vue\n- Default: `false`"
    }
  },
  "allowComments": true,
  "allowTrailingCommas": true,
  "definitions": {
    "ArrowParensConfig": {
      "type": "string",
      "enum": [
        "always",
        "avoid"
      ]
    },
    "AstroCompressHtmlConfig": {
      "oneOf": [
        {
          "description": "Whitespace runs containing a newline are dropped; same-line spaces are content.",
          "type": "string",
          "enum": [
            "jsx"
          ],
          "markdownDescription": "Whitespace runs containing a newline are dropped; same-line spaces are content."
        },
        {
          "description": "Browser HTML whitespace rules.",
          "type": "string",
          "enum": [
            "html"
          ],
          "markdownDescription": "Browser HTML whitespace rules."
        },
        {
          "description": "No collapsing.",
          "type": "string",
          "enum": [
            "none"
          ],
          "markdownDescription": "No collapsing."
        }
      ]
    },
    "AstroConfig": {
      "type": "object",
      "properties": {
        "allowShorthand": {
          "description": "Whether to normalize matching identifier attributes to shorthand or explicit form.\nWhen unset, the form that was written stays as-is.\n\n- Default: Unset",
          "type": "boolean",
          "markdownDescription": "Whether to normalize matching identifier attributes to shorthand or explicit form.\nWhen unset, the form that was written stays as-is.\n\n- Default: Unset"
        },
        "compressHTML": {
          "description": "Mirror of Astro's `compressHTML` config.\nTells the formatter which whitespace the compiler will collapse.\n\n- Default: `\"jsx\"`",
          "allOf": [
            {
              "$ref": "#/definitions/AstroCompressHtmlConfig"
            }
          ],
          "markdownDescription": "Mirror of Astro's `compressHTML` config.\nTells the formatter which whitespace the compiler will collapse.\n\n- Default: `\"jsx\"`"
        },
        "skipFrontmatter": {
          "description": "Whether to skip formatting the frontmatter.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Whether to skip formatting the frontmatter.\n\n- Default: `false`"
        }
      }
    },
    "AstroUserConfig": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/AstroConfig"
        }
      ]
    },
    "CommentLineStrategyConfig": {
      "type": "string",
      "enum": [
        "singleLine",
        "multiline",
        "keep"
      ]
    },
    "CustomGroupItemConfig": {
      "type": "object",
      "properties": {
        "elementNamePattern": {
          "description": "List of glob patterns to match import sources for this group.",
          "default": [],
          "type": "array",
          "items": {
            "type": "string"
          },
          "markdownDescription": "List of glob patterns to match import sources for this group."
        },
        "groupName": {
          "description": "Name of the custom group, used in the `groups` option.",
          "default": "",
          "type": "string",
          "markdownDescription": "Name of the custom group, used in the `groups` option."
        },
        "modifiers": {
          "description": "Modifiers to match the import characteristics.\nAll specified modifiers must match.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/ImportModifierConfig"
          },
          "markdownDescription": "Modifiers to match the import characteristics.\nAll specified modifiers must match."
        },
        "selector": {
          "description": "Selector to match the import kind.",
          "allOf": [
            {
              "$ref": "#/definitions/ImportSelectorConfig"
            }
          ],
          "markdownDescription": "Selector to match the import kind."
        }
      }
    },
    "EmbeddedLanguageFormattingConfig": {
      "type": "string",
      "enum": [
        "auto",
        "off"
      ]
    },
    "EndOfLineConfig": {
      "type": "string",
      "enum": [
        "lf",
        "crlf",
        "cr"
      ]
    },
    "FormatConfig": {
      "type": "object",
      "properties": {
        "arrowParens": {
          "description": "Include parentheses around a sole arrow function parameter.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"always\"`",
          "allOf": [
            {
              "$ref": "#/definitions/ArrowParensConfig"
            }
          ],
          "markdownDescription": "Include parentheses around a sole arrow function parameter.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"always\"`"
        },
        "astro": {
          "description": "Options for `prettier-plugin-astro`.\n\nPass `true` or an object to enable `.astro` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-astro` requires the `@astrojs/compiler-rs` package at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Astro\n- Default: Disabled",
          "allOf": [
            {
              "$ref": "#/definitions/AstroUserConfig"
            }
          ],
          "markdownDescription": "Options for `prettier-plugin-astro`.\n\nPass `true` or an object to enable `.astro` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-astro` requires the `@astrojs/compiler-rs` package at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Astro\n- Default: Disabled"
        },
        "bracketSameLine": {
          "description": "Put the `>` of a multi-line element at the end of the last line,\ninstead of being alone on the next line (does not apply to self-closing elements).\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Put the `>` of a multi-line element at the end of the last line,\ninstead of being alone on the next line (does not apply to self-closing elements).\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`"
        },
        "bracketSpacing": {
          "description": "Print spaces between brackets in object literals.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5, GraphQL, YAML\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Print spaces between brackets in object literals.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5, GraphQL, YAML\n- Default: `true`"
        },
        "embeddedLanguageFormatting": {
          "description": "Control whether to format embedded parts in the file.\nFor example:\n- CSS-in-JS: template literal\n- JS-in-Vue: `<script>` block\n- JS-in-Markdown: code fence\n- YAML-in-CSS/Markdown: front matter\n\nWith `\"off\"`, these parts are kept as-is.\n\nNOTE: Some languages behave differently.\nFor Svelte, formatting fails with `\"off\"`, a limitation of `prettier-plugin-svelte`.\nFor Astro, the frontmatter is still formatted, but by Prettier instead of Oxfmt (use `astro.skipFrontmatter` to keep it as-is).\n\n- Languages: JS, JSX, TS, TSX, CSS, SCSS, Less, HTML, Vue, Angular, Svelte, Astro, Markdown, MDX\n- Default: `\"auto\"`",
          "allOf": [
            {
              "$ref": "#/definitions/EmbeddedLanguageFormattingConfig"
            }
          ],
          "markdownDescription": "Control whether to format embedded parts in the file.\nFor example:\n- CSS-in-JS: template literal\n- JS-in-Vue: `<script>` block\n- JS-in-Markdown: code fence\n- YAML-in-CSS/Markdown: front matter\n\nWith `\"off\"`, these parts are kept as-is.\n\nNOTE: Some languages behave differently.\nFor Svelte, formatting fails with `\"off\"`, a limitation of `prettier-plugin-svelte`.\nFor Astro, the frontmatter is still formatted, but by Prettier instead of Oxfmt (use `astro.skipFrontmatter` to keep it as-is).\n\n- Languages: JS, JSX, TS, TSX, CSS, SCSS, Less, HTML, Vue, Angular, Svelte, Astro, Markdown, MDX\n- Default: `\"auto\"`"
        },
        "endOfLine": {
          "description": "Which end of line characters to apply.\n\nNOTE: `\"auto\"` is not supported.\n\n- Languages: All\n- Default: `\"lf\"`\n- Overrides `.editorconfig.end_of_line`",
          "allOf": [
            {
              "$ref": "#/definitions/EndOfLineConfig"
            }
          ],
          "markdownDescription": "Which end of line characters to apply.\n\nNOTE: `\"auto\"` is not supported.\n\n- Languages: All\n- Default: `\"lf\"`\n- Overrides `.editorconfig.end_of_line`"
        },
        "experimentalOperatorPosition": {
          "description": "When expressions wrap lines, print operators at the start of new lines (`\"start\"`)\nor at the end of previous lines (`\"end\"`).\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"end\"`",
          "allOf": [
            {
              "$ref": "#/definitions/OperatorPositionConfig"
            }
          ],
          "markdownDescription": "When expressions wrap lines, print operators at the start of new lines (`\"start\"`)\nor at the end of previous lines (`\"end\"`).\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"end\"`"
        },
        "htmlWhitespaceSensitivity": {
          "description": "Specify the global whitespace sensitivity.\n\n- Languages: HTML, Angular, Vue, Handlebars, Svelte\n- Default: `\"css\"`",
          "allOf": [
            {
              "$ref": "#/definitions/HtmlWhitespaceSensitivityConfig"
            }
          ],
          "markdownDescription": "Specify the global whitespace sensitivity.\n\n- Languages: HTML, Angular, Vue, Handlebars, Svelte\n- Default: `\"css\"`"
        },
        "insertFinalNewline": {
          "description": "Whether to insert a final newline at the end of the file.\n\n- Languages: All\n- Default: `true`\n- Overrides `.editorconfig.insert_final_newline`",
          "type": "boolean",
          "markdownDescription": "Whether to insert a final newline at the end of the file.\n\n- Languages: All\n- Default: `true`\n- Overrides `.editorconfig.insert_final_newline`"
        },
        "jsdoc": {
          "description": "Enable JSDoc comment formatting.\n\nNormalizes JSDoc comments: tag aliases are canonicalized, descriptions are capitalized,\nlong lines are wrapped, and short comments are collapsed to single-line.\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled",
          "allOf": [
            {
              "$ref": "#/definitions/JsdocUserConfig"
            }
          ],
          "markdownDescription": "Enable JSDoc comment formatting.\n\nNormalizes JSDoc comments: tag aliases are canonicalized, descriptions are capitalized,\nlong lines are wrapped, and short comments are collapsed to single-line.\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled"
        },
        "jsxSingleQuote": {
          "description": "Use single quotes instead of double quotes in JSX.\n\n- Languages: JSX, TSX\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Use single quotes instead of double quotes in JSX.\n\n- Languages: JSX, TSX\n- Default: `false`"
        },
        "objectWrap": {
          "description": "How to wrap object literals when they could fit on one line or span multiple lines.\n\nBy default, formats objects as multi-line if there is a newline prior to the first property.\nAuthors can use this heuristic to contextually improve readability, though it has some downsides.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5\n- Default: `\"preserve\"`",
          "allOf": [
            {
              "$ref": "#/definitions/ObjectWrapConfig"
            }
          ],
          "markdownDescription": "How to wrap object literals when they could fit on one line or span multiple lines.\n\nBy default, formats objects as multi-line if there is a newline prior to the first property.\nAuthors can use this heuristic to contextually improve readability, though it has some downsides.\n\n- Languages: JS, JSX, TS, TSX, JSON, JSONC, JSON5\n- Default: `\"preserve\"`"
        },
        "printWidth": {
          "description": "Specify the line length that the printer will wrap on.\n\nIf you don't want line wrapping when formatting Markdown, you can set the `proseWrap` option to disable it.\n\n- Languages: All\n- Default: `100`\n- Overrides `.editorconfig.max_line_length`",
          "type": "integer",
          "format": "uint16",
          "minimum": 0.0,
          "markdownDescription": "Specify the line length that the printer will wrap on.\n\nIf you don't want line wrapping when formatting Markdown, you can set the `proseWrap` option to disable it.\n\n- Languages: All\n- Default: `100`\n- Overrides `.editorconfig.max_line_length`"
        },
        "proseWrap": {
          "description": "How to wrap prose.\n\n- `\"always\"`: Wrap prose to the print width\n- `\"never\"`: Put each prose block on a single line, relying on editor/viewer soft wrapping\n- `\"preserve\"`: Keep wrapping as-is\n\nBy default, wrapping is preserved, since some services use a linebreak-sensitive renderer (e.g. GitHub comments, BitBucket).\n\n- Languages: Markdown, MDX, YAML\n- Default: `\"preserve\"`",
          "allOf": [
            {
              "$ref": "#/definitions/ProseWrapConfig"
            }
          ],
          "markdownDescription": "How to wrap prose.\n\n- `\"always\"`: Wrap prose to the print width\n- `\"never\"`: Put each prose block on a single line, relying on editor/viewer soft wrapping\n- `\"preserve\"`: Keep wrapping as-is\n\nBy default, wrapping is preserved, since some services use a linebreak-sensitive renderer (e.g. GitHub comments, BitBucket).\n\n- Languages: Markdown, MDX, YAML\n- Default: `\"preserve\"`"
        },
        "quoteProps": {
          "description": "Change when properties in objects are quoted.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"as-needed\"`",
          "allOf": [
            {
              "$ref": "#/definitions/QuotePropsConfig"
            }
          ],
          "markdownDescription": "Change when properties in objects are quoted.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `\"as-needed\"`"
        },
        "semi": {
          "description": "Print semicolons at the ends of statements.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Print semicolons at the ends of statements.\n\n- Languages: JS, JSX, TS, TSX\n- Default: `true`"
        },
        "singleAttributePerLine": {
          "description": "Enforce single attribute per line.\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Enforce single attribute per line.\n\n- Languages: JSX, TSX, HTML, Angular, Vue, MJML, Svelte, Astro\n- Default: `false`"
        },
        "singleQuote": {
          "description": "Use single quotes instead of double quotes.\n\nFor JSX, you can set the `jsxSingleQuote` option.\n\n- Languages: JS, JSX, TS, TSX, CSS, Less, SCSS, Markdown, MDX, YAML, Handlebars, Svelte, Astro\n- Default: `false`\n- Overrides `.editorconfig.quote_type`",
          "type": "boolean",
          "markdownDescription": "Use single quotes instead of double quotes.\n\nFor JSX, you can set the `jsxSingleQuote` option.\n\n- Languages: JS, JSX, TS, TSX, CSS, Less, SCSS, Markdown, MDX, YAML, Handlebars, Svelte, Astro\n- Default: `false`\n- Overrides `.editorconfig.quote_type`"
        },
        "sortImports": {
          "description": "Sort import statements.\n\nUses a similar algorithm to [eslint-plugin-perfectionist/sort-imports](https://perfectionist.dev/rules/sort-imports).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled",
          "allOf": [
            {
              "$ref": "#/definitions/SortImportsUserConfig"
            }
          ],
          "markdownDescription": "Sort import statements.\n\nUses a similar algorithm to [eslint-plugin-perfectionist/sort-imports](https://perfectionist.dev/rules/sort-imports).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX\n- Default: Disabled"
        },
        "sortPackageJson": {
          "description": "Sort `package.json` keys.\n\nThe order is NOT compatible with [prettier-plugin-packagejson](https://github.com/matzkoh/prettier-plugin-packagejson),\nbut we believe it is clearer and easier to navigate.\n\n- Languages: JSON (`package.json` only)\n- Default: `true`",
          "allOf": [
            {
              "$ref": "#/definitions/SortPackageJsonUserConfig"
            }
          ],
          "markdownDescription": "Sort `package.json` keys.\n\nThe order is NOT compatible with [prettier-plugin-packagejson](https://github.com/matzkoh/prettier-plugin-packagejson),\nbut we believe it is clearer and easier to navigate.\n\n- Languages: JSON (`package.json` only)\n- Default: `true`"
        },
        "sortTailwindcss": {
          "description": "Sort Tailwind CSS classes.\n\nUses the same algorithm as [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).\nOption names omit the `tailwind` prefix used in the original plugin (e.g. `config` instead of `tailwindConfig`).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX, HTML, Vue, Angular, Handlebars, CSS, SCSS, Less, Svelte, Astro\n- Default: Disabled",
          "allOf": [
            {
              "$ref": "#/definitions/SortTailwindcssUserConfig"
            }
          ],
          "markdownDescription": "Sort Tailwind CSS classes.\n\nUses the same algorithm as [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).\nOption names omit the `tailwind` prefix used in the original plugin (e.g. `config` instead of `tailwindConfig`).\n\nPass `true` or an object to enable, `false` to disable.\n\n- Languages: JS, JSX, TS, TSX, HTML, Vue, Angular, Handlebars, CSS, SCSS, Less, Svelte, Astro\n- Default: Disabled"
        },
        "svelte": {
          "description": "Options for `prettier-plugin-svelte`.\n\nPass `true` or an object to enable `.svelte` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-svelte` requires the `svelte` package (`svelte/compiler`) at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Svelte\n- Default: Disabled",
          "allOf": [
            {
              "$ref": "#/definitions/SvelteUserConfig"
            }
          ],
          "markdownDescription": "Options for `prettier-plugin-svelte`.\n\nPass `true` or an object to enable `.svelte` file formatting, `false` to disable (handy in overrides).\nSetting `true` resets to defaults, dropping options inherited from a parent scope.\n\nNOTE: `prettier-plugin-svelte` requires the `svelte` package (`svelte/compiler`) at runtime.\nOxfmt does NOT bundle it, so install it in your project, otherwise formatting fails.\n\n- Languages: Svelte\n- Default: Disabled"
        },
        "tabWidth": {
          "description": "Specify the number of spaces per indentation-level.\n\n- Languages: All\n- Default: `2`\n- Overrides `.editorconfig.indent_size` (falls back to `.editorconfig.tab_width`)",
          "type": "integer",
          "format": "uint8",
          "minimum": 0.0,
          "markdownDescription": "Specify the number of spaces per indentation-level.\n\n- Languages: All\n- Default: `2`\n- Overrides `.editorconfig.indent_size` (falls back to `.editorconfig.tab_width`)"
        },
        "trailingComma": {
          "description": "Print trailing commas wherever possible in multi-line comma-separated syntactic structures.\n\nA single-line array, for example, never gets trailing commas.\n\n- Languages: JS, JSX, TS, TSX, JSONC, JSON5, TOML, CSS, Less, SCSS, YAML\n- Default: `\"all\"`",
          "allOf": [
            {
              "$ref": "#/definitions/TrailingCommaConfig"
            }
          ],
          "markdownDescription": "Print trailing commas wherever possible in multi-line comma-separated syntactic structures.\n\nA single-line array, for example, never gets trailing commas.\n\n- Languages: JS, JSX, TS, TSX, JSONC, JSON5, TOML, CSS, Less, SCSS, YAML\n- Default: `\"all\"`"
        },
        "useTabs": {
          "description": "Indent lines with tabs instead of spaces.\n\n- Languages: All\n- Default: `false`\n- Overrides `.editorconfig.indent_style`",
          "type": "boolean",
          "markdownDescription": "Indent lines with tabs instead of spaces.\n\n- Languages: All\n- Default: `false`\n- Overrides `.editorconfig.indent_style`"
        },
        "vueIndentScriptAndStyle": {
          "description": "Whether or not to indent the code inside `<script>` and `<style>` tags in Vue files.\n\n- Languages: Vue\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Whether or not to indent the code inside `<script>` and `<style>` tags in Vue files.\n\n- Languages: Vue\n- Default: `false`"
        }
      }
    },
    "GlobSet": {
      "description": "A set of glob patterns.\nPatterns are matched against paths relative to the configuration file's directory.",
      "type": "array",
      "items": {
        "type": "string"
      },
      "markdownDescription": "A set of glob patterns.\nPatterns are matched against paths relative to the configuration file's directory."
    },
    "HtmlWhitespaceSensitivityConfig": {
      "type": "string",
      "enum": [
        "css",
        "strict",
        "ignore"
      ]
    },
    "ImportModifierConfig": {
      "description": "Modifier matching the import characteristics in `customGroups` (see `sortImports.groups` for semantics).",
      "type": "string",
      "enum": [
        "side_effect",
        "type",
        "value",
        "default",
        "wildcard",
        "named"
      ],
      "markdownDescription": "Modifier matching the import characteristics in `customGroups` (see `sortImports.groups` for semantics)."
    },
    "ImportSelectorConfig": {
      "description": "Selector matching the import kind in `customGroups` (see `sortImports.groups` for semantics).",
      "type": "string",
      "enum": [
        "type",
        "side_effect_style",
        "side_effect",
        "style",
        "index",
        "sibling",
        "parent",
        "subpath",
        "internal",
        "builtin",
        "external",
        "import"
      ],
      "markdownDescription": "Selector matching the import kind in `customGroups` (see `sortImports.groups` for semantics)."
    },
    "JsdocConfig": {
      "type": "object",
      "properties": {
        "addDefaultToDescription": {
          "description": "Append default values to `@param` descriptions (e.g. \"Default is `value`\").\n\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Append default values to `@param` descriptions (e.g. \"Default is `value`\").\n\n- Default: `true`"
        },
        "bracketSpacing": {
          "description": "Add spaces inside JSDoc type braces: `{string}` → `{ string }`.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Add spaces inside JSDoc type braces: `{string}` → `{ string }`.\n\n- Default: `false`"
        },
        "capitalizeDescriptions": {
          "description": "Capitalize the first letter of tag descriptions.\n\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Capitalize the first letter of tag descriptions.\n\n- Default: `true`"
        },
        "commentLineStrategy": {
          "description": "How to format comment blocks.\n\n- `\"singleLine\"`: Convert to single-line `/** content */` when possible\n- `\"multiline\"`: Always use multi-line format\n- `\"keep\"`: Preserve original formatting\n\nBy default, comments are collapsed to a single line when possible.\n\n- Default: `\"singleLine\"`",
          "allOf": [
            {
              "$ref": "#/definitions/CommentLineStrategyConfig"
            }
          ],
          "markdownDescription": "How to format comment blocks.\n\n- `\"singleLine\"`: Convert to single-line `/** content */` when possible\n- `\"multiline\"`: Always use multi-line format\n- `\"keep\"`: Preserve original formatting\n\nBy default, comments are collapsed to a single line when possible.\n\n- Default: `\"singleLine\"`"
        },
        "descriptionTag": {
          "description": "Emit `@description` tag instead of inline description.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Emit `@description` tag instead of inline description.\n\n- Default: `false`"
        },
        "descriptionWithDot": {
          "description": "Add a trailing dot to the end of descriptions.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Add a trailing dot to the end of descriptions.\n\n- Default: `false`"
        },
        "keepUnparsableExampleIndent": {
          "description": "Preserve indentation in unparsable `@example` code.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Preserve indentation in unparsable `@example` code.\n\n- Default: `false`"
        },
        "lineWrappingStyle": {
          "description": "Strategy for wrapping description lines at print width.\n\n- `\"greedy\"`: Always re-wrap text to fit within print width\n- `\"balance\"`: Preserve original line breaks if all lines fit within print width\n\nBy default, description lines are always re-wrapped.\n\n- Default: `\"greedy\"`",
          "allOf": [
            {
              "$ref": "#/definitions/LineWrappingStyleConfig"
            }
          ],
          "markdownDescription": "Strategy for wrapping description lines at print width.\n\n- `\"greedy\"`: Always re-wrap text to fit within print width\n- `\"balance\"`: Preserve original line breaks if all lines fit within print width\n\nBy default, description lines are always re-wrapped.\n\n- Default: `\"greedy\"`"
        },
        "preferCodeFences": {
          "description": "Use fenced code blocks (```` ``` ````) instead of 4-space indentation for code without a language tag.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Use fenced code blocks (```` ``` ````) instead of 4-space indentation for code without a language tag.\n\n- Default: `false`"
        },
        "separateReturnsFromParam": {
          "description": "Add a blank line between the last `@param` and `@returns`.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Add a blank line between the last `@param` and `@returns`.\n\n- Default: `false`"
        },
        "separateTagGroups": {
          "description": "Add blank lines between different tag groups (e.g. between `@param` and `@returns`).\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Add blank lines between different tag groups (e.g. between `@param` and `@returns`).\n\n- Default: `false`"
        }
      }
    },
    "JsdocUserConfig": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/JsdocConfig"
        }
      ]
    },
    "Language": {
      "type": "string",
      "enum": [
        "javascript",
        "jsx",
        "typescript",
        "tsx",
        "json",
        "jsonc",
        "json5",
        "css",
        "scss",
        "less",
        "graphql",
        "yaml",
        "markdown",
        "toml",
        "html",
        "angular-html",
        "vue",
        "svelte",
        "astro",
        "handlebars",
        "mdx"
      ]
    },
    "LineWrappingStyleConfig": {
      "type": "string",
      "enum": [
        "greedy",
        "balance"
      ]
    },
    "NewlinesBetweenMarker": {
      "description": "A marker object for overriding `newlinesBetween` at a specific group boundary.",
      "type": "object",
      "required": [
        "newlinesBetween"
      ],
      "properties": {
        "newlinesBetween": {
          "type": "boolean"
        }
      },
      "markdownDescription": "A marker object for overriding `newlinesBetween` at a specific group boundary."
    },
    "ObjectWrapConfig": {
      "type": "string",
      "enum": [
        "preserve",
        "collapse"
      ]
    },
    "OperatorPositionConfig": {
      "type": "string",
      "enum": [
        "start",
        "end"
      ]
    },
    "OxfmtAssociationConfig": {
      "type": "object",
      "required": [
        "files",
        "language"
      ],
      "properties": {
        "excludeFiles": {
          "description": "Glob patterns to exclude from this association.",
          "allOf": [
            {
              "$ref": "#/definitions/GlobSet"
            }
          ],
          "markdownDescription": "Glob patterns to exclude from this association."
        },
        "files": {
          "description": "Glob patterns to match files for this association.",
          "allOf": [
            {
              "$ref": "#/definitions/GlobSet"
            }
          ],
          "markdownDescription": "Glob patterns to match files for this association."
        },
        "language": {
          "description": "The language to format matched files as, named by its Shiki id (as in Markdown code fences).",
          "allOf": [
            {
              "$ref": "#/definitions/Language"
            }
          ],
          "markdownDescription": "The language to format matched files as, named by its Shiki id (as in Markdown code fences)."
        }
      }
    },
    "OxfmtOverrideConfig": {
      "type": "object",
      "required": [
        "files"
      ],
      "properties": {
        "excludeFiles": {
          "description": "Glob patterns to exclude from this override.",
          "allOf": [
            {
              "$ref": "#/definitions/GlobSet"
            }
          ],
          "markdownDescription": "Glob patterns to exclude from this override."
        },
        "files": {
          "description": "Glob patterns to match files for this override.",
          "allOf": [
            {
              "$ref": "#/definitions/GlobSet"
            }
          ],
          "markdownDescription": "Glob patterns to match files for this override."
        },
        "options": {
          "description": "Format options to apply for matched files.\nAccepts the same options as the top-level format options.",
          "default": {},
          "allOf": [
            {
              "$ref": "#/definitions/FormatConfig"
            }
          ],
          "markdownDescription": "Format options to apply for matched files.\nAccepts the same options as the top-level format options."
        }
      }
    },
    "ProseWrapConfig": {
      "type": "string",
      "enum": [
        "always",
        "never",
        "preserve"
      ]
    },
    "QuotePropsConfig": {
      "type": "string",
      "enum": [
        "as-needed",
        "consistent",
        "preserve"
      ]
    },
    "SortGroupItemConfig": {
      "anyOf": [
        {
          "description": "A `{ \"newlinesBetween\": bool }` marker object that overrides the global `newlinesBetween`\nsetting for the boundary between the previous and next groups.",
          "allOf": [
            {
              "$ref": "#/definitions/NewlinesBetweenMarker"
            }
          ],
          "markdownDescription": "A `{ \"newlinesBetween\": bool }` marker object that overrides the global `newlinesBetween`\nsetting for the boundary between the previous and next groups."
        },
        {
          "description": "A single group name string (e.g. `\"value-builtin\"`).",
          "type": "string",
          "markdownDescription": "A single group name string (e.g. `\"value-builtin\"`)."
        },
        {
          "description": "Multiple group names treated as one group (e.g. `[\"value-builtin\", \"value-external\"]`).",
          "type": "array",
          "items": {
            "type": "string"
          },
          "markdownDescription": "Multiple group names treated as one group (e.g. `[\"value-builtin\", \"value-external\"]`)."
        }
      ]
    },
    "SortImportsConfig": {
      "type": "object",
      "properties": {
        "customGroups": {
          "description": "Define your own groups for matching very specific imports.\n\nThe first matching definition is used, and custom groups take precedence over predefined groups.\nTo give a predefined group precedence, define an equivalent custom group and put it first.\n\nWhen multiple conditions (`elementNamePattern`, `selector`, `modifiers`) are specified,\nall of them must match.\n\nNOTE: Predefined group names (e.g. `side_effect`, `external`) and `unknown` are reserved and cannot be used as `groupName`.\n\n- Default: `[]`",
          "type": "array",
          "items": {
            "$ref": "#/definitions/CustomGroupItemConfig"
          },
          "markdownDescription": "Define your own groups for matching very specific imports.\n\nThe first matching definition is used, and custom groups take precedence over predefined groups.\nTo give a predefined group precedence, define an equivalent custom group and put it first.\n\nWhen multiple conditions (`elementNamePattern`, `selector`, `modifiers`) are specified,\nall of them must match.\n\nNOTE: Predefined group names (e.g. `side_effect`, `external`) and `unknown` are reserved and cannot be used as `groupName`.\n\n- Default: `[]`"
        },
        "groups": {
          "description": "List of import groups for sorting.\n\nEach import is assigned to a single group (or `unknown` if none matches), and groups are ordered as listed.\nWithin a group, imports are sorted according to `order`, `ignoreCase`, etc.\n\nA predefined group name is a single selector with optional modifiers, joined by `-` (e.g. `type-external`).\nModifiers can be in any order, but the selector must come last.\n\nSelectors, from most to least important:\n- `type`: TypeScript type imports.\n- `side_effect_style`: Side effect style imports.\n- `side_effect`: Side effect imports.\n- `style`: Style imports.\n- `index`: Main file from the current directory.\n- `sibling`: Modules from the same directory.\n- `parent`: Modules from the parent directory.\n- `subpath`: Node.js subpath imports.\n- `internal`: Your internal modules.\n- `builtin`: Node.js Built-in Modules.\n- `external`: External modules installed in the project.\n- `import`: Any import.\n\nModifiers, from most to least important:\n- `side_effect`: Side effect imports.\n- `type`: TypeScript type imports.\n- `value`: Value imports.\n- `default`: Imports containing the default specifier.\n- `wildcard`: Imports containing the wildcard (`* as`) specifier.\n- `named`: Imports containing at least one named specifier.\n\nWrap groups in an array to sort them together as a single group (order within the array does not matter).\n\nTo override `newlinesBetween` at a specific group boundary,\nput a `{ \"newlinesBetween\": boolean }` marker object at that position.\n\n- Default: See below\n```json\n[\n\"builtin\",\n\"external\",\n[\"internal\", \"subpath\"],\n[\"parent\", \"sibling\", \"index\"],\n\"style\",\n\"unknown\"\n]\n```",
          "type": "array",
          "items": {
            "$ref": "#/definitions/SortGroupItemConfig"
          },
          "markdownDescription": "List of import groups for sorting.\n\nEach import is assigned to a single group (or `unknown` if none matches), and groups are ordered as listed.\nWithin a group, imports are sorted according to `order`, `ignoreCase`, etc.\n\nA predefined group name is a single selector with optional modifiers, joined by `-` (e.g. `type-external`).\nModifiers can be in any order, but the selector must come last.\n\nSelectors, from most to least important:\n- `type`: TypeScript type imports.\n- `side_effect_style`: Side effect style imports.\n- `side_effect`: Side effect imports.\n- `style`: Style imports.\n- `index`: Main file from the current directory.\n- `sibling`: Modules from the same directory.\n- `parent`: Modules from the parent directory.\n- `subpath`: Node.js subpath imports.\n- `internal`: Your internal modules.\n- `builtin`: Node.js Built-in Modules.\n- `external`: External modules installed in the project.\n- `import`: Any import.\n\nModifiers, from most to least important:\n- `side_effect`: Side effect imports.\n- `type`: TypeScript type imports.\n- `value`: Value imports.\n- `default`: Imports containing the default specifier.\n- `wildcard`: Imports containing the wildcard (`* as`) specifier.\n- `named`: Imports containing at least one named specifier.\n\nWrap groups in an array to sort them together as a single group (order within the array does not matter).\n\nTo override `newlinesBetween` at a specific group boundary,\nput a `{ \"newlinesBetween\": boolean }` marker object at that position.\n\n- Default: See below\n```json\n[\n\"builtin\",\n\"external\",\n[\"internal\", \"subpath\"],\n[\"parent\", \"sibling\", \"index\"],\n\"style\",\n\"unknown\"\n]\n```"
        },
        "ignoreCase": {
          "description": "Ignore case when sorting.\n\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Ignore case when sorting.\n\n- Default: `true`"
        },
        "internalPattern": {
          "description": "Prefixes for identifying internal imports.\n\n- Default: `[\"~/\", \"@/\", \"#\"]`",
          "type": "array",
          "items": {
            "type": "string"
          },
          "markdownDescription": "Prefixes for identifying internal imports.\n\n- Default: `[\"~/\", \"@/\", \"#\"]`"
        },
        "newlinesBetween": {
          "description": "Add newlines between groups.\n\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Add newlines between groups.\n\n- Default: `true`"
        },
        "order": {
          "description": "Sort in ascending or descending order.\n\n- Default: `\"asc\"`",
          "allOf": [
            {
              "$ref": "#/definitions/SortOrderConfig"
            }
          ],
          "markdownDescription": "Sort in ascending or descending order.\n\n- Default: `\"asc\"`"
        },
        "partitionByComment": {
          "description": "Use comments to separate imports into logical groups.\n\nWhen `true`, all comments are treated as delimiters.\n\n```js\nimport { b1, b2 } from 'b'\n// PARTITION\nimport { a } from 'a'\nimport { c } from 'c'\n```\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Use comments to separate imports into logical groups.\n\nWhen `true`, all comments are treated as delimiters.\n\n```js\nimport { b1, b2 } from 'b'\n// PARTITION\nimport { a } from 'a'\nimport { c } from 'c'\n```\n\n- Default: `false`"
        },
        "partitionByNewline": {
          "description": "Use empty lines to separate imports into logical groups.\n\nWhen `true`, imports are not sorted across an empty line.\n\n```js\nimport { b1, b2 } from 'b'\n\nimport { a } from 'a'\nimport { c } from 'c'\n```\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Use empty lines to separate imports into logical groups.\n\nWhen `true`, imports are not sorted across an empty line.\n\n```js\nimport { b1, b2 } from 'b'\n\nimport { a } from 'a'\nimport { c } from 'c'\n```\n\n- Default: `false`"
        },
        "sortSideEffects": {
          "description": "Sort side effect imports.\n\nDisabled by default for safety reasons.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Sort side effect imports.\n\nDisabled by default for safety reasons.\n\n- Default: `false`"
        }
      }
    },
    "SortImportsUserConfig": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/SortImportsConfig"
        }
      ]
    },
    "SortOrderConfig": {
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "SortPackageJsonConfig": {
      "type": "object",
      "properties": {
        "sortScripts": {
          "description": "Sort the `scripts` field alphabetically.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Sort the `scripts` field alphabetically.\n\n- Default: `false`"
        }
      }
    },
    "SortPackageJsonUserConfig": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/SortPackageJsonConfig"
        }
      ]
    },
    "SortTailwindcssConfig": {
      "type": "object",
      "properties": {
        "attributes": {
          "description": "List of additional attributes to sort beyond `class` and `className` (exact match).\n\nNOTE: Regex patterns are not yet supported.\n\n- Default: `[]`\n- Example: `[\"myClassProp\", \":class\"]`",
          "type": "array",
          "items": {
            "type": "string"
          },
          "markdownDescription": "List of additional attributes to sort beyond `class` and `className` (exact match).\n\nNOTE: Regex patterns are not yet supported.\n\n- Default: `[]`\n- Example: `[\"myClassProp\", \":class\"]`"
        },
        "config": {
          "description": "Path to your Tailwind CSS configuration file (v3).\n\nNOTE: Paths are resolved relative to the Oxfmt configuration file.\n\n- Default: Automatically find `\"tailwind.config.js\"`",
          "type": "string",
          "markdownDescription": "Path to your Tailwind CSS configuration file (v3).\n\nNOTE: Paths are resolved relative to the Oxfmt configuration file.\n\n- Default: Automatically find `\"tailwind.config.js\"`"
        },
        "functions": {
          "description": "List of custom function names whose arguments should be sorted (exact match).\n\nNOTE: Regex patterns are not yet supported.\n\n- Default: `[]`\n- Example: `[\"clsx\", \"cn\", \"cva\", \"tw\"]`",
          "type": "array",
          "items": {
            "type": "string"
          },
          "markdownDescription": "List of custom function names whose arguments should be sorted (exact match).\n\nNOTE: Regex patterns are not yet supported.\n\n- Default: `[]`\n- Example: `[\"clsx\", \"cn\", \"cva\", \"tw\"]`"
        },
        "preserveDuplicates": {
          "description": "Preserve duplicate classes.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Preserve duplicate classes.\n\n- Default: `false`"
        },
        "preserveWhitespace": {
          "description": "Preserve whitespace around classes.\n\n- Default: `false`",
          "type": "boolean",
          "markdownDescription": "Preserve whitespace around classes.\n\n- Default: `false`"
        },
        "stylesheet": {
          "description": "Path to your Tailwind CSS stylesheet (v4).\n\nNOTE: Paths are resolved relative to the Oxfmt configuration file.\n\n- Default: Installed Tailwind CSS's `theme.css`",
          "type": "string",
          "markdownDescription": "Path to your Tailwind CSS stylesheet (v4).\n\nNOTE: Paths are resolved relative to the Oxfmt configuration file.\n\n- Default: Installed Tailwind CSS's `theme.css`"
        }
      }
    },
    "SortTailwindcssUserConfig": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/SortTailwindcssConfig"
        }
      ]
    },
    "SvelteConfig": {
      "type": "object",
      "properties": {
        "allowShorthand": {
          "description": "Whether to allow attribute shorthand if attribute name and expression are the same.\n\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Whether to allow attribute shorthand if attribute name and expression are the same.\n\n- Default: `true`"
        },
        "indentScriptAndStyle": {
          "description": "Whether to indent code inside `<script>` and `<style>` tags.\n\n- Default: `true`",
          "type": "boolean",
          "markdownDescription": "Whether to indent code inside `<script>` and `<style>` tags.\n\n- Default: `true`"
        },
        "sortOrder": {
          "description": "The order in which Svelte component sections are printed.\nJoin `options`, `scripts`, `markup`, `styles` with `-` in the desired order,\nor use `none` to keep the original order.\n\n- Default: `\"options-scripts-markup-styles\"`",
          "type": "string",
          "markdownDescription": "The order in which Svelte component sections are printed.\nJoin `options`, `scripts`, `markup`, `styles` with `-` in the desired order,\nor use `none` to keep the original order.\n\n- Default: `\"options-scripts-markup-styles\"`"
        }
      }
    },
    "SvelteUserConfig": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/SvelteConfig"
        }
      ]
    },
    "TrailingCommaConfig": {
      "type": "string",
      "enum": [
        "all",
        "es5",
        "none"
      ]
    }
  },
  "markdownDescription": "Configuration options for Oxfmt.\n\nMost options are the same as Prettier's options, but not all of them.\nIn addition, some options are our own extensions."
}
