[{"data":1,"prerenderedAt":5313},["ShallowReactive",2],{"navigation_docs":3,"-extending":44,"-extending-surround":5308},[4,8,12,16,20,24,28,32,36,40],{"title":5,"path":6,"stem":7},"CLI","\u002Fcli","1.cli",{"title":9,"path":10,"stem":11},"Nuxt","\u002Fnuxt","2.nuxt",{"title":13,"path":14,"stem":15},"Vue","\u002Fvue","3.vue",{"title":17,"path":18,"stem":19},"Vite","\u002Fvite","4.vite",{"title":21,"path":22,"stem":23},"Nitro","\u002Fnitro","5.nitro",{"title":25,"path":26,"stem":27},"TypeScript","\u002Ftypescript","6.typescript",{"title":29,"path":30,"stem":31},"shadcn","\u002Fshadcn","7.shadcn",{"title":33,"path":34,"stem":35},"Package","\u002Fpackage","8.package",{"title":37,"path":38,"stem":39},"Extending Doctor","\u002Fextending","9.extending",{"title":41,"path":42,"stem":43},"Pinia","\u002Fpinia","9.pinia",{"id":45,"title":37,"body":46,"description":5301,"extension":5302,"links":5303,"meta":5304,"navigation":156,"path":38,"seo":5306,"stem":39,"__hash__":5307},"docs\u002F9.extending.md",{"type":47,"value":48,"toc":5283},"minimark",[49,53,65,70,73,778,823,828,848,1318,1354,1357,1361,1420,2077,2089,2219,2230,2234,2243,2309,2327,2355,2359,2365,2429,2442,2446,2449,2452,2535,2575,2581,2701,2708,2712,2727,2897,3008,3014,3138,3151,3154,3165,3384,3394,3397,3451,3474,3501,3523,3541,3547,3551,3556,3959,4001,4005,4018,4365,4400,4433,4437,4510,4521,4527,4531,4545,4786,4833,4855,4884,4888,4913,4916,5135,5149,5170,5174,5196,5205,5219,5276,5279],[50,51,52],"p",{},"A Doctor Extension adds Rule Packs to a Doctor Run. A Rule Pack groups Rules, Presets, and the Diagnostic Codes those Rules emit. Use extensions for project-specific policies, or ship them with a library so its users get the library's diagnostics automatically.",[50,54,55,56,60,61,64],{},"Authoring APIs come from ",[57,58,59],"code",{},"vite-doctor\u002Fextension",". Test helpers come from ",[57,62,63],{},"vite-doctor\u002Ftestkit",".",[66,67,69],"h2",{"id":68},"write-a-doctor-extension","Write a Doctor Extension",[50,71,72],{},"This file defines one Rule, its Diagnostic Code, a Rule Pack, and the extension that registers the pack:",[74,75,81],"pre",{"className":76,"code":77,"filename":78,"language":79,"meta":80,"style":80},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  createRule,\n  defineDoctorDiagnostics,\n  defineDoctorExtension,\n  defineRulePack,\n} from \"vite-doctor\u002Fextension\";\n\nexport const acmeDiagnostics = defineDoctorDiagnostics(\n  [{ code: \"ACME0001\", ruleId: \"acme\u002Fno-legacy-client\" }],\n  { docsBase: \"https:\u002F\u002Facme.dev\u002Fdoctor\" },\n);\n\nexport const noLegacyClient = createRule({\n  meta: {\n    id: \"acme\u002Fno-legacy-client\",\n    title: \"Use the current Acme client\",\n    category: \"correctness\",\n    severity: \"warn\",\n    prefilter: { imports: [\"acme\u002Flegacy\"] },\n  },\n  create(ctx) {\n    return {\n      ImportDeclaration(node) {\n        if (node.source.value !== \"acme\u002Flegacy\") return;\n        ctx.report(\n          acmeDiagnostics.diagnostics.ACME0001({\n            why: \"`acme\u002Flegacy` is removed in Acme 3.\",\n            fix: \"Import `createClient` from `acme` instead.\",\n          }),\n          { range: ctx.range(node) },\n        );\n      },\n    };\n  },\n});\n\nexport const acmeRulePack = defineRulePack({\n  name: \"acme\",\n  version: \"1.0.0\",\n  rules: [noLegacyClient],\n  diagnostics: acmeDiagnostics,\n  presets: { recommended: [\"acme\u002Fno-legacy-client\"] },\n});\n\nexport default defineDoctorExtension({ name: \"acme\", rulePacks: [acmeRulePack] });\n","doctor\u002Fextension.ts","ts","",[57,82,83,96,106,114,122,130,151,158,181,227,248,256,261,282,292,308,325,342,359,391,397,413,421,436,474,487,506,523,540,550,577,585,591,597,602,611,616,635,652,669,682,695,722,731,736],{"__ignoreMap":80},[84,85,88,92],"span",{"class":86,"line":87},"line",1,[84,89,91],{"class":90},"s7zQu","import",[84,93,95],{"class":94},"sMK4o"," {\n",[84,97,99,103],{"class":86,"line":98},2,[84,100,102],{"class":101},"sTEyZ","  createRule",[84,104,105],{"class":94},",\n",[84,107,109,112],{"class":86,"line":108},3,[84,110,111],{"class":101},"  defineDoctorDiagnostics",[84,113,105],{"class":94},[84,115,117,120],{"class":86,"line":116},4,[84,118,119],{"class":101},"  defineDoctorExtension",[84,121,105],{"class":94},[84,123,125,128],{"class":86,"line":124},5,[84,126,127],{"class":101},"  defineRulePack",[84,129,105],{"class":94},[84,131,133,136,139,142,145,148],{"class":86,"line":132},6,[84,134,135],{"class":94},"}",[84,137,138],{"class":90}," from",[84,140,141],{"class":94}," \"",[84,143,59],{"class":144},"sfazB",[84,146,147],{"class":94},"\"",[84,149,150],{"class":94},";\n",[84,152,154],{"class":86,"line":153},7,[84,155,157],{"emptyLinePlaceholder":156},true,"\n",[84,159,161,164,168,171,174,178],{"class":86,"line":160},8,[84,162,163],{"class":90},"export",[84,165,167],{"class":166},"spNyl"," const",[84,169,170],{"class":101}," acmeDiagnostics ",[84,172,173],{"class":94},"=",[84,175,177],{"class":176},"s2Zo4"," defineDoctorDiagnostics",[84,179,180],{"class":101},"(\n",[84,182,184,187,190,194,197,199,202,204,207,210,212,214,217,219,222,225],{"class":86,"line":183},9,[84,185,186],{"class":101},"  [",[84,188,189],{"class":94},"{",[84,191,193],{"class":192},"swJcz"," code",[84,195,196],{"class":94},":",[84,198,141],{"class":94},[84,200,201],{"class":144},"ACME0001",[84,203,147],{"class":94},[84,205,206],{"class":94},",",[84,208,209],{"class":192}," ruleId",[84,211,196],{"class":94},[84,213,141],{"class":94},[84,215,216],{"class":144},"acme\u002Fno-legacy-client",[84,218,147],{"class":94},[84,220,221],{"class":94}," }",[84,223,224],{"class":101},"]",[84,226,105],{"class":94},[84,228,230,233,236,238,240,243,245],{"class":86,"line":229},10,[84,231,232],{"class":94},"  {",[84,234,235],{"class":192}," docsBase",[84,237,196],{"class":94},[84,239,141],{"class":94},[84,241,242],{"class":144},"https:\u002F\u002Facme.dev\u002Fdoctor",[84,244,147],{"class":94},[84,246,247],{"class":94}," },\n",[84,249,251,254],{"class":86,"line":250},11,[84,252,253],{"class":101},")",[84,255,150],{"class":94},[84,257,259],{"class":86,"line":258},12,[84,260,157],{"emptyLinePlaceholder":156},[84,262,264,266,268,271,273,276,279],{"class":86,"line":263},13,[84,265,163],{"class":90},[84,267,167],{"class":166},[84,269,270],{"class":101}," noLegacyClient ",[84,272,173],{"class":94},[84,274,275],{"class":176}," createRule",[84,277,278],{"class":101},"(",[84,280,281],{"class":94},"{\n",[84,283,285,288,290],{"class":86,"line":284},14,[84,286,287],{"class":192},"  meta",[84,289,196],{"class":94},[84,291,95],{"class":94},[84,293,295,298,300,302,304,306],{"class":86,"line":294},15,[84,296,297],{"class":192},"    id",[84,299,196],{"class":94},[84,301,141],{"class":94},[84,303,216],{"class":144},[84,305,147],{"class":94},[84,307,105],{"class":94},[84,309,311,314,316,318,321,323],{"class":86,"line":310},16,[84,312,313],{"class":192},"    title",[84,315,196],{"class":94},[84,317,141],{"class":94},[84,319,320],{"class":144},"Use the current Acme client",[84,322,147],{"class":94},[84,324,105],{"class":94},[84,326,328,331,333,335,338,340],{"class":86,"line":327},17,[84,329,330],{"class":192},"    category",[84,332,196],{"class":94},[84,334,141],{"class":94},[84,336,337],{"class":144},"correctness",[84,339,147],{"class":94},[84,341,105],{"class":94},[84,343,345,348,350,352,355,357],{"class":86,"line":344},18,[84,346,347],{"class":192},"    severity",[84,349,196],{"class":94},[84,351,141],{"class":94},[84,353,354],{"class":144},"warn",[84,356,147],{"class":94},[84,358,105],{"class":94},[84,360,362,365,367,370,373,375,378,380,383,385,388],{"class":86,"line":361},19,[84,363,364],{"class":192},"    prefilter",[84,366,196],{"class":94},[84,368,369],{"class":94}," {",[84,371,372],{"class":192}," imports",[84,374,196],{"class":94},[84,376,377],{"class":101}," [",[84,379,147],{"class":94},[84,381,382],{"class":144},"acme\u002Flegacy",[84,384,147],{"class":94},[84,386,387],{"class":101},"] ",[84,389,390],{"class":94},"},\n",[84,392,394],{"class":86,"line":393},20,[84,395,396],{"class":94},"  },\n",[84,398,400,403,405,409,411],{"class":86,"line":399},21,[84,401,402],{"class":192},"  create",[84,404,278],{"class":94},[84,406,408],{"class":407},"sHdIc","ctx",[84,410,253],{"class":94},[84,412,95],{"class":94},[84,414,416,419],{"class":86,"line":415},22,[84,417,418],{"class":90},"    return",[84,420,95],{"class":94},[84,422,424,427,429,432,434],{"class":86,"line":423},23,[84,425,426],{"class":192},"      ImportDeclaration",[84,428,278],{"class":94},[84,430,431],{"class":407},"node",[84,433,253],{"class":94},[84,435,95],{"class":94},[84,437,439,442,445,447,449,452,454,457,460,462,464,466,469,472],{"class":86,"line":438},24,[84,440,441],{"class":90},"        if",[84,443,444],{"class":192}," (",[84,446,431],{"class":101},[84,448,64],{"class":94},[84,450,451],{"class":101},"source",[84,453,64],{"class":94},[84,455,456],{"class":101},"value",[84,458,459],{"class":94}," !==",[84,461,141],{"class":94},[84,463,382],{"class":144},[84,465,147],{"class":94},[84,467,468],{"class":192},") ",[84,470,471],{"class":90},"return",[84,473,150],{"class":94},[84,475,477,480,482,485],{"class":86,"line":476},25,[84,478,479],{"class":101},"        ctx",[84,481,64],{"class":94},[84,483,484],{"class":176},"report",[84,486,180],{"class":192},[84,488,490,493,495,498,500,502,504],{"class":86,"line":489},26,[84,491,492],{"class":101},"          acmeDiagnostics",[84,494,64],{"class":94},[84,496,497],{"class":101},"diagnostics",[84,499,64],{"class":94},[84,501,201],{"class":176},[84,503,278],{"class":192},[84,505,281],{"class":94},[84,507,509,512,514,516,519,521],{"class":86,"line":508},27,[84,510,511],{"class":192},"            why",[84,513,196],{"class":94},[84,515,141],{"class":94},[84,517,518],{"class":144},"`acme\u002Flegacy` is removed in Acme 3.",[84,520,147],{"class":94},[84,522,105],{"class":94},[84,524,526,529,531,533,536,538],{"class":86,"line":525},28,[84,527,528],{"class":192},"            fix",[84,530,196],{"class":94},[84,532,141],{"class":94},[84,534,535],{"class":144},"Import `createClient` from `acme` instead.",[84,537,147],{"class":94},[84,539,105],{"class":94},[84,541,543,546,548],{"class":86,"line":542},29,[84,544,545],{"class":94},"          }",[84,547,253],{"class":192},[84,549,105],{"class":94},[84,551,553,556,559,561,564,566,569,571,573,575],{"class":86,"line":552},30,[84,554,555],{"class":94},"          {",[84,557,558],{"class":192}," range",[84,560,196],{"class":94},[84,562,563],{"class":101}," ctx",[84,565,64],{"class":94},[84,567,568],{"class":176},"range",[84,570,278],{"class":192},[84,572,431],{"class":101},[84,574,468],{"class":192},[84,576,390],{"class":94},[84,578,580,583],{"class":86,"line":579},31,[84,581,582],{"class":192},"        )",[84,584,150],{"class":94},[84,586,588],{"class":86,"line":587},32,[84,589,590],{"class":94},"      },\n",[84,592,594],{"class":86,"line":593},33,[84,595,596],{"class":94},"    };\n",[84,598,600],{"class":86,"line":599},34,[84,601,396],{"class":94},[84,603,605,607,609],{"class":86,"line":604},35,[84,606,135],{"class":94},[84,608,253],{"class":101},[84,610,150],{"class":94},[84,612,614],{"class":86,"line":613},36,[84,615,157],{"emptyLinePlaceholder":156},[84,617,619,621,623,626,628,631,633],{"class":86,"line":618},37,[84,620,163],{"class":90},[84,622,167],{"class":166},[84,624,625],{"class":101}," acmeRulePack ",[84,627,173],{"class":94},[84,629,630],{"class":176}," defineRulePack",[84,632,278],{"class":101},[84,634,281],{"class":94},[84,636,638,641,643,645,648,650],{"class":86,"line":637},38,[84,639,640],{"class":192},"  name",[84,642,196],{"class":94},[84,644,141],{"class":94},[84,646,647],{"class":144},"acme",[84,649,147],{"class":94},[84,651,105],{"class":94},[84,653,655,658,660,662,665,667],{"class":86,"line":654},39,[84,656,657],{"class":192},"  version",[84,659,196],{"class":94},[84,661,141],{"class":94},[84,663,664],{"class":144},"1.0.0",[84,666,147],{"class":94},[84,668,105],{"class":94},[84,670,672,675,677,680],{"class":86,"line":671},40,[84,673,674],{"class":192},"  rules",[84,676,196],{"class":94},[84,678,679],{"class":101}," [noLegacyClient]",[84,681,105],{"class":94},[84,683,685,688,690,693],{"class":86,"line":684},41,[84,686,687],{"class":192},"  diagnostics",[84,689,196],{"class":94},[84,691,692],{"class":101}," acmeDiagnostics",[84,694,105],{"class":94},[84,696,698,701,703,705,708,710,712,714,716,718,720],{"class":86,"line":697},42,[84,699,700],{"class":192},"  presets",[84,702,196],{"class":94},[84,704,369],{"class":94},[84,706,707],{"class":192}," recommended",[84,709,196],{"class":94},[84,711,377],{"class":101},[84,713,147],{"class":94},[84,715,216],{"class":144},[84,717,147],{"class":94},[84,719,387],{"class":101},[84,721,390],{"class":94},[84,723,725,727,729],{"class":86,"line":724},43,[84,726,135],{"class":94},[84,728,253],{"class":101},[84,730,150],{"class":94},[84,732,734],{"class":86,"line":733},44,[84,735,157],{"emptyLinePlaceholder":156},[84,737,739,741,744,747,749,751,754,756,758,760,762,764,767,769,772,774,776],{"class":86,"line":738},45,[84,740,163],{"class":90},[84,742,743],{"class":90}," default",[84,745,746],{"class":176}," defineDoctorExtension",[84,748,278],{"class":101},[84,750,189],{"class":94},[84,752,753],{"class":192}," name",[84,755,196],{"class":94},[84,757,141],{"class":94},[84,759,647],{"class":144},[84,761,147],{"class":94},[84,763,206],{"class":94},[84,765,766],{"class":192}," rulePacks",[84,768,196],{"class":94},[84,770,771],{"class":101}," [acmeRulePack] ",[84,773,135],{"class":94},[84,775,253],{"class":101},[84,777,150],{"class":94},[50,779,780,783,784,787,788,791,792,795,796,799,800,803,804,807,808,795,810,795,813,795,816,819,820,822],{},[57,781,782],{},"ctx.report"," takes a diagnostic created by a code handle. Every diagnostic needs ",[57,785,786],{},"why"," and ",[57,789,790],{},"fix",". The second argument is optional: ",[57,793,794],{},"ruleId",", ",[57,797,798],{},"severity",", and ",[57,801,802],{},"category"," default to the Rule's ",[57,805,806],{},"meta",", and you can add ",[57,809,568],{},[57,811,812],{},"file",[57,814,815],{},"evidence",[57,817,818],{},"confidence",", or a structured ",[57,821,790],{}," edit plan.",[824,825,827],"h3",{"id":826},"visit-script-nodes","Visit script nodes",[50,829,830,833,834,837,838,841,842,845,846,196],{},[57,831,832],{},"create(ctx)"," returns visitors keyed by ESTree node type, the same shape ESLint and oxlint use. Doctor walks each file's script once and calls a visitor only for nodes of its type. Add ",[57,835,836],{},":exit"," to run after the node's children. This Rule reports every ",[57,839,840],{},"createClient()"," call after the first one in a module, with ",[57,843,844],{},"ACME0002"," registered next to ",[57,847,201],{},[74,849,851],{"className":76,"code":850,"filename":78,"language":79,"meta":80,"style":80},"import { createRule, type ScriptAstNodeOf } from \"vite-doctor\u002Fextension\";\n\nexport const singleClient = createRule({\n  meta: {\n    id: \"acme\u002Fsingle-client\",\n    title: \"Create one Acme client per module\",\n    category: \"correctness\",\n    severity: \"warn\",\n    prefilter: { calls: [\"createClient\"] },\n  },\n  create(ctx) {\n    const clients: ScriptAstNodeOf\u003C\"CallExpression\">[] = [];\n    return {\n      CallExpression(node) {\n        if (node.callee.type === \"Identifier\" && node.callee.name === \"createClient\") {\n          clients.push(node);\n        }\n      },\n      \"Program:exit\"() {\n        for (const node of clients.slice(1)) {\n          ctx.report(\n            acmeDiagnostics.diagnostics.ACME0002({\n              why: \"Each client opens its own connection pool.\",\n              fix: \"Reuse the first client in this module.\",\n            }),\n            { range: ctx.range(node) },\n          );\n        }\n      },\n    };\n  },\n});\n",[57,852,853,881,885,902,910,925,940,954,968,994,998,1010,1046,1052,1065,1120,1138,1143,1147,1162,1195,1206,1223,1239,1255,1264,1287,1294,1298,1302,1306,1310],{"__ignoreMap":80},[84,854,855,857,859,861,863,866,869,871,873,875,877,879],{"class":86,"line":87},[84,856,91],{"class":90},[84,858,369],{"class":94},[84,860,275],{"class":101},[84,862,206],{"class":94},[84,864,865],{"class":90}," type",[84,867,868],{"class":101}," ScriptAstNodeOf",[84,870,221],{"class":94},[84,872,138],{"class":90},[84,874,141],{"class":94},[84,876,59],{"class":144},[84,878,147],{"class":94},[84,880,150],{"class":94},[84,882,883],{"class":86,"line":98},[84,884,157],{"emptyLinePlaceholder":156},[84,886,887,889,891,894,896,898,900],{"class":86,"line":108},[84,888,163],{"class":90},[84,890,167],{"class":166},[84,892,893],{"class":101}," singleClient ",[84,895,173],{"class":94},[84,897,275],{"class":176},[84,899,278],{"class":101},[84,901,281],{"class":94},[84,903,904,906,908],{"class":86,"line":116},[84,905,287],{"class":192},[84,907,196],{"class":94},[84,909,95],{"class":94},[84,911,912,914,916,918,921,923],{"class":86,"line":124},[84,913,297],{"class":192},[84,915,196],{"class":94},[84,917,141],{"class":94},[84,919,920],{"class":144},"acme\u002Fsingle-client",[84,922,147],{"class":94},[84,924,105],{"class":94},[84,926,927,929,931,933,936,938],{"class":86,"line":132},[84,928,313],{"class":192},[84,930,196],{"class":94},[84,932,141],{"class":94},[84,934,935],{"class":144},"Create one Acme client per module",[84,937,147],{"class":94},[84,939,105],{"class":94},[84,941,942,944,946,948,950,952],{"class":86,"line":153},[84,943,330],{"class":192},[84,945,196],{"class":94},[84,947,141],{"class":94},[84,949,337],{"class":144},[84,951,147],{"class":94},[84,953,105],{"class":94},[84,955,956,958,960,962,964,966],{"class":86,"line":160},[84,957,347],{"class":192},[84,959,196],{"class":94},[84,961,141],{"class":94},[84,963,354],{"class":144},[84,965,147],{"class":94},[84,967,105],{"class":94},[84,969,970,972,974,976,979,981,983,985,988,990,992],{"class":86,"line":183},[84,971,364],{"class":192},[84,973,196],{"class":94},[84,975,369],{"class":94},[84,977,978],{"class":192}," calls",[84,980,196],{"class":94},[84,982,377],{"class":101},[84,984,147],{"class":94},[84,986,987],{"class":144},"createClient",[84,989,147],{"class":94},[84,991,387],{"class":101},[84,993,390],{"class":94},[84,995,996],{"class":86,"line":229},[84,997,396],{"class":94},[84,999,1000,1002,1004,1006,1008],{"class":86,"line":250},[84,1001,402],{"class":192},[84,1003,278],{"class":94},[84,1005,408],{"class":407},[84,1007,253],{"class":94},[84,1009,95],{"class":94},[84,1011,1012,1015,1018,1020,1023,1026,1028,1031,1033,1036,1039,1041,1044],{"class":86,"line":258},[84,1013,1014],{"class":166},"    const",[84,1016,1017],{"class":101}," clients",[84,1019,196],{"class":94},[84,1021,868],{"class":1022},"sBMFI",[84,1024,1025],{"class":94},"\u003C",[84,1027,147],{"class":94},[84,1029,1030],{"class":144},"CallExpression",[84,1032,147],{"class":94},[84,1034,1035],{"class":94},">",[84,1037,1038],{"class":192},"[] ",[84,1040,173],{"class":94},[84,1042,1043],{"class":192}," []",[84,1045,150],{"class":94},[84,1047,1048,1050],{"class":86,"line":263},[84,1049,418],{"class":90},[84,1051,95],{"class":94},[84,1053,1054,1057,1059,1061,1063],{"class":86,"line":284},[84,1055,1056],{"class":192},"      CallExpression",[84,1058,278],{"class":94},[84,1060,431],{"class":407},[84,1062,253],{"class":94},[84,1064,95],{"class":94},[84,1066,1067,1069,1071,1073,1075,1078,1080,1083,1086,1088,1091,1093,1096,1099,1101,1103,1105,1108,1110,1112,1114,1116,1118],{"class":86,"line":294},[84,1068,441],{"class":90},[84,1070,444],{"class":192},[84,1072,431],{"class":101},[84,1074,64],{"class":94},[84,1076,1077],{"class":101},"callee",[84,1079,64],{"class":94},[84,1081,1082],{"class":101},"type",[84,1084,1085],{"class":94}," ===",[84,1087,141],{"class":94},[84,1089,1090],{"class":144},"Identifier",[84,1092,147],{"class":94},[84,1094,1095],{"class":94}," &&",[84,1097,1098],{"class":101}," node",[84,1100,64],{"class":94},[84,1102,1077],{"class":101},[84,1104,64],{"class":94},[84,1106,1107],{"class":101},"name",[84,1109,1085],{"class":94},[84,1111,141],{"class":94},[84,1113,987],{"class":144},[84,1115,147],{"class":94},[84,1117,468],{"class":192},[84,1119,281],{"class":94},[84,1121,1122,1125,1127,1130,1132,1134,1136],{"class":86,"line":310},[84,1123,1124],{"class":101},"          clients",[84,1126,64],{"class":94},[84,1128,1129],{"class":176},"push",[84,1131,278],{"class":192},[84,1133,431],{"class":101},[84,1135,253],{"class":192},[84,1137,150],{"class":94},[84,1139,1140],{"class":86,"line":327},[84,1141,1142],{"class":94},"        }\n",[84,1144,1145],{"class":86,"line":344},[84,1146,590],{"class":94},[84,1148,1149,1152,1155,1157,1160],{"class":86,"line":361},[84,1150,1151],{"class":94},"      \"",[84,1153,1154],{"class":144},"Program:exit",[84,1156,147],{"class":94},[84,1158,1159],{"class":94},"()",[84,1161,95],{"class":94},[84,1163,1164,1167,1169,1172,1174,1177,1179,1181,1184,1186,1190,1193],{"class":86,"line":393},[84,1165,1166],{"class":90},"        for",[84,1168,444],{"class":192},[84,1170,1171],{"class":166},"const",[84,1173,1098],{"class":101},[84,1175,1176],{"class":94}," of",[84,1178,1017],{"class":101},[84,1180,64],{"class":94},[84,1182,1183],{"class":176},"slice",[84,1185,278],{"class":192},[84,1187,1189],{"class":1188},"sbssI","1",[84,1191,1192],{"class":192},")) ",[84,1194,281],{"class":94},[84,1196,1197,1200,1202,1204],{"class":86,"line":399},[84,1198,1199],{"class":101},"          ctx",[84,1201,64],{"class":94},[84,1203,484],{"class":176},[84,1205,180],{"class":192},[84,1207,1208,1211,1213,1215,1217,1219,1221],{"class":86,"line":415},[84,1209,1210],{"class":101},"            acmeDiagnostics",[84,1212,64],{"class":94},[84,1214,497],{"class":101},[84,1216,64],{"class":94},[84,1218,844],{"class":176},[84,1220,278],{"class":192},[84,1222,281],{"class":94},[84,1224,1225,1228,1230,1232,1235,1237],{"class":86,"line":423},[84,1226,1227],{"class":192},"              why",[84,1229,196],{"class":94},[84,1231,141],{"class":94},[84,1233,1234],{"class":144},"Each client opens its own connection pool.",[84,1236,147],{"class":94},[84,1238,105],{"class":94},[84,1240,1241,1244,1246,1248,1251,1253],{"class":86,"line":438},[84,1242,1243],{"class":192},"              fix",[84,1245,196],{"class":94},[84,1247,141],{"class":94},[84,1249,1250],{"class":144},"Reuse the first client in this module.",[84,1252,147],{"class":94},[84,1254,105],{"class":94},[84,1256,1257,1260,1262],{"class":86,"line":476},[84,1258,1259],{"class":94},"            }",[84,1261,253],{"class":192},[84,1263,105],{"class":94},[84,1265,1266,1269,1271,1273,1275,1277,1279,1281,1283,1285],{"class":86,"line":489},[84,1267,1268],{"class":94},"            {",[84,1270,558],{"class":192},[84,1272,196],{"class":94},[84,1274,563],{"class":101},[84,1276,64],{"class":94},[84,1278,568],{"class":176},[84,1280,278],{"class":192},[84,1282,431],{"class":101},[84,1284,468],{"class":192},[84,1286,390],{"class":94},[84,1288,1289,1292],{"class":86,"line":508},[84,1290,1291],{"class":192},"          )",[84,1293,150],{"class":94},[84,1295,1296],{"class":86,"line":525},[84,1297,1142],{"class":94},[84,1299,1300],{"class":86,"line":542},[84,1301,590],{"class":94},[84,1303,1304],{"class":86,"line":552},[84,1305,596],{"class":94},[84,1307,1308],{"class":86,"line":579},[84,1309,396],{"class":94},[84,1311,1312,1314,1316],{"class":86,"line":587},[84,1313,135],{"class":94},[84,1315,253],{"class":101},[84,1317,150],{"class":94},[50,1319,1320,1321,1323,1324,1327,1328,1330,1331,1338,1339,1342,1343,1346,1347,1349,1350,1353],{},"Each visitor's ",[57,1322,431],{}," parameter is typed for its key: ",[57,1325,1326],{},"CallExpression(node)"," receives a ",[57,1329,1030],{},". Script ASTs come from ",[1332,1333,1337],"a",{"href":1334,"rel":1335},"https:\u002F\u002Foxc.rs\u002Fdocs\u002Fguide\u002Fusage\u002Fparser",[1336],"nofollow","oxc-parser",", so the node types match its ESTree output, including TypeScript and JSX nodes. To type a helper, use ",[57,1340,1341],{},"ScriptAstNodeOf\u003C\"CallExpression\">"," or the ",[57,1344,1345],{},"ScriptAstNode"," union from ",[57,1348,59],{},". Vue SFC Rules can also use the ",[57,1351,1352],{},"SFC"," hook and template visitors.",[50,1355,1356],{},"Doctor links script parents before any visitor runs. Visitors must treat the AST as read-only.",[824,1358,1360],{"id":1359},"visit-template-nodes","Visit template nodes",[50,1362,1363,1364,1367,1368,795,1371,795,1374,795,1377,795,1380,795,1383,799,1386,1389,1390,1393,1394,1397,1398,1401,1402,1405,1406,1409,1410,787,1413,1416,1417,196],{},"For Vue SFCs, return a ",[57,1365,1366],{},"template"," object with visitors keyed by node kind: ",[57,1369,1370],{},"root",[57,1372,1373],{},"element",[57,1375,1376],{},"attribute",[57,1378,1379],{},"directive",[57,1381,1382],{},"text",[57,1384,1385],{},"interpolation",[57,1387,1388],{},"comment",". Doctor walks the ",[57,1391,1392],{},"\u003Ctemplate>"," AST that ",[57,1395,1396],{},"@vue\u002Fcompiler-sfc"," builds when it parses the SFC, so template visitors add no parse of their own. This Rule reports ",[57,1399,1400],{},"\u003CAcmeImage>"," elements without alt text and ",[57,1403,1404],{},":src"," bindings to plain ",[57,1407,1408],{},"http:"," URLs, with ",[57,1411,1412],{},"ACME0003",[57,1414,1415],{},"ACME0004"," registered for ",[57,1418,1419],{},"acme\u002Fimage",[74,1421,1423],{"className":76,"code":1422,"filename":78,"language":79,"meta":80,"style":80},"export const acmeImage = createRule({\n  meta: {\n    id: \"acme\u002Fimage\",\n    title: \"Use accessible, secure Acme images\",\n    category: \"a11y\",\n    severity: \"warn\",\n  },\n  create(ctx) {\n    return {\n      template: {\n        element(node) {\n          if (node.tag !== \"AcmeImage\") return;\n          if (\n            ctx.helpers.hasVueAttribute(node, \"alt\") ||\n            ctx.helpers.hasVueDirective(node, \"bind\", \"alt\")\n          )\n            return;\n          ctx.report(\n            acmeDiagnostics.diagnostics.ACME0003({\n              why: \"Screen readers announce an image without alt text by its file name.\",\n              fix: 'Add alt text, or alt=\"\" for a decorative image.',\n            }),\n            { range: ctx.range(node) },\n          );\n        },\n        directive(node, element) {\n          if (element.tag !== \"AcmeImage\" || node.name !== \"bind\" || node.arg?.content !== \"src\")\n            return;\n          const expression = node.exp && ctx.helpers.parseTemplateExpression(node.exp);\n          if (expression?.type !== \"Literal\" || !String(expression.value).startsWith(\"http:\"))\n            return;\n          ctx.report(\n            acmeDiagnostics.diagnostics.ACME0004({\n              why: \"An http: image on an https: page is mixed content that browsers upgrade or block.\",\n              fix: \"Serve the image over https:.\",\n            }),\n            { range: ctx.range(expression) },\n          );\n        },\n      },\n    };\n  },\n});\n",[57,1424,1425,1442,1450,1464,1479,1494,1508,1512,1524,1530,1539,1552,1581,1588,1621,1658,1663,1670,1680,1696,1711,1728,1736,1758,1764,1769,1787,1850,1856,1899,1955,1961,1971,1987,2002,2017,2025,2047,2053,2057,2061,2065,2069],{"__ignoreMap":80},[84,1426,1427,1429,1431,1434,1436,1438,1440],{"class":86,"line":87},[84,1428,163],{"class":90},[84,1430,167],{"class":166},[84,1432,1433],{"class":101}," acmeImage ",[84,1435,173],{"class":94},[84,1437,275],{"class":176},[84,1439,278],{"class":101},[84,1441,281],{"class":94},[84,1443,1444,1446,1448],{"class":86,"line":98},[84,1445,287],{"class":192},[84,1447,196],{"class":94},[84,1449,95],{"class":94},[84,1451,1452,1454,1456,1458,1460,1462],{"class":86,"line":108},[84,1453,297],{"class":192},[84,1455,196],{"class":94},[84,1457,141],{"class":94},[84,1459,1419],{"class":144},[84,1461,147],{"class":94},[84,1463,105],{"class":94},[84,1465,1466,1468,1470,1472,1475,1477],{"class":86,"line":116},[84,1467,313],{"class":192},[84,1469,196],{"class":94},[84,1471,141],{"class":94},[84,1473,1474],{"class":144},"Use accessible, secure Acme images",[84,1476,147],{"class":94},[84,1478,105],{"class":94},[84,1480,1481,1483,1485,1487,1490,1492],{"class":86,"line":124},[84,1482,330],{"class":192},[84,1484,196],{"class":94},[84,1486,141],{"class":94},[84,1488,1489],{"class":144},"a11y",[84,1491,147],{"class":94},[84,1493,105],{"class":94},[84,1495,1496,1498,1500,1502,1504,1506],{"class":86,"line":132},[84,1497,347],{"class":192},[84,1499,196],{"class":94},[84,1501,141],{"class":94},[84,1503,354],{"class":144},[84,1505,147],{"class":94},[84,1507,105],{"class":94},[84,1509,1510],{"class":86,"line":153},[84,1511,396],{"class":94},[84,1513,1514,1516,1518,1520,1522],{"class":86,"line":160},[84,1515,402],{"class":192},[84,1517,278],{"class":94},[84,1519,408],{"class":407},[84,1521,253],{"class":94},[84,1523,95],{"class":94},[84,1525,1526,1528],{"class":86,"line":183},[84,1527,418],{"class":90},[84,1529,95],{"class":94},[84,1531,1532,1535,1537],{"class":86,"line":229},[84,1533,1534],{"class":192},"      template",[84,1536,196],{"class":94},[84,1538,95],{"class":94},[84,1540,1541,1544,1546,1548,1550],{"class":86,"line":250},[84,1542,1543],{"class":192},"        element",[84,1545,278],{"class":94},[84,1547,431],{"class":407},[84,1549,253],{"class":94},[84,1551,95],{"class":94},[84,1553,1554,1557,1559,1561,1563,1566,1568,1570,1573,1575,1577,1579],{"class":86,"line":258},[84,1555,1556],{"class":90},"          if",[84,1558,444],{"class":192},[84,1560,431],{"class":101},[84,1562,64],{"class":94},[84,1564,1565],{"class":101},"tag",[84,1567,459],{"class":94},[84,1569,141],{"class":94},[84,1571,1572],{"class":144},"AcmeImage",[84,1574,147],{"class":94},[84,1576,468],{"class":192},[84,1578,471],{"class":90},[84,1580,150],{"class":94},[84,1582,1583,1585],{"class":86,"line":263},[84,1584,1556],{"class":90},[84,1586,1587],{"class":192}," (\n",[84,1589,1590,1593,1595,1598,1600,1603,1605,1607,1609,1611,1614,1616,1618],{"class":86,"line":284},[84,1591,1592],{"class":101},"            ctx",[84,1594,64],{"class":94},[84,1596,1597],{"class":101},"helpers",[84,1599,64],{"class":94},[84,1601,1602],{"class":176},"hasVueAttribute",[84,1604,278],{"class":192},[84,1606,431],{"class":101},[84,1608,206],{"class":94},[84,1610,141],{"class":94},[84,1612,1613],{"class":144},"alt",[84,1615,147],{"class":94},[84,1617,468],{"class":192},[84,1619,1620],{"class":94},"||\n",[84,1622,1623,1625,1627,1629,1631,1634,1636,1638,1640,1642,1645,1647,1649,1651,1653,1655],{"class":86,"line":294},[84,1624,1592],{"class":101},[84,1626,64],{"class":94},[84,1628,1597],{"class":101},[84,1630,64],{"class":94},[84,1632,1633],{"class":176},"hasVueDirective",[84,1635,278],{"class":192},[84,1637,431],{"class":101},[84,1639,206],{"class":94},[84,1641,141],{"class":94},[84,1643,1644],{"class":144},"bind",[84,1646,147],{"class":94},[84,1648,206],{"class":94},[84,1650,141],{"class":94},[84,1652,1613],{"class":144},[84,1654,147],{"class":94},[84,1656,1657],{"class":192},")\n",[84,1659,1660],{"class":86,"line":310},[84,1661,1662],{"class":192},"          )\n",[84,1664,1665,1668],{"class":86,"line":327},[84,1666,1667],{"class":90},"            return",[84,1669,150],{"class":94},[84,1671,1672,1674,1676,1678],{"class":86,"line":344},[84,1673,1199],{"class":101},[84,1675,64],{"class":94},[84,1677,484],{"class":176},[84,1679,180],{"class":192},[84,1681,1682,1684,1686,1688,1690,1692,1694],{"class":86,"line":361},[84,1683,1210],{"class":101},[84,1685,64],{"class":94},[84,1687,497],{"class":101},[84,1689,64],{"class":94},[84,1691,1412],{"class":176},[84,1693,278],{"class":192},[84,1695,281],{"class":94},[84,1697,1698,1700,1702,1704,1707,1709],{"class":86,"line":393},[84,1699,1227],{"class":192},[84,1701,196],{"class":94},[84,1703,141],{"class":94},[84,1705,1706],{"class":144},"Screen readers announce an image without alt text by its file name.",[84,1708,147],{"class":94},[84,1710,105],{"class":94},[84,1712,1713,1715,1717,1720,1723,1726],{"class":86,"line":399},[84,1714,1243],{"class":192},[84,1716,196],{"class":94},[84,1718,1719],{"class":94}," '",[84,1721,1722],{"class":144},"Add alt text, or alt=\"\" for a decorative image.",[84,1724,1725],{"class":94},"'",[84,1727,105],{"class":94},[84,1729,1730,1732,1734],{"class":86,"line":415},[84,1731,1259],{"class":94},[84,1733,253],{"class":192},[84,1735,105],{"class":94},[84,1737,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756],{"class":86,"line":423},[84,1739,1268],{"class":94},[84,1741,558],{"class":192},[84,1743,196],{"class":94},[84,1745,563],{"class":101},[84,1747,64],{"class":94},[84,1749,568],{"class":176},[84,1751,278],{"class":192},[84,1753,431],{"class":101},[84,1755,468],{"class":192},[84,1757,390],{"class":94},[84,1759,1760,1762],{"class":86,"line":438},[84,1761,1291],{"class":192},[84,1763,150],{"class":94},[84,1765,1766],{"class":86,"line":476},[84,1767,1768],{"class":94},"        },\n",[84,1770,1771,1774,1776,1778,1780,1783,1785],{"class":86,"line":489},[84,1772,1773],{"class":192},"        directive",[84,1775,278],{"class":94},[84,1777,431],{"class":407},[84,1779,206],{"class":94},[84,1781,1782],{"class":407}," element",[84,1784,253],{"class":94},[84,1786,95],{"class":94},[84,1788,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1833,1836,1839,1841,1843,1846,1848],{"class":86,"line":508},[84,1790,1556],{"class":90},[84,1792,444],{"class":192},[84,1794,1373],{"class":101},[84,1796,64],{"class":94},[84,1798,1565],{"class":101},[84,1800,459],{"class":94},[84,1802,141],{"class":94},[84,1804,1572],{"class":144},[84,1806,147],{"class":94},[84,1808,1809],{"class":94}," ||",[84,1811,1098],{"class":101},[84,1813,64],{"class":94},[84,1815,1107],{"class":101},[84,1817,459],{"class":94},[84,1819,141],{"class":94},[84,1821,1644],{"class":144},[84,1823,147],{"class":94},[84,1825,1809],{"class":94},[84,1827,1098],{"class":101},[84,1829,64],{"class":94},[84,1831,1832],{"class":101},"arg",[84,1834,1835],{"class":94},"?.",[84,1837,1838],{"class":101},"content",[84,1840,459],{"class":94},[84,1842,141],{"class":94},[84,1844,1845],{"class":144},"src",[84,1847,147],{"class":94},[84,1849,1657],{"class":192},[84,1851,1852,1854],{"class":86,"line":525},[84,1853,1667],{"class":90},[84,1855,150],{"class":94},[84,1857,1858,1861,1864,1867,1869,1871,1874,1876,1878,1880,1882,1884,1887,1889,1891,1893,1895,1897],{"class":86,"line":542},[84,1859,1860],{"class":166},"          const",[84,1862,1863],{"class":101}," expression",[84,1865,1866],{"class":94}," =",[84,1868,1098],{"class":101},[84,1870,64],{"class":94},[84,1872,1873],{"class":101},"exp",[84,1875,1095],{"class":94},[84,1877,563],{"class":101},[84,1879,64],{"class":94},[84,1881,1597],{"class":101},[84,1883,64],{"class":94},[84,1885,1886],{"class":176},"parseTemplateExpression",[84,1888,278],{"class":192},[84,1890,431],{"class":101},[84,1892,64],{"class":94},[84,1894,1873],{"class":101},[84,1896,253],{"class":192},[84,1898,150],{"class":94},[84,1900,1901,1903,1905,1908,1910,1912,1914,1916,1919,1921,1923,1926,1929,1931,1933,1935,1937,1939,1941,1944,1946,1948,1950,1952],{"class":86,"line":552},[84,1902,1556],{"class":90},[84,1904,444],{"class":192},[84,1906,1907],{"class":101},"expression",[84,1909,1835],{"class":94},[84,1911,1082],{"class":101},[84,1913,459],{"class":94},[84,1915,141],{"class":94},[84,1917,1918],{"class":144},"Literal",[84,1920,147],{"class":94},[84,1922,1809],{"class":94},[84,1924,1925],{"class":94}," !",[84,1927,1928],{"class":176},"String",[84,1930,278],{"class":192},[84,1932,1907],{"class":101},[84,1934,64],{"class":94},[84,1936,456],{"class":101},[84,1938,253],{"class":192},[84,1940,64],{"class":94},[84,1942,1943],{"class":176},"startsWith",[84,1945,278],{"class":192},[84,1947,147],{"class":94},[84,1949,1408],{"class":144},[84,1951,147],{"class":94},[84,1953,1954],{"class":192},"))\n",[84,1956,1957,1959],{"class":86,"line":579},[84,1958,1667],{"class":90},[84,1960,150],{"class":94},[84,1962,1963,1965,1967,1969],{"class":86,"line":587},[84,1964,1199],{"class":101},[84,1966,64],{"class":94},[84,1968,484],{"class":176},[84,1970,180],{"class":192},[84,1972,1973,1975,1977,1979,1981,1983,1985],{"class":86,"line":593},[84,1974,1210],{"class":101},[84,1976,64],{"class":94},[84,1978,497],{"class":101},[84,1980,64],{"class":94},[84,1982,1415],{"class":176},[84,1984,278],{"class":192},[84,1986,281],{"class":94},[84,1988,1989,1991,1993,1995,1998,2000],{"class":86,"line":599},[84,1990,1227],{"class":192},[84,1992,196],{"class":94},[84,1994,141],{"class":94},[84,1996,1997],{"class":144},"An http: image on an https: page is mixed content that browsers upgrade or block.",[84,1999,147],{"class":94},[84,2001,105],{"class":94},[84,2003,2004,2006,2008,2010,2013,2015],{"class":86,"line":604},[84,2005,1243],{"class":192},[84,2007,196],{"class":94},[84,2009,141],{"class":94},[84,2011,2012],{"class":144},"Serve the image over https:.",[84,2014,147],{"class":94},[84,2016,105],{"class":94},[84,2018,2019,2021,2023],{"class":86,"line":613},[84,2020,1259],{"class":94},[84,2022,253],{"class":192},[84,2024,105],{"class":94},[84,2026,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045],{"class":86,"line":618},[84,2028,1268],{"class":94},[84,2030,558],{"class":192},[84,2032,196],{"class":94},[84,2034,563],{"class":101},[84,2036,64],{"class":94},[84,2038,568],{"class":176},[84,2040,278],{"class":192},[84,2042,1907],{"class":101},[84,2044,468],{"class":192},[84,2046,390],{"class":94},[84,2048,2049,2051],{"class":86,"line":637},[84,2050,1291],{"class":192},[84,2052,150],{"class":94},[84,2054,2055],{"class":86,"line":654},[84,2056,1768],{"class":94},[84,2058,2059],{"class":86,"line":671},[84,2060,590],{"class":94},[84,2062,2063],{"class":86,"line":684},[84,2064,596],{"class":94},[84,2066,2067],{"class":86,"line":697},[84,2068,396],{"class":94},[84,2070,2071,2073,2075],{"class":86,"line":724},[84,2072,135],{"class":94},[84,2074,253],{"class":101},[84,2076,150],{"class":94},[50,2078,2079,2080,795,2083,2086,2087,196],{},"Nodes are the compiler-dom nodes Vue's compiler produces, typed as ",[57,2081,2082],{},"TemplateElementNode",[57,2084,2085],{},"TemplateDirectiveNode",", and so on in ",[57,2088,59],{},[2090,2091,2092,2101,2111,2140,2172,2206],"ul",{},[2093,2094,2095,2096,787,2098,2100],"li",{},"Each visitor receives the node and its parent. ",[57,2097,1376],{},[57,2099,1379],{}," receive the element they belong to; other kinds receive their parent element or the template root.",[2093,2102,2103,2104,2107,2108,2110],{},"An element's attributes and directives are visited in source order before its children. ",[57,2105,2106],{},"\"element:exit\""," and the other ",[57,2109,836],{}," keys run after a node's props and children, so a Rule can track ancestors with a counter or stack.",[2093,2112,2113,2116,2117,795,2120,2123,2124,2127,2128,2131,2132,2135,2136,2139],{},[57,2114,2115],{},"element.tag"," is the tag as written, such as ",[57,2118,2119],{},"button",[57,2121,2122],{},"NuxtLink",", or ",[57,2125,2126],{},"router-view",". ",[57,2129,2130],{},"element.props"," holds static attributes (",[57,2133,2134],{},"type: 6",") and directives (",[57,2137,2138],{},"type: 7",").",[2093,2141,2142,2143,795,2146,799,2149,2152,2153,2155,2156,795,2158,799,2161,2164,2165,2127,2168,2171],{},"Directive shorthands are normalized: ",[57,2144,2145],{},":href",[57,2147,2148],{},"@click",[57,2150,2151],{},"#default"," have ",[57,2154,1107],{}," ",[57,2157,1644],{},[57,2159,2160],{},"on",[57,2162,2163],{},"slot",", and a static argument in ",[57,2166,2167],{},"arg.content",[57,2169,2170],{},"rawName"," keeps the attribute name as written.",[2093,2173,2174,2175,2178,2179,2127,2182,2185,2186,2189,2190,2193,2194,2197,2198,2201,2202,2205],{},"A static attribute value is ",[57,2176,2177],{},"attribute.value?.content",". Directive values and interpolations are strings in ",[57,2180,2181],{},"exp.content",[57,2183,2184],{},"ctx.helpers.parseTemplateExpression(exp)"," parses one with oxc on first use, shares the result with every Rule, and returns ",[57,2187,2188],{},"null"," for a whole ",[57,2191,2192],{},"v-for"," (parse ",[57,2195,2196],{},"forParseResult.source","), ",[57,2199,2200],{},"v-slot"," parameters, and ",[57,2203,2204],{},"v-on"," handlers with several statements.",[2093,2207,2208,2209,2212,2213,2216,2217,64],{},"Template nodes and parsed expressions carry SFC offsets, so ",[57,2210,2211],{},"ctx.range(node)"," points at the source. ",[57,2214,2215],{},"ctx.file.templateAst"," is the root, for Rules that need the whole template in ",[57,2218,832],{},[50,2220,2221,2222,2225,2226,2229],{},"Template visitors do not run on ",[57,2223,2224],{},"\u003Ctemplate src>"," or on templates with a non-HTML ",[57,2227,2228],{},"lang",", such as Pug.",[824,2231,2233],{"id":2232},"skip-files-that-cannot-match","Skip files that cannot match",[50,2235,2236,2239,2240,2242],{},[57,2237,2238],{},"meta.prefilter"," skips a Rule on files that cannot produce its Diagnostics. Doctor does not call ",[57,2241,832],{}," for those files. A Rule runs on a file when any listed signal is present:",[2244,2245,2246,2259],"table",{},[2247,2248,2249],"thead",{},[2250,2251,2252,2256],"tr",{},[2253,2254,2255],"th",{},"Field",[2253,2257,2258],{},"Matches",[2260,2261,2262,2284,2299],"tbody",{},[2250,2263,2264,2270],{},[2265,2266,2267],"td",{},[57,2268,2269],{},"calls",[2265,2271,2272,2273,2276,2277,2127,2280,2283],{},"Call expressions by callee name, such as ",[57,2274,2275],{},"useFetch"," or ",[57,2278,2279],{},"Math.random",[57,2281,2282],{},"new"," expressions do not count.",[2250,2285,2286,2291],{},[2265,2287,2288],{},[57,2289,2290],{},"imports",[2265,2292,2293,2294,2296,2297,64],{},"Static ",[57,2295,91],{}," declarations by exact source, such as ",[57,2298,382],{},[2250,2300,2301,2306],{},[2265,2302,2303],{},[57,2304,2305],{},"names",[2265,2307,2308],{},"Names the file text could spell, including through escape sequences. Use it for aliases and reads.",[50,2310,2311,2312,795,2314,2316,2317,2320,2321,2323,2324,2326],{},"List every signal your Rule reports from. If a Rule also reports from ",[57,2313,832],{},[57,2315,1352],{},", or template visitors, or follows aliases such as ",[57,2318,2319],{},"const load = createClient",", a ",[57,2322,2269],{}," prefilter can hide real Diagnostics; use ",[57,2325,2305],{}," or omit the prefilter.",[50,2328,2329,2330,2333,2334,2337,2338,2341,2342,795,2344,2347,2348,2351,2352,64],{},"Rule Packs without ",[57,2331,2332],{},"activation"," run their ",[57,2335,2336],{},"recommended"," Preset whenever the extension is registered. Set ",[57,2339,2340],{},"activation: { packages: [\"acme\"] }"," to run only when the project depends on ",[57,2343,647],{},[57,2345,2346],{},"activation: { frameworks: [\"vue\", \"nuxt\"] }"," to run only for Vue or Nuxt packages, or ",[57,2349,2350],{},"activation: false"," to require an explicit ",[57,2353,2354],{},"extends: [\"auto\", \"acme\u002Frecommended\"]",[824,2356,2358],{"id":2357},"diagnostic-codes","Diagnostic Codes",[50,2360,2361,2362,2364],{},"A Diagnostic Code is a package-owned uppercase prefix followed by four digits, such as ",[57,2363,201],{},". Pick a prefix that belongs to your package and never reuse a code.",[2090,2366,2367,2405,2411],{},[2093,2368,2369,2370,795,2373,795,2376,795,2379,795,2382,795,2385,795,2388,795,2391,799,2394,2397,2398,2401,2402,64],{},"Built-in prefixes are reserved: ",[57,2371,2372],{},"DOC",[57,2374,2375],{},"NITRO",[57,2377,2378],{},"NUXT",[57,2380,2381],{},"PINIA",[57,2383,2384],{},"PKG",[57,2386,2387],{},"SHAD",[57,2389,2390],{},"TS",[57,2392,2393],{},"VITE",[57,2395,2396],{},"VUE",". Using them fails with ",[57,2399,2400],{},"DOC0028",". A code that does not match the format fails with ",[57,2403,2404],{},"DOC0027",[2093,2406,2407,2408,2139],{},"Two Rule Packs in the same Doctor Run cannot declare the same code (",[57,2409,2410],{},"DOC0012",[2093,2412,2413,2416,2417,2420,2421,2424,2425,2428],{},[57,2414,2415],{},"docsBase"," produces ",[57,2418,2419],{},"https:\u002F\u002Facme.dev\u002Fdoctor\u002FACME0001",". Pass a function to build another URL shape, or set ",[57,2422,2423],{},"docs"," on one entry to override or opt out with ",[57,2426,2427],{},"false",". Without either, the code has no docs URL. Doctor does not link third-party codes to its own Diagnostic Reference.",[50,2430,2431,2432,2434,2435,787,2438,2441],{},"Attach the registry as the Rule Pack's ",[57,2433,497],{}," so ",[57,2436,2437],{},"vite-doctor rules",[57,2439,2440],{},"vite-doctor explain ACME0001"," list the codes and their docs URLs.",[66,2443,2445],{"id":2444},"add-a-project-rule","Add a project Rule",[50,2447,2448],{},"Keep project-only Rules in your repository and register the extension where you run Doctor.",[50,2450,2451],{},"With the CLI, load executable config explicitly:",[74,2453,2456],{"className":76,"code":2454,"filename":2455,"language":79,"meta":80,"style":80},"import { defineDoctorConfig } from \"vite-doctor\u002Fconfig\";\nimport acme from \".\u002Fdoctor\u002Fextension\";\n\nexport default defineDoctorConfig({\n  extensions: [acme],\n});\n","doctor.config.ts",[57,2457,2458,2480,2499,2503,2515,2527],{"__ignoreMap":80},[84,2459,2460,2462,2464,2467,2469,2471,2473,2476,2478],{"class":86,"line":87},[84,2461,91],{"class":90},[84,2463,369],{"class":94},[84,2465,2466],{"class":101}," defineDoctorConfig",[84,2468,221],{"class":94},[84,2470,138],{"class":90},[84,2472,141],{"class":94},[84,2474,2475],{"class":144},"vite-doctor\u002Fconfig",[84,2477,147],{"class":94},[84,2479,150],{"class":94},[84,2481,2482,2484,2487,2490,2492,2495,2497],{"class":86,"line":98},[84,2483,91],{"class":90},[84,2485,2486],{"class":101}," acme ",[84,2488,2489],{"class":90},"from",[84,2491,141],{"class":94},[84,2493,2494],{"class":144},".\u002Fdoctor\u002Fextension",[84,2496,147],{"class":94},[84,2498,150],{"class":94},[84,2500,2501],{"class":86,"line":108},[84,2502,157],{"emptyLinePlaceholder":156},[84,2504,2505,2507,2509,2511,2513],{"class":86,"line":116},[84,2506,163],{"class":90},[84,2508,743],{"class":90},[84,2510,2466],{"class":176},[84,2512,278],{"class":101},[84,2514,281],{"class":94},[84,2516,2517,2520,2522,2525],{"class":86,"line":124},[84,2518,2519],{"class":192},"  extensions",[84,2521,196],{"class":94},[84,2523,2524],{"class":101}," [acme]",[84,2526,105],{"class":94},[84,2528,2529,2531,2533],{"class":86,"line":132},[84,2530,135],{"class":94},[84,2532,253],{"class":101},[84,2534,150],{"class":94},[74,2536,2540],{"className":2537,"code":2538,"language":2539,"meta":80,"style":80},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm vite-doctor . --config doctor.config.ts\npnpm vite-doctor explain ACME0001 --config doctor.config.ts\n","bash",[57,2541,2542,2559],{"__ignoreMap":80},[84,2543,2544,2547,2550,2553,2556],{"class":86,"line":87},[84,2545,2546],{"class":1022},"pnpm",[84,2548,2549],{"class":144}," vite-doctor",[84,2551,2552],{"class":144}," .",[84,2554,2555],{"class":144}," --config",[84,2557,2558],{"class":144}," doctor.config.ts\n",[84,2560,2561,2563,2565,2568,2571,2573],{"class":86,"line":98},[84,2562,2546],{"class":1022},[84,2564,2549],{"class":144},[84,2566,2567],{"class":144}," explain",[84,2569,2570],{"class":144}," ACME0001",[84,2572,2555],{"class":144},[84,2574,2558],{"class":144},[50,2576,2577,2578,196],{},"With the Vite plugin, pass the extension in ",[57,2579,2580],{},"vite.config.ts",[74,2582,2584],{"className":76,"code":2583,"filename":2580,"language":79,"meta":80,"style":80},"import { doctor } from \"vite-doctor\";\nimport { defineConfig } from \"vite\";\nimport acme from \".\u002Fdoctor\u002Fextension\";\n\nexport default defineConfig({\n  plugins: [doctor({ extensions: [acme] })],\n});\n",[57,2585,2586,2608,2630,2646,2650,2662,2693],{"__ignoreMap":80},[84,2587,2588,2590,2592,2595,2597,2599,2601,2604,2606],{"class":86,"line":87},[84,2589,91],{"class":90},[84,2591,369],{"class":94},[84,2593,2594],{"class":101}," doctor",[84,2596,221],{"class":94},[84,2598,138],{"class":90},[84,2600,141],{"class":94},[84,2602,2603],{"class":144},"vite-doctor",[84,2605,147],{"class":94},[84,2607,150],{"class":94},[84,2609,2610,2612,2614,2617,2619,2621,2623,2626,2628],{"class":86,"line":98},[84,2611,91],{"class":90},[84,2613,369],{"class":94},[84,2615,2616],{"class":101}," defineConfig",[84,2618,221],{"class":94},[84,2620,138],{"class":90},[84,2622,141],{"class":94},[84,2624,2625],{"class":144},"vite",[84,2627,147],{"class":94},[84,2629,150],{"class":94},[84,2631,2632,2634,2636,2638,2640,2642,2644],{"class":86,"line":108},[84,2633,91],{"class":90},[84,2635,2486],{"class":101},[84,2637,2489],{"class":90},[84,2639,141],{"class":94},[84,2641,2494],{"class":144},[84,2643,147],{"class":94},[84,2645,150],{"class":94},[84,2647,2648],{"class":86,"line":116},[84,2649,157],{"emptyLinePlaceholder":156},[84,2651,2652,2654,2656,2658,2660],{"class":86,"line":124},[84,2653,163],{"class":90},[84,2655,743],{"class":90},[84,2657,2616],{"class":176},[84,2659,278],{"class":101},[84,2661,281],{"class":94},[84,2663,2664,2667,2669,2671,2674,2676,2678,2681,2683,2686,2688,2691],{"class":86,"line":132},[84,2665,2666],{"class":192},"  plugins",[84,2668,196],{"class":94},[84,2670,377],{"class":101},[84,2672,2673],{"class":176},"doctor",[84,2675,278],{"class":101},[84,2677,189],{"class":94},[84,2679,2680],{"class":192}," extensions",[84,2682,196],{"class":94},[84,2684,2685],{"class":101}," [acme] ",[84,2687,135],{"class":94},[84,2689,2690],{"class":101},")]",[84,2692,105],{"class":94},[84,2694,2695,2697,2699],{"class":86,"line":153},[84,2696,135],{"class":94},[84,2698,253],{"class":101},[84,2700,150],{"class":94},[50,2702,2703,2704,64],{},"In a Nuxt app, register it from a local module the same way a library does. See ",[1332,2705,2707],{"href":2706},"#ship-rules-with-a-nuxt-module","Ship Rules with a Nuxt module",[66,2709,2711],{"id":2710},"ship-rules-with-a-vite-plugin","Ship Rules with a Vite plugin",[50,2713,2714,2715,2718,2719,2722,2723,2726],{},"A Vite plugin can expose Doctor Extensions as ",[57,2716,2717],{},"api.doctor",". The ",[57,2720,2721],{},"doctor()"," plugin reads ",[57,2724,2725],{},"api.doctor.extensions"," from every plugin in the resolved Vite config, so users who install your plugin get your Rules with no extra setup:",[74,2728,2731],{"className":76,"code":2729,"filename":2730,"language":79,"meta":80,"style":80},"import type { Plugin } from \"vite\";\nimport type { DoctorPluginApi } from \"vite-doctor\u002Fextension\";\n\nexport function acme(): Plugin {\n  return {\n    name: \"acme\",\n    api: {\n      doctor: {\n        extensions: [() => import(\".\u002Fdoctor.js\")],\n      } satisfies DoctorPluginApi,\n    },\n  };\n}\n","src\u002Fvite.ts",[57,2732,2733,2756,2779,2783,2800,2807,2822,2831,2840,2870,2882,2887,2892],{"__ignoreMap":80},[84,2734,2735,2737,2739,2741,2744,2746,2748,2750,2752,2754],{"class":86,"line":87},[84,2736,91],{"class":90},[84,2738,865],{"class":90},[84,2740,369],{"class":94},[84,2742,2743],{"class":101}," Plugin",[84,2745,221],{"class":94},[84,2747,138],{"class":90},[84,2749,141],{"class":94},[84,2751,2625],{"class":144},[84,2753,147],{"class":94},[84,2755,150],{"class":94},[84,2757,2758,2760,2762,2764,2767,2769,2771,2773,2775,2777],{"class":86,"line":98},[84,2759,91],{"class":90},[84,2761,865],{"class":90},[84,2763,369],{"class":94},[84,2765,2766],{"class":101}," DoctorPluginApi",[84,2768,221],{"class":94},[84,2770,138],{"class":90},[84,2772,141],{"class":94},[84,2774,59],{"class":144},[84,2776,147],{"class":94},[84,2778,150],{"class":94},[84,2780,2781],{"class":86,"line":108},[84,2782,157],{"emptyLinePlaceholder":156},[84,2784,2785,2787,2790,2793,2796,2798],{"class":86,"line":116},[84,2786,163],{"class":90},[84,2788,2789],{"class":166}," function",[84,2791,2792],{"class":176}," acme",[84,2794,2795],{"class":94},"():",[84,2797,2743],{"class":1022},[84,2799,95],{"class":94},[84,2801,2802,2805],{"class":86,"line":124},[84,2803,2804],{"class":90},"  return",[84,2806,95],{"class":94},[84,2808,2809,2812,2814,2816,2818,2820],{"class":86,"line":132},[84,2810,2811],{"class":192},"    name",[84,2813,196],{"class":94},[84,2815,141],{"class":94},[84,2817,647],{"class":144},[84,2819,147],{"class":94},[84,2821,105],{"class":94},[84,2823,2824,2827,2829],{"class":86,"line":153},[84,2825,2826],{"class":192},"    api",[84,2828,196],{"class":94},[84,2830,95],{"class":94},[84,2832,2833,2836,2838],{"class":86,"line":160},[84,2834,2835],{"class":192},"      doctor",[84,2837,196],{"class":94},[84,2839,95],{"class":94},[84,2841,2842,2845,2847,2849,2851,2854,2857,2859,2861,2864,2866,2868],{"class":86,"line":183},[84,2843,2844],{"class":192},"        extensions",[84,2846,196],{"class":94},[84,2848,377],{"class":192},[84,2850,1159],{"class":94},[84,2852,2853],{"class":166}," =>",[84,2855,2856],{"class":94}," import",[84,2858,278],{"class":192},[84,2860,147],{"class":94},[84,2862,2863],{"class":144},".\u002Fdoctor.js",[84,2865,147],{"class":94},[84,2867,2690],{"class":192},[84,2869,105],{"class":94},[84,2871,2872,2875,2878,2880],{"class":86,"line":229},[84,2873,2874],{"class":94},"      }",[84,2876,2877],{"class":90}," satisfies",[84,2879,2766],{"class":1022},[84,2881,105],{"class":94},[84,2883,2884],{"class":86,"line":250},[84,2885,2886],{"class":94},"    },\n",[84,2888,2889],{"class":86,"line":258},[84,2890,2891],{"class":94},"  };\n",[84,2893,2894],{"class":86,"line":263},[84,2895,2896],{"class":94},"}\n",[74,2898,2900],{"className":76,"code":2899,"filename":2580,"language":79,"meta":80,"style":80},"import { acme } from \"acme\u002Fvite\";\nimport { doctor } from \"vite-doctor\";\nimport { defineConfig } from \"vite\";\n\nexport default defineConfig({\n  plugins: [acme(), doctor()],\n});\n",[57,2901,2902,2923,2943,2963,2967,2979,3000],{"__ignoreMap":80},[84,2903,2904,2906,2908,2910,2912,2914,2916,2919,2921],{"class":86,"line":87},[84,2905,91],{"class":90},[84,2907,369],{"class":94},[84,2909,2792],{"class":101},[84,2911,221],{"class":94},[84,2913,138],{"class":90},[84,2915,141],{"class":94},[84,2917,2918],{"class":144},"acme\u002Fvite",[84,2920,147],{"class":94},[84,2922,150],{"class":94},[84,2924,2925,2927,2929,2931,2933,2935,2937,2939,2941],{"class":86,"line":98},[84,2926,91],{"class":90},[84,2928,369],{"class":94},[84,2930,2594],{"class":101},[84,2932,221],{"class":94},[84,2934,138],{"class":90},[84,2936,141],{"class":94},[84,2938,2603],{"class":144},[84,2940,147],{"class":94},[84,2942,150],{"class":94},[84,2944,2945,2947,2949,2951,2953,2955,2957,2959,2961],{"class":86,"line":108},[84,2946,91],{"class":90},[84,2948,369],{"class":94},[84,2950,2616],{"class":101},[84,2952,221],{"class":94},[84,2954,138],{"class":90},[84,2956,141],{"class":94},[84,2958,2625],{"class":144},[84,2960,147],{"class":94},[84,2962,150],{"class":94},[84,2964,2965],{"class":86,"line":116},[84,2966,157],{"emptyLinePlaceholder":156},[84,2968,2969,2971,2973,2975,2977],{"class":86,"line":124},[84,2970,163],{"class":90},[84,2972,743],{"class":90},[84,2974,2616],{"class":176},[84,2976,278],{"class":101},[84,2978,281],{"class":94},[84,2980,2981,2983,2985,2987,2989,2991,2993,2995,2998],{"class":86,"line":132},[84,2982,2666],{"class":192},[84,2984,196],{"class":94},[84,2986,377],{"class":101},[84,2988,647],{"class":176},[84,2990,1159],{"class":101},[84,2992,206],{"class":94},[84,2994,2594],{"class":176},[84,2996,2997],{"class":101},"()]",[84,2999,105],{"class":94},[84,3001,3002,3004,3006],{"class":86,"line":153},[84,3003,135],{"class":94},[84,3005,253],{"class":101},[84,3007,150],{"class":94},[50,3009,3010,3011,3013],{},"An entry can be a Doctor Extension, or a loader that returns one or a module with a default export. Use a loader so your plugin imports Doctor code only during a Doctor Run. Then ",[57,3012,2603],{}," can stay an optional peer dependency:",[74,3015,3020],{"className":3016,"code":3017,"filename":3018,"language":3019,"meta":80,"style":80},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"exports\": {\n    \".\u002Fdoctor\": \".\u002Fdist\u002Fdoctor.mjs\"\n  },\n  \"peerDependencies\": { \"vite-doctor\": \"*\" },\n  \"peerDependenciesMeta\": { \"vite-doctor\": { \"optional\": true } }\n}\n","package.json","json",[57,3021,3022,3026,3040,3060,3064,3094,3134],{"__ignoreMap":80},[84,3023,3024],{"class":86,"line":87},[84,3025,281],{"class":94},[84,3027,3028,3031,3034,3036,3038],{"class":86,"line":98},[84,3029,3030],{"class":94},"  \"",[84,3032,3033],{"class":166},"exports",[84,3035,147],{"class":94},[84,3037,196],{"class":94},[84,3039,95],{"class":94},[84,3041,3042,3045,3048,3050,3052,3054,3057],{"class":86,"line":108},[84,3043,3044],{"class":94},"    \"",[84,3046,3047],{"class":1022},".\u002Fdoctor",[84,3049,147],{"class":94},[84,3051,196],{"class":94},[84,3053,141],{"class":94},[84,3055,3056],{"class":144},".\u002Fdist\u002Fdoctor.mjs",[84,3058,3059],{"class":94},"\"\n",[84,3061,3062],{"class":86,"line":116},[84,3063,396],{"class":94},[84,3065,3066,3068,3071,3073,3075,3077,3079,3081,3083,3085,3087,3090,3092],{"class":86,"line":124},[84,3067,3030],{"class":94},[84,3069,3070],{"class":166},"peerDependencies",[84,3072,147],{"class":94},[84,3074,196],{"class":94},[84,3076,369],{"class":94},[84,3078,141],{"class":94},[84,3080,2603],{"class":1022},[84,3082,147],{"class":94},[84,3084,196],{"class":94},[84,3086,141],{"class":94},[84,3088,3089],{"class":144},"*",[84,3091,147],{"class":94},[84,3093,247],{"class":94},[84,3095,3096,3098,3101,3103,3105,3107,3109,3111,3113,3115,3117,3119,3122,3124,3126,3129,3131],{"class":86,"line":132},[84,3097,3030],{"class":94},[84,3099,3100],{"class":166},"peerDependenciesMeta",[84,3102,147],{"class":94},[84,3104,196],{"class":94},[84,3106,369],{"class":94},[84,3108,141],{"class":94},[84,3110,2603],{"class":1022},[84,3112,147],{"class":94},[84,3114,196],{"class":94},[84,3116,369],{"class":94},[84,3118,141],{"class":94},[84,3120,3121],{"class":1188},"optional",[84,3123,147],{"class":94},[84,3125,196],{"class":94},[84,3127,3128],{"class":94}," true",[84,3130,221],{"class":94},[84,3132,3133],{"class":94}," }\n",[84,3135,3136],{"class":86,"line":153},[84,3137,2896],{"class":94},[50,3139,3140,3141,3143,3144,3147,3148,3150],{},"The type import is erased at build time. If your package already depends on ",[57,3142,2603],{}," at runtime, ",[57,3145,3146],{},"defineDoctorPluginApi({ extensions })"," from ",[57,3149,59],{}," gives the same typing.",[66,3152,2707],{"id":3153},"ship-rules-with-a-nuxt-module",[50,3155,3156,3157,3160,3161,3164],{},"A Nuxt module registers extension entry modules through the ",[57,3158,3159],{},"doctor:extendExtensions"," hook. Push a path, ",[57,3162,3163],{},"file:"," URL, or package specifier. The entry's default export must be a Doctor Extension:",[74,3166,3169],{"className":76,"code":3167,"filename":3168,"language":79,"meta":80,"style":80},"import { createResolver, defineNuxtModule } from \"@nuxt\u002Fkit\";\nimport type {} from \"vite-doctor\u002Fnuxt\";\n\nexport default defineNuxtModule({\n  meta: { name: \"acme\" },\n  setup(_options, nuxt) {\n    const { resolve } = createResolver(import.meta.url);\n    nuxt.hook(\"doctor:extendExtensions\", (entries) => {\n      entries.push(resolve(\".\u002Fdoctor\"));\n    });\n  },\n});\n","src\u002Fmodule.ts",[57,3170,3171,3198,3218,3222,3234,3254,3273,3305,3336,3363,3372,3376],{"__ignoreMap":80},[84,3172,3173,3175,3177,3180,3182,3185,3187,3189,3191,3194,3196],{"class":86,"line":87},[84,3174,91],{"class":90},[84,3176,369],{"class":94},[84,3178,3179],{"class":101}," createResolver",[84,3181,206],{"class":94},[84,3183,3184],{"class":101}," defineNuxtModule",[84,3186,221],{"class":94},[84,3188,138],{"class":90},[84,3190,141],{"class":94},[84,3192,3193],{"class":144},"@nuxt\u002Fkit",[84,3195,147],{"class":94},[84,3197,150],{"class":94},[84,3199,3200,3202,3204,3207,3209,3211,3214,3216],{"class":86,"line":98},[84,3201,91],{"class":90},[84,3203,865],{"class":90},[84,3205,3206],{"class":94}," {}",[84,3208,138],{"class":90},[84,3210,141],{"class":94},[84,3212,3213],{"class":144},"vite-doctor\u002Fnuxt",[84,3215,147],{"class":94},[84,3217,150],{"class":94},[84,3219,3220],{"class":86,"line":108},[84,3221,157],{"emptyLinePlaceholder":156},[84,3223,3224,3226,3228,3230,3232],{"class":86,"line":116},[84,3225,163],{"class":90},[84,3227,743],{"class":90},[84,3229,3184],{"class":176},[84,3231,278],{"class":101},[84,3233,281],{"class":94},[84,3235,3236,3238,3240,3242,3244,3246,3248,3250,3252],{"class":86,"line":124},[84,3237,287],{"class":192},[84,3239,196],{"class":94},[84,3241,369],{"class":94},[84,3243,753],{"class":192},[84,3245,196],{"class":94},[84,3247,141],{"class":94},[84,3249,647],{"class":144},[84,3251,147],{"class":94},[84,3253,247],{"class":94},[84,3255,3256,3259,3261,3264,3266,3269,3271],{"class":86,"line":132},[84,3257,3258],{"class":192},"  setup",[84,3260,278],{"class":94},[84,3262,3263],{"class":407},"_options",[84,3265,206],{"class":94},[84,3267,3268],{"class":407}," nuxt",[84,3270,253],{"class":94},[84,3272,95],{"class":94},[84,3274,3275,3277,3279,3282,3284,3286,3288,3290,3292,3294,3296,3298,3301,3303],{"class":86,"line":153},[84,3276,1014],{"class":166},[84,3278,369],{"class":94},[84,3280,3281],{"class":101}," resolve",[84,3283,221],{"class":94},[84,3285,1866],{"class":94},[84,3287,3179],{"class":176},[84,3289,278],{"class":192},[84,3291,91],{"class":90},[84,3293,64],{"class":94},[84,3295,806],{"class":101},[84,3297,64],{"class":94},[84,3299,3300],{"class":101},"url",[84,3302,253],{"class":192},[84,3304,150],{"class":94},[84,3306,3307,3310,3312,3315,3317,3319,3321,3323,3325,3327,3330,3332,3334],{"class":86,"line":160},[84,3308,3309],{"class":101},"    nuxt",[84,3311,64],{"class":94},[84,3313,3314],{"class":176},"hook",[84,3316,278],{"class":192},[84,3318,147],{"class":94},[84,3320,3159],{"class":144},[84,3322,147],{"class":94},[84,3324,206],{"class":94},[84,3326,444],{"class":94},[84,3328,3329],{"class":407},"entries",[84,3331,253],{"class":94},[84,3333,2853],{"class":166},[84,3335,95],{"class":94},[84,3337,3338,3341,3343,3345,3347,3350,3352,3354,3356,3358,3361],{"class":86,"line":183},[84,3339,3340],{"class":101},"      entries",[84,3342,64],{"class":94},[84,3344,1129],{"class":176},[84,3346,278],{"class":192},[84,3348,3349],{"class":176},"resolve",[84,3351,278],{"class":192},[84,3353,147],{"class":94},[84,3355,3047],{"class":144},[84,3357,147],{"class":94},[84,3359,3360],{"class":192},"))",[84,3362,150],{"class":94},[84,3364,3365,3368,3370],{"class":86,"line":229},[84,3366,3367],{"class":94},"    }",[84,3369,253],{"class":192},[84,3371,150],{"class":94},[84,3373,3374],{"class":86,"line":250},[84,3375,396],{"class":94},[84,3377,3378,3380,3382],{"class":86,"line":258},[84,3379,135],{"class":94},[84,3381,253],{"class":101},[84,3383,150],{"class":94},[50,3385,3386,3387,3390,3391,3393],{},"The ",[57,3388,3389],{},"import type {} from \"vite-doctor\u002Fnuxt\""," line loads the hook types and is erased at build time. When ",[57,3392,3213],{}," is not installed, the hook never runs.",[50,3395,3396],{},"Users add both modules and run the Nuxt Doctor Command:",[74,3398,3401],{"className":76,"code":3399,"filename":3400,"language":79,"meta":80,"style":80},"export default defineNuxtConfig({\n  modules: [\"acme\", \"vite-doctor\u002Fnuxt\"],\n});\n","nuxt.config.ts",[57,3402,3403,3416,3443],{"__ignoreMap":80},[84,3404,3405,3407,3409,3412,3414],{"class":86,"line":87},[84,3406,163],{"class":90},[84,3408,743],{"class":90},[84,3410,3411],{"class":176}," defineNuxtConfig",[84,3413,278],{"class":101},[84,3415,281],{"class":94},[84,3417,3418,3421,3423,3425,3427,3429,3431,3433,3435,3437,3439,3441],{"class":86,"line":98},[84,3419,3420],{"class":192},"  modules",[84,3422,196],{"class":94},[84,3424,377],{"class":101},[84,3426,147],{"class":94},[84,3428,647],{"class":144},[84,3430,147],{"class":94},[84,3432,206],{"class":94},[84,3434,141],{"class":94},[84,3436,3213],{"class":144},[84,3438,147],{"class":94},[84,3440,224],{"class":101},[84,3442,105],{"class":94},[84,3444,3445,3447,3449],{"class":86,"line":108},[84,3446,135],{"class":94},[84,3448,253],{"class":101},[84,3450,150],{"class":94},[74,3452,3454],{"className":2537,"code":3453,"language":2539,"meta":80,"style":80},"pnpm nuxt prepare\npnpm nuxt doctor\n",[57,3455,3456,3465],{"__ignoreMap":80},[84,3457,3458,3460,3462],{"class":86,"line":87},[84,3459,2546],{"class":1022},[84,3461,3268],{"class":144},[84,3463,3464],{"class":144}," prepare\n",[84,3466,3467,3469,3471],{"class":86,"line":98},[84,3468,2546],{"class":1022},[84,3470,3268],{"class":144},[84,3472,3473],{"class":144}," doctor\n",[50,3475,3476,3477,3480,3481,795,3484,799,3487,2127,3490,3493,3494,3496,3497,3500],{},"The Nuxt 4 Bridge resolves each entry to an absolute file and records it in ",[57,3478,3479],{},".nuxt\u002Fdoctor.manifest.json"," during ",[57,3482,3483],{},"nuxt dev",[57,3485,3486],{},"nuxt build",[57,3488,3489],{},"nuxt prepare",[57,3491,3492],{},"nuxt doctor"," loads recorded entries because it is a Nuxt host command, and running it is the same trust decision as ",[57,3495,3483],{},". The standalone CLI does not run host-registered code unless you pass ",[57,3498,3499],{},"--host-extensions",". Use that flag in CI, where Nuxt's host command can swallow Doctor's exit code:",[74,3502,3504],{"className":2537,"code":3503,"language":2539,"meta":80,"style":80},"pnpm vite-doctor . --host-extensions --max-warnings 0\n",[57,3505,3506],{"__ignoreMap":80},[84,3507,3508,3510,3512,3514,3517,3520],{"class":86,"line":87},[84,3509,2546],{"class":1022},[84,3511,2549],{"class":144},[84,3513,2552],{"class":144},[84,3515,3516],{"class":144}," --host-extensions",[84,3518,3519],{"class":144}," --max-warnings",[84,3521,3522],{"class":1188}," 0\n",[50,3524,3525,3526,3529,3530,3533,3534,3537,3538,3540],{},"Doctor loads entries with Node's native ",[57,3527,3528],{},"import()",". Publish built JavaScript. For a local module in your app, keep the entry outside ",[57,3531,3532],{},"modules\u002F",", because Nuxt registers every file there as a module. A TypeScript entry works when Node can strip its types and its relative imports include file extensions. If an entry fails to load or its default export is not a Doctor Extension, the run stops with ",[57,3535,3536],{},"DOC0029",". Rebuild the package and run ",[57,3539,3489],{}," again.",[50,3542,3543,3544,3546],{},"A package that ships both a Vite plugin and a Nuxt module can point both contracts at the same ",[57,3545,3047],{}," entry.",[66,3548,3550],{"id":3549},"test-a-rule","Test a Rule",[50,3552,3553,3555],{},[57,3554,63],{}," writes fixture files to a temporary project, runs Doctor with only the Rules you pass, and returns the Doctor Run result:",[74,3557,3560],{"className":76,"code":3558,"filename":3559,"language":79,"meta":80,"style":80},"import { expect, test } from \"vitest\";\nimport { runProjectFixture, runRuleFixture } from \"vite-doctor\u002Ftestkit\";\nimport acme, { noLegacyClient } from \".\u002Fextension\";\n\ntest(\"reports legacy client imports\", async () => {\n  const result = await runRuleFixture({\n    rule: noLegacyClient,\n    framework: \"vite\",\n    files: { \"src\u002Fclient.ts\": 'import { createClient } from \"acme\u002Flegacy\";\\n' },\n  });\n  expect(result.diagnostics.map((diagnostic) => diagnostic.code)).toEqual([\"ACME0001\"]);\n});\n\ntest(\"runs the published extension\", async () => {\n  const result = await runProjectFixture({\n    framework: \"vite\",\n    extensions: [acme],\n    files: { \"src\u002Fclient.ts\": 'import { createClient } from \"acme\";\\n' },\n  });\n  expect(result.diagnostics).toEqual([]);\n});\n","doctor\u002Fextension.test.ts",[57,3561,3562,3589,3615,3641,3645,3671,3690,3701,3716,3746,3755,3813,3821,3825,3848,3864,3878,3893,3920,3928,3951],{"__ignoreMap":80},[84,3563,3564,3566,3568,3571,3573,3576,3578,3580,3582,3585,3587],{"class":86,"line":87},[84,3565,91],{"class":90},[84,3567,369],{"class":94},[84,3569,3570],{"class":101}," expect",[84,3572,206],{"class":94},[84,3574,3575],{"class":101}," test",[84,3577,221],{"class":94},[84,3579,138],{"class":90},[84,3581,141],{"class":94},[84,3583,3584],{"class":144},"vitest",[84,3586,147],{"class":94},[84,3588,150],{"class":94},[84,3590,3591,3593,3595,3598,3600,3603,3605,3607,3609,3611,3613],{"class":86,"line":98},[84,3592,91],{"class":90},[84,3594,369],{"class":94},[84,3596,3597],{"class":101}," runProjectFixture",[84,3599,206],{"class":94},[84,3601,3602],{"class":101}," runRuleFixture",[84,3604,221],{"class":94},[84,3606,138],{"class":90},[84,3608,141],{"class":94},[84,3610,63],{"class":144},[84,3612,147],{"class":94},[84,3614,150],{"class":94},[84,3616,3617,3619,3621,3623,3625,3628,3630,3632,3634,3637,3639],{"class":86,"line":108},[84,3618,91],{"class":90},[84,3620,2792],{"class":101},[84,3622,206],{"class":94},[84,3624,369],{"class":94},[84,3626,3627],{"class":101}," noLegacyClient",[84,3629,221],{"class":94},[84,3631,138],{"class":90},[84,3633,141],{"class":94},[84,3635,3636],{"class":144},".\u002Fextension",[84,3638,147],{"class":94},[84,3640,150],{"class":94},[84,3642,3643],{"class":86,"line":116},[84,3644,157],{"emptyLinePlaceholder":156},[84,3646,3647,3650,3652,3654,3657,3659,3661,3664,3667,3669],{"class":86,"line":124},[84,3648,3649],{"class":176},"test",[84,3651,278],{"class":101},[84,3653,147],{"class":94},[84,3655,3656],{"class":144},"reports legacy client imports",[84,3658,147],{"class":94},[84,3660,206],{"class":94},[84,3662,3663],{"class":166}," async",[84,3665,3666],{"class":94}," ()",[84,3668,2853],{"class":166},[84,3670,95],{"class":94},[84,3672,3673,3676,3679,3681,3684,3686,3688],{"class":86,"line":132},[84,3674,3675],{"class":166},"  const",[84,3677,3678],{"class":101}," result",[84,3680,1866],{"class":94},[84,3682,3683],{"class":90}," await",[84,3685,3602],{"class":176},[84,3687,278],{"class":192},[84,3689,281],{"class":94},[84,3691,3692,3695,3697,3699],{"class":86,"line":153},[84,3693,3694],{"class":192},"    rule",[84,3696,196],{"class":94},[84,3698,3627],{"class":101},[84,3700,105],{"class":94},[84,3702,3703,3706,3708,3710,3712,3714],{"class":86,"line":160},[84,3704,3705],{"class":192},"    framework",[84,3707,196],{"class":94},[84,3709,141],{"class":94},[84,3711,2625],{"class":144},[84,3713,147],{"class":94},[84,3715,105],{"class":94},[84,3717,3718,3721,3723,3725,3727,3730,3732,3734,3736,3739,3742,3744],{"class":86,"line":183},[84,3719,3720],{"class":192},"    files",[84,3722,196],{"class":94},[84,3724,369],{"class":94},[84,3726,141],{"class":94},[84,3728,3729],{"class":192},"src\u002Fclient.ts",[84,3731,147],{"class":94},[84,3733,196],{"class":94},[84,3735,1719],{"class":94},[84,3737,3738],{"class":144},"import { createClient } from \"acme\u002Flegacy\";",[84,3740,3741],{"class":101},"\\n",[84,3743,1725],{"class":94},[84,3745,247],{"class":94},[84,3747,3748,3751,3753],{"class":86,"line":229},[84,3749,3750],{"class":94},"  }",[84,3752,253],{"class":192},[84,3754,150],{"class":94},[84,3756,3757,3760,3762,3765,3767,3769,3771,3774,3776,3778,3781,3783,3785,3788,3790,3792,3794,3796,3799,3802,3804,3806,3808,3811],{"class":86,"line":250},[84,3758,3759],{"class":176},"  expect",[84,3761,278],{"class":192},[84,3763,3764],{"class":101},"result",[84,3766,64],{"class":94},[84,3768,497],{"class":101},[84,3770,64],{"class":94},[84,3772,3773],{"class":176},"map",[84,3775,278],{"class":192},[84,3777,278],{"class":94},[84,3779,3780],{"class":407},"diagnostic",[84,3782,253],{"class":94},[84,3784,2853],{"class":166},[84,3786,3787],{"class":101}," diagnostic",[84,3789,64],{"class":94},[84,3791,57],{"class":101},[84,3793,3360],{"class":192},[84,3795,64],{"class":94},[84,3797,3798],{"class":176},"toEqual",[84,3800,3801],{"class":192},"([",[84,3803,147],{"class":94},[84,3805,201],{"class":144},[84,3807,147],{"class":94},[84,3809,3810],{"class":192},"])",[84,3812,150],{"class":94},[84,3814,3815,3817,3819],{"class":86,"line":258},[84,3816,135],{"class":94},[84,3818,253],{"class":101},[84,3820,150],{"class":94},[84,3822,3823],{"class":86,"line":263},[84,3824,157],{"emptyLinePlaceholder":156},[84,3826,3827,3829,3831,3833,3836,3838,3840,3842,3844,3846],{"class":86,"line":284},[84,3828,3649],{"class":176},[84,3830,278],{"class":101},[84,3832,147],{"class":94},[84,3834,3835],{"class":144},"runs the published extension",[84,3837,147],{"class":94},[84,3839,206],{"class":94},[84,3841,3663],{"class":166},[84,3843,3666],{"class":94},[84,3845,2853],{"class":166},[84,3847,95],{"class":94},[84,3849,3850,3852,3854,3856,3858,3860,3862],{"class":86,"line":294},[84,3851,3675],{"class":166},[84,3853,3678],{"class":101},[84,3855,1866],{"class":94},[84,3857,3683],{"class":90},[84,3859,3597],{"class":176},[84,3861,278],{"class":192},[84,3863,281],{"class":94},[84,3865,3866,3868,3870,3872,3874,3876],{"class":86,"line":310},[84,3867,3705],{"class":192},[84,3869,196],{"class":94},[84,3871,141],{"class":94},[84,3873,2625],{"class":144},[84,3875,147],{"class":94},[84,3877,105],{"class":94},[84,3879,3880,3883,3885,3887,3889,3891],{"class":86,"line":327},[84,3881,3882],{"class":192},"    extensions",[84,3884,196],{"class":94},[84,3886,377],{"class":192},[84,3888,647],{"class":101},[84,3890,224],{"class":192},[84,3892,105],{"class":94},[84,3894,3895,3897,3899,3901,3903,3905,3907,3909,3911,3914,3916,3918],{"class":86,"line":344},[84,3896,3720],{"class":192},[84,3898,196],{"class":94},[84,3900,369],{"class":94},[84,3902,141],{"class":94},[84,3904,3729],{"class":192},[84,3906,147],{"class":94},[84,3908,196],{"class":94},[84,3910,1719],{"class":94},[84,3912,3913],{"class":144},"import { createClient } from \"acme\";",[84,3915,3741],{"class":101},[84,3917,1725],{"class":94},[84,3919,247],{"class":94},[84,3921,3922,3924,3926],{"class":86,"line":361},[84,3923,3750],{"class":94},[84,3925,253],{"class":192},[84,3927,150],{"class":94},[84,3929,3930,3932,3934,3936,3938,3940,3942,3944,3946,3949],{"class":86,"line":393},[84,3931,3759],{"class":176},[84,3933,278],{"class":192},[84,3935,3764],{"class":101},[84,3937,64],{"class":94},[84,3939,497],{"class":101},[84,3941,253],{"class":192},[84,3943,64],{"class":94},[84,3945,3798],{"class":176},[84,3947,3948],{"class":192},"([])",[84,3950,150],{"class":94},[84,3952,3953,3955,3957],{"class":86,"line":399},[84,3954,135],{"class":94},[84,3956,253],{"class":101},[84,3958,150],{"class":94},[50,3960,3961,3964,3965,3968,3969,795,3971,795,3973,2123,3976,3979,3980,3983,3984,3986,3987,787,3990,3993,3994,3997,3998,64],{},[57,3962,3963],{},"framework"," defaults to ",[57,3966,3967],{},"vue"," and accepts ",[57,3970,2625],{},[57,3972,3967],{},[57,3974,3975],{},"nitro",[57,3977,3978],{},"nuxt",". Pass ",[57,3981,3982],{},"dependencies"," to add entries to the generated ",[57,3985,3018],{},". Use ",[57,3988,3989],{},"config",[57,3991,3992],{},"run"," for Doctor config and Doctor Run options such as ",[57,3995,3996],{},"extends",". Fixture projects are temporary, so the rule cache stays in memory unless you pass ",[57,3999,4000],{},"run: { cache: true }",[824,4002,4004],{"id":4003},"share-a-fixture-project","Share a fixture project",[50,4006,4007,787,4010,4013,4014,4017],{},[57,4008,4009],{},"runRuleFixture",[57,4011,4012],{},"runProjectFixture"," write a new project and detect its Project Inventory on every call. Most Rule tests change one source file, so ",[57,4015,4016],{},"createProjectFixture"," writes the project and detects its inventory once, then reuses both for every run:",[74,4019,4021],{"className":76,"code":4020,"filename":3559,"language":79,"meta":80,"style":80},"import { afterAll, expect, test } from \"vitest\";\nimport { createProjectFixture } from \"vite-doctor\u002Ftestkit\";\nimport { noLegacyClient } from \".\u002Fextension\";\n\nconst project = createProjectFixture({ framework: \"nuxt\", files: { \"app\u002F.gitkeep\": \"\" } });\nafterAll(() => project.dispose());\n\ntest.each([\"acme\u002Flegacy\", \"acme\u002Flegacy\u002Fclient\"])(\"reports %s\", async (entry) => {\n  const result = await project.run({\n    rule: noLegacyClient,\n    files: { \"app\u002Fpages\u002Findex.vue\": `\u003Cscript setup>import \"${entry}\"\u003C\u002Fscript>` },\n  });\n  expect(result.diagnostics.map((diagnostic) => diagnostic.code)).toEqual([\"ACME0001\"]);\n});\n",[57,4022,4023,4052,4073,4093,4097,4152,4176,4180,4231,4251,4261,4299,4307,4357],{"__ignoreMap":80},[84,4024,4025,4027,4029,4032,4034,4036,4038,4040,4042,4044,4046,4048,4050],{"class":86,"line":87},[84,4026,91],{"class":90},[84,4028,369],{"class":94},[84,4030,4031],{"class":101}," afterAll",[84,4033,206],{"class":94},[84,4035,3570],{"class":101},[84,4037,206],{"class":94},[84,4039,3575],{"class":101},[84,4041,221],{"class":94},[84,4043,138],{"class":90},[84,4045,141],{"class":94},[84,4047,3584],{"class":144},[84,4049,147],{"class":94},[84,4051,150],{"class":94},[84,4053,4054,4056,4058,4061,4063,4065,4067,4069,4071],{"class":86,"line":98},[84,4055,91],{"class":90},[84,4057,369],{"class":94},[84,4059,4060],{"class":101}," createProjectFixture",[84,4062,221],{"class":94},[84,4064,138],{"class":90},[84,4066,141],{"class":94},[84,4068,63],{"class":144},[84,4070,147],{"class":94},[84,4072,150],{"class":94},[84,4074,4075,4077,4079,4081,4083,4085,4087,4089,4091],{"class":86,"line":108},[84,4076,91],{"class":90},[84,4078,369],{"class":94},[84,4080,3627],{"class":101},[84,4082,221],{"class":94},[84,4084,138],{"class":90},[84,4086,141],{"class":94},[84,4088,3636],{"class":144},[84,4090,147],{"class":94},[84,4092,150],{"class":94},[84,4094,4095],{"class":86,"line":116},[84,4096,157],{"emptyLinePlaceholder":156},[84,4098,4099,4101,4104,4106,4108,4110,4112,4115,4117,4119,4121,4123,4125,4128,4130,4132,4134,4137,4139,4141,4144,4146,4148,4150],{"class":86,"line":124},[84,4100,1171],{"class":166},[84,4102,4103],{"class":101}," project ",[84,4105,173],{"class":94},[84,4107,4060],{"class":176},[84,4109,278],{"class":101},[84,4111,189],{"class":94},[84,4113,4114],{"class":192}," framework",[84,4116,196],{"class":94},[84,4118,141],{"class":94},[84,4120,3978],{"class":144},[84,4122,147],{"class":94},[84,4124,206],{"class":94},[84,4126,4127],{"class":192}," files",[84,4129,196],{"class":94},[84,4131,369],{"class":94},[84,4133,141],{"class":94},[84,4135,4136],{"class":192},"app\u002F.gitkeep",[84,4138,147],{"class":94},[84,4140,196],{"class":94},[84,4142,4143],{"class":94}," \"\"",[84,4145,221],{"class":94},[84,4147,221],{"class":94},[84,4149,253],{"class":101},[84,4151,150],{"class":94},[84,4153,4154,4157,4159,4161,4163,4166,4168,4171,4174],{"class":86,"line":132},[84,4155,4156],{"class":176},"afterAll",[84,4158,278],{"class":101},[84,4160,1159],{"class":94},[84,4162,2853],{"class":166},[84,4164,4165],{"class":101}," project",[84,4167,64],{"class":94},[84,4169,4170],{"class":176},"dispose",[84,4172,4173],{"class":101},"())",[84,4175,150],{"class":94},[84,4177,4178],{"class":86,"line":153},[84,4179,157],{"emptyLinePlaceholder":156},[84,4181,4182,4184,4186,4189,4191,4193,4195,4197,4199,4201,4204,4206,4209,4211,4214,4216,4218,4220,4222,4225,4227,4229],{"class":86,"line":160},[84,4183,3649],{"class":101},[84,4185,64],{"class":94},[84,4187,4188],{"class":176},"each",[84,4190,3801],{"class":101},[84,4192,147],{"class":94},[84,4194,382],{"class":144},[84,4196,147],{"class":94},[84,4198,206],{"class":94},[84,4200,141],{"class":94},[84,4202,4203],{"class":144},"acme\u002Flegacy\u002Fclient",[84,4205,147],{"class":94},[84,4207,4208],{"class":101},"])(",[84,4210,147],{"class":94},[84,4212,4213],{"class":144},"reports %s",[84,4215,147],{"class":94},[84,4217,206],{"class":94},[84,4219,3663],{"class":166},[84,4221,444],{"class":94},[84,4223,4224],{"class":407},"entry",[84,4226,253],{"class":94},[84,4228,2853],{"class":166},[84,4230,95],{"class":94},[84,4232,4233,4235,4237,4239,4241,4243,4245,4247,4249],{"class":86,"line":183},[84,4234,3675],{"class":166},[84,4236,3678],{"class":101},[84,4238,1866],{"class":94},[84,4240,3683],{"class":90},[84,4242,4165],{"class":101},[84,4244,64],{"class":94},[84,4246,3992],{"class":176},[84,4248,278],{"class":192},[84,4250,281],{"class":94},[84,4252,4253,4255,4257,4259],{"class":86,"line":229},[84,4254,3694],{"class":192},[84,4256,196],{"class":94},[84,4258,3627],{"class":101},[84,4260,105],{"class":94},[84,4262,4263,4265,4267,4269,4271,4274,4276,4278,4281,4284,4287,4289,4291,4294,4297],{"class":86,"line":250},[84,4264,3720],{"class":192},[84,4266,196],{"class":94},[84,4268,369],{"class":94},[84,4270,141],{"class":94},[84,4272,4273],{"class":192},"app\u002Fpages\u002Findex.vue",[84,4275,147],{"class":94},[84,4277,196],{"class":94},[84,4279,4280],{"class":94}," `",[84,4282,4283],{"class":144},"\u003Cscript setup>import \"",[84,4285,4286],{"class":94},"${",[84,4288,4224],{"class":101},[84,4290,135],{"class":94},[84,4292,4293],{"class":144},"\"\u003C\u002Fscript>",[84,4295,4296],{"class":94},"`",[84,4298,247],{"class":94},[84,4300,4301,4303,4305],{"class":86,"line":258},[84,4302,3750],{"class":94},[84,4304,253],{"class":192},[84,4306,150],{"class":94},[84,4308,4309,4311,4313,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355],{"class":86,"line":263},[84,4310,3759],{"class":176},[84,4312,278],{"class":192},[84,4314,3764],{"class":101},[84,4316,64],{"class":94},[84,4318,497],{"class":101},[84,4320,64],{"class":94},[84,4322,3773],{"class":176},[84,4324,278],{"class":192},[84,4326,278],{"class":94},[84,4328,3780],{"class":407},[84,4330,253],{"class":94},[84,4332,2853],{"class":166},[84,4334,3787],{"class":101},[84,4336,64],{"class":94},[84,4338,57],{"class":101},[84,4340,3360],{"class":192},[84,4342,64],{"class":94},[84,4344,3798],{"class":176},[84,4346,3801],{"class":192},[84,4348,147],{"class":94},[84,4350,201],{"class":144},[84,4352,147],{"class":94},[84,4354,3810],{"class":192},[84,4356,150],{"class":94},[84,4358,4359,4361,4363],{"class":86,"line":284},[84,4360,135],{"class":94},[84,4362,253],{"class":101},[84,4364,150],{"class":94},[50,4366,4367,4369,4370,795,4372,799,4374,4377,4378,4369,4380,2276,4383,795,4386,795,4389,799,4391,4393,4394,4396,4397,4399],{},[57,4368,4016],{}," takes ",[57,4371,3963],{},[57,4373,3982],{},[57,4375,4376],{},"files",". Its files stay on disk for every run. ",[57,4379,3992],{},[57,4381,4382],{},"rule",[57,4384,4385],{},"rules",[57,4387,4388],{},"extensions",[57,4390,3989],{},[57,4392,3992],{}," like ",[57,4395,4012],{},", adds its own ",[57,4398,4376],{},", runs Doctor on the whole project, and deletes its files before the next run starts. Runs on one fixture project never overlap.",[50,4401,4402,4403,4405,4406,795,4408,4411,4412,4415,4416,4419,4420,4422,4423,4425,4426,4429,4430,4432],{},"The Project Inventory comes from the fixture project's own files, so run files cannot change it. Put files that shape it in ",[57,4404,4016],{},": dependencies, ",[57,4407,3400],{},[57,4409,4410],{},"tsconfig.json",", Nuxt ",[57,4413,4414],{},"server\u002F"," routes, or the Nuxt ",[57,4417,4418],{},"app\u002F"," directory, which ",[57,4421,4136],{}," creates without adding a source file. When a test needs its own inventory, use ",[57,4424,4009],{}," or a separate fixture project. A run file that would replace a fixture project file throws. Call ",[57,4427,4428],{},"dispose()"," in ",[57,4431,4156],{}," to delete the fixture project.",[66,4434,4436],{"id":4435},"how-surfaces-find-extensions","How surfaces find extensions",[2244,4438,4439,4449],{},[2247,4440,4441],{},[2250,4442,4443,4446],{},[2253,4444,4445],{},"Surface",[2253,4447,4448],{},"Registered extensions",[2260,4450,4451,4466,4483,4497],{},[2250,4452,4453,4458],{},[2265,4454,4455,4457],{},[57,4456,2721],{}," Vite plugin",[2265,4459,4460,4462,4463,4465],{},[57,4461,4388],{}," option, then ",[57,4464,2725],{}," from other Vite plugins",[2250,4467,4468,4472],{},[2265,4469,4470],{},[57,4471,3492],{},[2265,4473,4474,4476,4477,4479,4480,2680],{},[57,4475,3159],{}," entries recorded by ",[57,4478,3213],{},", plus ",[57,4481,4482],{},"--config",[2250,4484,4485,4490],{},[2265,4486,4487,4489],{},[57,4488,2603],{}," CLI",[2265,4491,4492,4494,4495],{},[57,4493,4482],{}," extensions, plus recorded Nuxt entries with ",[57,4496,3499],{},[2250,4498,4499,4503],{},[2265,4500,4501],{},[57,4502,63],{},[2265,4504,4505,787,4507,4509],{},[57,4506,4385],{},[57,4508,4388],{}," passed to the fixture",[50,4511,4512,4513,4515,4516,4518,4519,64],{},"The CLI cannot see extensions from Vite plugins in ",[57,4514,2580],{},", because it does not load host config. Run those through the Vite plugin, or register the same extension in ",[57,4517,2455],{}," and pass ",[57,4520,4482],{},[50,4522,4523,4524,4526],{},"The extension ",[57,4525,1107],{}," is its identity. If the same name is registered more than once, Doctor keeps the first registration. You can register an extension explicitly while a plugin also contributes it, and its Rules still run once.",[66,4528,4530],{"id":4529},"rule-inputs","Rule inputs",[50,4532,4533,4534,4537,4538,4541,4542,196],{},"A Rule reads its file through ",[57,4535,4536],{},"ctx.file"," and Project Inventory through ",[57,4539,4540],{},"ctx.project",". Any other file, directory listing, or path check goes through ",[57,4543,4544],{},"ctx.fs",[74,4546,4548],{"className":76,"code":4547,"language":79,"meta":80,"style":80},"const isRecord = (value: unknown): value is Record\u003Cstring, unknown> =>\n  typeof value === \"object\" && value !== null && !Array.isArray(value);\n\ncreate(ctx) {\n  const pkg = ctx.fs.readJson(\"package.json\");\n  if (!isRecord(pkg) || !isRecord(pkg.dependencies) || !pkg.dependencies.acme) return;\n  const config = ctx.fs.readText(\"acme.config.ts\");\n  \u002F\u002F ...\n}\n",[57,4549,4550,4594,4639,4643,4653,4686,4743,4776,4782],{"__ignoreMap":80},[84,4551,4552,4554,4557,4559,4561,4563,4565,4568,4571,4574,4577,4580,4582,4585,4587,4589,4591],{"class":86,"line":87},[84,4553,1171],{"class":166},[84,4555,4556],{"class":101}," isRecord ",[84,4558,173],{"class":94},[84,4560,444],{"class":94},[84,4562,456],{"class":407},[84,4564,196],{"class":94},[84,4566,4567],{"class":1022}," unknown",[84,4569,4570],{"class":94},"):",[84,4572,4573],{"class":407}," value",[84,4575,4576],{"class":94}," is",[84,4578,4579],{"class":1022}," Record",[84,4581,1025],{"class":94},[84,4583,4584],{"class":1022},"string",[84,4586,206],{"class":94},[84,4588,4567],{"class":1022},[84,4590,1035],{"class":94},[84,4592,4593],{"class":166}," =>\n",[84,4595,4596,4599,4602,4605,4607,4610,4612,4614,4616,4619,4622,4624,4626,4629,4631,4634,4637],{"class":86,"line":98},[84,4597,4598],{"class":94},"  typeof",[84,4600,4601],{"class":101}," value ",[84,4603,4604],{"class":94},"===",[84,4606,141],{"class":94},[84,4608,4609],{"class":144},"object",[84,4611,147],{"class":94},[84,4613,1095],{"class":94},[84,4615,4601],{"class":101},[84,4617,4618],{"class":94},"!==",[84,4620,4621],{"class":94}," null",[84,4623,1095],{"class":94},[84,4625,1925],{"class":94},[84,4627,4628],{"class":101},"Array",[84,4630,64],{"class":94},[84,4632,4633],{"class":176},"isArray",[84,4635,4636],{"class":101},"(value)",[84,4638,150],{"class":94},[84,4640,4641],{"class":86,"line":108},[84,4642,157],{"emptyLinePlaceholder":156},[84,4644,4645,4648,4651],{"class":86,"line":116},[84,4646,4647],{"class":176},"create",[84,4649,4650],{"class":101},"(ctx) ",[84,4652,281],{"class":94},[84,4654,4655,4657,4660,4662,4664,4666,4669,4671,4674,4676,4678,4680,4682,4684],{"class":86,"line":124},[84,4656,3675],{"class":166},[84,4658,4659],{"class":101}," pkg",[84,4661,1866],{"class":94},[84,4663,563],{"class":101},[84,4665,64],{"class":94},[84,4667,4668],{"class":101},"fs",[84,4670,64],{"class":94},[84,4672,4673],{"class":176},"readJson",[84,4675,278],{"class":192},[84,4677,147],{"class":94},[84,4679,3018],{"class":144},[84,4681,147],{"class":94},[84,4683,253],{"class":192},[84,4685,150],{"class":94},[84,4687,4688,4691,4693,4696,4699,4701,4704,4706,4709,4711,4713,4715,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737,4739,4741],{"class":86,"line":132},[84,4689,4690],{"class":90},"  if",[84,4692,444],{"class":192},[84,4694,4695],{"class":94},"!",[84,4697,4698],{"class":176},"isRecord",[84,4700,278],{"class":192},[84,4702,4703],{"class":101},"pkg",[84,4705,468],{"class":192},[84,4707,4708],{"class":94},"||",[84,4710,1925],{"class":94},[84,4712,4698],{"class":176},[84,4714,278],{"class":192},[84,4716,4703],{"class":101},[84,4718,64],{"class":94},[84,4720,3982],{"class":101},[84,4722,468],{"class":192},[84,4724,4708],{"class":94},[84,4726,1925],{"class":94},[84,4728,4703],{"class":101},[84,4730,64],{"class":94},[84,4732,3982],{"class":101},[84,4734,64],{"class":94},[84,4736,647],{"class":101},[84,4738,468],{"class":192},[84,4740,471],{"class":90},[84,4742,150],{"class":94},[84,4744,4745,4747,4750,4752,4754,4756,4758,4760,4763,4765,4767,4770,4772,4774],{"class":86,"line":153},[84,4746,3675],{"class":166},[84,4748,4749],{"class":101}," config",[84,4751,1866],{"class":94},[84,4753,563],{"class":101},[84,4755,64],{"class":94},[84,4757,4668],{"class":101},[84,4759,64],{"class":94},[84,4761,4762],{"class":176},"readText",[84,4764,278],{"class":192},[84,4766,147],{"class":94},[84,4768,4769],{"class":144},"acme.config.ts",[84,4771,147],{"class":94},[84,4773,253],{"class":192},[84,4775,150],{"class":94},[84,4777,4778],{"class":86,"line":160},[84,4779,4781],{"class":4780},"sHwdD","  \u002F\u002F ...\n",[84,4783,4784],{"class":86,"line":183},[84,4785,2896],{"class":94},[50,4787,4788,4790,4791,795,4793,795,4795,795,4798,795,4801,795,4804,795,4807,799,4810,4813,4814,4817,4818,4820,4821,4824,4825,4828,4829,4832],{},[57,4789,4544],{}," offers ",[57,4792,4762],{},[57,4794,4673],{},[57,4796,4797],{},"exists",[57,4799,4800],{},"stat",[57,4802,4803],{},"readDir",[57,4805,4806],{},"readDirRecursive",[57,4808,4809],{},"realpath",[57,4811,4812],{},"glob",". Relative paths resolve from the project root, and missing files return ",[57,4815,4816],{},"undefined"," instead of throwing. ",[57,4819,4673],{}," returns ",[57,4822,4823],{},"unknown",", so validate the value before using it. Doctor records every read as an input of the Rule, so do not import ",[57,4826,4827],{},"node:fs"," or read ",[57,4830,4831],{},"process.env"," in Rule code; built-in Rule Packs enforce this with a lint rule.",[50,4834,4835,4838,4839,4842,4843,4845,4846,4849,4850,799,4852,4854],{},[57,4836,4837],{},"ctx.cache"," is memory shared by all Rules for one Doctor Run. A value remembered with ",[57,4840,4841],{},"ctx.cache.set"," carries the ",[57,4844,4544],{}," reads made since the matching ",[57,4847,4848],{},"ctx.cache.get"," missed, so another Rule that reuses it depends on the same inputs. Derive cached values only from the key, ",[57,4851,4544],{},[57,4853,4540],{},", never from the current file.",[50,4856,4857,4858,787,4860,4863,4864,4866,4867,4869,4870,4873,4874,4876,4877,2276,4880,4883],{},"Doctor caches each Rule's Diagnostics per file between runs and replays them while the file, the Project Inventory, the Rule config, and every input the Rule read are unchanged. The cache key includes the Rule Pack ",[57,4859,1107],{},[57,4861,4862],{},"version",", the Rule's ",[57,4865,806],{}," (prefilter included), and the source of its ",[57,4868,4647],{}," function, so bump the Rule Pack version when a Rule's helpers change. Set ",[57,4871,4872],{},"meta.cacheScope: \"none\""," for a Rule that reads anything ",[57,4875,4544],{}," cannot see, and ",[57,4878,4879],{},"meta.determinism: \"env-dependent\"",[57,4881,4882],{},"\"runtime-dependent\""," for a Rule whose result depends on the environment or a network call. Doctor runs those Rules every time. A Rule that changes Project Inventory, such as adding evidence gaps, is not cached either.",[66,4885,4887],{"id":4886},"report-scope","Report scope",[50,4889,4890,4891,4893,4894,4897,4898,4901,4902,4905,4906,4909,4910,4912],{},"A file Rule reports Diagnostics into the file it analyzes: the reported ",[57,4892,812],{}," and every ",[57,4895,4896],{},"related"," location must be ",[57,4899,4900],{},"ctx.file.path",". That is the default ",[57,4903,4904],{},"meta.reportScope: \"file\"",", and Doctor enforces it. A file Rule that reports anywhere else stops the Doctor Run with ",[57,4907,4908],{},"DOC0030",", naming the Rule, the analyzed file, and the other file. Evidence ",[57,4911,812],{}," entries are not report locations and are not checked.",[50,4914,4915],{},"A file Rule that does report into other files, for example on the module an import resolves to, declares it:",[74,4917,4919],{"className":76,"code":4918,"language":79,"meta":80,"style":80},"createRule({\n  meta: {\n    id: \"acme\u002Fimported-legacy\",\n    title: \"Legacy module\",\n    category: \"imports\",\n    severity: \"warn\",\n    reportScope: \"project\",\n  },\n  create(ctx) {\n    \u002F\u002F ...\n    ctx.report(diagnostics.ACME0002(), {\n      file: target,\n      related: [{ file: ctx.file.path, message: \"Imported here\" }],\n    });\n  },\n});\n",[57,4920,4921,4930,4938,4953,4968,4982,4996,5012,5016,5028,5033,5056,5068,5115,5123,5127],{"__ignoreMap":80},[84,4922,4923,4926,4928],{"class":86,"line":87},[84,4924,4925],{"class":176},"createRule",[84,4927,278],{"class":101},[84,4929,281],{"class":94},[84,4931,4932,4934,4936],{"class":86,"line":98},[84,4933,287],{"class":192},[84,4935,196],{"class":94},[84,4937,95],{"class":94},[84,4939,4940,4942,4944,4946,4949,4951],{"class":86,"line":108},[84,4941,297],{"class":192},[84,4943,196],{"class":94},[84,4945,141],{"class":94},[84,4947,4948],{"class":144},"acme\u002Fimported-legacy",[84,4950,147],{"class":94},[84,4952,105],{"class":94},[84,4954,4955,4957,4959,4961,4964,4966],{"class":86,"line":116},[84,4956,313],{"class":192},[84,4958,196],{"class":94},[84,4960,141],{"class":94},[84,4962,4963],{"class":144},"Legacy module",[84,4965,147],{"class":94},[84,4967,105],{"class":94},[84,4969,4970,4972,4974,4976,4978,4980],{"class":86,"line":124},[84,4971,330],{"class":192},[84,4973,196],{"class":94},[84,4975,141],{"class":94},[84,4977,2290],{"class":144},[84,4979,147],{"class":94},[84,4981,105],{"class":94},[84,4983,4984,4986,4988,4990,4992,4994],{"class":86,"line":132},[84,4985,347],{"class":192},[84,4987,196],{"class":94},[84,4989,141],{"class":94},[84,4991,354],{"class":144},[84,4993,147],{"class":94},[84,4995,105],{"class":94},[84,4997,4998,5001,5003,5005,5008,5010],{"class":86,"line":153},[84,4999,5000],{"class":192},"    reportScope",[84,5002,196],{"class":94},[84,5004,141],{"class":94},[84,5006,5007],{"class":144},"project",[84,5009,147],{"class":94},[84,5011,105],{"class":94},[84,5013,5014],{"class":86,"line":160},[84,5015,396],{"class":94},[84,5017,5018,5020,5022,5024,5026],{"class":86,"line":183},[84,5019,402],{"class":192},[84,5021,278],{"class":94},[84,5023,408],{"class":407},[84,5025,253],{"class":94},[84,5027,95],{"class":94},[84,5029,5030],{"class":86,"line":229},[84,5031,5032],{"class":4780},"    \u002F\u002F ...\n",[84,5034,5035,5038,5040,5042,5044,5046,5048,5050,5052,5054],{"class":86,"line":250},[84,5036,5037],{"class":101},"    ctx",[84,5039,64],{"class":94},[84,5041,484],{"class":176},[84,5043,278],{"class":192},[84,5045,497],{"class":101},[84,5047,64],{"class":94},[84,5049,844],{"class":176},[84,5051,1159],{"class":192},[84,5053,206],{"class":94},[84,5055,95],{"class":94},[84,5057,5058,5061,5063,5066],{"class":86,"line":258},[84,5059,5060],{"class":192},"      file",[84,5062,196],{"class":94},[84,5064,5065],{"class":101}," target",[84,5067,105],{"class":94},[84,5069,5070,5073,5075,5077,5079,5082,5084,5086,5088,5090,5092,5095,5097,5100,5102,5104,5107,5109,5111,5113],{"class":86,"line":263},[84,5071,5072],{"class":192},"      related",[84,5074,196],{"class":94},[84,5076,377],{"class":192},[84,5078,189],{"class":94},[84,5080,5081],{"class":192}," file",[84,5083,196],{"class":94},[84,5085,563],{"class":101},[84,5087,64],{"class":94},[84,5089,812],{"class":101},[84,5091,64],{"class":94},[84,5093,5094],{"class":101},"path",[84,5096,206],{"class":94},[84,5098,5099],{"class":192}," message",[84,5101,196],{"class":94},[84,5103,141],{"class":94},[84,5105,5106],{"class":144},"Imported here",[84,5108,147],{"class":94},[84,5110,221],{"class":94},[84,5112,224],{"class":192},[84,5114,105],{"class":94},[84,5116,5117,5119,5121],{"class":86,"line":284},[84,5118,3367],{"class":94},[84,5120,253],{"class":192},[84,5122,150],{"class":94},[84,5124,5125],{"class":86,"line":294},[84,5126,396],{"class":94},[84,5128,5129,5131,5133],{"class":86,"line":310},[84,5130,135],{"class":94},[84,5132,253],{"class":101},[84,5134,150],{"class":94},[50,5136,5137,5138,2276,5141,5144,5145,5148],{},"Manifest and workspace Rules (",[57,5139,5140],{},"execution: \"manifest\"",[57,5142,5143],{},"\"workspace\"",") report on the project and are always project-scoped; ",[57,5146,5147],{},"reportScope"," does not apply to them and they are never checked.",[50,5150,5151,5152,5155,5156,5158,5159,5162,5163,5166,5167,5169],{},"The scope decides what a ",[57,5153,5154],{},"--changed"," run analyzes. Diagnostics of a file-scoped Rule can only land in the file it analyzed, so ",[57,5157,5154],{}," runs file-scoped Rules on changed files only, and does not even parse unchanged files unless something needs them. Project-scoped file Rules, manifest Rules, workspace Rules, and ",[57,5160,5161],{},"--analyses"," still see the whole project. Either way the report equals a full run filtered to the changed lines, so declare ",[57,5164,5165],{},"\"project\""," whenever a Rule can report outside its file; a Rule that is wrongly left file-scoped fails with ",[57,5168,4908],{}," on any run that reaches the offending report.",[66,5171,5173],{"id":5172},"file-rule-execution-contract","File Rule execution contract",[50,5175,5176,5177,5179,5180,5182,5183,5185,5186,5188,5189,5191,5192,5195],{},"File Rules run one file at a time. For each file, Doctor skips Rules whose\n",[57,5178,2238],{}," cannot match, awaits every remaining Rule's ",[57,5181,832],{}," in\nenabled-rule order, then awaits every ",[57,5184,1352],{}," hook in that order. It walks the\nscript once in depth-first order. On entering a node it calls each Rule's\nvisitor for that node type, in Rule order; after the node's children it calls\nthe ",[57,5187,836],{}," visitors the same way. The template walk follows with the same\nenter and exit order, using each Rule's ",[57,5190,1366],{}," visitors. All callbacks for\none file finish before the next file's ",[57,5193,5194],{},"create()",". Diagnostics appear in Rule\norder, then file order.",[50,5197,5198,5199,5201,5202,5204],{},"Custom Rule Packs that coordinate through shared module state or ",[57,5200,4837],{},"\nmust not assume an earlier Rule has finished its callbacks when their ",[57,5203,5194],{},"\nruns. Use caches for reusable facts, not to sequence Rules.",[50,5206,5207,5208,5211,5212,5215,5216,64],{},"The catch-all ",[57,5209,5210],{},"ScriptNode"," hook was removed. Move its body into visitors for\nthe node types it checked, for example ",[57,5213,5214],{},"ScriptNode(node) { if (node.type !== \"CallExpression\") return; ... }"," becomes ",[57,5217,5218],{},"CallExpression(node) { ... }",[50,5220,5207,5221,5224,5225,5228,5229,795,5232,5215,5234,105,5236,5215,5239,5242,5243,5246,5247,5250,5251,787,5253,5255,5256,5215,5259,795,5262,5228,5265,799,5267,5270,5271,787,5273,5275],{},[57,5222,5223],{},"TemplateNode"," hook was removed too, along with the\nvue-eslint-parser node shapes it received. ",[57,5226,5227],{},"node.type === \"VElement\""," becomes\n",[57,5230,5231],{},"template: { element(node) {} }",[57,5233,2170],{},[57,5235,1565],{},[57,5237,5238],{},"startTag.attributes",[57,5240,5241],{},"props",", a directive's ",[57,5244,5245],{},"key.name.name"," and\n",[57,5248,5249],{},"key.argument.name"," become ",[57,5252,1107],{},[57,5254,2167],{},", a static\n",[57,5257,5258],{},"value.value",[57,5260,5261],{},"value.content",[57,5263,5264],{},"value.expression",[57,5266,2184],{},[57,5268,5269],{},"parent"," chains become\n",[57,5272,1373],{},[57,5274,2106],{}," visitors.",[50,5277,5278],{},"Treat SFC, script and template ASTs as read-only. Script parent links are complete\nbefore script callbacks run, and both traversals are snapshotted before\ncallbacks: replacing or removing children does not remove their queued visits,\nand inserted children are not visited. This also applies to the single-visitor\nrunner. AST mutations are unsupported; no mutation behavior is guaranteed across\nRules. Keep analysis state outside the AST.",[5280,5281,5282],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":80,"searchDepth":98,"depth":98,"links":5284},[5285,5291,5292,5293,5294,5297,5298,5299,5300],{"id":68,"depth":98,"text":69,"children":5286},[5287,5288,5289,5290],{"id":826,"depth":108,"text":827},{"id":1359,"depth":108,"text":1360},{"id":2232,"depth":108,"text":2233},{"id":2357,"depth":108,"text":2358},{"id":2444,"depth":98,"text":2445},{"id":2710,"depth":98,"text":2711},{"id":3153,"depth":98,"text":2707},{"id":3549,"depth":98,"text":3550,"children":5295},[5296],{"id":4003,"depth":108,"text":4004},{"id":4435,"depth":98,"text":4436},{"id":4529,"depth":98,"text":4530},{"id":4886,"depth":98,"text":4887},{"id":5172,"depth":98,"text":5173},"Write custom Rules, ship them with a Vite plugin or Nuxt module, and test them.","md",null,{"icon":5305},"i-lucide-puzzle",{"title":37,"description":5301},"wBf7TWsex0qG_luUU8lXvwj1wU2AZ92nvbh46rLI-z4",[5309,5311],{"title":33,"path":34,"stem":35,"description":5310,"children":-1},"Diagnose dependency contracts in a library's built output.",{"title":41,"path":42,"stem":43,"description":5312,"children":-1},"Diagnose Pinia store definitions with the Pinia Rule Pack.",1791309509314]