[{"data":1,"prerenderedAt":397},["ShallowReactive",2],{"navigation_docs":3,"rule-content-\u002Fnuxt\u002Frules\u002Fstructure\u002Fno-server-utils-in-app":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,"description":386,"diagnosticCodes":387,"docsUrl":55,"extension":388,"fix":56,"framework":389,"meta":390,"navigation":391,"pack":57,"path":393,"recommendedReplacement":113,"ruleId":58,"seo":394,"severity":59,"source":60,"sourceUrl":61,"stem":395,"why":106,"__hash__":396},"rules\u002Fnuxt\u002Frules\u002Fstructure\u002Fno-server-utils-in-app.md","Do not import server code into app or shared code",{"type":48,"value":49,"toc":377},"minimark",[50,62,67,99,103,107,111,114,118,130,134,139,142,185,188,373],[51,52],"rule-metadata",{"category":53,"diagnosticCodes":54,"docsUrl":55,"fix":56,"pack":57,"ruleId":58,"severity":59,"source":60,"sourceUrl":61},"architecture","NUXT0075","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fshared","suggestion","vite-doctor\u002Fnuxt","nuxt\u002Fstructure\u002Fno-server-utils-in-app","error","src\u002Frule-packs\u002Fnuxt\u002Frules\u002Fnuxt\u002Fno-server-utils-in-app.ts","https:\u002F\u002Fgithub.com\u002Fonmax\u002Fvite-doctor\u002Fblob\u002Fmain\u002Fsrc\u002Frule-packs\u002Fnuxt\u002Frules\u002Fnuxt\u002Fno-server-utils-in-app.ts",[63,64,66],"h2",{"id":65},"run-this-rule","Run this rule",[68,69,74],"pre",{"className":70,"code":71,"language":72,"meta":73,"style":73},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm nuxt doctor --rules nuxt\u002Fstructure\u002Fno-server-utils-in-app\n","bash","",[75,76,77],"code",{"__ignoreMap":73},[78,79,82,86,90,93,96],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"sBMFI","pnpm",[78,87,89],{"class":88},"sfazB"," nuxt",[78,91,92],{"class":88}," doctor",[78,94,95],{"class":88}," --rules",[78,97,98],{"class":88}," nuxt\u002Fstructure\u002Fno-server-utils-in-app\n",[63,100,102],{"id":101},"why-it-matters","Why it matters",[104,105,106],"p",{},"Nuxt's import protection doesn't block server\u002Futils. Importing from it in app code ships server code (database clients, private config reads, Node APIs) into the client bundle. Code used by both sides belongs in shared\u002Futils\u002F, which Nuxt auto-imports in both the app and the server.",[63,108,110],{"id":109},"recommended-fix","Recommended fix",[104,112,113],{},"Move code used by both the app and the server to shared\u002Futils\u002F. Keep server-only logic in server\u002F and call it through an API route.",[63,115,117],{"id":116},"useful-links","Useful links",[119,120,121],"ul",{},[122,123,124],"li",{},[125,126,129],"a",{"href":55,"rel":127},[128],"nofollow","Rule reference",[63,131,133],{"id":132},"example","Example",[135,136,138],"h3",{"id":137},"share-utilities-through-sharedutils","Share utilities through shared\u002Futils",[104,140,141],{},"Before",[68,143,147],{"className":144,"code":145,"language":146,"meta":73,"style":73},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F app\u002Fcomponents\u002FPriceTag.vue \u003Cscript setup>\nimport { formatPrice } from '~~\u002Fserver\u002Futils\u002Fpricing'\n","ts",[75,148,149,155],{"__ignoreMap":73},[78,150,151],{"class":80,"line":81},[78,152,154],{"class":153},"sHwdD","\u002F\u002F app\u002Fcomponents\u002FPriceTag.vue \u003Cscript setup>\n",[78,156,158,162,166,170,173,176,179,182],{"class":80,"line":157},2,[78,159,161],{"class":160},"s7zQu","import",[78,163,165],{"class":164},"sMK4o"," {",[78,167,169],{"class":168},"sTEyZ"," formatPrice",[78,171,172],{"class":164}," }",[78,174,175],{"class":160}," from",[78,177,178],{"class":164}," '",[78,180,181],{"class":88},"~~\u002Fserver\u002Futils\u002Fpricing",[78,183,184],{"class":164},"'\n",[104,186,187],{},"After",[68,189,191],{"className":144,"code":190,"language":146,"meta":73,"style":73},"\u002F\u002F shared\u002Futils\u002Fformat-price.ts\nexport function formatPrice(cents: number, currency: string) {\n  return new Intl.NumberFormat('en', { style: 'currency', currency }).format(cents \u002F 100)\n}\n\n\u002F\u002F app\u002Fcomponents\u002FPriceTag.vue: auto-imported\nconst label = computed(() => formatPrice(props.cents, props.currency))\n",[75,192,193,198,240,312,318,325,331],{"__ignoreMap":73},[78,194,195],{"class":80,"line":81},[78,196,197],{"class":153},"\u002F\u002F shared\u002Futils\u002Fformat-price.ts\n",[78,199,200,203,207,210,213,217,220,223,226,229,231,234,237],{"class":80,"line":157},[78,201,202],{"class":160},"export",[78,204,206],{"class":205},"spNyl"," function",[78,208,169],{"class":209},"s2Zo4",[78,211,212],{"class":164},"(",[78,214,216],{"class":215},"sHdIc","cents",[78,218,219],{"class":164},":",[78,221,222],{"class":84}," number",[78,224,225],{"class":164},",",[78,227,228],{"class":215}," currency",[78,230,219],{"class":164},[78,232,233],{"class":84}," string",[78,235,236],{"class":164},")",[78,238,239],{"class":164}," {\n",[78,241,243,246,249,252,255,258,261,264,267,269,271,273,276,278,280,283,285,287,289,291,293,295,298,300,302,305,309],{"class":80,"line":242},3,[78,244,245],{"class":160},"  return",[78,247,248],{"class":164}," new",[78,250,251],{"class":168}," Intl",[78,253,254],{"class":164},".",[78,256,257],{"class":209},"NumberFormat",[78,259,212],{"class":260},"swJcz",[78,262,263],{"class":164},"'",[78,265,266],{"class":88},"en",[78,268,263],{"class":164},[78,270,225],{"class":164},[78,272,165],{"class":164},[78,274,275],{"class":260}," style",[78,277,219],{"class":164},[78,279,178],{"class":164},[78,281,282],{"class":88},"currency",[78,284,263],{"class":164},[78,286,225],{"class":164},[78,288,228],{"class":168},[78,290,172],{"class":164},[78,292,236],{"class":260},[78,294,254],{"class":164},[78,296,297],{"class":209},"format",[78,299,212],{"class":260},[78,301,216],{"class":168},[78,303,304],{"class":164}," \u002F",[78,306,308],{"class":307},"sbssI"," 100",[78,310,311],{"class":260},")\n",[78,313,315],{"class":80,"line":314},4,[78,316,317],{"class":164},"}\n",[78,319,321],{"class":80,"line":320},5,[78,322,324],{"emptyLinePlaceholder":323},true,"\n",[78,326,328],{"class":80,"line":327},6,[78,329,330],{"class":153},"\u002F\u002F app\u002Fcomponents\u002FPriceTag.vue: auto-imported\n",[78,332,334,337,340,343,346,348,351,354,356,359,361,363,365,368,370],{"class":80,"line":333},7,[78,335,336],{"class":205},"const",[78,338,339],{"class":168}," label ",[78,341,342],{"class":164},"=",[78,344,345],{"class":209}," computed",[78,347,212],{"class":168},[78,349,350],{"class":164},"()",[78,352,353],{"class":205}," =>",[78,355,169],{"class":209},[78,357,358],{"class":168},"(props",[78,360,254],{"class":164},[78,362,216],{"class":168},[78,364,225],{"class":164},[78,366,367],{"class":168}," props",[78,369,254],{"class":164},[78,371,372],{"class":168},"currency))\n",[374,375,376],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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 .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 .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 .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 pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":73,"searchDepth":157,"depth":157,"links":378},[379,380,381,382,383],{"id":65,"depth":157,"text":66},{"id":101,"depth":157,"text":102},{"id":109,"depth":157,"text":110},{"id":116,"depth":157,"text":117},{"id":132,"depth":157,"text":133,"children":384},[385],{"id":137,"depth":242,"text":138},"Report runtime imports from the Nuxt server directory in app or shared code.",[54],"md","nuxt",{},{"title":392},"Server code in app","\u002Fnuxt\u002Frules\u002Fstructure\u002Fno-server-utils-in-app",{"title":46,"description":386},"nuxt\u002Frules\u002Fstructure\u002Fno-server-utils-in-app","BP8huIlFtNq6k8E-edgF_8q_eZRuNEJEmix7p3mVs5Q",1791309473285]