[{"data":1,"prerenderedAt":4583},["ShallowReactive",2],{"navigation":3,"\u002Fpassport\u002Fmiddleware":170,"\u002Fpassport\u002Fmiddleware-surround":4578},[4,18,43,75,103,120,134],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-simple-icons-laravel",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",false,{"title":19,"path":20,"stem":21,"children":22,"page":17},"Sanctum","\u002Fsanctum","2.sanctum",[23,28,33,38],{"title":24,"path":25,"stem":26,"icon":27},"Configuration","\u002Fsanctum\u002Fconfiguration","2.sanctum\u002F1.configuration","i-lucide-cog",{"title":29,"path":30,"stem":31,"icon":32},"Cookie Authentication","\u002Fsanctum\u002Fcookie","2.sanctum\u002F2.cookie","i-lucide-cookie",{"title":34,"path":35,"stem":36,"icon":37},"Sanctum 2FA Flow","\u002Fsanctum\u002Ftwo-factor","2.sanctum\u002F3.two-factor","i-lucide-shield-check",{"title":39,"path":40,"stem":41,"icon":42},"Server Proxy","\u002Fsanctum\u002Fproxy","2.sanctum\u002F4.proxy","i-lucide-waypoints",{"title":44,"path":45,"stem":46,"children":47,"page":17},"Passport","\u002Fpassport","3.passport",[48,51,56,61,66,70],{"title":24,"path":49,"stem":50,"icon":27},"\u002Fpassport\u002Fconfiguration","3.passport\u002F1.configuration",{"title":52,"path":53,"stem":54,"icon":55},"Login & Logout","\u002Fpassport\u002Flogin-logout","3.passport\u002F2.login-logout","i-lucide-log-in",{"title":57,"path":58,"stem":59,"icon":60},"Token Management","\u002Fpassport\u002Ftokens","3.passport\u002F3.tokens","i-lucide-key",{"title":62,"path":63,"stem":64,"icon":65},"Two-Factor Authentication","\u002Fpassport\u002Ftwo-factor","3.passport\u002F4.two-factor","i-lucide-shield",{"title":67,"path":68,"stem":69,"icon":37},"Middleware & Route Protection","\u002Fpassport\u002Fmiddleware","3.passport\u002F5.middleware",{"title":71,"path":72,"stem":73,"icon":74},"Examples & Use Cases","\u002Fpassport\u002Fexamples","3.passport\u002F6.examples","i-lucide-code",{"title":76,"path":77,"stem":78,"children":79,"page":17},"Composables","\u002Fcomposables","4.composables",[80,84,89,94,99],{"title":76,"path":81,"stem":82,"icon":83},"\u002Fcomposables\u002Fcomposables","4.composables\u002F1.composables","i-lucide-code-2",{"title":85,"path":86,"stem":87,"icon":88},"$autx","\u002Fcomposables\u002Fautx","4.composables\u002F2.autx","i-lucide-globe",{"title":90,"path":91,"stem":92,"icon":93},"useAuthConfig","\u002Fcomposables\u002Fuse-auth-config","4.composables\u002F3.use-auth-config","i-lucide-settings",{"title":95,"path":96,"stem":97,"icon":98},"useAuthStore","\u002Fcomposables\u002Fuse-auth-store","4.composables\u002F4.use-auth-store","i-lucide-database",{"title":100,"path":101,"stem":102,"icon":37},"useEnsureCsrf","\u002Fcomposables\u002Fuse-ensure-csrf","4.composables\u002F5.use-ensure-csrf",{"title":104,"path":105,"stem":106,"children":107,"page":17},"Middleware","\u002Fmiddleware","5.middleware",[108,111,116],{"title":104,"path":109,"stem":110,"icon":37},"\u002Fmiddleware\u002Fmiddleware","5.middleware\u002F1.middleware",{"title":112,"path":113,"stem":114,"icon":115},"auth","\u002Fmiddleware\u002Fauth","5.middleware\u002F2.auth","i-lucide-lock",{"title":117,"path":118,"stem":119,"icon":65},"two-factor","\u002Fmiddleware\u002Ftwo-factor","5.middleware\u002F3.two-factor",{"title":121,"path":122,"stem":123,"children":124,"page":17},"Hooks","\u002Fhooks","6.hooks",[125,129],{"title":121,"path":126,"stem":127,"icon":128},"\u002Fhooks\u002Fhooks","6.hooks\u002F1.hooks","i-lucide-webhook",{"title":130,"path":131,"stem":132,"icon":133},"prepare:types","\u002Fhooks\u002Fprepare-types","6.hooks\u002F2.prepare-types","i-lucide-file-code",{"title":135,"path":136,"stem":137,"children":138,"page":17},"Advanced","\u002Fadvanced","7.advanced",[139,143,148,152,156,161,165],{"title":135,"path":140,"stem":141,"icon":142},"\u002Fadvanced\u002Fadvanced","7.advanced\u002F1.advanced","i-lucide-settings-2",{"title":144,"path":145,"stem":146,"icon":147},"Custom Configuration","\u002Fadvanced\u002Fcustom-configuration","7.advanced\u002F2.custom-configuration","i-lucide-sliders",{"title":149,"path":150,"stem":151,"icon":32},"Cookie Configuration","\u002Fadvanced\u002Fcookie-configuration","7.advanced\u002F3.cookie-configuration",{"title":153,"path":154,"stem":155,"icon":133},"TypeScript Integration","\u002Fadvanced\u002Ftypescript-integration","7.advanced\u002F4.typescript-integration",{"title":157,"path":158,"stem":159,"icon":160},"Module Aliases","\u002Fadvanced\u002Fmodule-aliases","7.advanced\u002F5.module-aliases","i-lucide-square-library",{"title":162,"path":163,"stem":164,"icon":37},"Security Features","\u002Fadvanced\u002Fsecurity-features","7.advanced\u002F6.security-features",{"title":166,"path":167,"stem":168,"icon":169},"Runtime Configuration","\u002Fadvanced\u002Fruntime-configuration","7.advanced\u002F7.runtime-configuration","i-lucide-server",{"id":171,"title":67,"body":172,"description":4571,"extension":4572,"links":4573,"meta":4574,"navigation":4575,"path":68,"seo":4576,"stem":69,"__hash__":4577},"docs\u002F3.passport\u002F5.middleware.md",{"type":173,"value":174,"toc":4530},"minimark",[175,179,182,187,190,194,199,206,454,458,464,635,639,643,650,815,819,822,889,893,896,995,999,1003,1006,1201,1205,1404,1408,1624,1628,1632,1857,1861,2036,2040,2212,2216,2220,2592,2596,2777,2781,2785,2929,2933,3094,3098,3102,3448,3452,3720,3724,3728,3809,3813,3943,3947,3951,4511,4513,4526],[176,177,178],"p",{},"Learn how to protect routes and manage authentication flows using Nuxt Umbu middleware with Laravel Passport.",[180,181],"hr",{},[183,184,186],"h2",{"id":185},"overview","Overview",[176,188,189],{},"Nuxt Umbu provides built-in middleware for protecting routes and managing authentication flows. These middleware automatically handle token validation, user authentication, and redirect logic.",[183,191,193],{"id":192},"built-in-middleware","Built-in Middleware",[195,196,198],"h3",{"id":197},"auth-middleware","Auth Middleware",[176,200,201,202,205],{},"The ",[203,204,112],"code",{}," middleware protects routes by requiring user authentication:",[207,208,214],"pre",{"className":209,"code":210,"filename":211,"language":212,"meta":213,"style":213},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F This file is automatically provided by Nuxt Umbu\nexport default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, fetchProfile } = useAuth()\n  \n  if (!loggedIn.value) {\n    \u002F\u002F Redirect to login page\n    return navigateTo('\u002Flogin')\n  }\n  \n  try {\n    \u002F\u002F Verify token is still valid\n    await fetchProfile('client')\n  } catch (error) {\n    \u002F\u002F Token invalid, redirect to login\n    return navigateTo('\u002Flogin')\n  }\n})\n","middleware\u002Fauth.ts","typescript","",[203,215,216,225,264,295,301,327,333,356,362,367,375,381,400,418,424,441,446],{"__ignoreMap":213},[217,218,221],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"sHwdD","\u002F\u002F This file is automatically provided by Nuxt Umbu\n",[217,226,228,232,235,239,243,247,251,255,258,261],{"class":219,"line":227},2,[217,229,231],{"class":230},"s7zQu","export",[217,233,234],{"class":230}," default",[217,236,238],{"class":237},"s2Zo4"," defineNuxtRouteMiddleware",[217,240,242],{"class":241},"sTEyZ","(",[217,244,246],{"class":245},"spNyl","async",[217,248,250],{"class":249},"sMK4o"," (",[217,252,254],{"class":253},"sHdIc","to",[217,256,257],{"class":249},")",[217,259,260],{"class":245}," =>",[217,262,263],{"class":249}," {\n",[217,265,267,270,273,276,279,282,285,288,291],{"class":219,"line":266},3,[217,268,269],{"class":245},"  const",[217,271,272],{"class":249}," {",[217,274,275],{"class":241}," loggedIn",[217,277,278],{"class":249},",",[217,280,281],{"class":241}," fetchProfile",[217,283,284],{"class":249}," }",[217,286,287],{"class":249}," =",[217,289,290],{"class":237}," useAuth",[217,292,294],{"class":293},"swJcz","()\n",[217,296,298],{"class":219,"line":297},4,[217,299,300],{"class":293},"  \n",[217,302,304,307,309,312,315,318,321,324],{"class":219,"line":303},5,[217,305,306],{"class":230},"  if",[217,308,250],{"class":293},[217,310,311],{"class":249},"!",[217,313,314],{"class":241},"loggedIn",[217,316,317],{"class":249},".",[217,319,320],{"class":241},"value",[217,322,323],{"class":293},") ",[217,325,326],{"class":249},"{\n",[217,328,330],{"class":219,"line":329},6,[217,331,332],{"class":223},"    \u002F\u002F Redirect to login page\n",[217,334,336,339,342,344,347,351,353],{"class":219,"line":335},7,[217,337,338],{"class":230},"    return",[217,340,341],{"class":237}," navigateTo",[217,343,242],{"class":293},[217,345,346],{"class":249},"'",[217,348,350],{"class":349},"sfazB","\u002Flogin",[217,352,346],{"class":249},[217,354,355],{"class":293},")\n",[217,357,359],{"class":219,"line":358},8,[217,360,361],{"class":249},"  }\n",[217,363,365],{"class":219,"line":364},9,[217,366,300],{"class":293},[217,368,370,373],{"class":219,"line":369},10,[217,371,372],{"class":230},"  try",[217,374,263],{"class":249},[217,376,378],{"class":219,"line":377},11,[217,379,380],{"class":223},"    \u002F\u002F Verify token is still valid\n",[217,382,384,387,389,391,393,396,398],{"class":219,"line":383},12,[217,385,386],{"class":230},"    await",[217,388,281],{"class":237},[217,390,242],{"class":293},[217,392,346],{"class":249},[217,394,395],{"class":349},"client",[217,397,346],{"class":249},[217,399,355],{"class":293},[217,401,403,406,409,411,414,416],{"class":219,"line":402},13,[217,404,405],{"class":249},"  }",[217,407,408],{"class":230}," catch",[217,410,250],{"class":293},[217,412,413],{"class":241},"error",[217,415,323],{"class":293},[217,417,326],{"class":249},[217,419,421],{"class":219,"line":420},14,[217,422,423],{"class":223},"    \u002F\u002F Token invalid, redirect to login\n",[217,425,427,429,431,433,435,437,439],{"class":219,"line":426},15,[217,428,338],{"class":230},[217,430,341],{"class":237},[217,432,242],{"class":293},[217,434,346],{"class":249},[217,436,350],{"class":349},[217,438,346],{"class":249},[217,440,355],{"class":293},[217,442,444],{"class":219,"line":443},16,[217,445,361],{"class":249},[217,447,449,452],{"class":219,"line":448},17,[217,450,451],{"class":249},"}",[217,453,355],{"class":241},[195,455,457],{"id":456},"two-factor-auth-middleware","Two-Factor Auth Middleware",[176,459,201,460,463],{},[203,461,462],{},"twoFactor"," middleware ensures 2FA verification when required:",[207,465,468],{"className":209,"code":466,"filename":467,"language":212,"meta":213,"style":213},"\u002F\u002F This file is automatically provided by Nuxt Umbu\nexport default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, user } = useAuth()\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  \u002F\u002F Check if user has 2FA enabled but not verified\n  if (user.value?.two_factor_enabled && !user.value?.two_factor_verified) {\n    return navigateTo('\u002F2fa\u002Fverify')\n  }\n})\n","middleware\u002FtwoFactor.ts",[203,469,470,474,496,517,521,539,555,559,563,568,608,625,629],{"__ignoreMap":213},[217,471,472],{"class":219,"line":220},[217,473,224],{"class":223},[217,475,476,478,480,482,484,486,488,490,492,494],{"class":219,"line":227},[217,477,231],{"class":230},[217,479,234],{"class":230},[217,481,238],{"class":237},[217,483,242],{"class":241},[217,485,246],{"class":245},[217,487,250],{"class":249},[217,489,254],{"class":253},[217,491,257],{"class":249},[217,493,260],{"class":245},[217,495,263],{"class":249},[217,497,498,500,502,504,506,509,511,513,515],{"class":219,"line":266},[217,499,269],{"class":245},[217,501,272],{"class":249},[217,503,275],{"class":241},[217,505,278],{"class":249},[217,507,508],{"class":241}," user",[217,510,284],{"class":249},[217,512,287],{"class":249},[217,514,290],{"class":237},[217,516,294],{"class":293},[217,518,519],{"class":219,"line":297},[217,520,300],{"class":293},[217,522,523,525,527,529,531,533,535,537],{"class":219,"line":303},[217,524,306],{"class":230},[217,526,250],{"class":293},[217,528,311],{"class":249},[217,530,314],{"class":241},[217,532,317],{"class":249},[217,534,320],{"class":241},[217,536,323],{"class":293},[217,538,326],{"class":249},[217,540,541,543,545,547,549,551,553],{"class":219,"line":329},[217,542,338],{"class":230},[217,544,341],{"class":237},[217,546,242],{"class":293},[217,548,346],{"class":249},[217,550,350],{"class":349},[217,552,346],{"class":249},[217,554,355],{"class":293},[217,556,557],{"class":219,"line":335},[217,558,361],{"class":249},[217,560,561],{"class":219,"line":358},[217,562,300],{"class":293},[217,564,565],{"class":219,"line":364},[217,566,567],{"class":223},"  \u002F\u002F Check if user has 2FA enabled but not verified\n",[217,569,570,572,574,577,579,581,584,587,590,593,595,597,599,601,604,606],{"class":219,"line":369},[217,571,306],{"class":230},[217,573,250],{"class":293},[217,575,576],{"class":241},"user",[217,578,317],{"class":249},[217,580,320],{"class":241},[217,582,583],{"class":249},"?.",[217,585,586],{"class":241},"two_factor_enabled",[217,588,589],{"class":249}," &&",[217,591,592],{"class":249}," !",[217,594,576],{"class":241},[217,596,317],{"class":249},[217,598,320],{"class":241},[217,600,583],{"class":249},[217,602,603],{"class":241},"two_factor_verified",[217,605,323],{"class":293},[217,607,326],{"class":249},[217,609,610,612,614,616,618,621,623],{"class":219,"line":377},[217,611,338],{"class":230},[217,613,341],{"class":237},[217,615,242],{"class":293},[217,617,346],{"class":249},[217,619,620],{"class":349},"\u002F2fa\u002Fverify",[217,622,346],{"class":249},[217,624,355],{"class":293},[217,626,627],{"class":219,"line":383},[217,628,361],{"class":249},[217,630,631,633],{"class":219,"line":402},[217,632,451],{"class":249},[217,634,355],{"class":241},[183,636,638],{"id":637},"using-middleware","Using Middleware",[195,640,642],{"id":641},"page-level-protection","Page-Level Protection",[176,644,645,646,649],{},"Protect individual pages using the ",[203,647,648],{},"definePageMeta"," macro:",[207,651,656],{"className":652,"code":653,"filename":654,"language":655,"meta":213,"style":213},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>Dashboard\u003C\u002Fh1>\n    \u003Cp>Welcome, {{ user?.name }}!\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\ndefinePageMeta({\n  middleware: 'umbu:auth' \u002F\u002F Requires authentication\n})\n\nconst { user } = useAuth()\n\u003C\u002Fscript>\n","pages\u002Fdashboard.vue","vue",[203,657,658,669,679,700,717,726,734,740,752,760,779,785,789,807],{"__ignoreMap":213},[217,659,660,663,666],{"class":219,"line":220},[217,661,662],{"class":249},"\u003C",[217,664,665],{"class":293},"template",[217,667,668],{"class":249},">\n",[217,670,671,674,677],{"class":219,"line":227},[217,672,673],{"class":249},"  \u003C",[217,675,676],{"class":293},"div",[217,678,668],{"class":249},[217,680,681,684,687,690,693,696,698],{"class":219,"line":266},[217,682,683],{"class":249},"    \u003C",[217,685,686],{"class":293},"h1",[217,688,689],{"class":249},">",[217,691,692],{"class":241},"Dashboard",[217,694,695],{"class":249},"\u003C\u002F",[217,697,686],{"class":293},[217,699,668],{"class":249},[217,701,702,704,706,708,711,713,715],{"class":219,"line":297},[217,703,683],{"class":249},[217,705,176],{"class":293},[217,707,689],{"class":249},[217,709,710],{"class":241},"Welcome, {{ user?.name }}!",[217,712,695],{"class":249},[217,714,176],{"class":293},[217,716,668],{"class":249},[217,718,719,722,724],{"class":219,"line":303},[217,720,721],{"class":249},"  \u003C\u002F",[217,723,676],{"class":293},[217,725,668],{"class":249},[217,727,728,730,732],{"class":219,"line":329},[217,729,695],{"class":249},[217,731,665],{"class":293},[217,733,668],{"class":249},[217,735,736],{"class":219,"line":335},[217,737,739],{"emptyLinePlaceholder":738},true,"\n",[217,741,742,744,747,750],{"class":219,"line":358},[217,743,662],{"class":249},[217,745,746],{"class":293},"script",[217,748,749],{"class":245}," setup",[217,751,668],{"class":249},[217,753,754,756,758],{"class":219,"line":364},[217,755,648],{"class":237},[217,757,242],{"class":241},[217,759,326],{"class":249},[217,761,762,765,768,771,774,776],{"class":219,"line":369},[217,763,764],{"class":293},"  middleware",[217,766,767],{"class":249},":",[217,769,770],{"class":249}," '",[217,772,773],{"class":349},"umbu:auth",[217,775,346],{"class":249},[217,777,778],{"class":223}," \u002F\u002F Requires authentication\n",[217,780,781,783],{"class":219,"line":377},[217,782,451],{"class":249},[217,784,355],{"class":241},[217,786,787],{"class":219,"line":383},[217,788,739],{"emptyLinePlaceholder":738},[217,790,791,794,796,799,801,803,805],{"class":219,"line":402},[217,792,793],{"class":245},"const",[217,795,272],{"class":249},[217,797,798],{"class":241}," user ",[217,800,451],{"class":249},[217,802,287],{"class":249},[217,804,290],{"class":237},[217,806,294],{"class":241},[217,808,809,811,813],{"class":219,"line":420},[217,810,695],{"class":249},[217,812,746],{"class":293},[217,814,668],{"class":249},[195,816,818],{"id":817},"route-level-protection","Route-Level Protection",[176,820,821],{},"Configure middleware in your route definitions:",[207,823,826],{"className":209,"code":824,"filename":825,"language":212,"meta":213,"style":213},"\u003Cscript setup>\ndefinePageMeta({\n  middleware: ['umbu:auth', 'umbu:two-factor'] \u002F\u002F Multiple middleware\n})\n\u003C\u002Fscript>\n","pages\u002Fadmin\u002Findex.vue",[203,827,828,837,845,875,881],{"__ignoreMap":213},[217,829,830,832,835],{"class":219,"line":220},[217,831,662],{"class":249},[217,833,834],{"class":241},"script setup",[217,836,668],{"class":249},[217,838,839,841,843],{"class":219,"line":227},[217,840,648],{"class":237},[217,842,242],{"class":241},[217,844,326],{"class":249},[217,846,847,849,851,854,856,858,860,862,864,867,869,872],{"class":219,"line":266},[217,848,764],{"class":293},[217,850,767],{"class":249},[217,852,853],{"class":241}," [",[217,855,346],{"class":249},[217,857,773],{"class":349},[217,859,346],{"class":249},[217,861,278],{"class":249},[217,863,770],{"class":249},[217,865,866],{"class":349},"umbu:two-factor",[217,868,346],{"class":249},[217,870,871],{"class":241},"] ",[217,873,874],{"class":223},"\u002F\u002F Multiple middleware\n",[217,876,877,879],{"class":219,"line":297},[217,878,451],{"class":249},[217,880,355],{"class":241},[217,882,883,885,887],{"class":219,"line":303},[217,884,695],{"class":249},[217,886,746],{"class":241},[217,888,668],{"class":249},[195,890,892],{"id":891},"layout-level-protection","Layout-Level Protection",[176,894,895],{},"Apply middleware to entire layouts:",[207,897,900],{"className":652,"code":898,"filename":899,"language":655,"meta":213,"style":213},"\u003Ctemplate>\n  \u003Cdiv>\n    \u003CNuxtPage \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\ndefinePageMeta({\n  middleware: 'auth' \u002F\u002F Apply to all pages using this layout\n})\n\u003C\u002Fscript>\n","layouts\u002Fdefault.vue",[203,901,902,910,918,928,936,944,948,958,966,981,987],{"__ignoreMap":213},[217,903,904,906,908],{"class":219,"line":220},[217,905,662],{"class":249},[217,907,665],{"class":293},[217,909,668],{"class":249},[217,911,912,914,916],{"class":219,"line":227},[217,913,673],{"class":249},[217,915,676],{"class":293},[217,917,668],{"class":249},[217,919,920,922,925],{"class":219,"line":266},[217,921,683],{"class":249},[217,923,924],{"class":293},"NuxtPage",[217,926,927],{"class":249}," \u002F>\n",[217,929,930,932,934],{"class":219,"line":297},[217,931,721],{"class":249},[217,933,676],{"class":293},[217,935,668],{"class":249},[217,937,938,940,942],{"class":219,"line":303},[217,939,695],{"class":249},[217,941,665],{"class":293},[217,943,668],{"class":249},[217,945,946],{"class":219,"line":329},[217,947,739],{"emptyLinePlaceholder":738},[217,949,950,952,954,956],{"class":219,"line":335},[217,951,662],{"class":249},[217,953,746],{"class":293},[217,955,749],{"class":245},[217,957,668],{"class":249},[217,959,960,962,964],{"class":219,"line":358},[217,961,648],{"class":237},[217,963,242],{"class":241},[217,965,326],{"class":249},[217,967,968,970,972,974,976,978],{"class":219,"line":364},[217,969,764],{"class":293},[217,971,767],{"class":249},[217,973,770],{"class":249},[217,975,112],{"class":349},[217,977,346],{"class":249},[217,979,980],{"class":223}," \u002F\u002F Apply to all pages using this layout\n",[217,982,983,985],{"class":219,"line":369},[217,984,451],{"class":249},[217,986,355],{"class":241},[217,988,989,991,993],{"class":219,"line":377},[217,990,695],{"class":249},[217,992,746],{"class":293},[217,994,668],{"class":249},[183,996,998],{"id":997},"custom-middleware","Custom Middleware",[195,1000,1002],{"id":1001},"role-based-access-control","Role-Based Access Control",[176,1004,1005],{},"Create custom middleware for role-based protection:",[207,1007,1010],{"className":209,"code":1008,"filename":1009,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, user } = useAuth()\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  \u002F\u002F Check if user has admin role\n  if (!user.value?.roles?.includes('admin')) {\n    throw createError({\n      statusCode: 403,\n      statusMessage: 'Access denied'\n    })\n  }\n})\n","middleware\u002Fadmin.ts",[203,1011,1012,1034,1054,1058,1076,1092,1096,1100,1105,1143,1155,1169,1184,1191,1195],{"__ignoreMap":213},[217,1013,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032],{"class":219,"line":220},[217,1015,231],{"class":230},[217,1017,234],{"class":230},[217,1019,238],{"class":237},[217,1021,242],{"class":241},[217,1023,246],{"class":245},[217,1025,250],{"class":249},[217,1027,254],{"class":253},[217,1029,257],{"class":249},[217,1031,260],{"class":245},[217,1033,263],{"class":249},[217,1035,1036,1038,1040,1042,1044,1046,1048,1050,1052],{"class":219,"line":227},[217,1037,269],{"class":245},[217,1039,272],{"class":249},[217,1041,275],{"class":241},[217,1043,278],{"class":249},[217,1045,508],{"class":241},[217,1047,284],{"class":249},[217,1049,287],{"class":249},[217,1051,290],{"class":237},[217,1053,294],{"class":293},[217,1055,1056],{"class":219,"line":266},[217,1057,300],{"class":293},[217,1059,1060,1062,1064,1066,1068,1070,1072,1074],{"class":219,"line":297},[217,1061,306],{"class":230},[217,1063,250],{"class":293},[217,1065,311],{"class":249},[217,1067,314],{"class":241},[217,1069,317],{"class":249},[217,1071,320],{"class":241},[217,1073,323],{"class":293},[217,1075,326],{"class":249},[217,1077,1078,1080,1082,1084,1086,1088,1090],{"class":219,"line":303},[217,1079,338],{"class":230},[217,1081,341],{"class":237},[217,1083,242],{"class":293},[217,1085,346],{"class":249},[217,1087,350],{"class":349},[217,1089,346],{"class":249},[217,1091,355],{"class":293},[217,1093,1094],{"class":219,"line":329},[217,1095,361],{"class":249},[217,1097,1098],{"class":219,"line":335},[217,1099,300],{"class":293},[217,1101,1102],{"class":219,"line":358},[217,1103,1104],{"class":223},"  \u002F\u002F Check if user has admin role\n",[217,1106,1107,1109,1111,1113,1115,1117,1119,1121,1124,1126,1129,1131,1133,1136,1138,1141],{"class":219,"line":364},[217,1108,306],{"class":230},[217,1110,250],{"class":293},[217,1112,311],{"class":249},[217,1114,576],{"class":241},[217,1116,317],{"class":249},[217,1118,320],{"class":241},[217,1120,583],{"class":249},[217,1122,1123],{"class":241},"roles",[217,1125,583],{"class":249},[217,1127,1128],{"class":237},"includes",[217,1130,242],{"class":293},[217,1132,346],{"class":249},[217,1134,1135],{"class":349},"admin",[217,1137,346],{"class":249},[217,1139,1140],{"class":293},")) ",[217,1142,326],{"class":249},[217,1144,1145,1148,1151,1153],{"class":219,"line":369},[217,1146,1147],{"class":230},"    throw",[217,1149,1150],{"class":237}," createError",[217,1152,242],{"class":293},[217,1154,326],{"class":249},[217,1156,1157,1160,1162,1166],{"class":219,"line":377},[217,1158,1159],{"class":293},"      statusCode",[217,1161,767],{"class":249},[217,1163,1165],{"class":1164},"sbssI"," 403",[217,1167,1168],{"class":249},",\n",[217,1170,1171,1174,1176,1178,1181],{"class":219,"line":383},[217,1172,1173],{"class":293},"      statusMessage",[217,1175,767],{"class":249},[217,1177,770],{"class":249},[217,1179,1180],{"class":349},"Access denied",[217,1182,1183],{"class":249},"'\n",[217,1185,1186,1189],{"class":219,"line":402},[217,1187,1188],{"class":249},"    }",[217,1190,355],{"class":293},[217,1192,1193],{"class":219,"line":420},[217,1194,361],{"class":249},[217,1196,1197,1199],{"class":219,"line":426},[217,1198,451],{"class":249},[217,1200,355],{"class":241},[195,1202,1204],{"id":1203},"permission-based-access","Permission-Based Access",[207,1206,1209],{"className":209,"code":1207,"filename":1208,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware((to) => {\n  const { loggedIn, user } = useAuth()\n  const requiredPermission = to.meta.permission\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  if (requiredPermission && !user.value?.permissions?.includes(requiredPermission)) {\n    throw createError({\n      statusCode: 403,\n      statusMessage: 'Insufficient permissions'\n    })\n  }\n})\n","middleware\u002Fpermission.ts",[203,1210,1211,1231,1251,1273,1277,1295,1311,1315,1319,1355,1365,1375,1388,1394,1398],{"__ignoreMap":213},[217,1212,1213,1215,1217,1219,1221,1223,1225,1227,1229],{"class":219,"line":220},[217,1214,231],{"class":230},[217,1216,234],{"class":230},[217,1218,238],{"class":237},[217,1220,242],{"class":241},[217,1222,242],{"class":249},[217,1224,254],{"class":253},[217,1226,257],{"class":249},[217,1228,260],{"class":245},[217,1230,263],{"class":249},[217,1232,1233,1235,1237,1239,1241,1243,1245,1247,1249],{"class":219,"line":227},[217,1234,269],{"class":245},[217,1236,272],{"class":249},[217,1238,275],{"class":241},[217,1240,278],{"class":249},[217,1242,508],{"class":241},[217,1244,284],{"class":249},[217,1246,287],{"class":249},[217,1248,290],{"class":237},[217,1250,294],{"class":293},[217,1252,1253,1255,1258,1260,1263,1265,1268,1270],{"class":219,"line":266},[217,1254,269],{"class":245},[217,1256,1257],{"class":241}," requiredPermission",[217,1259,287],{"class":249},[217,1261,1262],{"class":241}," to",[217,1264,317],{"class":249},[217,1266,1267],{"class":241},"meta",[217,1269,317],{"class":249},[217,1271,1272],{"class":241},"permission\n",[217,1274,1275],{"class":219,"line":297},[217,1276,300],{"class":293},[217,1278,1279,1281,1283,1285,1287,1289,1291,1293],{"class":219,"line":303},[217,1280,306],{"class":230},[217,1282,250],{"class":293},[217,1284,311],{"class":249},[217,1286,314],{"class":241},[217,1288,317],{"class":249},[217,1290,320],{"class":241},[217,1292,323],{"class":293},[217,1294,326],{"class":249},[217,1296,1297,1299,1301,1303,1305,1307,1309],{"class":219,"line":329},[217,1298,338],{"class":230},[217,1300,341],{"class":237},[217,1302,242],{"class":293},[217,1304,346],{"class":249},[217,1306,350],{"class":349},[217,1308,346],{"class":249},[217,1310,355],{"class":293},[217,1312,1313],{"class":219,"line":335},[217,1314,361],{"class":249},[217,1316,1317],{"class":219,"line":358},[217,1318,300],{"class":293},[217,1320,1321,1323,1325,1328,1330,1332,1334,1336,1338,1340,1343,1345,1347,1349,1351,1353],{"class":219,"line":364},[217,1322,306],{"class":230},[217,1324,250],{"class":293},[217,1326,1327],{"class":241},"requiredPermission",[217,1329,589],{"class":249},[217,1331,592],{"class":249},[217,1333,576],{"class":241},[217,1335,317],{"class":249},[217,1337,320],{"class":241},[217,1339,583],{"class":249},[217,1341,1342],{"class":241},"permissions",[217,1344,583],{"class":249},[217,1346,1128],{"class":237},[217,1348,242],{"class":293},[217,1350,1327],{"class":241},[217,1352,1140],{"class":293},[217,1354,326],{"class":249},[217,1356,1357,1359,1361,1363],{"class":219,"line":369},[217,1358,1147],{"class":230},[217,1360,1150],{"class":237},[217,1362,242],{"class":293},[217,1364,326],{"class":249},[217,1366,1367,1369,1371,1373],{"class":219,"line":377},[217,1368,1159],{"class":293},[217,1370,767],{"class":249},[217,1372,1165],{"class":1164},[217,1374,1168],{"class":249},[217,1376,1377,1379,1381,1383,1386],{"class":219,"line":383},[217,1378,1173],{"class":293},[217,1380,767],{"class":249},[217,1382,770],{"class":249},[217,1384,1385],{"class":349},"Insufficient permissions",[217,1387,1183],{"class":249},[217,1389,1390,1392],{"class":219,"line":402},[217,1391,1188],{"class":249},[217,1393,355],{"class":293},[217,1395,1396],{"class":219,"line":420},[217,1397,361],{"class":249},[217,1399,1400,1402],{"class":219,"line":426},[217,1401,451],{"class":249},[217,1403,355],{"class":241},[195,1405,1407],{"id":1406},"subscription-based-access","Subscription-Based Access",[207,1409,1412],{"className":209,"code":1410,"filename":1411,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, user } = useAuth()\n  const requiredPlan = to.meta.plan\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  if (requiredPlan) {\n    const userPlan = user.value?.subscription?.plan\n    \n    if (!userPlan || userPlan !== requiredPlan) {\n      return navigateTo('\u002Fbilling\u002Fupgrade')\n    }\n  }\n})\n","middleware\u002Fsubscription.ts",[203,1413,1414,1436,1456,1476,1480,1498,1514,1518,1522,1535,1560,1565,1591,1609,1614,1618],{"__ignoreMap":213},[217,1415,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434],{"class":219,"line":220},[217,1417,231],{"class":230},[217,1419,234],{"class":230},[217,1421,238],{"class":237},[217,1423,242],{"class":241},[217,1425,246],{"class":245},[217,1427,250],{"class":249},[217,1429,254],{"class":253},[217,1431,257],{"class":249},[217,1433,260],{"class":245},[217,1435,263],{"class":249},[217,1437,1438,1440,1442,1444,1446,1448,1450,1452,1454],{"class":219,"line":227},[217,1439,269],{"class":245},[217,1441,272],{"class":249},[217,1443,275],{"class":241},[217,1445,278],{"class":249},[217,1447,508],{"class":241},[217,1449,284],{"class":249},[217,1451,287],{"class":249},[217,1453,290],{"class":237},[217,1455,294],{"class":293},[217,1457,1458,1460,1463,1465,1467,1469,1471,1473],{"class":219,"line":266},[217,1459,269],{"class":245},[217,1461,1462],{"class":241}," requiredPlan",[217,1464,287],{"class":249},[217,1466,1262],{"class":241},[217,1468,317],{"class":249},[217,1470,1267],{"class":241},[217,1472,317],{"class":249},[217,1474,1475],{"class":241},"plan\n",[217,1477,1478],{"class":219,"line":297},[217,1479,300],{"class":293},[217,1481,1482,1484,1486,1488,1490,1492,1494,1496],{"class":219,"line":303},[217,1483,306],{"class":230},[217,1485,250],{"class":293},[217,1487,311],{"class":249},[217,1489,314],{"class":241},[217,1491,317],{"class":249},[217,1493,320],{"class":241},[217,1495,323],{"class":293},[217,1497,326],{"class":249},[217,1499,1500,1502,1504,1506,1508,1510,1512],{"class":219,"line":329},[217,1501,338],{"class":230},[217,1503,341],{"class":237},[217,1505,242],{"class":293},[217,1507,346],{"class":249},[217,1509,350],{"class":349},[217,1511,346],{"class":249},[217,1513,355],{"class":293},[217,1515,1516],{"class":219,"line":335},[217,1517,361],{"class":249},[217,1519,1520],{"class":219,"line":358},[217,1521,300],{"class":293},[217,1523,1524,1526,1528,1531,1533],{"class":219,"line":364},[217,1525,306],{"class":230},[217,1527,250],{"class":293},[217,1529,1530],{"class":241},"requiredPlan",[217,1532,323],{"class":293},[217,1534,326],{"class":249},[217,1536,1537,1540,1543,1545,1547,1549,1551,1553,1556,1558],{"class":219,"line":369},[217,1538,1539],{"class":245},"    const",[217,1541,1542],{"class":241}," userPlan",[217,1544,287],{"class":249},[217,1546,508],{"class":241},[217,1548,317],{"class":249},[217,1550,320],{"class":241},[217,1552,583],{"class":249},[217,1554,1555],{"class":241},"subscription",[217,1557,583],{"class":249},[217,1559,1475],{"class":241},[217,1561,1562],{"class":219,"line":377},[217,1563,1564],{"class":293},"    \n",[217,1566,1567,1570,1572,1574,1577,1580,1582,1585,1587,1589],{"class":219,"line":383},[217,1568,1569],{"class":230},"    if",[217,1571,250],{"class":293},[217,1573,311],{"class":249},[217,1575,1576],{"class":241},"userPlan",[217,1578,1579],{"class":249}," ||",[217,1581,1542],{"class":241},[217,1583,1584],{"class":249}," !==",[217,1586,1462],{"class":241},[217,1588,323],{"class":293},[217,1590,326],{"class":249},[217,1592,1593,1596,1598,1600,1602,1605,1607],{"class":219,"line":402},[217,1594,1595],{"class":230},"      return",[217,1597,341],{"class":237},[217,1599,242],{"class":293},[217,1601,346],{"class":249},[217,1603,1604],{"class":349},"\u002Fbilling\u002Fupgrade",[217,1606,346],{"class":249},[217,1608,355],{"class":293},[217,1610,1611],{"class":219,"line":420},[217,1612,1613],{"class":249},"    }\n",[217,1615,1616],{"class":219,"line":426},[217,1617,361],{"class":249},[217,1619,1620,1622],{"class":219,"line":443},[217,1621,451],{"class":249},[217,1623,355],{"class":241},[183,1625,1627],{"id":1626},"advanced-middleware-patterns","Advanced Middleware Patterns",[195,1629,1631],{"id":1630},"conditional-middleware","Conditional Middleware",[207,1633,1636],{"className":209,"code":1634,"filename":1635,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, user } = useAuth()\n  \n  \u002F\u002F Only apply to certain routes\n  if (!to.path.startsWith('\u002Fadmin')) {\n    return\n  }\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  \u002F\u002F Additional admin checks\n  if (!user.value?.is_admin) {\n    throw createError({\n      statusCode: 403,\n      statusMessage: 'Admin access required'\n    })\n  }\n})\n","middleware\u002Fconditional.ts",[203,1637,1638,1660,1680,1684,1689,1722,1727,1731,1735,1753,1769,1773,1777,1782,1805,1815,1825,1838,1845,1850],{"__ignoreMap":213},[217,1639,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658],{"class":219,"line":220},[217,1641,231],{"class":230},[217,1643,234],{"class":230},[217,1645,238],{"class":237},[217,1647,242],{"class":241},[217,1649,246],{"class":245},[217,1651,250],{"class":249},[217,1653,254],{"class":253},[217,1655,257],{"class":249},[217,1657,260],{"class":245},[217,1659,263],{"class":249},[217,1661,1662,1664,1666,1668,1670,1672,1674,1676,1678],{"class":219,"line":227},[217,1663,269],{"class":245},[217,1665,272],{"class":249},[217,1667,275],{"class":241},[217,1669,278],{"class":249},[217,1671,508],{"class":241},[217,1673,284],{"class":249},[217,1675,287],{"class":249},[217,1677,290],{"class":237},[217,1679,294],{"class":293},[217,1681,1682],{"class":219,"line":266},[217,1683,300],{"class":293},[217,1685,1686],{"class":219,"line":297},[217,1687,1688],{"class":223},"  \u002F\u002F Only apply to certain routes\n",[217,1690,1691,1693,1695,1697,1699,1701,1704,1706,1709,1711,1713,1716,1718,1720],{"class":219,"line":303},[217,1692,306],{"class":230},[217,1694,250],{"class":293},[217,1696,311],{"class":249},[217,1698,254],{"class":241},[217,1700,317],{"class":249},[217,1702,1703],{"class":241},"path",[217,1705,317],{"class":249},[217,1707,1708],{"class":237},"startsWith",[217,1710,242],{"class":293},[217,1712,346],{"class":249},[217,1714,1715],{"class":349},"\u002Fadmin",[217,1717,346],{"class":249},[217,1719,1140],{"class":293},[217,1721,326],{"class":249},[217,1723,1724],{"class":219,"line":329},[217,1725,1726],{"class":230},"    return\n",[217,1728,1729],{"class":219,"line":335},[217,1730,361],{"class":249},[217,1732,1733],{"class":219,"line":358},[217,1734,300],{"class":293},[217,1736,1737,1739,1741,1743,1745,1747,1749,1751],{"class":219,"line":364},[217,1738,306],{"class":230},[217,1740,250],{"class":293},[217,1742,311],{"class":249},[217,1744,314],{"class":241},[217,1746,317],{"class":249},[217,1748,320],{"class":241},[217,1750,323],{"class":293},[217,1752,326],{"class":249},[217,1754,1755,1757,1759,1761,1763,1765,1767],{"class":219,"line":369},[217,1756,338],{"class":230},[217,1758,341],{"class":237},[217,1760,242],{"class":293},[217,1762,346],{"class":249},[217,1764,350],{"class":349},[217,1766,346],{"class":249},[217,1768,355],{"class":293},[217,1770,1771],{"class":219,"line":377},[217,1772,361],{"class":249},[217,1774,1775],{"class":219,"line":383},[217,1776,300],{"class":293},[217,1778,1779],{"class":219,"line":402},[217,1780,1781],{"class":223},"  \u002F\u002F Additional admin checks\n",[217,1783,1784,1786,1788,1790,1792,1794,1796,1798,1801,1803],{"class":219,"line":420},[217,1785,306],{"class":230},[217,1787,250],{"class":293},[217,1789,311],{"class":249},[217,1791,576],{"class":241},[217,1793,317],{"class":249},[217,1795,320],{"class":241},[217,1797,583],{"class":249},[217,1799,1800],{"class":241},"is_admin",[217,1802,323],{"class":293},[217,1804,326],{"class":249},[217,1806,1807,1809,1811,1813],{"class":219,"line":426},[217,1808,1147],{"class":230},[217,1810,1150],{"class":237},[217,1812,242],{"class":293},[217,1814,326],{"class":249},[217,1816,1817,1819,1821,1823],{"class":219,"line":443},[217,1818,1159],{"class":293},[217,1820,767],{"class":249},[217,1822,1165],{"class":1164},[217,1824,1168],{"class":249},[217,1826,1827,1829,1831,1833,1836],{"class":219,"line":448},[217,1828,1173],{"class":293},[217,1830,767],{"class":249},[217,1832,770],{"class":249},[217,1834,1835],{"class":349},"Admin access required",[217,1837,1183],{"class":249},[217,1839,1841,1843],{"class":219,"line":1840},18,[217,1842,1188],{"class":249},[217,1844,355],{"class":293},[217,1846,1848],{"class":219,"line":1847},19,[217,1849,361],{"class":249},[217,1851,1853,1855],{"class":219,"line":1852},20,[217,1854,451],{"class":249},[217,1856,355],{"class":241},[195,1858,1860],{"id":1859},"multi-strategy-authentication","Multi-Strategy Authentication",[207,1862,1865],{"className":209,"code":1863,"filename":1864,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, strategy } = useAuth()\n  const requiredStrategy = to.meta.strategy\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  if (requiredStrategy && strategy !== requiredStrategy) {\n    \u002F\u002F Redirect to login with specific strategy\n    return navigateTo(`\u002Flogin?strategy=${requiredStrategy}`)\n  }\n})\n","middleware\u002Fmulti-strategy.ts",[203,1866,1867,1889,1910,1930,1934,1952,1968,1972,1976,1997,2002,2026,2030],{"__ignoreMap":213},[217,1868,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887],{"class":219,"line":220},[217,1870,231],{"class":230},[217,1872,234],{"class":230},[217,1874,238],{"class":237},[217,1876,242],{"class":241},[217,1878,246],{"class":245},[217,1880,250],{"class":249},[217,1882,254],{"class":253},[217,1884,257],{"class":249},[217,1886,260],{"class":245},[217,1888,263],{"class":249},[217,1890,1891,1893,1895,1897,1899,1902,1904,1906,1908],{"class":219,"line":227},[217,1892,269],{"class":245},[217,1894,272],{"class":249},[217,1896,275],{"class":241},[217,1898,278],{"class":249},[217,1900,1901],{"class":241}," strategy",[217,1903,284],{"class":249},[217,1905,287],{"class":249},[217,1907,290],{"class":237},[217,1909,294],{"class":293},[217,1911,1912,1914,1917,1919,1921,1923,1925,1927],{"class":219,"line":266},[217,1913,269],{"class":245},[217,1915,1916],{"class":241}," requiredStrategy",[217,1918,287],{"class":249},[217,1920,1262],{"class":241},[217,1922,317],{"class":249},[217,1924,1267],{"class":241},[217,1926,317],{"class":249},[217,1928,1929],{"class":241},"strategy\n",[217,1931,1932],{"class":219,"line":297},[217,1933,300],{"class":293},[217,1935,1936,1938,1940,1942,1944,1946,1948,1950],{"class":219,"line":303},[217,1937,306],{"class":230},[217,1939,250],{"class":293},[217,1941,311],{"class":249},[217,1943,314],{"class":241},[217,1945,317],{"class":249},[217,1947,320],{"class":241},[217,1949,323],{"class":293},[217,1951,326],{"class":249},[217,1953,1954,1956,1958,1960,1962,1964,1966],{"class":219,"line":329},[217,1955,338],{"class":230},[217,1957,341],{"class":237},[217,1959,242],{"class":293},[217,1961,346],{"class":249},[217,1963,350],{"class":349},[217,1965,346],{"class":249},[217,1967,355],{"class":293},[217,1969,1970],{"class":219,"line":335},[217,1971,361],{"class":249},[217,1973,1974],{"class":219,"line":358},[217,1975,300],{"class":293},[217,1977,1978,1980,1982,1985,1987,1989,1991,1993,1995],{"class":219,"line":364},[217,1979,306],{"class":230},[217,1981,250],{"class":293},[217,1983,1984],{"class":241},"requiredStrategy",[217,1986,589],{"class":249},[217,1988,1901],{"class":241},[217,1990,1584],{"class":249},[217,1992,1916],{"class":241},[217,1994,323],{"class":293},[217,1996,326],{"class":249},[217,1998,1999],{"class":219,"line":369},[217,2000,2001],{"class":223},"    \u002F\u002F Redirect to login with specific strategy\n",[217,2003,2004,2006,2008,2010,2013,2016,2019,2021,2024],{"class":219,"line":377},[217,2005,338],{"class":230},[217,2007,341],{"class":237},[217,2009,242],{"class":293},[217,2011,2012],{"class":249},"`",[217,2014,2015],{"class":349},"\u002Flogin?strategy=",[217,2017,2018],{"class":249},"${",[217,2020,1984],{"class":241},[217,2022,2023],{"class":249},"}`",[217,2025,355],{"class":293},[217,2027,2028],{"class":219,"line":383},[217,2029,361],{"class":249},[217,2031,2032,2034],{"class":219,"line":402},[217,2033,451],{"class":249},[217,2035,355],{"class":241},[195,2037,2039],{"id":2038},"api-route-protection","API Route Protection",[207,2041,2044],{"className":209,"code":2042,"filename":2043,"language":212,"meta":213,"style":213},"import protectedMiddleware from '#auth-utils\u002Fserver\u002Fmiddleware\u002Fprotected'\nimport { getAuthSession } from '#auth-utils\u002Fserver\u002Futils'\n\nexport default defineEventHandler(async (event) => {\n  \u002F\u002F Use Nuxt Umbu's protected middleware for authentication\n  await protectedMiddleware(event)\n  \n  \u002F\u002F Get authentication session data\n  const { token, strategyName } = getAuthSession(event)\n  \n  \u002F\u002F User is authenticated, proceed with API logic\n  return { data: 'Protected data', strategy: strategyName }\n})\n","server\u002Fapi\u002Fprotected\u002F[...].ts",[203,2045,2046,2064,2085,2089,2113,2118,2132,2136,2141,2167,2171,2176,2206],{"__ignoreMap":213},[217,2047,2048,2051,2054,2057,2059,2062],{"class":219,"line":220},[217,2049,2050],{"class":230},"import",[217,2052,2053],{"class":241}," protectedMiddleware ",[217,2055,2056],{"class":230},"from",[217,2058,770],{"class":249},[217,2060,2061],{"class":349},"#auth-utils\u002Fserver\u002Fmiddleware\u002Fprotected",[217,2063,1183],{"class":249},[217,2065,2066,2068,2070,2073,2075,2078,2080,2083],{"class":219,"line":227},[217,2067,2050],{"class":230},[217,2069,272],{"class":249},[217,2071,2072],{"class":241}," getAuthSession",[217,2074,284],{"class":249},[217,2076,2077],{"class":230}," from",[217,2079,770],{"class":249},[217,2081,2082],{"class":349},"#auth-utils\u002Fserver\u002Futils",[217,2084,1183],{"class":249},[217,2086,2087],{"class":219,"line":266},[217,2088,739],{"emptyLinePlaceholder":738},[217,2090,2091,2093,2095,2098,2100,2102,2104,2107,2109,2111],{"class":219,"line":297},[217,2092,231],{"class":230},[217,2094,234],{"class":230},[217,2096,2097],{"class":237}," defineEventHandler",[217,2099,242],{"class":241},[217,2101,246],{"class":245},[217,2103,250],{"class":249},[217,2105,2106],{"class":253},"event",[217,2108,257],{"class":249},[217,2110,260],{"class":245},[217,2112,263],{"class":249},[217,2114,2115],{"class":219,"line":303},[217,2116,2117],{"class":223},"  \u002F\u002F Use Nuxt Umbu's protected middleware for authentication\n",[217,2119,2120,2123,2126,2128,2130],{"class":219,"line":329},[217,2121,2122],{"class":230},"  await",[217,2124,2125],{"class":237}," protectedMiddleware",[217,2127,242],{"class":293},[217,2129,2106],{"class":241},[217,2131,355],{"class":293},[217,2133,2134],{"class":219,"line":335},[217,2135,300],{"class":293},[217,2137,2138],{"class":219,"line":358},[217,2139,2140],{"class":223},"  \u002F\u002F Get authentication session data\n",[217,2142,2143,2145,2147,2150,2152,2155,2157,2159,2161,2163,2165],{"class":219,"line":364},[217,2144,269],{"class":245},[217,2146,272],{"class":249},[217,2148,2149],{"class":241}," token",[217,2151,278],{"class":249},[217,2153,2154],{"class":241}," strategyName",[217,2156,284],{"class":249},[217,2158,287],{"class":249},[217,2160,2072],{"class":237},[217,2162,242],{"class":293},[217,2164,2106],{"class":241},[217,2166,355],{"class":293},[217,2168,2169],{"class":219,"line":369},[217,2170,300],{"class":293},[217,2172,2173],{"class":219,"line":377},[217,2174,2175],{"class":223},"  \u002F\u002F User is authenticated, proceed with API logic\n",[217,2177,2178,2181,2183,2186,2188,2190,2193,2195,2197,2199,2201,2203],{"class":219,"line":383},[217,2179,2180],{"class":230},"  return",[217,2182,272],{"class":249},[217,2184,2185],{"class":293}," data",[217,2187,767],{"class":249},[217,2189,770],{"class":249},[217,2191,2192],{"class":349},"Protected data",[217,2194,346],{"class":249},[217,2196,278],{"class":249},[217,2198,1901],{"class":293},[217,2200,767],{"class":249},[217,2202,2154],{"class":241},[217,2204,2205],{"class":249}," }\n",[217,2207,2208,2210],{"class":219,"line":402},[217,2209,451],{"class":249},[217,2211,355],{"class":241},[183,2213,2215],{"id":2214},"route-configuration","Route Configuration",[195,2217,2219],{"id":2218},"dynamic-route-protection","Dynamic Route Protection",[207,2221,2224],{"className":209,"code":2222,"filename":2223,"language":212,"meta":213,"style":213},"\u003Cscript setup>\ndefinePageMeta({\n  middleware: async (to) => {\n    const { loggedIn, user } = useAuth()\n    const resourceId = to.params.id\n    \n    if (!loggedIn.value) {\n      return navigateTo('\u002Flogin')\n    }\n    \n    \u002F\u002F Check if user owns this resource\n    try {\n      const resource = await $fetch(`\u002Fapi\u002Fresources\u002F${resourceId}`)\n      if (resource.user_id !== user.value?.id) {\n        throw createError({\n          statusCode: 403,\n          statusMessage: 'Access denied'\n        })\n      }\n    } catch (error) {\n      if (error.statusCode === 404) {\n        throw createError({\n          statusCode: 404,\n          statusMessage: 'Resource not found'\n        })\n      }\n      throw error\n    }\n  }\n})\n\u003C\u002Fscript>\n","pages\u002F[id]\u002Fedit.vue",[203,2225,2226,2234,2242,2261,2281,2302,2306,2324,2340,2344,2348,2353,2360,2392,2424,2435,2446,2459,2466,2471,2485,2509,2520,2531,2545,2552,2557,2566,2571,2576,2583],{"__ignoreMap":213},[217,2227,2228,2230,2232],{"class":219,"line":220},[217,2229,662],{"class":249},[217,2231,834],{"class":241},[217,2233,668],{"class":249},[217,2235,2236,2238,2240],{"class":219,"line":227},[217,2237,648],{"class":237},[217,2239,242],{"class":241},[217,2241,326],{"class":249},[217,2243,2244,2246,2248,2251,2253,2255,2257,2259],{"class":219,"line":266},[217,2245,764],{"class":237},[217,2247,767],{"class":249},[217,2249,2250],{"class":245}," async",[217,2252,250],{"class":249},[217,2254,254],{"class":253},[217,2256,257],{"class":249},[217,2258,260],{"class":245},[217,2260,263],{"class":249},[217,2262,2263,2265,2267,2269,2271,2273,2275,2277,2279],{"class":219,"line":297},[217,2264,1539],{"class":245},[217,2266,272],{"class":249},[217,2268,275],{"class":241},[217,2270,278],{"class":249},[217,2272,508],{"class":241},[217,2274,284],{"class":249},[217,2276,287],{"class":249},[217,2278,290],{"class":237},[217,2280,294],{"class":293},[217,2282,2283,2285,2288,2290,2292,2294,2297,2299],{"class":219,"line":303},[217,2284,1539],{"class":245},[217,2286,2287],{"class":241}," resourceId",[217,2289,287],{"class":249},[217,2291,1262],{"class":241},[217,2293,317],{"class":249},[217,2295,2296],{"class":241},"params",[217,2298,317],{"class":249},[217,2300,2301],{"class":241},"id\n",[217,2303,2304],{"class":219,"line":329},[217,2305,1564],{"class":293},[217,2307,2308,2310,2312,2314,2316,2318,2320,2322],{"class":219,"line":335},[217,2309,1569],{"class":230},[217,2311,250],{"class":293},[217,2313,311],{"class":249},[217,2315,314],{"class":241},[217,2317,317],{"class":249},[217,2319,320],{"class":241},[217,2321,323],{"class":293},[217,2323,326],{"class":249},[217,2325,2326,2328,2330,2332,2334,2336,2338],{"class":219,"line":358},[217,2327,1595],{"class":230},[217,2329,341],{"class":237},[217,2331,242],{"class":293},[217,2333,346],{"class":249},[217,2335,350],{"class":349},[217,2337,346],{"class":249},[217,2339,355],{"class":293},[217,2341,2342],{"class":219,"line":364},[217,2343,1613],{"class":249},[217,2345,2346],{"class":219,"line":369},[217,2347,1564],{"class":293},[217,2349,2350],{"class":219,"line":377},[217,2351,2352],{"class":223},"    \u002F\u002F Check if user owns this resource\n",[217,2354,2355,2358],{"class":219,"line":383},[217,2356,2357],{"class":230},"    try",[217,2359,263],{"class":249},[217,2361,2362,2365,2368,2370,2373,2376,2378,2380,2383,2385,2388,2390],{"class":219,"line":402},[217,2363,2364],{"class":245},"      const",[217,2366,2367],{"class":241}," resource",[217,2369,287],{"class":249},[217,2371,2372],{"class":230}," await",[217,2374,2375],{"class":237}," $fetch",[217,2377,242],{"class":293},[217,2379,2012],{"class":249},[217,2381,2382],{"class":349},"\u002Fapi\u002Fresources\u002F",[217,2384,2018],{"class":249},[217,2386,2387],{"class":241},"resourceId",[217,2389,2023],{"class":249},[217,2391,355],{"class":293},[217,2393,2394,2397,2399,2402,2404,2407,2409,2411,2413,2415,2417,2420,2422],{"class":219,"line":420},[217,2395,2396],{"class":230},"      if",[217,2398,250],{"class":293},[217,2400,2401],{"class":241},"resource",[217,2403,317],{"class":249},[217,2405,2406],{"class":241},"user_id",[217,2408,1584],{"class":249},[217,2410,508],{"class":241},[217,2412,317],{"class":249},[217,2414,320],{"class":241},[217,2416,583],{"class":249},[217,2418,2419],{"class":241},"id",[217,2421,323],{"class":293},[217,2423,326],{"class":249},[217,2425,2426,2429,2431,2433],{"class":219,"line":426},[217,2427,2428],{"class":230},"        throw",[217,2430,1150],{"class":237},[217,2432,242],{"class":293},[217,2434,326],{"class":249},[217,2436,2437,2440,2442,2444],{"class":219,"line":443},[217,2438,2439],{"class":293},"          statusCode",[217,2441,767],{"class":249},[217,2443,1165],{"class":1164},[217,2445,1168],{"class":249},[217,2447,2448,2451,2453,2455,2457],{"class":219,"line":448},[217,2449,2450],{"class":293},"          statusMessage",[217,2452,767],{"class":249},[217,2454,770],{"class":249},[217,2456,1180],{"class":349},[217,2458,1183],{"class":249},[217,2460,2461,2464],{"class":219,"line":1840},[217,2462,2463],{"class":249},"        }",[217,2465,355],{"class":293},[217,2467,2468],{"class":219,"line":1847},[217,2469,2470],{"class":249},"      }\n",[217,2472,2473,2475,2477,2479,2481,2483],{"class":219,"line":1852},[217,2474,1188],{"class":249},[217,2476,408],{"class":230},[217,2478,250],{"class":293},[217,2480,413],{"class":241},[217,2482,323],{"class":293},[217,2484,326],{"class":249},[217,2486,2488,2490,2492,2494,2496,2499,2502,2505,2507],{"class":219,"line":2487},21,[217,2489,2396],{"class":230},[217,2491,250],{"class":293},[217,2493,413],{"class":241},[217,2495,317],{"class":249},[217,2497,2498],{"class":241},"statusCode",[217,2500,2501],{"class":249}," ===",[217,2503,2504],{"class":1164}," 404",[217,2506,323],{"class":293},[217,2508,326],{"class":249},[217,2510,2512,2514,2516,2518],{"class":219,"line":2511},22,[217,2513,2428],{"class":230},[217,2515,1150],{"class":237},[217,2517,242],{"class":293},[217,2519,326],{"class":249},[217,2521,2523,2525,2527,2529],{"class":219,"line":2522},23,[217,2524,2439],{"class":293},[217,2526,767],{"class":249},[217,2528,2504],{"class":1164},[217,2530,1168],{"class":249},[217,2532,2534,2536,2538,2540,2543],{"class":219,"line":2533},24,[217,2535,2450],{"class":293},[217,2537,767],{"class":249},[217,2539,770],{"class":249},[217,2541,2542],{"class":349},"Resource not found",[217,2544,1183],{"class":249},[217,2546,2548,2550],{"class":219,"line":2547},25,[217,2549,2463],{"class":249},[217,2551,355],{"class":293},[217,2553,2555],{"class":219,"line":2554},26,[217,2556,2470],{"class":249},[217,2558,2560,2563],{"class":219,"line":2559},27,[217,2561,2562],{"class":230},"      throw",[217,2564,2565],{"class":241}," error\n",[217,2567,2569],{"class":219,"line":2568},28,[217,2570,1613],{"class":249},[217,2572,2574],{"class":219,"line":2573},29,[217,2575,361],{"class":249},[217,2577,2579,2581],{"class":219,"line":2578},30,[217,2580,451],{"class":249},[217,2582,355],{"class":241},[217,2584,2586,2588,2590],{"class":219,"line":2585},31,[217,2587,695],{"class":249},[217,2589,746],{"class":241},[217,2591,668],{"class":249},[195,2593,2595],{"id":2594},"public-route-with-optional-auth","Public Route with Optional Auth",[207,2597,2600],{"className":209,"code":2598,"filename":2599,"language":212,"meta":213,"style":213},"\u003Cscript setup>\ndefinePageMeta({\n  middleware: async (to) => {\n    const { loggedIn, fetchProfile } = useAuth()\n    \n    \u002F\u002F Try to authenticate, but don't require it\n    if (loggedIn.value) {\n      try {\n        await fetchProfile('client')\n      } catch (error) {\n        \u002F\u002F Silently fail, user remains unauthenticated\n        console.warn('Auth failed:', error)\n      }\n    }\n  }\n})\n\u003C\u002Fscript>\n","pages\u002Fprofile\u002F[username].vue",[203,2601,2602,2610,2618,2636,2656,2660,2665,2681,2688,2705,2720,2725,2751,2755,2759,2763,2769],{"__ignoreMap":213},[217,2603,2604,2606,2608],{"class":219,"line":220},[217,2605,662],{"class":249},[217,2607,834],{"class":241},[217,2609,668],{"class":249},[217,2611,2612,2614,2616],{"class":219,"line":227},[217,2613,648],{"class":237},[217,2615,242],{"class":241},[217,2617,326],{"class":249},[217,2619,2620,2622,2624,2626,2628,2630,2632,2634],{"class":219,"line":266},[217,2621,764],{"class":237},[217,2623,767],{"class":249},[217,2625,2250],{"class":245},[217,2627,250],{"class":249},[217,2629,254],{"class":253},[217,2631,257],{"class":249},[217,2633,260],{"class":245},[217,2635,263],{"class":249},[217,2637,2638,2640,2642,2644,2646,2648,2650,2652,2654],{"class":219,"line":297},[217,2639,1539],{"class":245},[217,2641,272],{"class":249},[217,2643,275],{"class":241},[217,2645,278],{"class":249},[217,2647,281],{"class":241},[217,2649,284],{"class":249},[217,2651,287],{"class":249},[217,2653,290],{"class":237},[217,2655,294],{"class":293},[217,2657,2658],{"class":219,"line":303},[217,2659,1564],{"class":293},[217,2661,2662],{"class":219,"line":329},[217,2663,2664],{"class":223},"    \u002F\u002F Try to authenticate, but don't require it\n",[217,2666,2667,2669,2671,2673,2675,2677,2679],{"class":219,"line":335},[217,2668,1569],{"class":230},[217,2670,250],{"class":293},[217,2672,314],{"class":241},[217,2674,317],{"class":249},[217,2676,320],{"class":241},[217,2678,323],{"class":293},[217,2680,326],{"class":249},[217,2682,2683,2686],{"class":219,"line":358},[217,2684,2685],{"class":230},"      try",[217,2687,263],{"class":249},[217,2689,2690,2693,2695,2697,2699,2701,2703],{"class":219,"line":364},[217,2691,2692],{"class":230},"        await",[217,2694,281],{"class":237},[217,2696,242],{"class":293},[217,2698,346],{"class":249},[217,2700,395],{"class":349},[217,2702,346],{"class":249},[217,2704,355],{"class":293},[217,2706,2707,2710,2712,2714,2716,2718],{"class":219,"line":369},[217,2708,2709],{"class":249},"      }",[217,2711,408],{"class":230},[217,2713,250],{"class":293},[217,2715,413],{"class":241},[217,2717,323],{"class":293},[217,2719,326],{"class":249},[217,2721,2722],{"class":219,"line":377},[217,2723,2724],{"class":223},"        \u002F\u002F Silently fail, user remains unauthenticated\n",[217,2726,2727,2730,2732,2735,2737,2739,2742,2744,2746,2749],{"class":219,"line":383},[217,2728,2729],{"class":241},"        console",[217,2731,317],{"class":249},[217,2733,2734],{"class":237},"warn",[217,2736,242],{"class":293},[217,2738,346],{"class":249},[217,2740,2741],{"class":349},"Auth failed:",[217,2743,346],{"class":249},[217,2745,278],{"class":249},[217,2747,2748],{"class":241}," error",[217,2750,355],{"class":293},[217,2752,2753],{"class":219,"line":402},[217,2754,2470],{"class":249},[217,2756,2757],{"class":219,"line":420},[217,2758,1613],{"class":249},[217,2760,2761],{"class":219,"line":426},[217,2762,361],{"class":249},[217,2764,2765,2767],{"class":219,"line":443},[217,2766,451],{"class":249},[217,2768,355],{"class":241},[217,2770,2771,2773,2775],{"class":219,"line":448},[217,2772,695],{"class":249},[217,2774,746],{"class":241},[217,2776,668],{"class":249},[183,2778,2780],{"id":2779},"middleware-configuration","Middleware Configuration",[195,2782,2784],{"id":2783},"global-middleware-setup","Global Middleware Setup",[207,2786,2789],{"className":209,"code":2787,"filename":2788,"language":212,"meta":213,"style":213},"export default defineNuxtConfig({\n  modules: ['nuxt-umbu'],\n  \n  auth: {\n    provider: 'passport',\n    \n    \u002F\u002F Global middleware configuration\n    globalMiddleware: {\n      auth: ['auth'], \u002F\u002F Apply to all routes\n      guest: ['guest'] \u002F\u002F Apply to guest routes\n    }\n  }\n})\n","nuxt.config.ts",[203,2790,2791,2804,2825,2829,2838,2854,2858,2863,2872,2894,2915,2919,2923],{"__ignoreMap":213},[217,2792,2793,2795,2797,2800,2802],{"class":219,"line":220},[217,2794,231],{"class":230},[217,2796,234],{"class":230},[217,2798,2799],{"class":237}," defineNuxtConfig",[217,2801,242],{"class":241},[217,2803,326],{"class":249},[217,2805,2806,2809,2811,2813,2815,2818,2820,2823],{"class":219,"line":227},[217,2807,2808],{"class":293},"  modules",[217,2810,767],{"class":249},[217,2812,853],{"class":241},[217,2814,346],{"class":249},[217,2816,2817],{"class":349},"nuxt-umbu",[217,2819,346],{"class":249},[217,2821,2822],{"class":241},"]",[217,2824,1168],{"class":249},[217,2826,2827],{"class":219,"line":266},[217,2828,300],{"class":241},[217,2830,2831,2834,2836],{"class":219,"line":297},[217,2832,2833],{"class":293},"  auth",[217,2835,767],{"class":249},[217,2837,263],{"class":249},[217,2839,2840,2843,2845,2847,2850,2852],{"class":219,"line":303},[217,2841,2842],{"class":293},"    provider",[217,2844,767],{"class":249},[217,2846,770],{"class":249},[217,2848,2849],{"class":349},"passport",[217,2851,346],{"class":249},[217,2853,1168],{"class":249},[217,2855,2856],{"class":219,"line":329},[217,2857,1564],{"class":241},[217,2859,2860],{"class":219,"line":335},[217,2861,2862],{"class":223},"    \u002F\u002F Global middleware configuration\n",[217,2864,2865,2868,2870],{"class":219,"line":358},[217,2866,2867],{"class":293},"    globalMiddleware",[217,2869,767],{"class":249},[217,2871,263],{"class":249},[217,2873,2874,2877,2879,2881,2883,2885,2887,2889,2891],{"class":219,"line":364},[217,2875,2876],{"class":293},"      auth",[217,2878,767],{"class":249},[217,2880,853],{"class":241},[217,2882,346],{"class":249},[217,2884,112],{"class":349},[217,2886,346],{"class":249},[217,2888,2822],{"class":241},[217,2890,278],{"class":249},[217,2892,2893],{"class":223}," \u002F\u002F Apply to all routes\n",[217,2895,2896,2899,2901,2903,2905,2908,2910,2912],{"class":219,"line":369},[217,2897,2898],{"class":293},"      guest",[217,2900,767],{"class":249},[217,2902,853],{"class":241},[217,2904,346],{"class":249},[217,2906,2907],{"class":349},"guest",[217,2909,346],{"class":249},[217,2911,871],{"class":241},[217,2913,2914],{"class":223},"\u002F\u002F Apply to guest routes\n",[217,2916,2917],{"class":219,"line":377},[217,2918,1613],{"class":249},[217,2920,2921],{"class":219,"line":383},[217,2922,361],{"class":249},[217,2924,2925,2927],{"class":219,"line":402},[217,2926,451],{"class":249},[217,2928,355],{"class":241},[195,2930,2932],{"id":2931},"custom-middleware-registration","Custom Middleware Registration",[207,2934,2937],{"className":209,"code":2935,"filename":2936,"language":212,"meta":213,"style":213},"export default defineNuxtPlugin((nuxtApp) => {\n  \u002F\u002F Register custom middleware\n  addRouteMiddleware('custom-auth', async (to) => {\n    const { loggedIn } = useAuth()\n    \n    if (!loggedIn.value && to.path !== '\u002Flogin') {\n      return navigateTo('\u002Flogin')\n    }\n  }, { global: true })\n})\n","plugins\u002Fmiddleware.ts",[203,2938,2939,2961,2966,2994,3010,3014,3048,3064,3068,3088],{"__ignoreMap":213},[217,2940,2941,2943,2945,2948,2950,2952,2955,2957,2959],{"class":219,"line":220},[217,2942,231],{"class":230},[217,2944,234],{"class":230},[217,2946,2947],{"class":237}," defineNuxtPlugin",[217,2949,242],{"class":241},[217,2951,242],{"class":249},[217,2953,2954],{"class":253},"nuxtApp",[217,2956,257],{"class":249},[217,2958,260],{"class":245},[217,2960,263],{"class":249},[217,2962,2963],{"class":219,"line":227},[217,2964,2965],{"class":223},"  \u002F\u002F Register custom middleware\n",[217,2967,2968,2971,2973,2975,2978,2980,2982,2984,2986,2988,2990,2992],{"class":219,"line":266},[217,2969,2970],{"class":237},"  addRouteMiddleware",[217,2972,242],{"class":293},[217,2974,346],{"class":249},[217,2976,2977],{"class":349},"custom-auth",[217,2979,346],{"class":249},[217,2981,278],{"class":249},[217,2983,2250],{"class":245},[217,2985,250],{"class":249},[217,2987,254],{"class":253},[217,2989,257],{"class":249},[217,2991,260],{"class":245},[217,2993,263],{"class":249},[217,2995,2996,2998,3000,3002,3004,3006,3008],{"class":219,"line":297},[217,2997,1539],{"class":245},[217,2999,272],{"class":249},[217,3001,275],{"class":241},[217,3003,284],{"class":249},[217,3005,287],{"class":249},[217,3007,290],{"class":237},[217,3009,294],{"class":293},[217,3011,3012],{"class":219,"line":303},[217,3013,1564],{"class":293},[217,3015,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046],{"class":219,"line":329},[217,3017,1569],{"class":230},[217,3019,250],{"class":293},[217,3021,311],{"class":249},[217,3023,314],{"class":241},[217,3025,317],{"class":249},[217,3027,320],{"class":241},[217,3029,589],{"class":249},[217,3031,1262],{"class":241},[217,3033,317],{"class":249},[217,3035,1703],{"class":241},[217,3037,1584],{"class":249},[217,3039,770],{"class":249},[217,3041,350],{"class":349},[217,3043,346],{"class":249},[217,3045,323],{"class":293},[217,3047,326],{"class":249},[217,3049,3050,3052,3054,3056,3058,3060,3062],{"class":219,"line":335},[217,3051,1595],{"class":230},[217,3053,341],{"class":237},[217,3055,242],{"class":293},[217,3057,346],{"class":249},[217,3059,350],{"class":349},[217,3061,346],{"class":249},[217,3063,355],{"class":293},[217,3065,3066],{"class":219,"line":358},[217,3067,1613],{"class":249},[217,3069,3070,3073,3075,3078,3080,3084,3086],{"class":219,"line":364},[217,3071,3072],{"class":249},"  },",[217,3074,272],{"class":249},[217,3076,3077],{"class":293}," global",[217,3079,767],{"class":249},[217,3081,3083],{"class":3082},"sfNiH"," true",[217,3085,284],{"class":249},[217,3087,355],{"class":293},[217,3089,3090,3092],{"class":219,"line":369},[217,3091,451],{"class":249},[217,3093,355],{"class":241},[183,3095,3097],{"id":3096},"error-handling","Error Handling",[195,3099,3101],{"id":3100},"custom-error-pages","Custom Error Pages",[207,3103,3106],{"className":652,"code":3104,"filename":3105,"language":655,"meta":213,"style":213},"\u003Ctemplate>\n  \u003Cdiv class=\"error-page\">\n    \u003Ch1>{{ error?.statusCode }}\u003C\u002Fh1>\n    \u003Cp>{{ error?.statusMessage }}\u003C\u002Fp>\n    \n    \u003Cdiv v-if=\"error?.statusCode === 401\">\n      \u003Cp>Please log in to access this page.\u003C\u002Fp>\n      \u003CNuxtLink to=\"\u002Flogin\">Go to Login\u003C\u002FNuxtLink>\n    \u003C\u002Fdiv>\n    \n    \u003Cdiv v-else-if=\"error?.statusCode === 403\">\n      \u003Cp>You don't have permission to access this page.\u003C\u002Fp>\n      \u003CNuxtLink to=\"\u002Fdashboard\">Go to Dashboard\u003C\u002FNuxtLink>\n    \u003C\u002Fdiv>\n    \n    \u003Cdiv v-else>\n      \u003Cp>Something went wrong.\u003C\u002Fp>\n      \u003CNuxtLink to=\"\u002F\">Go Home\u003C\u002FNuxtLink>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst error = useError()\n\u003C\u002Fscript>\n","pages\u002Ferror.vue",[203,3107,3108,3116,3138,3155,3172,3176,3196,3214,3242,3251,3255,3275,3292,3320,3328,3332,3343,3360,3388,3396,3404,3412,3416,3426,3440],{"__ignoreMap":213},[217,3109,3110,3112,3114],{"class":219,"line":220},[217,3111,662],{"class":249},[217,3113,665],{"class":293},[217,3115,668],{"class":249},[217,3117,3118,3120,3122,3125,3128,3131,3134,3136],{"class":219,"line":227},[217,3119,673],{"class":249},[217,3121,676],{"class":293},[217,3123,3124],{"class":245}," class",[217,3126,3127],{"class":249},"=",[217,3129,3130],{"class":249},"\"",[217,3132,3133],{"class":349},"error-page",[217,3135,3130],{"class":249},[217,3137,668],{"class":249},[217,3139,3140,3142,3144,3146,3149,3151,3153],{"class":219,"line":266},[217,3141,683],{"class":249},[217,3143,686],{"class":293},[217,3145,689],{"class":249},[217,3147,3148],{"class":241},"{{ error?.statusCode }}",[217,3150,695],{"class":249},[217,3152,686],{"class":293},[217,3154,668],{"class":249},[217,3156,3157,3159,3161,3163,3166,3168,3170],{"class":219,"line":297},[217,3158,683],{"class":249},[217,3160,176],{"class":293},[217,3162,689],{"class":249},[217,3164,3165],{"class":241},"{{ error?.statusMessage }}",[217,3167,695],{"class":249},[217,3169,176],{"class":293},[217,3171,668],{"class":249},[217,3173,3174],{"class":219,"line":303},[217,3175,1564],{"class":241},[217,3177,3178,3180,3182,3185,3187,3189,3192,3194],{"class":219,"line":329},[217,3179,683],{"class":249},[217,3181,676],{"class":293},[217,3183,3184],{"class":245}," v-if",[217,3186,3127],{"class":249},[217,3188,3130],{"class":249},[217,3190,3191],{"class":349},"error?.statusCode === 401",[217,3193,3130],{"class":249},[217,3195,668],{"class":249},[217,3197,3198,3201,3203,3205,3208,3210,3212],{"class":219,"line":335},[217,3199,3200],{"class":249},"      \u003C",[217,3202,176],{"class":293},[217,3204,689],{"class":249},[217,3206,3207],{"class":241},"Please log in to access this page.",[217,3209,695],{"class":249},[217,3211,176],{"class":293},[217,3213,668],{"class":249},[217,3215,3216,3218,3221,3223,3225,3227,3229,3231,3233,3236,3238,3240],{"class":219,"line":358},[217,3217,3200],{"class":249},[217,3219,3220],{"class":293},"NuxtLink",[217,3222,1262],{"class":245},[217,3224,3127],{"class":249},[217,3226,3130],{"class":249},[217,3228,350],{"class":349},[217,3230,3130],{"class":249},[217,3232,689],{"class":249},[217,3234,3235],{"class":241},"Go to Login",[217,3237,695],{"class":249},[217,3239,3220],{"class":293},[217,3241,668],{"class":249},[217,3243,3244,3247,3249],{"class":219,"line":364},[217,3245,3246],{"class":249},"    \u003C\u002F",[217,3248,676],{"class":293},[217,3250,668],{"class":249},[217,3252,3253],{"class":219,"line":369},[217,3254,1564],{"class":241},[217,3256,3257,3259,3261,3264,3266,3268,3271,3273],{"class":219,"line":377},[217,3258,683],{"class":249},[217,3260,676],{"class":293},[217,3262,3263],{"class":245}," v-else-if",[217,3265,3127],{"class":249},[217,3267,3130],{"class":249},[217,3269,3270],{"class":349},"error?.statusCode === 403",[217,3272,3130],{"class":249},[217,3274,668],{"class":249},[217,3276,3277,3279,3281,3283,3286,3288,3290],{"class":219,"line":383},[217,3278,3200],{"class":249},[217,3280,176],{"class":293},[217,3282,689],{"class":249},[217,3284,3285],{"class":241},"You don't have permission to access this page.",[217,3287,695],{"class":249},[217,3289,176],{"class":293},[217,3291,668],{"class":249},[217,3293,3294,3296,3298,3300,3302,3304,3307,3309,3311,3314,3316,3318],{"class":219,"line":402},[217,3295,3200],{"class":249},[217,3297,3220],{"class":293},[217,3299,1262],{"class":245},[217,3301,3127],{"class":249},[217,3303,3130],{"class":249},[217,3305,3306],{"class":349},"\u002Fdashboard",[217,3308,3130],{"class":249},[217,3310,689],{"class":249},[217,3312,3313],{"class":241},"Go to Dashboard",[217,3315,695],{"class":249},[217,3317,3220],{"class":293},[217,3319,668],{"class":249},[217,3321,3322,3324,3326],{"class":219,"line":420},[217,3323,3246],{"class":249},[217,3325,676],{"class":293},[217,3327,668],{"class":249},[217,3329,3330],{"class":219,"line":426},[217,3331,1564],{"class":241},[217,3333,3334,3336,3338,3341],{"class":219,"line":443},[217,3335,683],{"class":249},[217,3337,676],{"class":293},[217,3339,3340],{"class":245}," v-else",[217,3342,668],{"class":249},[217,3344,3345,3347,3349,3351,3354,3356,3358],{"class":219,"line":448},[217,3346,3200],{"class":249},[217,3348,176],{"class":293},[217,3350,689],{"class":249},[217,3352,3353],{"class":241},"Something went wrong.",[217,3355,695],{"class":249},[217,3357,176],{"class":293},[217,3359,668],{"class":249},[217,3361,3362,3364,3366,3368,3370,3372,3375,3377,3379,3382,3384,3386],{"class":219,"line":1840},[217,3363,3200],{"class":249},[217,3365,3220],{"class":293},[217,3367,1262],{"class":245},[217,3369,3127],{"class":249},[217,3371,3130],{"class":249},[217,3373,3374],{"class":349},"\u002F",[217,3376,3130],{"class":249},[217,3378,689],{"class":249},[217,3380,3381],{"class":241},"Go Home",[217,3383,695],{"class":249},[217,3385,3220],{"class":293},[217,3387,668],{"class":249},[217,3389,3390,3392,3394],{"class":219,"line":1847},[217,3391,3246],{"class":249},[217,3393,676],{"class":293},[217,3395,668],{"class":249},[217,3397,3398,3400,3402],{"class":219,"line":1852},[217,3399,721],{"class":249},[217,3401,676],{"class":293},[217,3403,668],{"class":249},[217,3405,3406,3408,3410],{"class":219,"line":2487},[217,3407,695],{"class":249},[217,3409,665],{"class":293},[217,3411,668],{"class":249},[217,3413,3414],{"class":219,"line":2511},[217,3415,739],{"emptyLinePlaceholder":738},[217,3417,3418,3420,3422,3424],{"class":219,"line":2522},[217,3419,662],{"class":249},[217,3421,746],{"class":293},[217,3423,749],{"class":245},[217,3425,668],{"class":249},[217,3427,3428,3430,3433,3435,3438],{"class":219,"line":2533},[217,3429,793],{"class":245},[217,3431,3432],{"class":241}," error ",[217,3434,3127],{"class":249},[217,3436,3437],{"class":237}," useError",[217,3439,294],{"class":241},[217,3441,3442,3444,3446],{"class":219,"line":2547},[217,3443,695],{"class":249},[217,3445,746],{"class":293},[217,3447,668],{"class":249},[195,3449,3451],{"id":3450},"middleware-error-handling","Middleware Error Handling",[207,3453,3456],{"className":209,"code":3454,"filename":3455,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  try {\n    const { loggedIn, fetchProfile } = useAuth()\n    \n    if (!loggedIn.value) {\n      return navigateTo('\u002Flogin')\n    }\n    \n    await fetchProfile('client')\n  } catch (error) {\n    console.error('Middleware error:', error)\n    \n    \u002F\u002F Clear invalid auth data\n    const { logout } = useAuth()\n    await logout('client')\n    \n    \u002F\u002F Redirect with error message\n    return navigateTo({\n      path: '\u002Flogin',\n      query: { error: 'session_expired' }\n    })\n  }\n})\n","middleware\u002Ferror-handling.ts",[203,3457,3458,3480,3486,3506,3510,3528,3544,3548,3552,3568,3582,3606,3610,3615,3632,3648,3652,3657,3667,3682,3704,3710,3714],{"__ignoreMap":213},[217,3459,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478],{"class":219,"line":220},[217,3461,231],{"class":230},[217,3463,234],{"class":230},[217,3465,238],{"class":237},[217,3467,242],{"class":241},[217,3469,246],{"class":245},[217,3471,250],{"class":249},[217,3473,254],{"class":253},[217,3475,257],{"class":249},[217,3477,260],{"class":245},[217,3479,263],{"class":249},[217,3481,3482,3484],{"class":219,"line":227},[217,3483,372],{"class":230},[217,3485,263],{"class":249},[217,3487,3488,3490,3492,3494,3496,3498,3500,3502,3504],{"class":219,"line":266},[217,3489,1539],{"class":245},[217,3491,272],{"class":249},[217,3493,275],{"class":241},[217,3495,278],{"class":249},[217,3497,281],{"class":241},[217,3499,284],{"class":249},[217,3501,287],{"class":249},[217,3503,290],{"class":237},[217,3505,294],{"class":293},[217,3507,3508],{"class":219,"line":297},[217,3509,1564],{"class":293},[217,3511,3512,3514,3516,3518,3520,3522,3524,3526],{"class":219,"line":303},[217,3513,1569],{"class":230},[217,3515,250],{"class":293},[217,3517,311],{"class":249},[217,3519,314],{"class":241},[217,3521,317],{"class":249},[217,3523,320],{"class":241},[217,3525,323],{"class":293},[217,3527,326],{"class":249},[217,3529,3530,3532,3534,3536,3538,3540,3542],{"class":219,"line":329},[217,3531,1595],{"class":230},[217,3533,341],{"class":237},[217,3535,242],{"class":293},[217,3537,346],{"class":249},[217,3539,350],{"class":349},[217,3541,346],{"class":249},[217,3543,355],{"class":293},[217,3545,3546],{"class":219,"line":335},[217,3547,1613],{"class":249},[217,3549,3550],{"class":219,"line":358},[217,3551,1564],{"class":293},[217,3553,3554,3556,3558,3560,3562,3564,3566],{"class":219,"line":364},[217,3555,386],{"class":230},[217,3557,281],{"class":237},[217,3559,242],{"class":293},[217,3561,346],{"class":249},[217,3563,395],{"class":349},[217,3565,346],{"class":249},[217,3567,355],{"class":293},[217,3569,3570,3572,3574,3576,3578,3580],{"class":219,"line":369},[217,3571,405],{"class":249},[217,3573,408],{"class":230},[217,3575,250],{"class":293},[217,3577,413],{"class":241},[217,3579,323],{"class":293},[217,3581,326],{"class":249},[217,3583,3584,3587,3589,3591,3593,3595,3598,3600,3602,3604],{"class":219,"line":377},[217,3585,3586],{"class":241},"    console",[217,3588,317],{"class":249},[217,3590,413],{"class":237},[217,3592,242],{"class":293},[217,3594,346],{"class":249},[217,3596,3597],{"class":349},"Middleware error:",[217,3599,346],{"class":249},[217,3601,278],{"class":249},[217,3603,2748],{"class":241},[217,3605,355],{"class":293},[217,3607,3608],{"class":219,"line":383},[217,3609,1564],{"class":293},[217,3611,3612],{"class":219,"line":402},[217,3613,3614],{"class":223},"    \u002F\u002F Clear invalid auth data\n",[217,3616,3617,3619,3621,3624,3626,3628,3630],{"class":219,"line":420},[217,3618,1539],{"class":245},[217,3620,272],{"class":249},[217,3622,3623],{"class":241}," logout",[217,3625,284],{"class":249},[217,3627,287],{"class":249},[217,3629,290],{"class":237},[217,3631,294],{"class":293},[217,3633,3634,3636,3638,3640,3642,3644,3646],{"class":219,"line":426},[217,3635,386],{"class":230},[217,3637,3623],{"class":237},[217,3639,242],{"class":293},[217,3641,346],{"class":249},[217,3643,395],{"class":349},[217,3645,346],{"class":249},[217,3647,355],{"class":293},[217,3649,3650],{"class":219,"line":443},[217,3651,1564],{"class":293},[217,3653,3654],{"class":219,"line":448},[217,3655,3656],{"class":223},"    \u002F\u002F Redirect with error message\n",[217,3658,3659,3661,3663,3665],{"class":219,"line":1840},[217,3660,338],{"class":230},[217,3662,341],{"class":237},[217,3664,242],{"class":293},[217,3666,326],{"class":249},[217,3668,3669,3672,3674,3676,3678,3680],{"class":219,"line":1847},[217,3670,3671],{"class":293},"      path",[217,3673,767],{"class":249},[217,3675,770],{"class":249},[217,3677,350],{"class":349},[217,3679,346],{"class":249},[217,3681,1168],{"class":249},[217,3683,3684,3687,3689,3691,3693,3695,3697,3700,3702],{"class":219,"line":1852},[217,3685,3686],{"class":293},"      query",[217,3688,767],{"class":249},[217,3690,272],{"class":249},[217,3692,2748],{"class":293},[217,3694,767],{"class":249},[217,3696,770],{"class":249},[217,3698,3699],{"class":349},"session_expired",[217,3701,346],{"class":249},[217,3703,2205],{"class":249},[217,3705,3706,3708],{"class":219,"line":2487},[217,3707,1188],{"class":249},[217,3709,355],{"class":293},[217,3711,3712],{"class":219,"line":2511},[217,3713,361],{"class":249},[217,3715,3716,3718],{"class":219,"line":2522},[217,3717,451],{"class":249},[217,3719,355],{"class":241},[183,3721,3723],{"id":3722},"performance-optimization","Performance Optimization",[195,3725,3727],{"id":3726},"middleware-caching","Middleware Caching",[207,3729,3732],{"className":209,"code":3730,"filename":3731,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn } = useAuth()\n  return loggedIn.value ? undefined : navigateTo('\u002Flogin')\n})\n","middleware\u002Fcached-auth.ts",[203,3733,3734,3756,3772,3803],{"__ignoreMap":213},[217,3735,3736,3738,3740,3742,3744,3746,3748,3750,3752,3754],{"class":219,"line":220},[217,3737,231],{"class":230},[217,3739,234],{"class":230},[217,3741,238],{"class":237},[217,3743,242],{"class":241},[217,3745,246],{"class":245},[217,3747,250],{"class":249},[217,3749,254],{"class":253},[217,3751,257],{"class":249},[217,3753,260],{"class":245},[217,3755,263],{"class":249},[217,3757,3758,3760,3762,3764,3766,3768,3770],{"class":219,"line":227},[217,3759,269],{"class":245},[217,3761,272],{"class":249},[217,3763,275],{"class":241},[217,3765,284],{"class":249},[217,3767,287],{"class":249},[217,3769,290],{"class":237},[217,3771,294],{"class":293},[217,3773,3774,3776,3778,3780,3782,3785,3788,3791,3793,3795,3797,3799,3801],{"class":219,"line":266},[217,3775,2180],{"class":230},[217,3777,275],{"class":241},[217,3779,317],{"class":249},[217,3781,320],{"class":241},[217,3783,3784],{"class":249}," ?",[217,3786,3787],{"class":249}," undefined",[217,3789,3790],{"class":249}," :",[217,3792,341],{"class":237},[217,3794,242],{"class":293},[217,3796,346],{"class":249},[217,3798,350],{"class":349},[217,3800,346],{"class":249},[217,3802,355],{"class":293},[217,3804,3805,3807],{"class":219,"line":297},[217,3806,451],{"class":249},[217,3808,355],{"class":241},[195,3810,3812],{"id":3811},"lazy-loading-middleware","Lazy Loading Middleware",[207,3814,3817],{"className":209,"code":3815,"filename":3816,"language":212,"meta":213,"style":213},"export default defineNuxtRouteMiddleware(async (to) => {\n  \u002F\u002F Only run auth check for protected routes\n  if (to.meta.public) {\n    return\n  }\n  \n  const { loggedIn } = useAuth()\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n})\n","middleware\u002Flazy-auth.ts",[203,3818,3819,3841,3846,3867,3871,3875,3879,3895,3899,3917,3933,3937],{"__ignoreMap":213},[217,3820,3821,3823,3825,3827,3829,3831,3833,3835,3837,3839],{"class":219,"line":220},[217,3822,231],{"class":230},[217,3824,234],{"class":230},[217,3826,238],{"class":237},[217,3828,242],{"class":241},[217,3830,246],{"class":245},[217,3832,250],{"class":249},[217,3834,254],{"class":253},[217,3836,257],{"class":249},[217,3838,260],{"class":245},[217,3840,263],{"class":249},[217,3842,3843],{"class":219,"line":227},[217,3844,3845],{"class":223},"  \u002F\u002F Only run auth check for protected routes\n",[217,3847,3848,3850,3852,3854,3856,3858,3860,3863,3865],{"class":219,"line":266},[217,3849,306],{"class":230},[217,3851,250],{"class":293},[217,3853,254],{"class":241},[217,3855,317],{"class":249},[217,3857,1267],{"class":241},[217,3859,317],{"class":249},[217,3861,3862],{"class":241},"public",[217,3864,323],{"class":293},[217,3866,326],{"class":249},[217,3868,3869],{"class":219,"line":297},[217,3870,1726],{"class":230},[217,3872,3873],{"class":219,"line":303},[217,3874,361],{"class":249},[217,3876,3877],{"class":219,"line":329},[217,3878,300],{"class":293},[217,3880,3881,3883,3885,3887,3889,3891,3893],{"class":219,"line":335},[217,3882,269],{"class":245},[217,3884,272],{"class":249},[217,3886,275],{"class":241},[217,3888,284],{"class":249},[217,3890,287],{"class":249},[217,3892,290],{"class":237},[217,3894,294],{"class":293},[217,3896,3897],{"class":219,"line":358},[217,3898,300],{"class":293},[217,3900,3901,3903,3905,3907,3909,3911,3913,3915],{"class":219,"line":364},[217,3902,306],{"class":230},[217,3904,250],{"class":293},[217,3906,311],{"class":249},[217,3908,314],{"class":241},[217,3910,317],{"class":249},[217,3912,320],{"class":241},[217,3914,323],{"class":293},[217,3916,326],{"class":249},[217,3918,3919,3921,3923,3925,3927,3929,3931],{"class":219,"line":369},[217,3920,338],{"class":230},[217,3922,341],{"class":237},[217,3924,242],{"class":293},[217,3926,346],{"class":249},[217,3928,350],{"class":349},[217,3930,346],{"class":249},[217,3932,355],{"class":293},[217,3934,3935],{"class":219,"line":377},[217,3936,361],{"class":249},[217,3938,3939,3941],{"class":219,"line":383},[217,3940,451],{"class":249},[217,3942,355],{"class":241},[183,3944,3946],{"id":3945},"testing-middleware","Testing Middleware",[195,3948,3950],{"id":3949},"unit-testing","Unit Testing",[207,3952,3955],{"className":209,"code":3953,"filename":3954,"language":212,"meta":213,"style":213},"import { describe, it, expect, vi, beforeEach } from 'vitest'\n\ndescribe('Auth Middleware', () => {\n  beforeEach(() => {\n    \u002F\u002F Mock Nuxt runtime and useAuth\n    vi.mock('#imports', () => ({\n      useAuth: () => ({\n        loggedIn: { value: false },\n        fetchProfile: vi.fn()\n      })\n    }))\n  })\n\n  it('redirects unauthenticated users', async () => {\n    const { useAuth } = await import('#imports')\n    const { loggedIn } = useAuth()\n    \n    const result = await global.$nuxt.$middleware.umbu.auth({\n      path: '\u002Fprotected',\n      meta: {}\n    })\n    \n    expect(result?.path).toBe('\u002Flogin')\n  })\n  \n  it('allows authenticated users', async () => {\n    const { useAuth } = await import('#imports')\n    const { loggedIn } = useAuth()\n    loggedIn.value = true\n    \n    const result = await global.$nuxt.$middleware.umbu.auth({\n      path: '\u002Fprotected',\n      meta: {}\n    })\n    \n    expect(result).toBeUndefined()\n  })\n})\n","tests\u002Fmiddleware\u002Fauth.test.ts",[203,3956,3957,3997,4001,4023,4037,4042,4071,4086,4106,4122,4128,4135,4141,4145,4169,4196,4212,4216,4252,4267,4277,4283,4287,4318,4324,4328,4351,4377,4393,4407,4411,4443,4458,4467,4474,4479,4497,4504],{"__ignoreMap":213},[217,3958,3959,3961,3963,3966,3968,3971,3973,3976,3978,3981,3983,3986,3988,3990,3992,3995],{"class":219,"line":220},[217,3960,2050],{"class":230},[217,3962,272],{"class":249},[217,3964,3965],{"class":241}," describe",[217,3967,278],{"class":249},[217,3969,3970],{"class":241}," it",[217,3972,278],{"class":249},[217,3974,3975],{"class":241}," expect",[217,3977,278],{"class":249},[217,3979,3980],{"class":241}," vi",[217,3982,278],{"class":249},[217,3984,3985],{"class":241}," beforeEach",[217,3987,284],{"class":249},[217,3989,2077],{"class":230},[217,3991,770],{"class":249},[217,3993,3994],{"class":349},"vitest",[217,3996,1183],{"class":249},[217,3998,3999],{"class":219,"line":227},[217,4000,739],{"emptyLinePlaceholder":738},[217,4002,4003,4006,4008,4010,4012,4014,4016,4019,4021],{"class":219,"line":266},[217,4004,4005],{"class":237},"describe",[217,4007,242],{"class":241},[217,4009,346],{"class":249},[217,4011,198],{"class":349},[217,4013,346],{"class":249},[217,4015,278],{"class":249},[217,4017,4018],{"class":249}," ()",[217,4020,260],{"class":245},[217,4022,263],{"class":249},[217,4024,4025,4028,4030,4033,4035],{"class":219,"line":297},[217,4026,4027],{"class":237},"  beforeEach",[217,4029,242],{"class":293},[217,4031,4032],{"class":249},"()",[217,4034,260],{"class":245},[217,4036,263],{"class":249},[217,4038,4039],{"class":219,"line":303},[217,4040,4041],{"class":223},"    \u002F\u002F Mock Nuxt runtime and useAuth\n",[217,4043,4044,4047,4049,4052,4054,4056,4059,4061,4063,4065,4067,4069],{"class":219,"line":329},[217,4045,4046],{"class":241},"    vi",[217,4048,317],{"class":249},[217,4050,4051],{"class":237},"mock",[217,4053,242],{"class":293},[217,4055,346],{"class":249},[217,4057,4058],{"class":349},"#imports",[217,4060,346],{"class":249},[217,4062,278],{"class":249},[217,4064,4018],{"class":249},[217,4066,260],{"class":245},[217,4068,250],{"class":293},[217,4070,326],{"class":249},[217,4072,4073,4076,4078,4080,4082,4084],{"class":219,"line":335},[217,4074,4075],{"class":237},"      useAuth",[217,4077,767],{"class":249},[217,4079,4018],{"class":249},[217,4081,260],{"class":245},[217,4083,250],{"class":293},[217,4085,326],{"class":249},[217,4087,4088,4091,4093,4095,4098,4100,4103],{"class":219,"line":358},[217,4089,4090],{"class":293},"        loggedIn",[217,4092,767],{"class":249},[217,4094,272],{"class":249},[217,4096,4097],{"class":293}," value",[217,4099,767],{"class":249},[217,4101,4102],{"class":3082}," false",[217,4104,4105],{"class":249}," },\n",[217,4107,4108,4111,4113,4115,4117,4120],{"class":219,"line":364},[217,4109,4110],{"class":293},"        fetchProfile",[217,4112,767],{"class":249},[217,4114,3980],{"class":241},[217,4116,317],{"class":249},[217,4118,4119],{"class":237},"fn",[217,4121,294],{"class":293},[217,4123,4124,4126],{"class":219,"line":369},[217,4125,2709],{"class":249},[217,4127,355],{"class":293},[217,4129,4130,4132],{"class":219,"line":377},[217,4131,1188],{"class":249},[217,4133,4134],{"class":293},"))\n",[217,4136,4137,4139],{"class":219,"line":383},[217,4138,405],{"class":249},[217,4140,355],{"class":293},[217,4142,4143],{"class":219,"line":402},[217,4144,739],{"emptyLinePlaceholder":738},[217,4146,4147,4150,4152,4154,4157,4159,4161,4163,4165,4167],{"class":219,"line":420},[217,4148,4149],{"class":237},"  it",[217,4151,242],{"class":293},[217,4153,346],{"class":249},[217,4155,4156],{"class":349},"redirects unauthenticated users",[217,4158,346],{"class":249},[217,4160,278],{"class":249},[217,4162,2250],{"class":245},[217,4164,4018],{"class":249},[217,4166,260],{"class":245},[217,4168,263],{"class":249},[217,4170,4171,4173,4175,4177,4179,4181,4183,4186,4188,4190,4192,4194],{"class":219,"line":426},[217,4172,1539],{"class":245},[217,4174,272],{"class":249},[217,4176,290],{"class":241},[217,4178,284],{"class":249},[217,4180,287],{"class":249},[217,4182,2372],{"class":230},[217,4184,4185],{"class":249}," import",[217,4187,242],{"class":293},[217,4189,346],{"class":249},[217,4191,4058],{"class":349},[217,4193,346],{"class":249},[217,4195,355],{"class":293},[217,4197,4198,4200,4202,4204,4206,4208,4210],{"class":219,"line":443},[217,4199,1539],{"class":245},[217,4201,272],{"class":249},[217,4203,275],{"class":241},[217,4205,284],{"class":249},[217,4207,287],{"class":249},[217,4209,290],{"class":237},[217,4211,294],{"class":293},[217,4213,4214],{"class":219,"line":448},[217,4215,1564],{"class":293},[217,4217,4218,4220,4223,4225,4227,4229,4231,4234,4236,4239,4241,4244,4246,4248,4250],{"class":219,"line":1840},[217,4219,1539],{"class":245},[217,4221,4222],{"class":241}," result",[217,4224,287],{"class":249},[217,4226,2372],{"class":230},[217,4228,3077],{"class":241},[217,4230,317],{"class":249},[217,4232,4233],{"class":241},"$nuxt",[217,4235,317],{"class":249},[217,4237,4238],{"class":241},"$middleware",[217,4240,317],{"class":249},[217,4242,4243],{"class":241},"umbu",[217,4245,317],{"class":249},[217,4247,112],{"class":237},[217,4249,242],{"class":293},[217,4251,326],{"class":249},[217,4253,4254,4256,4258,4260,4263,4265],{"class":219,"line":1847},[217,4255,3671],{"class":293},[217,4257,767],{"class":249},[217,4259,770],{"class":249},[217,4261,4262],{"class":349},"\u002Fprotected",[217,4264,346],{"class":249},[217,4266,1168],{"class":249},[217,4268,4269,4272,4274],{"class":219,"line":1852},[217,4270,4271],{"class":293},"      meta",[217,4273,767],{"class":249},[217,4275,4276],{"class":249}," {}\n",[217,4278,4279,4281],{"class":219,"line":2487},[217,4280,1188],{"class":249},[217,4282,355],{"class":293},[217,4284,4285],{"class":219,"line":2511},[217,4286,1564],{"class":293},[217,4288,4289,4292,4294,4297,4299,4301,4303,4305,4308,4310,4312,4314,4316],{"class":219,"line":2522},[217,4290,4291],{"class":237},"    expect",[217,4293,242],{"class":293},[217,4295,4296],{"class":241},"result",[217,4298,583],{"class":249},[217,4300,1703],{"class":241},[217,4302,257],{"class":293},[217,4304,317],{"class":249},[217,4306,4307],{"class":237},"toBe",[217,4309,242],{"class":293},[217,4311,346],{"class":249},[217,4313,350],{"class":349},[217,4315,346],{"class":249},[217,4317,355],{"class":293},[217,4319,4320,4322],{"class":219,"line":2533},[217,4321,405],{"class":249},[217,4323,355],{"class":293},[217,4325,4326],{"class":219,"line":2547},[217,4327,300],{"class":293},[217,4329,4330,4332,4334,4336,4339,4341,4343,4345,4347,4349],{"class":219,"line":2554},[217,4331,4149],{"class":237},[217,4333,242],{"class":293},[217,4335,346],{"class":249},[217,4337,4338],{"class":349},"allows authenticated users",[217,4340,346],{"class":249},[217,4342,278],{"class":249},[217,4344,2250],{"class":245},[217,4346,4018],{"class":249},[217,4348,260],{"class":245},[217,4350,263],{"class":249},[217,4352,4353,4355,4357,4359,4361,4363,4365,4367,4369,4371,4373,4375],{"class":219,"line":2559},[217,4354,1539],{"class":245},[217,4356,272],{"class":249},[217,4358,290],{"class":241},[217,4360,284],{"class":249},[217,4362,287],{"class":249},[217,4364,2372],{"class":230},[217,4366,4185],{"class":249},[217,4368,242],{"class":293},[217,4370,346],{"class":249},[217,4372,4058],{"class":349},[217,4374,346],{"class":249},[217,4376,355],{"class":293},[217,4378,4379,4381,4383,4385,4387,4389,4391],{"class":219,"line":2568},[217,4380,1539],{"class":245},[217,4382,272],{"class":249},[217,4384,275],{"class":241},[217,4386,284],{"class":249},[217,4388,287],{"class":249},[217,4390,290],{"class":237},[217,4392,294],{"class":293},[217,4394,4395,4398,4400,4402,4404],{"class":219,"line":2573},[217,4396,4397],{"class":241},"    loggedIn",[217,4399,317],{"class":249},[217,4401,320],{"class":241},[217,4403,287],{"class":249},[217,4405,4406],{"class":3082}," true\n",[217,4408,4409],{"class":219,"line":2578},[217,4410,1564],{"class":293},[217,4412,4413,4415,4417,4419,4421,4423,4425,4427,4429,4431,4433,4435,4437,4439,4441],{"class":219,"line":2585},[217,4414,1539],{"class":245},[217,4416,4222],{"class":241},[217,4418,287],{"class":249},[217,4420,2372],{"class":230},[217,4422,3077],{"class":241},[217,4424,317],{"class":249},[217,4426,4233],{"class":241},[217,4428,317],{"class":249},[217,4430,4238],{"class":241},[217,4432,317],{"class":249},[217,4434,4243],{"class":241},[217,4436,317],{"class":249},[217,4438,112],{"class":237},[217,4440,242],{"class":293},[217,4442,326],{"class":249},[217,4444,4446,4448,4450,4452,4454,4456],{"class":219,"line":4445},32,[217,4447,3671],{"class":293},[217,4449,767],{"class":249},[217,4451,770],{"class":249},[217,4453,4262],{"class":349},[217,4455,346],{"class":249},[217,4457,1168],{"class":249},[217,4459,4461,4463,4465],{"class":219,"line":4460},33,[217,4462,4271],{"class":293},[217,4464,767],{"class":249},[217,4466,4276],{"class":249},[217,4468,4470,4472],{"class":219,"line":4469},34,[217,4471,1188],{"class":249},[217,4473,355],{"class":293},[217,4475,4477],{"class":219,"line":4476},35,[217,4478,1564],{"class":293},[217,4480,4482,4484,4486,4488,4490,4492,4495],{"class":219,"line":4481},36,[217,4483,4291],{"class":237},[217,4485,242],{"class":293},[217,4487,4296],{"class":241},[217,4489,257],{"class":293},[217,4491,317],{"class":249},[217,4493,4494],{"class":237},"toBeUndefined",[217,4496,294],{"class":293},[217,4498,4500,4502],{"class":219,"line":4499},37,[217,4501,405],{"class":249},[217,4503,355],{"class":293},[217,4505,4507,4509],{"class":219,"line":4506},38,[217,4508,451],{"class":249},[217,4510,355],{"class":241},[180,4512],{},[176,4514,4515,4519,4520,4525],{},[4516,4517,4518],"strong",{},"Next:"," Explore ",[4521,4522,4524],"a",{"href":4523},"\u002F3.passport\u002F6.examples","Examples"," for practical implementations and use cases.",[4527,4528,4529],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":213,"searchDepth":220,"depth":227,"links":4531},[4532,4533,4537,4542,4547,4552,4556,4560,4564,4568],{"id":185,"depth":227,"text":186},{"id":192,"depth":227,"text":193,"children":4534},[4535,4536],{"id":197,"depth":266,"text":198},{"id":456,"depth":266,"text":457},{"id":637,"depth":227,"text":638,"children":4538},[4539,4540,4541],{"id":641,"depth":266,"text":642},{"id":817,"depth":266,"text":818},{"id":891,"depth":266,"text":892},{"id":997,"depth":227,"text":998,"children":4543},[4544,4545,4546],{"id":1001,"depth":266,"text":1002},{"id":1203,"depth":266,"text":1204},{"id":1406,"depth":266,"text":1407},{"id":1626,"depth":227,"text":1627,"children":4548},[4549,4550,4551],{"id":1630,"depth":266,"text":1631},{"id":1859,"depth":266,"text":1860},{"id":2038,"depth":266,"text":2039},{"id":2214,"depth":227,"text":2215,"children":4553},[4554,4555],{"id":2218,"depth":266,"text":2219},{"id":2594,"depth":266,"text":2595},{"id":2779,"depth":227,"text":2780,"children":4557},[4558,4559],{"id":2783,"depth":266,"text":2784},{"id":2931,"depth":266,"text":2932},{"id":3096,"depth":227,"text":3097,"children":4561},[4562,4563],{"id":3100,"depth":266,"text":3101},{"id":3450,"depth":266,"text":3451},{"id":3722,"depth":227,"text":3723,"children":4565},[4566,4567],{"id":3726,"depth":266,"text":3727},{"id":3811,"depth":266,"text":3812},{"id":3945,"depth":227,"text":3946,"children":4569},[4570],{"id":3949,"depth":266,"text":3950},"Protecting routes and managing authentication flows with middleware","md",null,{},{"icon":37},{"title":67,"description":4571},"ONojOM_blA_VBr6Q9BT0z7sQWHx9u-IwCzPX_48GvQE",[4579,4581],{"title":62,"path":63,"stem":64,"description":4580,"icon":65,"children":-1},"Implementing two-factor authentication (2FA) with Laravel Passport",{"title":71,"path":72,"stem":73,"description":4582,"icon":74,"children":-1},"Practical examples and common use cases for Laravel Passport with Nuxt Umbu",1785126612932]