[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"navigation_docs":3,"diagnostic-content-VUE0026":44},[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":46,"body":47,"category":53,"code":428,"description":429,"docsUrl":54,"extension":430,"fix":431,"framework":432,"meta":433,"navigation":434,"pack":56,"path":435,"ruleId":57,"rulePath":58,"seo":436,"severity":59,"source":60,"sourceUrl":61,"stem":437,"why":438,"__hash__":439},"diagnostics\u002Fdiagnostics\u002FVUE0026.md","VUE0026: Name setup-bound composables with use",{"type":48,"value":49,"toc":418},"minimark",[50,62,67,83,87,109,113,118,121,258,261,349,353,356,386,390,402,406,414],[51,52],"rule-metadata",{"category":53,"docsUrl":54,"fix":55,"pack":56,"ruleId":57,"rulePath":58,"severity":59,"source":60,"sourceUrl":61},"composables","https:\u002F\u002Fvuejs.org\u002Fguide\u002Freusability\u002Fcomposables.html#conventions-and-best-practices","suggestion","vite-doctor\u002Fvue","vue\u002Fcomposables\u002Frequire-use-prefix","\u002Fvue\u002Frules\u002Fcomposables\u002Frequire-use-prefix","warn","src\u002Frule-packs\u002Fvue\u002Frules\u002Fvue\u002Frequire-use-prefix.ts","https:\u002F\u002Fgithub.com\u002Fonmax\u002Fvite-doctor\u002Fblob\u002Fmain\u002Fsrc\u002Frule-packs\u002Fvue\u002Frules\u002Fvue\u002Frequire-use-prefix.ts",[63,64,66],"h2",{"id":65},"why-it-happens","Why it happens",[68,69,70,71,75,76,75,79,82],"p",{},"Vue composables are named with a use prefix so readers know a function must run synchronously during setup or inside another composable. Lifecycle hooks, ",[72,73,74],"code",{},"inject()",", ",[72,77,78],{},"provide()",[72,80,81],{},"getCurrentInstance()",", and other composables fail or leak when a plainly named helper is called from an event handler, timer, or module scope.",[63,84,86],{"id":85},"fix","Fix",[68,88,89,90,75,93,96,97,100,101,104,105,108],{},"Rename the function with a use prefix and call it only from setup or another composable. Functions that only create ",[72,91,92],{},"ref()",[72,94,95],{},"reactive()",", or ",[72,98,99],{},"computed()"," state, only read Nuxt app context such as ",[72,102,103],{},"useNuxtApp()"," or ",[72,106,107],{},"useState()",", define*\u002Fcreate* factories, Pinia stores, and on*\u002Fprovide*\u002Finject* helpers are not reported.",[63,110,112],{"id":111},"example","Example",[114,115,117],"h3",{"id":116},"name-setup-bound-functions-as-composables","Name setup-bound functions as composables",[68,119,120],{},"Before",[122,123,128],"pre",{"className":124,"code":125,"language":126,"meta":127,"style":127},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F app\u002Fcomposables\u002Fcart.ts\nexport function cartState() {\n  const items = useState\u003CCartItem[]>('cart', () => [])\n  onMounted(() => hydrateCart(items))\n  return { items }\n}\n","ts","",[72,129,130,139,161,215,238,252],{"__ignoreMap":127},[131,132,135],"span",{"class":133,"line":134},"line",1,[131,136,138],{"class":137},"sHwdD","\u002F\u002F app\u002Fcomposables\u002Fcart.ts\n",[131,140,142,146,150,154,158],{"class":133,"line":141},2,[131,143,145],{"class":144},"s7zQu","export",[131,147,149],{"class":148},"spNyl"," function",[131,151,153],{"class":152},"s2Zo4"," cartState",[131,155,157],{"class":156},"sMK4o","()",[131,159,160],{"class":156}," {\n",[131,162,164,167,171,174,177,180,184,188,191,194,197,201,203,206,209,212],{"class":133,"line":163},3,[131,165,166],{"class":148},"  const",[131,168,170],{"class":169},"sTEyZ"," items",[131,172,173],{"class":156}," =",[131,175,176],{"class":152}," useState",[131,178,179],{"class":156},"\u003C",[131,181,183],{"class":182},"sBMFI","CartItem",[131,185,187],{"class":186},"swJcz","[]",[131,189,190],{"class":156},">",[131,192,193],{"class":186},"(",[131,195,196],{"class":156},"'",[131,198,200],{"class":199},"sfazB","cart",[131,202,196],{"class":156},[131,204,205],{"class":156},",",[131,207,208],{"class":156}," ()",[131,210,211],{"class":148}," =>",[131,213,214],{"class":186}," [])\n",[131,216,218,221,223,225,227,230,232,235],{"class":133,"line":217},4,[131,219,220],{"class":152},"  onMounted",[131,222,193],{"class":186},[131,224,157],{"class":156},[131,226,211],{"class":148},[131,228,229],{"class":152}," hydrateCart",[131,231,193],{"class":186},[131,233,234],{"class":169},"items",[131,236,237],{"class":186},"))\n",[131,239,241,244,247,249],{"class":133,"line":240},5,[131,242,243],{"class":144},"  return",[131,245,246],{"class":156}," {",[131,248,170],{"class":169},[131,250,251],{"class":156}," }\n",[131,253,255],{"class":133,"line":254},6,[131,256,257],{"class":156},"}\n",[68,259,260],{},"After",[122,262,264],{"className":124,"code":263,"language":126,"meta":127,"style":127},"\u002F\u002F app\u002Fcomposables\u002Fcart.ts\nexport function useCart() {\n  const items = useState\u003CCartItem[]>('cart', () => [])\n  onMounted(() => hydrateCart(items))\n  return { items }\n}\n",[72,265,266,270,283,317,335,345],{"__ignoreMap":127},[131,267,268],{"class":133,"line":134},[131,269,138],{"class":137},[131,271,272,274,276,279,281],{"class":133,"line":141},[131,273,145],{"class":144},[131,275,149],{"class":148},[131,277,278],{"class":152}," useCart",[131,280,157],{"class":156},[131,282,160],{"class":156},[131,284,285,287,289,291,293,295,297,299,301,303,305,307,309,311,313,315],{"class":133,"line":163},[131,286,166],{"class":148},[131,288,170],{"class":169},[131,290,173],{"class":156},[131,292,176],{"class":152},[131,294,179],{"class":156},[131,296,183],{"class":182},[131,298,187],{"class":186},[131,300,190],{"class":156},[131,302,193],{"class":186},[131,304,196],{"class":156},[131,306,200],{"class":199},[131,308,196],{"class":156},[131,310,205],{"class":156},[131,312,208],{"class":156},[131,314,211],{"class":148},[131,316,214],{"class":186},[131,318,319,321,323,325,327,329,331,333],{"class":133,"line":217},[131,320,220],{"class":152},[131,322,193],{"class":186},[131,324,157],{"class":156},[131,326,211],{"class":148},[131,328,229],{"class":152},[131,330,193],{"class":186},[131,332,234],{"class":169},[131,334,237],{"class":186},[131,336,337,339,341,343],{"class":133,"line":240},[131,338,243],{"class":144},[131,340,246],{"class":156},[131,342,170],{"class":169},[131,344,251],{"class":156},[131,346,347],{"class":133,"line":254},[131,348,257],{"class":156},[63,350,352],{"id":351},"verify-the-fix","Verify the fix",[68,354,355],{},"Run only this rule after editing so the report stays focused on the diagnostic you are closing:",[122,357,361],{"className":358,"code":359,"language":360,"meta":127,"style":127},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm vite-doctor . --framework vue --rules vue\u002Fcomposables\u002Frequire-use-prefix\n","bash",[72,362,363],{"__ignoreMap":127},[131,364,365,368,371,374,377,380,383],{"class":133,"line":134},[131,366,367],{"class":182},"pnpm",[131,369,370],{"class":199}," vite-doctor",[131,372,373],{"class":199}," .",[131,375,376],{"class":199}," --framework",[131,378,379],{"class":199}," vue",[131,381,382],{"class":199}," --rules",[131,384,385],{"class":199}," vue\u002Fcomposables\u002Frequire-use-prefix\n",[63,387,389],{"id":388},"useful-links","Useful links",[391,392,393],"ul",{},[394,395,396],"li",{},[397,398,401],"a",{"href":54,"rel":399},[400],"nofollow","Upstream docs",[63,403,405],{"id":404},"related-rule","Related rule",[391,407,408],{},[394,409,410],{},[397,411,412],{"href":58},[72,413,57],{},[415,416,417],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":127,"searchDepth":141,"depth":141,"links":419},[420,421,422,425,426,427],{"id":65,"depth":141,"text":66},{"id":85,"depth":141,"text":86},{"id":111,"depth":141,"text":112,"children":423},[424],{"id":116,"depth":163,"text":117},{"id":351,"depth":141,"text":352},{"id":388,"depth":141,"text":389},{"id":404,"depth":141,"text":405},"VUE0026","Finds exported functions that need a component setup context but are not named like composables.","md","Rename the function with a use prefix and call it only from setup or another composable. Functions that only create ref(), reactive(), or computed() state, only read Nuxt app context such as useNuxtApp() or useState(), define*\u002Fcreate* factories, Pinia stores, and on*\u002Fprovide*\u002Finject* helpers are not reported.","vue",{},true,"\u002Fdiagnostics\u002Fvue0026",{"title":46,"description":429},"diagnostics\u002FVUE0026","Vue composables are named with a use prefix so readers know a function must run synchronously during setup or inside another composable. Lifecycle hooks, inject(), provide(), getCurrentInstance(), and other composables fail or leak when a plainly named helper is called from an event handler, timer, or module scope.","zOCWXTHfNZpfo4hMot45XAMxEs8fYj5keOXs1Y3o-AY",1791309483257]