diff --git a/README.md b/README.md
index 4f71dbea45..8d0ddd57c5 100644
--- a/README.md
+++ b/README.md
@@ -129,10 +129,21 @@ And that's it! Or you can configure each integration individually, for example:
import antfu from '@antfu/eslint-config'
export default antfu({
- stylistic: true, // enable stylistic formatting rules
+ // Enable stylistic formatting rules
+ // stylistic: true,
+
+ // Or customize the stylistic rules
+ stylistic: {
+ indent: 2, // 4, or 'tab'
+ quotes: 'single', // or 'double'
+ },
+
+ // TypeScript and Vue are auto-detected, you can also explicitly enable them:
typescript: true,
vue: true,
- jsonc: false, // disable jsonc support
+
+ // Disable jsonc and yaml support
+ jsonc: false,
yaml: false,
// `.eslintignore` is no longer supported in Flat config, use `ignores` instead
diff --git a/fixtures/output/tab-double-quotes/javascript.js b/fixtures/output/tab-double-quotes/javascript.js
new file mode 100644
index 0000000000..54fe8971f4
--- /dev/null
+++ b/fixtures/output/tab-double-quotes/javascript.js
@@ -0,0 +1,63 @@
+// This file is generated by ChatGPT
+
+// eslint-disable-next-line no-console
+const log = console.log
+
+// Define a class using ES6 class syntax
+class Person {
+ constructor(name, age) {
+ this.name = name
+ this.age = age
+ }
+
+ // Define a method within the class
+ sayHello() {
+ log(`Hello, my name is ${this.name} and I am ${this.age} years old.`)
+ }
+}
+
+// Create an array of objects
+const people = [
+ new Person("Alice", 30),
+ new Person("Bob", 25),
+ new Person("Charlie", 35),
+]
+
+// Use the forEach method to iterate over the array
+people.forEach((person) => {
+ person.sayHello()
+})
+
+// Use a template literal to create a multiline string
+const multilineString = `
+ This is a multiline string
+ that spans multiple lines.
+`
+
+// Use destructuring assignment to extract values from an object
+const { name, age } = people[0]
+log(`First person in the array is ${name} and they are ${age} years old.`, multilineString)
+
+// Use the spread operator to create a new array
+const numbers = [1, 2, 3]
+const newNumbers = [...numbers, 4, 5]
+log(newNumbers)
+
+// Use a try-catch block for error handling
+try {
+ // Attempt to parse an invalid JSON string
+ JSON.parse("invalid JSON")
+}
+catch (error) {
+ console.error("Error parsing JSON:", error.message)
+}
+
+// Use a ternary conditional operator
+const isEven = num => num % 2 === 0
+const number = 7
+log(`${number} is ${isEven(number) ? "even" : "odd"}.`)
+
+// Use a callback function with setTimeout for asynchronous code
+setTimeout(() => {
+ log("This code runs after a delay of 2 seconds.")
+}, 2000)
diff --git a/fixtures/output/tab-double-quotes/typescript.ts b/fixtures/output/tab-double-quotes/typescript.ts
new file mode 100644
index 0000000000..6be5f7961f
--- /dev/null
+++ b/fixtures/output/tab-double-quotes/typescript.ts
@@ -0,0 +1,83 @@
+// Define a TypeScript interface
+interface Person {
+ name: string
+ age: number
+}
+
+// Create an array of objects with the defined interface
+const people: Person[] = [
+ { name: "Alice", age: 30 },
+ { name: "Bob", age: 25 },
+ { name: "Charlie", age: 35 },
+]
+
+// eslint-disable-next-line no-console
+const log = console.log
+
+// Use a for...of loop to iterate over the array
+for (const person of people)
+ log(`Hello, my name is ${person.name} and I am ${person.age} years old.`)
+
+// Define a generic function
+function identity< T >(arg: T): T {
+ return arg
+}
+
+// Use the generic function with type inference
+const result = identity(
+ "TypeScript is awesome",
+)
+log(result)
+
+// Use optional properties in an interface
+interface Car {
+ make: string
+ model?: string
+}
+
+// Create objects using the interface
+const car1: Car = { make: "Toyota" }
+const car2: Car = {
+ make: "Ford",
+ model: "Focus",
+}
+
+// Use union types
+type Fruit = "apple" | "banana" | "orange"
+const favoriteFruit: Fruit = "apple"
+
+// Use a type assertion to tell TypeScript about the type
+const inputValue: any = "42"
+const numericValue = inputValue as number
+
+// Define a class with access modifiers
+class Animal {
+ private name: string
+ constructor(name: string) {
+ this.name = name
+ }
+
+ protected makeSound(sound: string) {
+ log(`${this.name} says ${sound}`)
+ }
+}
+
+// Extend a class
+class Dog extends Animal {
+ constructor(private alias: string) {
+ super(alias)
+ }
+
+ bark() {
+ this.makeSound("Woof!")
+ }
+}
+
+const dog = new Dog("Buddy")
+dog.bark()
+
+function fn(): string {
+ return `hello${1}`
+}
+
+log(car1, car2, favoriteFruit, numericValue, fn())
diff --git a/fixtures/output/tab-double-quotes/vue-ts.vue b/fixtures/output/tab-double-quotes/vue-ts.vue
new file mode 100644
index 0000000000..389ece7b4d
--- /dev/null
+++ b/fixtures/output/tab-double-quotes/vue-ts.vue
@@ -0,0 +1,22 @@
+
+
+
+