[{"data":1,"prerenderedAt":1779},["ShallowReactive",2],{"navigation_docs_en":3,"-en-eslint-config":46,"-en-eslint-config-surround":1776},[4,31,36,41],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"ESLint Config","\u002Fen\u002Feslint-config","en\u002F1.eslint-config\u002F1.index",[9,11,15,19,23,27],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-shield-check",{"title":12,"path":13,"stem":14},"Package JSON Lint","\u002Fen\u002Feslint-config\u002Fpackage-json","en\u002F1.eslint-config\u002F2.package-json",{"title":16,"path":17,"stem":18},"Nuxt Integration","\u002Fen\u002Feslint-config\u002Fnuxt","en\u002F1.eslint-config\u002F3.nuxt",{"title":20,"path":21,"stem":22},"Framework Integrations","\u002Fen\u002Feslint-config\u002Fframeworks","en\u002F1.eslint-config\u002F4.frameworks",{"title":24,"path":25,"stem":26},"Advanced Usage","\u002Fen\u002Feslint-config\u002Fadvanced","en\u002F1.eslint-config\u002F5.advanced",{"title":28,"path":29,"stem":30},"Editor & CI Integration","\u002Fen\u002Feslint-config\u002Feditor","en\u002F1.eslint-config\u002F6.editor",{"title":32,"path":33,"stem":34,"icon":35},"Prettier Config","\u002Fen\u002Fprettier-config","en\u002F2.prettier-config","i-lucide-paintbrush",{"title":37,"path":38,"stem":39,"icon":40},"EditorConfig","\u002Fen\u002Feditorconfig","en\u002F3.editorconfig","i-lucide-file-cog",{"title":42,"path":43,"stem":44,"icon":45},"CLI","\u002Fen\u002Fcli","en\u002F4.cli","i-lucide-terminal",{"id":47,"title":5,"body":48,"description":1769,"extension":1770,"links":1771,"meta":1772,"navigation":1773,"path":6,"seo":1774,"stem":7,"__hash__":1775},"docs_en\u002Fen\u002F1.eslint-config\u002F1.index.md",{"type":49,"value":50,"toc":1749},"minimark",[51,55,82,87,144,148,219,235,239,249,301,304,309,317,484,490,494,497,620,624,631,788,799,818,822,828,906,917,921,927,1081,1091,1094,1117,1209,1257,1272,1276,1282,1350,1357,1361,1390,1394,1397,1410,1421,1425,1436,1440,1446,1538,1549,1553,1565,1669,1672,1745],[52,53,5],"h1",{"id":54},"eslint-config",[56,57,58,62,63,72,73,76,77,81],"p",{},[59,60,61],"code",{},"@pleaseai\u002Feslint-config"," is an opinionated ESLint flat config built on top of ",[64,65,69],"a",{"href":66,"rel":67},"https:\u002F\u002Fgithub.com\u002Fantfu\u002Feslint-config",[68],"nofollow",[59,70,71],{},"@antfu\u002Feslint-config",". It gives you a single ",[59,74,75],{},"pleaseai()"," function that wires up linting ",[78,79,80],"strong",{},"and formatting"," for JS\u002FTS\u002FJSX\u002FVue\u002FJSON\u002FYAML\u002FMarkdown out of the box — no Prettier required.",[83,84,86],"h2",{"id":85},"features","Features",[88,89,90,99,105,108,115,125,134,141],"ul",{},[91,92,93,98],"li",{},[64,94,97],{"href":95,"rel":96},"https:\u002F\u002Feslint.org\u002Fdocs\u002Flatest\u002Fuse\u002Fconfigure\u002Fconfiguration-files-new",[68],"ESLint flat config"," format, composable and future-proof",[91,100,101,102],{},"Auto-fix for formatting — ",[78,103,104],{},"use standalone without Prettier",[91,106,107],{},"TypeScript, JSX, Vue, JSON, YAML, Markdown, TOML, XML, GraphQL, Svelte, Astro, CSS support",[91,109,110,111,114],{},"Optional ",[64,112,113],{"href":21},"React, Next.js, Svelte, UnoCSS, Astro, Solid, Angular"," integrations",[91,116,110,117,121,122],{},[64,118,120],{"href":119},"#formatters","formatters"," for CSS \u002F HTML \u002F Markdown via ",[59,123,124],{},"eslint-plugin-format",[91,126,127,128,133],{},"Includes ",[64,129,130],{"href":13},[59,131,132],{},"eslint-plugin-package-json"," configs",[91,135,136,137,140],{},"Auto-detects ",[59,138,139],{},".gitignore"," patterns",[91,142,143],{},"Requires ESLint v9.10.0+",[83,145,147],{"id":146},"installation","Installation",[149,150,151,182,200],"code-group",{},[152,153,159],"pre",{"className":154,"code":155,"filename":156,"language":157,"meta":158,"style":158},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add -D @pleaseai\u002Feslint-config eslint\n","bun","bash","",[59,160,161],{"__ignoreMap":158},[162,163,166,169,173,176,179],"span",{"class":164,"line":165},"line",1,[162,167,156],{"class":168},"sBMFI",[162,170,172],{"class":171},"sfazB"," add",[162,174,175],{"class":171}," -D",[162,177,178],{"class":171}," @pleaseai\u002Feslint-config",[162,180,181],{"class":171}," eslint\n",[152,183,186],{"className":154,"code":184,"filename":185,"language":157,"meta":158,"style":158},"pnpm add -D @pleaseai\u002Feslint-config eslint\n","pnpm",[59,187,188],{"__ignoreMap":158},[162,189,190,192,194,196,198],{"class":164,"line":165},[162,191,185],{"class":168},[162,193,172],{"class":171},[162,195,175],{"class":171},[162,197,178],{"class":171},[162,199,181],{"class":171},[152,201,204],{"className":154,"code":202,"filename":203,"language":157,"meta":158,"style":158},"npm install -D @pleaseai\u002Feslint-config eslint\n","npm",[59,205,206],{"__ignoreMap":158},[162,207,208,210,213,215,217],{"class":164,"line":165},[162,209,203],{"class":168},[162,211,212],{"class":171}," install",[162,214,175],{"class":171},[162,216,178],{"class":171},[162,218,181],{"class":171},[220,221,222,223,226,227,230,231,234],"tip",{"to":43},"Prefer not to set this up by hand? Run ",[59,224,225],{},"bunx @pleaseai\u002Fcode-style"," — the CLI installs the packages, writes ",[59,228,229],{},"eslint.config.mjs",", and can also manage a rules block in ",[59,232,233],{},"AGENTS.md"," for AI coding assistants.",[83,236,238],{"id":237},"usage","Usage",[56,240,241,242,245,246,248],{},"Create ",[59,243,244],{},"eslint.config.ts"," (or ",[59,247,229],{},") in your project root:",[152,250,254],{"className":251,"code":252,"filename":244,"language":253,"meta":158,"style":158},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai()\n","ts",[59,255,256,278,285],{"__ignoreMap":158},[162,257,258,262,266,269,273,275],{"class":164,"line":165},[162,259,261],{"class":260},"s7zQu","import",[162,263,265],{"class":264},"sTEyZ"," pleaseai ",[162,267,268],{"class":260},"from",[162,270,272],{"class":271},"sMK4o"," '",[162,274,61],{"class":171},[162,276,277],{"class":271},"'\n",[162,279,281],{"class":164,"line":280},2,[162,282,284],{"emptyLinePlaceholder":283},true,"\n",[162,286,288,291,294,298],{"class":164,"line":287},3,[162,289,290],{"class":260},"export",[162,292,293],{"class":260}," default",[162,295,297],{"class":296},"s2Zo4"," pleaseai",[162,299,300],{"class":264},"()\n",[56,302,303],{},"That's it. ESLint will pick it up automatically on the next run.",[305,306,308],"h3",{"id":307},"with-options","With Options",[56,310,311,313,314,316],{},[59,312,75],{}," accepts the same options as ",[59,315,71],{},":",[152,318,320],{"className":251,"code":319,"filename":244,"language":253,"meta":158,"style":158},"import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai({\n  \u002F\u002F Override PleaseAI defaults\n  stylistic: {\n    indent: 4,\n  },\n\n  \u002F\u002F Enable framework support\n  vue: true,\n  react: true,\n\n  \u002F\u002F Add ignores\n  ignores: [\n    '**\u002Ffixtures',\n  ],\n})\n",[59,321,322,336,340,354,361,373,388,394,399,405,419,431,436,442,453,467,475],{"__ignoreMap":158},[162,323,324,326,328,330,332,334],{"class":164,"line":165},[162,325,261],{"class":260},[162,327,265],{"class":264},[162,329,268],{"class":260},[162,331,272],{"class":271},[162,333,61],{"class":171},[162,335,277],{"class":271},[162,337,338],{"class":164,"line":280},[162,339,284],{"emptyLinePlaceholder":283},[162,341,342,344,346,348,351],{"class":164,"line":287},[162,343,290],{"class":260},[162,345,293],{"class":260},[162,347,297],{"class":296},[162,349,350],{"class":264},"(",[162,352,353],{"class":271},"{\n",[162,355,357],{"class":164,"line":356},4,[162,358,360],{"class":359},"sHwdD","  \u002F\u002F Override PleaseAI defaults\n",[162,362,364,368,370],{"class":164,"line":363},5,[162,365,367],{"class":366},"swJcz","  stylistic",[162,369,316],{"class":271},[162,371,372],{"class":271}," {\n",[162,374,376,379,381,385],{"class":164,"line":375},6,[162,377,378],{"class":366},"    indent",[162,380,316],{"class":271},[162,382,384],{"class":383},"sbssI"," 4",[162,386,387],{"class":271},",\n",[162,389,391],{"class":164,"line":390},7,[162,392,393],{"class":271},"  },\n",[162,395,397],{"class":164,"line":396},8,[162,398,284],{"emptyLinePlaceholder":283},[162,400,402],{"class":164,"line":401},9,[162,403,404],{"class":359},"  \u002F\u002F Enable framework support\n",[162,406,408,411,413,417],{"class":164,"line":407},10,[162,409,410],{"class":366},"  vue",[162,412,316],{"class":271},[162,414,416],{"class":415},"sfNiH"," true",[162,418,387],{"class":271},[162,420,422,425,427,429],{"class":164,"line":421},11,[162,423,424],{"class":366},"  react",[162,426,316],{"class":271},[162,428,416],{"class":415},[162,430,387],{"class":271},[162,432,434],{"class":164,"line":433},12,[162,435,284],{"emptyLinePlaceholder":283},[162,437,439],{"class":164,"line":438},13,[162,440,441],{"class":359},"  \u002F\u002F Add ignores\n",[162,443,445,448,450],{"class":164,"line":444},14,[162,446,447],{"class":366},"  ignores",[162,449,316],{"class":271},[162,451,452],{"class":264}," [\n",[162,454,456,459,462,465],{"class":164,"line":455},15,[162,457,458],{"class":271},"    '",[162,460,461],{"class":171},"**\u002Ffixtures",[162,463,464],{"class":271},"'",[162,466,387],{"class":271},[162,468,470,473],{"class":164,"line":469},16,[162,471,472],{"class":264},"  ]",[162,474,387],{"class":271},[162,476,478,481],{"class":164,"line":477},17,[162,479,480],{"class":271},"}",[162,482,483],{"class":264},")\n",[56,485,486,487,489],{},"See ",[64,488,20],{"href":21}," for the full list of framework flags and their peer dependencies.",[305,491,493],{"id":492},"with-additional-configs","With Additional Configs",[56,495,496],{},"Pass additional flat config items as rest arguments — they're merged after the PleaseAI preset:",[152,498,500],{"className":251,"code":499,"filename":244,"language":253,"meta":158,"style":158},"import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai(\n  {\n    typescript: true,\n  },\n  {\n    files: ['**\u002F*.ts'],\n    rules: {\n      'no-console': 'warn',\n    },\n  },\n)\n",[59,501,502,516,520,531,536,547,551,555,577,586,607,612,616],{"__ignoreMap":158},[162,503,504,506,508,510,512,514],{"class":164,"line":165},[162,505,261],{"class":260},[162,507,265],{"class":264},[162,509,268],{"class":260},[162,511,272],{"class":271},[162,513,61],{"class":171},[162,515,277],{"class":271},[162,517,518],{"class":164,"line":280},[162,519,284],{"emptyLinePlaceholder":283},[162,521,522,524,526,528],{"class":164,"line":287},[162,523,290],{"class":260},[162,525,293],{"class":260},[162,527,297],{"class":296},[162,529,530],{"class":264},"(\n",[162,532,533],{"class":164,"line":356},[162,534,535],{"class":271},"  {\n",[162,537,538,541,543,545],{"class":164,"line":363},[162,539,540],{"class":366},"    typescript",[162,542,316],{"class":271},[162,544,416],{"class":415},[162,546,387],{"class":271},[162,548,549],{"class":164,"line":375},[162,550,393],{"class":271},[162,552,553],{"class":164,"line":390},[162,554,535],{"class":271},[162,556,557,560,562,565,567,570,572,575],{"class":164,"line":396},[162,558,559],{"class":366},"    files",[162,561,316],{"class":271},[162,563,564],{"class":264}," [",[162,566,464],{"class":271},[162,568,569],{"class":171},"**\u002F*.ts",[162,571,464],{"class":271},[162,573,574],{"class":264},"]",[162,576,387],{"class":271},[162,578,579,582,584],{"class":164,"line":401},[162,580,581],{"class":366},"    rules",[162,583,316],{"class":271},[162,585,372],{"class":271},[162,587,588,591,594,596,598,600,603,605],{"class":164,"line":407},[162,589,590],{"class":271},"      '",[162,592,593],{"class":366},"no-console",[162,595,464],{"class":271},[162,597,316],{"class":271},[162,599,272],{"class":271},[162,601,602],{"class":171},"warn",[162,604,464],{"class":271},[162,606,387],{"class":271},[162,608,609],{"class":164,"line":421},[162,610,611],{"class":271},"    },\n",[162,613,614],{"class":164,"line":433},[162,615,393],{"class":271},[162,617,618],{"class":164,"line":438},[162,619,483],{"class":264},[305,621,623],{"id":622},"rules-overrides","Rules Overrides",[56,625,626,627,630],{},"Every framework integration accepts an ",[59,628,629],{},"overrides"," object so you can tune rules without replacing the whole preset:",[152,632,634],{"className":251,"code":633,"filename":244,"language":253,"meta":158,"style":158},"import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai({\n  vue: {\n    overrides: {\n      'vue\u002Foperator-linebreak': ['error', 'before'],\n    },\n  },\n  typescript: {\n    overrides: {\n      'ts\u002Fconsistent-type-definitions': ['error', 'interface'],\n    },\n  },\n})\n",[59,635,636,650,654,666,674,683,717,721,725,734,742,774,778,782],{"__ignoreMap":158},[162,637,638,640,642,644,646,648],{"class":164,"line":165},[162,639,261],{"class":260},[162,641,265],{"class":264},[162,643,268],{"class":260},[162,645,272],{"class":271},[162,647,61],{"class":171},[162,649,277],{"class":271},[162,651,652],{"class":164,"line":280},[162,653,284],{"emptyLinePlaceholder":283},[162,655,656,658,660,662,664],{"class":164,"line":287},[162,657,290],{"class":260},[162,659,293],{"class":260},[162,661,297],{"class":296},[162,663,350],{"class":264},[162,665,353],{"class":271},[162,667,668,670,672],{"class":164,"line":356},[162,669,410],{"class":366},[162,671,316],{"class":271},[162,673,372],{"class":271},[162,675,676,679,681],{"class":164,"line":363},[162,677,678],{"class":366},"    overrides",[162,680,316],{"class":271},[162,682,372],{"class":271},[162,684,685,687,690,692,694,696,698,701,703,706,708,711,713,715],{"class":164,"line":375},[162,686,590],{"class":271},[162,688,689],{"class":366},"vue\u002Foperator-linebreak",[162,691,464],{"class":271},[162,693,316],{"class":271},[162,695,564],{"class":264},[162,697,464],{"class":271},[162,699,700],{"class":171},"error",[162,702,464],{"class":271},[162,704,705],{"class":271},",",[162,707,272],{"class":271},[162,709,710],{"class":171},"before",[162,712,464],{"class":271},[162,714,574],{"class":264},[162,716,387],{"class":271},[162,718,719],{"class":164,"line":390},[162,720,611],{"class":271},[162,722,723],{"class":164,"line":396},[162,724,393],{"class":271},[162,726,727,730,732],{"class":164,"line":401},[162,728,729],{"class":366},"  typescript",[162,731,316],{"class":271},[162,733,372],{"class":271},[162,735,736,738,740],{"class":164,"line":407},[162,737,678],{"class":366},[162,739,316],{"class":271},[162,741,372],{"class":271},[162,743,744,746,749,751,753,755,757,759,761,763,765,768,770,772],{"class":164,"line":421},[162,745,590],{"class":271},[162,747,748],{"class":366},"ts\u002Fconsistent-type-definitions",[162,750,464],{"class":271},[162,752,316],{"class":271},[162,754,564],{"class":264},[162,756,464],{"class":271},[162,758,700],{"class":171},[162,760,464],{"class":271},[162,762,705],{"class":271},[162,764,272],{"class":271},[162,766,767],{"class":171},"interface",[162,769,464],{"class":271},[162,771,574],{"class":264},[162,773,387],{"class":271},[162,775,776],{"class":164,"line":433},[162,777,611],{"class":271},[162,779,780],{"class":164,"line":438},[162,781,393],{"class":271},[162,783,784,786],{"class":164,"line":444},[162,785,480],{"class":271},[162,787,483],{"class":264},[56,789,790,791,794,795,798],{},"For overrides that don't fit a specific integration, pass a second argument with a ",[59,792,793],{},"rules"," object as shown in ",[64,796,493],{"href":797},"#with-additional-configs",".",[800,801,803,804,807,808,807,811,807,814,817],"note",{"to":802},"\u002Fen\u002Feslint-config\u002Fadvanced#plugins-renaming","Plugin prefixes are renamed for ergonomics — use ",[59,805,806],{},"ts\u002F*",", ",[59,809,810],{},"style\u002F*",[59,812,813],{},"test\u002F*",[59,815,816],{},"import\u002F*",", etc. See the full mapping in Advanced Usage.",[83,819,821],{"id":820},"npm-scripts","NPM Scripts",[56,823,824,825,316],{},"Add the lint commands to your ",[59,826,827],{},"package.json",[152,829,833],{"className":830,"code":831,"filename":827,"language":832,"meta":158,"style":158},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"scripts\": {\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint . --fix\"\n  }\n}\n","json",[59,834,835,839,855,877,896,901],{"__ignoreMap":158},[162,836,837],{"class":164,"line":165},[162,838,353],{"class":271},[162,840,841,844,848,851,853],{"class":164,"line":280},[162,842,843],{"class":271},"  \"",[162,845,847],{"class":846},"spNyl","scripts",[162,849,850],{"class":271},"\"",[162,852,316],{"class":271},[162,854,372],{"class":271},[162,856,857,860,863,865,867,870,873,875],{"class":164,"line":287},[162,858,859],{"class":271},"    \"",[162,861,862],{"class":168},"lint",[162,864,850],{"class":271},[162,866,316],{"class":271},[162,868,869],{"class":271}," \"",[162,871,872],{"class":171},"eslint .",[162,874,850],{"class":271},[162,876,387],{"class":271},[162,878,879,881,884,886,888,890,893],{"class":164,"line":356},[162,880,859],{"class":271},[162,882,883],{"class":168},"lint:fix",[162,885,850],{"class":271},[162,887,316],{"class":271},[162,889,869],{"class":271},[162,891,892],{"class":171},"eslint . --fix",[162,894,895],{"class":271},"\"\n",[162,897,898],{"class":164,"line":363},[162,899,900],{"class":271},"  }\n",[162,902,903],{"class":164,"line":375},[162,904,905],{"class":271},"}\n",[56,907,908,909,912,913,916],{},"Run ",[59,910,911],{},"npm run lint"," to check, or ",[59,914,915],{},"npm run lint:fix"," to auto-fix.",[83,918,920],{"id":919},"pleaseai-defaults","PleaseAI Defaults",[56,922,923,924,926],{},"This config wraps ",[59,925,71],{}," with these PleaseAI-specific defaults:",[928,929,930,946],"table",{},[931,932,933],"thead",{},[934,935,936,940,943],"tr",{},[937,938,939],"th",{},"Option",[937,941,942],{},"Value",[937,944,945],{},"Note",[947,948,949,965,980,995,1010,1026,1051,1068],"tbody",{},[934,950,951,957,962],{},[952,953,954],"td",{},[59,955,956],{},"stylistic.indent",[952,958,959],{},[59,960,961],{},"2",[952,963,964],{},"Two-space indent",[934,966,967,972,977],{},[952,968,969],{},[59,970,971],{},"stylistic.quotes",[952,973,974],{},[59,975,976],{},"single",[952,978,979],{},"Single quotes",[934,981,982,987,992],{},[952,983,984],{},[59,985,986],{},"stylistic.semi",[952,988,989],{},[59,990,991],{},"false",[952,993,994],{},"No trailing semicolons",[934,996,997,1002,1007],{},[952,998,999],{},[59,1000,1001],{},"typescript",[952,1003,1004],{},[59,1005,1006],{},"true",[952,1008,1009],{},"Enabled out of the box",[934,1011,1012,1017,1021],{},[952,1013,1014],{},[59,1015,1016],{},"gitignore",[952,1018,1019],{},[59,1020,1006],{},[952,1022,1023,1024],{},"Ignores anything in ",[59,1025,139],{},[934,1027,1028,1033,1037],{},[952,1029,1030],{},[59,1031,1032],{},"lessOpinionated",[952,1034,1035],{},[59,1036,1006],{},[952,1038,1039,1040,1043,1044,1047,1048],{},"Disables ",[59,1041,1042],{},"antfu\u002Fif-newline"," and ",[59,1045,1046],{},"antfu\u002Fcurly",", enables ",[59,1049,1050],{},"curly: ['error', 'all']",[934,1052,1053,1058,1061],{},[952,1054,1055],{},[59,1056,1057],{},"antfu\u002Ftop-level-function",[952,1059,1060],{},"Re-enabled",[952,1062,1063,1064,1067],{},"Prefer ",[59,1065,1066],{},"function"," declarations at top level",[934,1069,1070,1075,1078],{},[952,1071,1072],{},[59,1073,1074],{},"test\u002Fprefer-lowercase-title",[952,1076,1077],{},"Disabled",[952,1079,1080],{},"Test titles can start with any case",[56,1082,1083,1084,1087,1088,1090],{},"The ",[59,1085,1086],{},"lessOpinionated: true"," + ",[59,1089,1050],{}," combination is the key PleaseAI divergence from antfu's defaults: control-flow statements must always use braces, but antfu's top-level-function preference is still honoured.",[83,1092,1093],{"id":120},"Formatters",[56,1095,1096,1097,807,1100,807,1103,1106,1107,1109,1110,1116],{},"ESLint can't natively format ",[59,1098,1099],{},".css",[59,1101,1102],{},".html",[59,1104,1105],{},".xml",", or Markdown frontmatter. Opt in to the ",[59,1108,120],{}," feature to delegate those files to ",[64,1111,1114],{"href":1112,"rel":1113},"https:\u002F\u002Fgithub.com\u002Fantfu\u002Feslint-plugin-format",[68],[59,1115,124],{}," (which wraps Prettier \u002F dprint) while keeping everything else on pure ESLint:",[152,1118,1120],{"className":251,"code":1119,"filename":244,"language":253,"meta":158,"style":158},"import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai({\n  formatters: {\n    css: true,\n    html: true,\n    markdown: 'prettier',\n  },\n})\n",[59,1121,1122,1136,1140,1152,1161,1172,1183,1199,1203],{"__ignoreMap":158},[162,1123,1124,1126,1128,1130,1132,1134],{"class":164,"line":165},[162,1125,261],{"class":260},[162,1127,265],{"class":264},[162,1129,268],{"class":260},[162,1131,272],{"class":271},[162,1133,61],{"class":171},[162,1135,277],{"class":271},[162,1137,1138],{"class":164,"line":280},[162,1139,284],{"emptyLinePlaceholder":283},[162,1141,1142,1144,1146,1148,1150],{"class":164,"line":287},[162,1143,290],{"class":260},[162,1145,293],{"class":260},[162,1147,297],{"class":296},[162,1149,350],{"class":264},[162,1151,353],{"class":271},[162,1153,1154,1157,1159],{"class":164,"line":356},[162,1155,1156],{"class":366},"  formatters",[162,1158,316],{"class":271},[162,1160,372],{"class":271},[162,1162,1163,1166,1168,1170],{"class":164,"line":363},[162,1164,1165],{"class":366},"    css",[162,1167,316],{"class":271},[162,1169,416],{"class":415},[162,1171,387],{"class":271},[162,1173,1174,1177,1179,1181],{"class":164,"line":375},[162,1175,1176],{"class":366},"    html",[162,1178,316],{"class":271},[162,1180,416],{"class":415},[162,1182,387],{"class":271},[162,1184,1185,1188,1190,1192,1195,1197],{"class":164,"line":390},[162,1186,1187],{"class":366},"    markdown",[162,1189,316],{"class":271},[162,1191,272],{"class":271},[162,1193,1194],{"class":171},"prettier",[162,1196,464],{"class":271},[162,1198,387],{"class":271},[162,1200,1201],{"class":164,"line":396},[162,1202,393],{"class":271},[162,1204,1205,1207],{"class":164,"line":401},[162,1206,480],{"class":271},[162,1208,483],{"class":264},[149,1210,1211,1227,1242],{},[152,1212,1214],{"className":154,"code":1213,"filename":156,"language":157,"meta":158,"style":158},"bun add -D eslint-plugin-format\n",[59,1215,1216],{"__ignoreMap":158},[162,1217,1218,1220,1222,1224],{"class":164,"line":165},[162,1219,156],{"class":168},[162,1221,172],{"class":171},[162,1223,175],{"class":171},[162,1225,1226],{"class":171}," eslint-plugin-format\n",[152,1228,1230],{"className":154,"code":1229,"filename":185,"language":157,"meta":158,"style":158},"pnpm add -D eslint-plugin-format\n",[59,1231,1232],{"__ignoreMap":158},[162,1233,1234,1236,1238,1240],{"class":164,"line":165},[162,1235,185],{"class":168},[162,1237,172],{"class":171},[162,1239,175],{"class":171},[162,1241,1226],{"class":171},[152,1243,1245],{"className":154,"code":1244,"filename":203,"language":157,"meta":158,"style":158},"npm install -D eslint-plugin-format\n",[59,1246,1247],{"__ignoreMap":158},[162,1248,1249,1251,1253,1255],{"class":164,"line":165},[162,1250,203],{"class":168},[162,1252,212],{"class":171},[162,1254,175],{"class":171},[162,1256,1226],{"class":171},[800,1258,1259,1261,1262,1265,1266,1271],{},[59,1260,120],{}," only handles formatting, not linting. For proper CSS ",[78,1263,1264],{},"linting"," use ",[64,1267,1270],{"href":1268,"rel":1269},"https:\u002F\u002Fstylelint.io\u002F",[68],"Stylelint"," alongside it.",[83,1273,1275],{"id":1274},"type-aware-rules","Type Aware Rules",[56,1277,1278,1279,316],{},"The strongest TypeScript rules require type information. Opt in by pointing at your ",[59,1280,1281],{},"tsconfig.json",[152,1283,1285],{"className":251,"code":1284,"filename":244,"language":253,"meta":158,"style":158},"import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai({\n  typescript: {\n    tsconfigPath: 'tsconfig.json',\n  },\n})\n",[59,1286,1287,1301,1305,1317,1325,1340,1344],{"__ignoreMap":158},[162,1288,1289,1291,1293,1295,1297,1299],{"class":164,"line":165},[162,1290,261],{"class":260},[162,1292,265],{"class":264},[162,1294,268],{"class":260},[162,1296,272],{"class":271},[162,1298,61],{"class":171},[162,1300,277],{"class":271},[162,1302,1303],{"class":164,"line":280},[162,1304,284],{"emptyLinePlaceholder":283},[162,1306,1307,1309,1311,1313,1315],{"class":164,"line":287},[162,1308,290],{"class":260},[162,1310,293],{"class":260},[162,1312,297],{"class":296},[162,1314,350],{"class":264},[162,1316,353],{"class":271},[162,1318,1319,1321,1323],{"class":164,"line":356},[162,1320,729],{"class":366},[162,1322,316],{"class":271},[162,1324,372],{"class":271},[162,1326,1327,1330,1332,1334,1336,1338],{"class":164,"line":363},[162,1328,1329],{"class":366},"    tsconfigPath",[162,1331,316],{"class":271},[162,1333,272],{"class":271},[162,1335,1281],{"class":171},[162,1337,464],{"class":271},[162,1339,387],{"class":271},[162,1341,1342],{"class":164,"line":375},[162,1343,393],{"class":271},[162,1345,1346,1348],{"class":164,"line":390},[162,1347,480],{"class":271},[162,1349,483],{"class":264},[56,1351,1352,1353,798],{},"Read more in ",[64,1354,1356],{"href":1355},"\u002Fen\u002Feslint-config\u002Fadvanced#type-aware-rules","Advanced Usage → Type Aware Rules",[83,1358,1360],{"id":1359},"next-steps","Next Steps",[1362,1363,1364,1369,1377,1382],"card-group",{},[1365,1366,1368],"card",{"icon":1367,"title":20,"to":21},"i-lucide-package","React, Next.js, Vue, Svelte, Astro, Solid, UnoCSS, and Angular — with peer deps.",[1365,1370,1372,1373,1376],{"icon":1371,"title":24,"to":25},"i-lucide-settings-2","Config Composer, ",[59,1374,1375],{},"command"," codemods, plugin renaming, versioning policy.",[1365,1378,1381],{"icon":1379,"title":1380,"to":29},"i-lucide-monitor","Editor & CI","VS Code, Neovim, editor-specific disables, and lint-staged.",[1365,1383,1385,1386,1389],{"icon":1384,"title":16,"to":17},"i-lucide-mountain","Compose with ",[59,1387,1388],{},"@nuxt\u002Feslint"," for auto-import-aware linting.",[83,1391,1393],{"id":1392},"faq","FAQ",[305,1395,1396],{"id":1194},"Prettier?",[56,1398,1399,1400,1403,1404,1409],{},"This config uses ESLint for both linting ",[78,1401,1402],{},"and"," formatting, so Prettier isn't needed. See ",[64,1405,1408],{"href":1406,"rel":1407},"https:\u002F\u002Fantfu.me\u002Fposts\u002Fwhy-not-prettier",[68],"Why I don't use Prettier"," by Anthony Fu for the reasoning.",[56,1411,1412,1413,807,1415,1417,1418,1420],{},"If you need to format files ESLint can't handle yet (",[59,1414,1099],{},[59,1416,1102],{},", etc.), use the ",[64,1419,120],{"href":119}," option — it wraps Prettier\u002Fdprint under the hood without adding a separate tool to your workflow.",[305,1422,1424],{"id":1423},"how-do-i-format-css","How do I format CSS?",[56,1426,1427,1428,1432,1433,798],{},"Opt in to the ",[64,1429,1430],{"href":119},[59,1431,120],{}," feature. It formats but does not lint — for proper CSS linting pair it with ",[64,1434,1270],{"href":1268,"rel":1435},[68],[305,1437,1439],{"id":1438},"curly-braces-style","Curly braces style?",[56,1441,1442,1443,1445],{},"PleaseAI enforces ",[59,1444,1050],{}," — always wrap control-flow bodies in braces:",[152,1447,1449],{"className":251,"code":1448,"language":253,"meta":158,"style":158},"\u002F\u002F ✓ required\nfunction example() {\n  if (foo) {\n    return true\n  }\n}\n\n\u002F\u002F ✗ rejected\nfunction example() {\n  if (foo) return true\n}\n",[59,1450,1451,1456,1468,1484,1492,1496,1500,1504,1509,1519,1534],{"__ignoreMap":158},[162,1452,1453],{"class":164,"line":165},[162,1454,1455],{"class":359},"\u002F\u002F ✓ required\n",[162,1457,1458,1460,1463,1466],{"class":164,"line":280},[162,1459,1066],{"class":846},[162,1461,1462],{"class":296}," example",[162,1464,1465],{"class":271},"()",[162,1467,372],{"class":271},[162,1469,1470,1473,1476,1479,1482],{"class":164,"line":287},[162,1471,1472],{"class":260},"  if",[162,1474,1475],{"class":366}," (",[162,1477,1478],{"class":264},"foo",[162,1480,1481],{"class":366},") ",[162,1483,353],{"class":271},[162,1485,1486,1489],{"class":164,"line":356},[162,1487,1488],{"class":260},"    return",[162,1490,1491],{"class":415}," true\n",[162,1493,1494],{"class":164,"line":363},[162,1495,900],{"class":271},[162,1497,1498],{"class":164,"line":375},[162,1499,905],{"class":271},[162,1501,1502],{"class":164,"line":390},[162,1503,284],{"emptyLinePlaceholder":283},[162,1505,1506],{"class":164,"line":396},[162,1507,1508],{"class":359},"\u002F\u002F ✗ rejected\n",[162,1510,1511,1513,1515,1517],{"class":164,"line":401},[162,1512,1066],{"class":846},[162,1514,1462],{"class":296},[162,1516,1465],{"class":271},[162,1518,372],{"class":271},[162,1520,1521,1523,1525,1527,1529,1532],{"class":164,"line":407},[162,1522,1472],{"class":260},[162,1524,1475],{"class":366},[162,1526,1478],{"class":264},[162,1528,1481],{"class":366},[162,1530,1531],{"class":260},"return",[162,1533,1491],{"class":415},[162,1535,1536],{"class":164,"line":421},[162,1537,905],{"class":271},[56,1539,1540,1541,1544,1545,1548],{},"This diverges from antfu's default (which allows brace-less single-line ",[59,1542,1543],{},"if","). We made this choice because brace-less bodies interact badly with our other rules like ",[59,1546,1547],{},"style\u002Fmax-statements-per-line"," — mixing them produces hard-to-read one-liners.",[305,1550,1552],{"id":1551},"top-level-function-style","Top-level function style?",[56,1554,1555,1556,1558,1559,1561,1562,316],{},"PleaseAI re-enables ",[59,1557,1057],{},", so top-level functions should use a ",[59,1560,1066],{}," declaration rather than an arrow assigned to a ",[59,1563,1564],{},"const",[152,1566,1568],{"className":251,"code":1567,"language":253,"meta":158,"style":158},"\u002F\u002F ✓ preferred\nexport function greet(name: string) {\n  return `Hello, ${name}`\n}\n\n\u002F\u002F ✗ flagged\nexport const greet = (name: string) => `Hello, ${name}`\n",[59,1569,1570,1575,1601,1620,1624,1628,1633],{"__ignoreMap":158},[162,1571,1572],{"class":164,"line":165},[162,1573,1574],{"class":359},"\u002F\u002F ✓ preferred\n",[162,1576,1577,1579,1582,1585,1587,1591,1593,1596,1599],{"class":164,"line":280},[162,1578,290],{"class":260},[162,1580,1581],{"class":846}," function",[162,1583,1584],{"class":296}," greet",[162,1586,350],{"class":271},[162,1588,1590],{"class":1589},"sHdIc","name",[162,1592,316],{"class":271},[162,1594,1595],{"class":168}," string",[162,1597,1598],{"class":271},")",[162,1600,372],{"class":271},[162,1602,1603,1606,1609,1612,1615,1617],{"class":164,"line":287},[162,1604,1605],{"class":260},"  return",[162,1607,1608],{"class":271}," `",[162,1610,1611],{"class":171},"Hello, ",[162,1613,1614],{"class":271},"${",[162,1616,1590],{"class":264},[162,1618,1619],{"class":271},"}`\n",[162,1621,1622],{"class":164,"line":356},[162,1623,905],{"class":271},[162,1625,1626],{"class":164,"line":363},[162,1627,284],{"emptyLinePlaceholder":283},[162,1629,1630],{"class":164,"line":375},[162,1631,1632],{"class":359},"\u002F\u002F ✗ flagged\n",[162,1634,1635,1637,1640,1643,1646,1648,1650,1652,1654,1656,1659,1661,1663,1665,1667],{"class":164,"line":390},[162,1636,290],{"class":260},[162,1638,1639],{"class":846}," const",[162,1641,1642],{"class":264}," greet ",[162,1644,1645],{"class":271},"=",[162,1647,1475],{"class":271},[162,1649,1590],{"class":1589},[162,1651,316],{"class":271},[162,1653,1595],{"class":168},[162,1655,1598],{"class":271},[162,1657,1658],{"class":846}," =>",[162,1660,1608],{"class":271},[162,1662,1611],{"class":171},[162,1664,1614],{"class":271},[162,1666,1590],{"class":264},[162,1668,1619],{"class":271},[56,1670,1671],{},"Arrow functions are still fine inside function bodies, as callbacks, or for inline JSX handlers — the rule only targets top-level declarations. If you disagree, override it:",[152,1673,1675],{"className":251,"code":1674,"filename":244,"language":253,"meta":158,"style":158},"import pleaseai from '@pleaseai\u002Feslint-config'\n\nexport default pleaseai({\n  rules: {\n    'antfu\u002Ftop-level-function': 'off',\n  },\n})\n",[59,1676,1677,1691,1695,1707,1716,1735,1739],{"__ignoreMap":158},[162,1678,1679,1681,1683,1685,1687,1689],{"class":164,"line":165},[162,1680,261],{"class":260},[162,1682,265],{"class":264},[162,1684,268],{"class":260},[162,1686,272],{"class":271},[162,1688,61],{"class":171},[162,1690,277],{"class":271},[162,1692,1693],{"class":164,"line":280},[162,1694,284],{"emptyLinePlaceholder":283},[162,1696,1697,1699,1701,1703,1705],{"class":164,"line":287},[162,1698,290],{"class":260},[162,1700,293],{"class":260},[162,1702,297],{"class":296},[162,1704,350],{"class":264},[162,1706,353],{"class":271},[162,1708,1709,1712,1714],{"class":164,"line":356},[162,1710,1711],{"class":366},"  rules",[162,1713,316],{"class":271},[162,1715,372],{"class":271},[162,1717,1718,1720,1722,1724,1726,1728,1731,1733],{"class":164,"line":363},[162,1719,458],{"class":271},[162,1721,1057],{"class":366},[162,1723,464],{"class":271},[162,1725,316],{"class":271},[162,1727,272],{"class":271},[162,1729,1730],{"class":171},"off",[162,1732,464],{"class":271},[162,1734,387],{"class":271},[162,1736,1737],{"class":164,"line":375},[162,1738,393],{"class":271},[162,1740,1741,1743],{"class":164,"line":390},[162,1742,480],{"class":271},[162,1744,483],{"class":264},[1746,1747,1748],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":158,"searchDepth":280,"depth":280,"links":1750},[1751,1752,1753,1758,1759,1760,1761,1762,1763],{"id":85,"depth":280,"text":86},{"id":146,"depth":280,"text":147},{"id":237,"depth":280,"text":238,"children":1754},[1755,1756,1757],{"id":307,"depth":287,"text":308},{"id":492,"depth":287,"text":493},{"id":622,"depth":287,"text":623},{"id":820,"depth":280,"text":821},{"id":919,"depth":280,"text":920},{"id":120,"depth":280,"text":1093},{"id":1274,"depth":280,"text":1275},{"id":1359,"depth":280,"text":1360},{"id":1392,"depth":280,"text":1393,"children":1764},[1765,1766,1767,1768],{"id":1194,"depth":287,"text":1396},{"id":1423,"depth":287,"text":1424},{"id":1438,"depth":287,"text":1439},{"id":1551,"depth":287,"text":1552},"Opinionated ESLint flat config for PleaseAI projects — built on @antfu\u002Feslint-config.","md",null,{},{"icon":10},{"title":5,"description":1769},"90UnKpLXK2NUSyj_oUkopJl29LvkjgyeUZTz2ONMtP0",[1771,1777],{"title":12,"path":13,"stem":14,"description":1778,"children":-1},"Lint package.json files with ESLint.",1776318162623]