[{"data":1,"prerenderedAt":3390},["ShallowReactive",2],{"\u002Fapi-provider":3},{"id":4,"title":5,"body":6,"description":3384,"extension":3385,"meta":3386,"navigation":407,"order":168,"package":13,"path":3387,"seo":3388,"stem":5,"__hash__":3389},"docs\u002Fapi-provider.md","api-provider",{"type":7,"value":8,"toc":3360},"minimark",[9,14,23,150,155,180,184,352,356,373,440,551,554,558,576,807,827,833,865,1153,1159,1256,1356,1363,1367,1381,1467,1471,1478,1542,1546,1620,1624,1633,1726,1730,1739,1794,1798,1881,1885,1891,1965,1979,1983,2015,2215,2218,2239,2243,2253,2260,2321,2346,2493,2497,2500,2505,2613,2617,2739,2743,2756,2865,2868,2871,3056,3060,3249,3253,3356],[10,11,13],"h1",{"id":12},"alikhalilllnuxt-api-provider","@alikhalilll\u002Fnuxt-api-provider",[15,16,17,18,22],"p",{},"A strongly-typed ",[19,20,21],"code",{},"fetch"," client for Nuxt 3 \u002F 4 with interceptors, retry\u002Fbackoff, and a framework-agnostic core you can use anywhere.",[24,25,26,38,55,61,84,98,112,141],"ul",{},[27,28,29,33,34,37],"li",{},[30,31,32],"strong",{},"Typed client type"," — ",[19,35,36],{},"ApiProviderClient"," is exported so you can annotate your own wrappers and composables.",[27,39,40,43,44,47,48,47,51,54],{},[30,41,42],{},"Interceptor chain"," — register multiple request\u002Fresponse\u002Ferror interceptors via ",[19,45,46],{},".useRequest",", ",[19,49,50],{},".useResponse",[19,52,53],{},".useError",".",[27,56,57,60],{},[30,58,59],{},"Retry + backoff"," — per-client defaults with per-call overrides. Configurable status codes and exponential delay.",[27,62,63,66,67,70,71,70,74,70,77,70,80,83],{},[30,64,65],{},"Smart body encoding"," — plain objects → JSON; ",[19,68,69],{},"FormData"," \u002F ",[19,72,73],{},"URLSearchParams",[19,75,76],{},"Blob",[19,78,79],{},"ArrayBuffer",[19,81,82],{},"string"," pass through with correct Content-Type.",[27,85,86,89,90,93,94,97],{},[30,87,88],{},"Timeouts + abort"," — per-call timeout plus ",[19,91,92],{},"AbortSignal"," support via ",[19,95,96],{},"AbortSignal.any"," with a polyfill fallback.",[27,99,100,103,104,107,108,111],{},[30,101,102],{},"Upload + download progress"," — a single ",[19,105,106],{},"onRequestProgress"," hook. The client transparently switches to ",[19,109,110],{},"XMLHttpRequest"," only when you pass it.",[27,113,114,120,121,47,124,47,127,47,130,133,134,70,137,140],{},[30,115,116,119],{},[19,117,118],{},"ApiError"," class"," — structured errors with ",[19,122,123],{},".status",[19,125,126],{},".details",[19,128,129],{},".payload",[19,131,132],{},".response",", plus an ",[19,135,136],{},"isApiError(e)",[19,138,139],{},"ApiError.is(e)"," guard that works across bundles and realms.",[27,142,143,33,146,149],{},[30,144,145],{},"Framework-agnostic core",[19,147,148],{},"import { createApiClient } from '@alikhalilll\u002Fnuxt-api-provider\u002Fcore'"," to use outside Nuxt.",[151,152,154],"h2",{"id":153},"install","Install",[156,157,162],"pre",{"className":158,"code":159,"language":160,"meta":161,"style":161},"language-bash shiki shiki-themes github-dark github-dark","pnpm add @alikhalilll\u002Fnuxt-api-provider\n","bash","",[19,163,164],{"__ignoreMap":161},[165,166,169,173,177],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"sFR8T","pnpm",[165,174,176],{"class":175},"s4wv1"," add",[165,178,179],{"class":175}," @alikhalilll\u002Fnuxt-api-provider\n",[151,181,183],{"id":182},"register-the-module","Register the module",[156,185,189],{"className":186,"code":187,"language":188,"meta":161,"style":161},"language-ts shiki shiki-themes github-dark github-dark","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@alikhalilll\u002Fnuxt-api-provider'],\n  apiProvider: {\n    baseURL: 'https:\u002F\u002Fapi.example.com',\n    provideName: '$apiProvider', \u002F\u002F leading \"$\" optional — gets stripped\n    defaultTimeoutMs: 20_000,\n    server: true, \u002F\u002F set false to skip SSR (client-only)\n    retry: { attempts: 2, delayMs: 500, backoff: 2 },\n    onRequestPath: '~\u002Fapi\u002Fon-request',\n    onSuccessPath: '~\u002Fapi\u002Fon-success',\n    onErrorPath: '~\u002Fapi\u002Fon-error',\n  },\n});\n","ts",[19,190,191,197,214,226,232,244,258,270,284,307,318,329,340,346],{"__ignoreMap":161},[165,192,193],{"class":167,"line":168},[165,194,196],{"class":195},"sJ8bj","\u002F\u002F nuxt.config.ts\n",[165,198,200,204,207,210],{"class":167,"line":199},2,[165,201,203],{"class":202},"sOPea","export",[165,205,206],{"class":202}," default",[165,208,209],{"class":171}," defineNuxtConfig",[165,211,213],{"class":212},"suv1-","({\n",[165,215,217,220,223],{"class":167,"line":216},3,[165,218,219],{"class":212},"  modules: [",[165,221,222],{"class":175},"'@alikhalilll\u002Fnuxt-api-provider'",[165,224,225],{"class":212},"],\n",[165,227,229],{"class":167,"line":228},4,[165,230,231],{"class":212},"  apiProvider: {\n",[165,233,235,238,241],{"class":167,"line":234},5,[165,236,237],{"class":212},"    baseURL: ",[165,239,240],{"class":175},"'https:\u002F\u002Fapi.example.com'",[165,242,243],{"class":212},",\n",[165,245,247,250,253,255],{"class":167,"line":246},6,[165,248,249],{"class":212},"    provideName: ",[165,251,252],{"class":175},"'$apiProvider'",[165,254,47],{"class":212},[165,256,257],{"class":195},"\u002F\u002F leading \"$\" optional — gets stripped\n",[165,259,261,264,268],{"class":167,"line":260},7,[165,262,263],{"class":212},"    defaultTimeoutMs: ",[165,265,267],{"class":266},"s8ozJ","20_000",[165,269,243],{"class":212},[165,271,273,276,279,281],{"class":167,"line":272},8,[165,274,275],{"class":212},"    server: ",[165,277,278],{"class":266},"true",[165,280,47],{"class":212},[165,282,283],{"class":195},"\u002F\u002F set false to skip SSR (client-only)\n",[165,285,287,290,293,296,299,302,304],{"class":167,"line":286},9,[165,288,289],{"class":212},"    retry: { attempts: ",[165,291,292],{"class":266},"2",[165,294,295],{"class":212},", delayMs: ",[165,297,298],{"class":266},"500",[165,300,301],{"class":212},", backoff: ",[165,303,292],{"class":266},[165,305,306],{"class":212}," },\n",[165,308,310,313,316],{"class":167,"line":309},10,[165,311,312],{"class":212},"    onRequestPath: ",[165,314,315],{"class":175},"'~\u002Fapi\u002Fon-request'",[165,317,243],{"class":212},[165,319,321,324,327],{"class":167,"line":320},11,[165,322,323],{"class":212},"    onSuccessPath: ",[165,325,326],{"class":175},"'~\u002Fapi\u002Fon-success'",[165,328,243],{"class":212},[165,330,332,335,338],{"class":167,"line":331},12,[165,333,334],{"class":212},"    onErrorPath: ",[165,336,337],{"class":175},"'~\u002Fapi\u002Fon-error'",[165,339,243],{"class":212},[165,341,343],{"class":167,"line":342},13,[165,344,345],{"class":212},"  },\n",[165,347,349],{"class":167,"line":348},14,[165,350,351],{"class":212},"});\n",[151,353,355],{"id":354},"basic-usage","Basic usage",[15,357,358,361,362,365,366,369,370,372],{},[19,359,360],{},"$apiProvider"," is augmented onto ",[19,363,364],{},"NuxtApp"," and ",[19,367,368],{},"ComponentCustomProperties"," as an ",[19,371,36],{},". Wrap it in a composable to stop destructuring it everywhere:",[156,374,376],{"className":186,"code":375,"language":188,"meta":161,"style":161},"\u002F\u002F composables\u002FuseApi.ts\nimport type { ApiProviderClient } from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n\nexport const useApi = (): ApiProviderClient => useNuxtApp().$apiProvider;\n",[19,377,378,383,403,409],{"__ignoreMap":161},[165,379,380],{"class":167,"line":168},[165,381,382],{"class":195},"\u002F\u002F composables\u002FuseApi.ts\n",[165,384,385,388,391,394,397,400],{"class":167,"line":199},[165,386,387],{"class":202},"import",[165,389,390],{"class":202}," type",[165,392,393],{"class":212}," { ApiProviderClient } ",[165,395,396],{"class":202},"from",[165,398,399],{"class":175}," '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes'",[165,401,402],{"class":212},";\n",[165,404,405],{"class":167,"line":216},[165,406,408],{"emptyLinePlaceholder":407},true,"\n",[165,410,411,413,416,419,422,425,428,431,434,437],{"class":167,"line":228},[165,412,203],{"class":202},[165,414,415],{"class":202}," const",[165,417,418],{"class":171}," useApi",[165,420,421],{"class":202}," =",[165,423,424],{"class":212}," ()",[165,426,427],{"class":202},":",[165,429,430],{"class":171}," ApiProviderClient",[165,432,433],{"class":202}," =>",[165,435,436],{"class":171}," useNuxtApp",[165,438,439],{"class":212},"().$apiProvider;\n",[156,441,445],{"className":442,"code":443,"language":444,"meta":161,"style":161},"language-vue shiki shiki-themes github-dark github-dark","\u003Cscript setup lang=\"ts\">\ninterface Post {\n  id: number;\n  title: string;\n}\nconst post = await useApi()\u003CPost>('\u002Fposts\u002F1');\n\u003C\u002Fscript>\n","vue",[19,446,447,471,482,495,507,512,542],{"__ignoreMap":161},[165,448,449,452,456,459,462,465,468],{"class":167,"line":168},[165,450,451],{"class":212},"\u003C",[165,453,455],{"class":454},"sxg3X","script",[165,457,458],{"class":171}," setup",[165,460,461],{"class":171}," lang",[165,463,464],{"class":212},"=",[165,466,467],{"class":175},"\"ts\"",[165,469,470],{"class":212},">\n",[165,472,473,476,479],{"class":167,"line":199},[165,474,475],{"class":202},"interface",[165,477,478],{"class":171}," Post",[165,480,481],{"class":212}," {\n",[165,483,484,488,490,493],{"class":167,"line":216},[165,485,487],{"class":486},"s-3mD","  id",[165,489,427],{"class":202},[165,491,492],{"class":266}," number",[165,494,402],{"class":212},[165,496,497,500,502,505],{"class":167,"line":228},[165,498,499],{"class":486},"  title",[165,501,427],{"class":202},[165,503,504],{"class":266}," string",[165,506,402],{"class":212},[165,508,509],{"class":167,"line":234},[165,510,511],{"class":212},"}\n",[165,513,514,517,520,522,525,527,530,533,536,539],{"class":167,"line":246},[165,515,516],{"class":202},"const",[165,518,519],{"class":266}," post",[165,521,421],{"class":202},[165,523,524],{"class":202}," await",[165,526,418],{"class":171},[165,528,529],{"class":212},"()\u003C",[165,531,532],{"class":171},"Post",[165,534,535],{"class":212},">(",[165,537,538],{"class":175},"'\u002Fposts\u002F1'",[165,540,541],{"class":212},");\n",[165,543,544,547,549],{"class":167,"line":260},[165,545,546],{"class":212},"\u003C\u002F",[165,548,455],{"class":454},[165,550,470],{"class":212},[552,553],"demo-api-basic",{},[151,555,557],{"id":556},"ssr-server-side-rendering","SSR (server-side rendering)",[15,559,560,561,564,565,567,568,571,572,575],{},"With ",[19,562,563],{},"server: true"," (the default), ",[19,566,360],{}," is available during SSR, so top-level ",[19,569,570],{},"await"," inside a page's ",[19,573,574],{},"\u003Cscript setup>"," runs on the server and the HTML arrives fully populated.",[156,577,579],{"className":442,"code":578,"language":444,"meta":161,"style":161},"\u003C!-- pages\u002Fposts\u002F[id].vue -->\n\u003Cscript setup lang=\"ts\">\ninterface Post {\n  id: number;\n  title: string;\n  body: string;\n}\n\nconst route = useRoute();\nconst api = useApi();\n\n\u002F\u002F Resolves on the server during SSR, then hydrates on the client.\nconst post = await api\u003CPost>(`\u002Fposts\u002F${route.params.id}`);\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Carticle>\n    \u003Ch1>{{ post?.title }}\u003C\u002Fh1>\n    \u003Cp>{{ post?.body }}\u003C\u002Fp>\n  \u003C\u002Farticle>\n\u003C\u002Ftemplate>\n",[19,580,581,586,602,610,620,630,641,645,649,664,677,681,686,725,733,738,748,759,774,788,798],{"__ignoreMap":161},[165,582,583],{"class":167,"line":168},[165,584,585],{"class":195},"\u003C!-- pages\u002Fposts\u002F[id].vue -->\n",[165,587,588,590,592,594,596,598,600],{"class":167,"line":199},[165,589,451],{"class":212},[165,591,455],{"class":454},[165,593,458],{"class":171},[165,595,461],{"class":171},[165,597,464],{"class":212},[165,599,467],{"class":175},[165,601,470],{"class":212},[165,603,604,606,608],{"class":167,"line":216},[165,605,475],{"class":202},[165,607,478],{"class":171},[165,609,481],{"class":212},[165,611,612,614,616,618],{"class":167,"line":228},[165,613,487],{"class":486},[165,615,427],{"class":202},[165,617,492],{"class":266},[165,619,402],{"class":212},[165,621,622,624,626,628],{"class":167,"line":234},[165,623,499],{"class":486},[165,625,427],{"class":202},[165,627,504],{"class":266},[165,629,402],{"class":212},[165,631,632,635,637,639],{"class":167,"line":246},[165,633,634],{"class":486},"  body",[165,636,427],{"class":202},[165,638,504],{"class":266},[165,640,402],{"class":212},[165,642,643],{"class":167,"line":260},[165,644,511],{"class":212},[165,646,647],{"class":167,"line":272},[165,648,408],{"emptyLinePlaceholder":407},[165,650,651,653,656,658,661],{"class":167,"line":286},[165,652,516],{"class":202},[165,654,655],{"class":266}," route",[165,657,421],{"class":202},[165,659,660],{"class":171}," useRoute",[165,662,663],{"class":212},"();\n",[165,665,666,668,671,673,675],{"class":167,"line":309},[165,667,516],{"class":202},[165,669,670],{"class":266}," api",[165,672,421],{"class":202},[165,674,418],{"class":171},[165,676,663],{"class":212},[165,678,679],{"class":167,"line":320},[165,680,408],{"emptyLinePlaceholder":407},[165,682,683],{"class":167,"line":331},[165,684,685],{"class":195},"\u002F\u002F Resolves on the server during SSR, then hydrates on the client.\n",[165,687,688,690,692,694,696,698,700,702,704,707,710,712,715,717,720,723],{"class":167,"line":342},[165,689,516],{"class":202},[165,691,519],{"class":266},[165,693,421],{"class":202},[165,695,524],{"class":202},[165,697,670],{"class":171},[165,699,451],{"class":212},[165,701,532],{"class":171},[165,703,535],{"class":212},[165,705,706],{"class":175},"`\u002Fposts\u002F${",[165,708,709],{"class":212},"route",[165,711,54],{"class":175},[165,713,714],{"class":212},"params",[165,716,54],{"class":175},[165,718,719],{"class":212},"id",[165,721,722],{"class":175},"}`",[165,724,541],{"class":212},[165,726,727,729,731],{"class":167,"line":348},[165,728,546],{"class":212},[165,730,455],{"class":454},[165,732,470],{"class":212},[165,734,736],{"class":167,"line":735},15,[165,737,408],{"emptyLinePlaceholder":407},[165,739,741,743,746],{"class":167,"line":740},16,[165,742,451],{"class":212},[165,744,745],{"class":454},"template",[165,747,470],{"class":212},[165,749,751,754,757],{"class":167,"line":750},17,[165,752,753],{"class":212},"  \u003C",[165,755,756],{"class":454},"article",[165,758,470],{"class":212},[165,760,762,765,767,770,772],{"class":167,"line":761},18,[165,763,764],{"class":212},"    \u003C",[165,766,10],{"class":454},[165,768,769],{"class":212},">{{ post?.title }}\u003C\u002F",[165,771,10],{"class":454},[165,773,470],{"class":212},[165,775,777,779,781,784,786],{"class":167,"line":776},19,[165,778,764],{"class":212},[165,780,15],{"class":454},[165,782,783],{"class":212},">{{ post?.body }}\u003C\u002F",[165,785,15],{"class":454},[165,787,470],{"class":212},[165,789,791,794,796],{"class":167,"line":790},20,[165,792,793],{"class":212},"  \u003C\u002F",[165,795,756],{"class":454},[165,797,470],{"class":212},[165,799,801,803,805],{"class":167,"line":800},21,[165,802,546],{"class":212},[165,804,745],{"class":454},[165,806,470],{"class":212},[15,808,809,810,813,814,47,817,819,820,823,824,54],{},"If you set ",[19,811,812],{},"server: false"," in ",[19,815,816],{},"nuxt.config.ts",[19,818,360],{}," won't exist during SSR and this pattern will throw — move the call into ",[19,821,822],{},"onMounted"," or ",[19,825,826],{},"useAsyncData(..., { server: false })",[151,828,830],{"id":829},"useasyncdata",[19,831,832],{},"useAsyncData",[15,834,835,837,838,70,841,70,844,847,848,851,852,33,854,857,858,860,861,54],{},[19,836,832],{}," is the idiomatic way to fetch in Nuxt: it deduplicates per-key, populates the SSR payload, and exposes ",[19,839,840],{},"pending",[19,842,843],{},"error",[19,845,846],{},"refresh",". Capture the client ",[30,849,850],{},"synchronously"," at the top of ",[19,853,574],{},[19,855,856],{},"useNuxtApp()"," only works in the synchronous prefix of a setup or a Nuxt-managed callback, so reaching for it after an ",[19,859,570],{}," throws ",[862,863,864],"em",{},"\"A composable that requires access to the Nuxt instance was called outside of …\"",[156,866,868],{"className":442,"code":867,"language":444,"meta":161,"style":161},"\u003Cscript setup lang=\"ts\">\ninterface Post {\n  id: number;\n  title: string;\n}\n\nconst { $apiProvider } = useNuxtApp(); \u002F\u002F capture ONCE, before any await\n\nconst { data, pending, error, refresh } = await useAsyncData('posts', () =>\n  $apiProvider\u003CPost[]>('\u002Fposts')\n);\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"pending\">Loading…\u003C\u002Fdiv>\n  \u003Cdiv v-else-if=\"error\">Failed: {{ error.message }}\u003C\u002Fdiv>\n  \u003Cul v-else>\n    \u003Cli v-for=\"post in data\" :key=\"post.id\">{{ post.title }}\u003C\u002Fli>\n  \u003C\u002Ful>\n  \u003Cbutton @click=\"refresh()\">Reload\u003C\u002Fbutton>\n\u003C\u002Ftemplate>\n",[19,869,870,886,894,904,914,918,922,944,948,990,1008,1012,1020,1024,1032,1054,1075,1086,1115,1123,1145],{"__ignoreMap":161},[165,871,872,874,876,878,880,882,884],{"class":167,"line":168},[165,873,451],{"class":212},[165,875,455],{"class":454},[165,877,458],{"class":171},[165,879,461],{"class":171},[165,881,464],{"class":212},[165,883,467],{"class":175},[165,885,470],{"class":212},[165,887,888,890,892],{"class":167,"line":199},[165,889,475],{"class":202},[165,891,478],{"class":171},[165,893,481],{"class":212},[165,895,896,898,900,902],{"class":167,"line":216},[165,897,487],{"class":486},[165,899,427],{"class":202},[165,901,492],{"class":266},[165,903,402],{"class":212},[165,905,906,908,910,912],{"class":167,"line":228},[165,907,499],{"class":486},[165,909,427],{"class":202},[165,911,504],{"class":266},[165,913,402],{"class":212},[165,915,916],{"class":167,"line":234},[165,917,511],{"class":212},[165,919,920],{"class":167,"line":246},[165,921,408],{"emptyLinePlaceholder":407},[165,923,924,926,929,931,934,936,938,941],{"class":167,"line":260},[165,925,516],{"class":202},[165,927,928],{"class":212}," { ",[165,930,360],{"class":266},[165,932,933],{"class":212}," } ",[165,935,464],{"class":202},[165,937,436],{"class":171},[165,939,940],{"class":212},"(); ",[165,942,943],{"class":195},"\u002F\u002F capture ONCE, before any await\n",[165,945,946],{"class":167,"line":272},[165,947,408],{"emptyLinePlaceholder":407},[165,949,950,952,954,957,959,961,963,965,967,969,971,973,975,978,981,984,987],{"class":167,"line":286},[165,951,516],{"class":202},[165,953,928],{"class":212},[165,955,956],{"class":266},"data",[165,958,47],{"class":212},[165,960,840],{"class":266},[165,962,47],{"class":212},[165,964,843],{"class":266},[165,966,47],{"class":212},[165,968,846],{"class":266},[165,970,933],{"class":212},[165,972,464],{"class":202},[165,974,524],{"class":202},[165,976,977],{"class":171}," useAsyncData",[165,979,980],{"class":212},"(",[165,982,983],{"class":175},"'posts'",[165,985,986],{"class":212},", () ",[165,988,989],{"class":202},"=>\n",[165,991,992,995,997,999,1002,1005],{"class":167,"line":309},[165,993,994],{"class":171},"  $apiProvider",[165,996,451],{"class":212},[165,998,532],{"class":171},[165,1000,1001],{"class":212},"[]>(",[165,1003,1004],{"class":175},"'\u002Fposts'",[165,1006,1007],{"class":212},")\n",[165,1009,1010],{"class":167,"line":320},[165,1011,541],{"class":212},[165,1013,1014,1016,1018],{"class":167,"line":331},[165,1015,546],{"class":212},[165,1017,455],{"class":454},[165,1019,470],{"class":212},[165,1021,1022],{"class":167,"line":342},[165,1023,408],{"emptyLinePlaceholder":407},[165,1025,1026,1028,1030],{"class":167,"line":348},[165,1027,451],{"class":212},[165,1029,745],{"class":454},[165,1031,470],{"class":212},[165,1033,1034,1036,1039,1042,1044,1047,1050,1052],{"class":167,"line":735},[165,1035,753],{"class":212},[165,1037,1038],{"class":454},"div",[165,1040,1041],{"class":171}," v-if",[165,1043,464],{"class":212},[165,1045,1046],{"class":175},"\"pending\"",[165,1048,1049],{"class":212},">Loading…\u003C\u002F",[165,1051,1038],{"class":454},[165,1053,470],{"class":212},[165,1055,1056,1058,1060,1063,1065,1068,1071,1073],{"class":167,"line":740},[165,1057,753],{"class":212},[165,1059,1038],{"class":454},[165,1061,1062],{"class":171}," v-else-if",[165,1064,464],{"class":212},[165,1066,1067],{"class":175},"\"error\"",[165,1069,1070],{"class":212},">Failed: {{ error.message }}\u003C\u002F",[165,1072,1038],{"class":454},[165,1074,470],{"class":212},[165,1076,1077,1079,1081,1084],{"class":167,"line":750},[165,1078,753],{"class":212},[165,1080,24],{"class":454},[165,1082,1083],{"class":171}," v-else",[165,1085,470],{"class":212},[165,1087,1088,1090,1092,1095,1097,1100,1103,1105,1108,1111,1113],{"class":167,"line":761},[165,1089,764],{"class":212},[165,1091,27],{"class":454},[165,1093,1094],{"class":171}," v-for",[165,1096,464],{"class":212},[165,1098,1099],{"class":175},"\"post in data\"",[165,1101,1102],{"class":171}," :key",[165,1104,464],{"class":212},[165,1106,1107],{"class":175},"\"post.id\"",[165,1109,1110],{"class":212},">{{ post.title }}\u003C\u002F",[165,1112,27],{"class":454},[165,1114,470],{"class":212},[165,1116,1117,1119,1121],{"class":167,"line":776},[165,1118,793],{"class":212},[165,1120,24],{"class":454},[165,1122,470],{"class":212},[165,1124,1125,1127,1130,1133,1135,1138,1141,1143],{"class":167,"line":790},[165,1126,753],{"class":212},[165,1128,1129],{"class":454},"button",[165,1131,1132],{"class":171}," @click",[165,1134,464],{"class":212},[165,1136,1137],{"class":175},"\"refresh()\"",[165,1139,1140],{"class":212},">Reload\u003C\u002F",[165,1142,1129],{"class":454},[165,1144,470],{"class":212},[165,1146,1147,1149,1151],{"class":167,"line":800},[165,1148,546],{"class":212},[165,1150,745],{"class":454},[165,1152,470],{"class":212},[15,1154,1155,1156,1158],{},"If you factor the call into a service, pass the client in rather than calling ",[19,1157,856],{}," inside the service:",[156,1160,1162],{"className":186,"code":1161,"language":188,"meta":161,"style":161},"\u002F\u002F services\u002Fposts.ts\nimport type { ApiProviderClient } from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n\nexport const getPost = (api: ApiProviderClient, id: string) =>\n  api\u003C{ id: number; title: string }>(`\u002Fposts\u002F${id}`);\n",[19,1163,1164,1169,1183,1187,1221],{"__ignoreMap":161},[165,1165,1166],{"class":167,"line":168},[165,1167,1168],{"class":195},"\u002F\u002F services\u002Fposts.ts\n",[165,1170,1171,1173,1175,1177,1179,1181],{"class":167,"line":199},[165,1172,387],{"class":202},[165,1174,390],{"class":202},[165,1176,393],{"class":212},[165,1178,396],{"class":202},[165,1180,399],{"class":175},[165,1182,402],{"class":212},[165,1184,1185],{"class":167,"line":216},[165,1186,408],{"emptyLinePlaceholder":407},[165,1188,1189,1191,1193,1196,1198,1201,1204,1206,1208,1210,1212,1214,1216,1219],{"class":167,"line":228},[165,1190,203],{"class":202},[165,1192,415],{"class":202},[165,1194,1195],{"class":171}," getPost",[165,1197,421],{"class":202},[165,1199,1200],{"class":212}," (",[165,1202,1203],{"class":486},"api",[165,1205,427],{"class":202},[165,1207,430],{"class":171},[165,1209,47],{"class":212},[165,1211,719],{"class":486},[165,1213,427],{"class":202},[165,1215,504],{"class":266},[165,1217,1218],{"class":212},") ",[165,1220,989],{"class":202},[165,1222,1223,1226,1229,1231,1233,1235,1238,1241,1243,1245,1248,1250,1252,1254],{"class":167,"line":234},[165,1224,1225],{"class":171},"  api",[165,1227,1228],{"class":212},"\u003C{ ",[165,1230,719],{"class":486},[165,1232,427],{"class":202},[165,1234,492],{"class":266},[165,1236,1237],{"class":212},"; ",[165,1239,1240],{"class":486},"title",[165,1242,427],{"class":202},[165,1244,504],{"class":266},[165,1246,1247],{"class":212}," }>(",[165,1249,706],{"class":175},[165,1251,719],{"class":212},[165,1253,722],{"class":175},[165,1255,541],{"class":212},[156,1257,1259],{"className":442,"code":1258,"language":444,"meta":161,"style":161},"\u003Cscript setup lang=\"ts\">\nimport { getPost } from '~\u002Fservices\u002Fposts';\n\nconst { $apiProvider } = useNuxtApp();\nconst { data } = await useAsyncData('post-1', () => getPost($apiProvider, '1'));\n\u003C\u002Fscript>\n",[19,1260,1261,1277,1291,1295,1311,1348],{"__ignoreMap":161},[165,1262,1263,1265,1267,1269,1271,1273,1275],{"class":167,"line":168},[165,1264,451],{"class":212},[165,1266,455],{"class":454},[165,1268,458],{"class":171},[165,1270,461],{"class":171},[165,1272,464],{"class":212},[165,1274,467],{"class":175},[165,1276,470],{"class":212},[165,1278,1279,1281,1284,1286,1289],{"class":167,"line":199},[165,1280,387],{"class":202},[165,1282,1283],{"class":212}," { getPost } ",[165,1285,396],{"class":202},[165,1287,1288],{"class":175}," '~\u002Fservices\u002Fposts'",[165,1290,402],{"class":212},[165,1292,1293],{"class":167,"line":216},[165,1294,408],{"emptyLinePlaceholder":407},[165,1296,1297,1299,1301,1303,1305,1307,1309],{"class":167,"line":228},[165,1298,516],{"class":202},[165,1300,928],{"class":212},[165,1302,360],{"class":266},[165,1304,933],{"class":212},[165,1306,464],{"class":202},[165,1308,436],{"class":171},[165,1310,663],{"class":212},[165,1312,1313,1315,1317,1319,1321,1323,1325,1327,1329,1332,1334,1337,1339,1342,1345],{"class":167,"line":234},[165,1314,516],{"class":202},[165,1316,928],{"class":212},[165,1318,956],{"class":266},[165,1320,933],{"class":212},[165,1322,464],{"class":202},[165,1324,524],{"class":202},[165,1326,977],{"class":171},[165,1328,980],{"class":212},[165,1330,1331],{"class":175},"'post-1'",[165,1333,986],{"class":212},[165,1335,1336],{"class":202},"=>",[165,1338,1195],{"class":171},[165,1340,1341],{"class":212},"($apiProvider, ",[165,1343,1344],{"class":175},"'1'",[165,1346,1347],{"class":212},"));\n",[165,1349,1350,1352,1354],{"class":167,"line":246},[165,1351,546],{"class":212},[165,1353,455],{"class":454},[165,1355,470],{"class":212},[15,1357,1358,1359,1362],{},"The same function now works from a Nitro route (pass a ",[19,1360,1361],{},"createApiClient"," instance instead) — see the core section below.",[151,1364,1366],{"id":1365},"query-parameters","Query parameters",[15,1368,1369,1370,1373,1374,1377,1378,54],{},"Queries are the third argument. ",[19,1371,1372],{},"null","\u002F",[19,1375,1376],{},"undefined","\u002Fempty-string are skipped; arrays are repeated as ",[19,1379,1380],{},"?tag=a&tag=b",[156,1382,1384],{"className":186,"code":1383,"language":188,"meta":161,"style":161},"const posts = await api\u003CPost[]>('\u002Fposts', null, {\n  userId: 1,\n  tag: ['news', 'featured'],\n  q: '', \u002F\u002F skipped\n  draft: undefined, \u002F\u002F skipped\n});\n",[19,1385,1386,1414,1424,1439,1452,1463],{"__ignoreMap":161},[165,1387,1388,1390,1393,1395,1397,1399,1401,1403,1405,1407,1409,1411],{"class":167,"line":168},[165,1389,516],{"class":202},[165,1391,1392],{"class":266}," posts",[165,1394,421],{"class":202},[165,1396,524],{"class":202},[165,1398,670],{"class":171},[165,1400,451],{"class":212},[165,1402,532],{"class":171},[165,1404,1001],{"class":212},[165,1406,1004],{"class":175},[165,1408,47],{"class":212},[165,1410,1372],{"class":266},[165,1412,1413],{"class":212},", {\n",[165,1415,1416,1419,1422],{"class":167,"line":199},[165,1417,1418],{"class":212},"  userId: ",[165,1420,1421],{"class":266},"1",[165,1423,243],{"class":212},[165,1425,1426,1429,1432,1434,1437],{"class":167,"line":216},[165,1427,1428],{"class":212},"  tag: [",[165,1430,1431],{"class":175},"'news'",[165,1433,47],{"class":212},[165,1435,1436],{"class":175},"'featured'",[165,1438,225],{"class":212},[165,1440,1441,1444,1447,1449],{"class":167,"line":228},[165,1442,1443],{"class":212},"  q: ",[165,1445,1446],{"class":175},"''",[165,1448,47],{"class":212},[165,1450,1451],{"class":195},"\u002F\u002F skipped\n",[165,1453,1454,1457,1459,1461],{"class":167,"line":234},[165,1455,1456],{"class":212},"  draft: ",[165,1458,1376],{"class":266},[165,1460,47],{"class":212},[165,1462,1451],{"class":195},[165,1464,1465],{"class":167,"line":246},[165,1466,351],{"class":212},[151,1468,1470],{"id":1469},"post-with-json","POST with JSON",[15,1472,1473,1474,1477],{},"Plain objects (and arrays) are JSON-encoded; ",[19,1475,1476],{},"Content-Type: application\u002Fjson"," is set automatically.",[156,1479,1481],{"className":186,"code":1480,"language":188,"meta":161,"style":161},"const created = await api\u003CPost>('\u002Fposts', {\n  method: 'POST',\n  body: { userId: 42, title: 'Hello', body: 'World' },\n});\n",[19,1482,1483,1506,1516,1538],{"__ignoreMap":161},[165,1484,1485,1487,1490,1492,1494,1496,1498,1500,1502,1504],{"class":167,"line":168},[165,1486,516],{"class":202},[165,1488,1489],{"class":266}," created",[165,1491,421],{"class":202},[165,1493,524],{"class":202},[165,1495,670],{"class":171},[165,1497,451],{"class":212},[165,1499,532],{"class":171},[165,1501,535],{"class":212},[165,1503,1004],{"class":175},[165,1505,1413],{"class":212},[165,1507,1508,1511,1514],{"class":167,"line":199},[165,1509,1510],{"class":212},"  method: ",[165,1512,1513],{"class":175},"'POST'",[165,1515,243],{"class":212},[165,1517,1518,1521,1524,1527,1530,1533,1536],{"class":167,"line":216},[165,1519,1520],{"class":212},"  body: { userId: ",[165,1522,1523],{"class":266},"42",[165,1525,1526],{"class":212},", title: ",[165,1528,1529],{"class":175},"'Hello'",[165,1531,1532],{"class":212},", body: ",[165,1534,1535],{"class":175},"'World'",[165,1537,306],{"class":212},[165,1539,1540],{"class":167,"line":228},[165,1541,351],{"class":212},[151,1543,1545],{"id":1544},"patch-put-delete","PATCH \u002F PUT \u002F DELETE",[156,1547,1549],{"className":186,"code":1548,"language":188,"meta":161,"style":161},"await api\u003CPost>('\u002Fposts\u002F1', { method: 'PATCH', body: { title: 'Updated' } });\nawait api\u003CPost>('\u002Fposts\u002F1', { method: 'PUT', body: fullReplacement });\nawait api('\u002Fposts\u002F1', { method: 'DELETE' });\n",[19,1550,1551,1580,1602],{"__ignoreMap":161},[165,1552,1553,1555,1557,1559,1561,1563,1565,1568,1571,1574,1577],{"class":167,"line":168},[165,1554,570],{"class":202},[165,1556,670],{"class":171},[165,1558,451],{"class":212},[165,1560,532],{"class":171},[165,1562,535],{"class":212},[165,1564,538],{"class":175},[165,1566,1567],{"class":212},", { method: ",[165,1569,1570],{"class":175},"'PATCH'",[165,1572,1573],{"class":212},", body: { title: ",[165,1575,1576],{"class":175},"'Updated'",[165,1578,1579],{"class":212}," } });\n",[165,1581,1582,1584,1586,1588,1590,1592,1594,1596,1599],{"class":167,"line":199},[165,1583,570],{"class":202},[165,1585,670],{"class":171},[165,1587,451],{"class":212},[165,1589,532],{"class":171},[165,1591,535],{"class":212},[165,1593,538],{"class":175},[165,1595,1567],{"class":212},[165,1597,1598],{"class":175},"'PUT'",[165,1600,1601],{"class":212},", body: fullReplacement });\n",[165,1603,1604,1606,1608,1610,1612,1614,1617],{"class":167,"line":216},[165,1605,570],{"class":202},[165,1607,670],{"class":171},[165,1609,980],{"class":212},[165,1611,538],{"class":175},[165,1613,1567],{"class":212},[165,1615,1616],{"class":175},"'DELETE'",[165,1618,1619],{"class":212}," });\n",[151,1621,1623],{"id":1622},"formdata-multipart","FormData \u002F multipart",[15,1625,1626,1628,1629,1632],{},[19,1627,69],{}," is passed through and ",[19,1630,1631],{},"Content-Type"," is dropped so the browser sets the boundary.",[156,1634,1636],{"className":186,"code":1635,"language":188,"meta":161,"style":161},"const form = new FormData();\nform.append('file', fileInput.files[0]);\nform.append('caption', 'my file');\n\nawait api\u003C{ url: string }>('\u002Fuploads', { method: 'POST', body: form });\n",[19,1637,1638,1655,1677,1695,1699],{"__ignoreMap":161},[165,1639,1640,1642,1645,1647,1650,1653],{"class":167,"line":168},[165,1641,516],{"class":202},[165,1643,1644],{"class":266}," form",[165,1646,421],{"class":202},[165,1648,1649],{"class":202}," new",[165,1651,1652],{"class":171}," FormData",[165,1654,663],{"class":212},[165,1656,1657,1660,1663,1665,1668,1671,1674],{"class":167,"line":199},[165,1658,1659],{"class":212},"form.",[165,1661,1662],{"class":171},"append",[165,1664,980],{"class":212},[165,1666,1667],{"class":175},"'file'",[165,1669,1670],{"class":212},", fileInput.files[",[165,1672,1673],{"class":266},"0",[165,1675,1676],{"class":212},"]);\n",[165,1678,1679,1681,1683,1685,1688,1690,1693],{"class":167,"line":216},[165,1680,1659],{"class":212},[165,1682,1662],{"class":171},[165,1684,980],{"class":212},[165,1686,1687],{"class":175},"'caption'",[165,1689,47],{"class":212},[165,1691,1692],{"class":175},"'my file'",[165,1694,541],{"class":212},[165,1696,1697],{"class":167,"line":228},[165,1698,408],{"emptyLinePlaceholder":407},[165,1700,1701,1703,1705,1707,1710,1712,1714,1716,1719,1721,1723],{"class":167,"line":234},[165,1702,570],{"class":202},[165,1704,670],{"class":171},[165,1706,1228],{"class":212},[165,1708,1709],{"class":486},"url",[165,1711,427],{"class":202},[165,1713,504],{"class":266},[165,1715,1247],{"class":212},[165,1717,1718],{"class":175},"'\u002Fuploads'",[165,1720,1567],{"class":212},[165,1722,1513],{"class":175},[165,1724,1725],{"class":212},", body: form });\n",[151,1727,1729],{"id":1728},"url-encoded","URL-encoded",[15,1731,1732,1734,1735,1738],{},[19,1733,73],{}," sets ",[19,1736,1737],{},"Content-Type: application\u002Fx-www-form-urlencoded"," when not already present.",[156,1740,1742],{"className":186,"code":1741,"language":188,"meta":161,"style":161},"const body = new URLSearchParams({ grant_type: 'refresh_token', token: rt });\nawait api\u003C{ access_token: string }>('\u002Foauth\u002Ftoken', { method: 'POST', body });\n",[19,1743,1744,1767],{"__ignoreMap":161},[165,1745,1746,1748,1751,1753,1755,1758,1761,1764],{"class":167,"line":168},[165,1747,516],{"class":202},[165,1749,1750],{"class":266}," body",[165,1752,421],{"class":202},[165,1754,1649],{"class":202},[165,1756,1757],{"class":171}," URLSearchParams",[165,1759,1760],{"class":212},"({ grant_type: ",[165,1762,1763],{"class":175},"'refresh_token'",[165,1765,1766],{"class":212},", token: rt });\n",[165,1768,1769,1771,1773,1775,1778,1780,1782,1784,1787,1789,1791],{"class":167,"line":199},[165,1770,570],{"class":202},[165,1772,670],{"class":171},[165,1774,1228],{"class":212},[165,1776,1777],{"class":486},"access_token",[165,1779,427],{"class":202},[165,1781,504],{"class":266},[165,1783,1247],{"class":212},[165,1785,1786],{"class":175},"'\u002Foauth\u002Ftoken'",[165,1788,1567],{"class":212},[165,1790,1513],{"class":175},[165,1792,1793],{"class":212},", body });\n",[151,1795,1797],{"id":1796},"timeouts-and-abort","Timeouts and abort",[156,1799,1801],{"className":186,"code":1800,"language":188,"meta":161,"style":161},"\u002F\u002F Aborts after 3s regardless of the client-level default.\nawait api('\u002Fslow', { timeoutMs: 3_000 });\n\n\u002F\u002F External AbortSignal — combined with the internal timeout signal via AbortSignal.any.\nconst ctrl = new AbortController();\nconst promise = api('\u002Fstream', { signal: ctrl.signal });\nctrl.abort();\n",[19,1802,1803,1808,1827,1831,1836,1852,1871],{"__ignoreMap":161},[165,1804,1805],{"class":167,"line":168},[165,1806,1807],{"class":195},"\u002F\u002F Aborts after 3s regardless of the client-level default.\n",[165,1809,1810,1812,1814,1816,1819,1822,1825],{"class":167,"line":199},[165,1811,570],{"class":202},[165,1813,670],{"class":171},[165,1815,980],{"class":212},[165,1817,1818],{"class":175},"'\u002Fslow'",[165,1820,1821],{"class":212},", { timeoutMs: ",[165,1823,1824],{"class":266},"3_000",[165,1826,1619],{"class":212},[165,1828,1829],{"class":167,"line":216},[165,1830,408],{"emptyLinePlaceholder":407},[165,1832,1833],{"class":167,"line":228},[165,1834,1835],{"class":195},"\u002F\u002F External AbortSignal — combined with the internal timeout signal via AbortSignal.any.\n",[165,1837,1838,1840,1843,1845,1847,1850],{"class":167,"line":234},[165,1839,516],{"class":202},[165,1841,1842],{"class":266}," ctrl",[165,1844,421],{"class":202},[165,1846,1649],{"class":202},[165,1848,1849],{"class":171}," AbortController",[165,1851,663],{"class":212},[165,1853,1854,1856,1859,1861,1863,1865,1868],{"class":167,"line":246},[165,1855,516],{"class":202},[165,1857,1858],{"class":266}," promise",[165,1860,421],{"class":202},[165,1862,670],{"class":171},[165,1864,980],{"class":212},[165,1866,1867],{"class":175},"'\u002Fstream'",[165,1869,1870],{"class":212},", { signal: ctrl.signal });\n",[165,1872,1873,1876,1879],{"class":167,"line":260},[165,1874,1875],{"class":212},"ctrl.",[165,1877,1878],{"class":171},"abort",[165,1880,663],{"class":212},[151,1882,1884],{"id":1883},"retry-and-backoff","Retry and backoff",[15,1886,1887,1888,1890],{},"Per-client defaults from ",[19,1889,816],{}," can be overridden per call.",[156,1892,1894],{"className":186,"code":1893,"language":188,"meta":161,"style":161},"await api('\u002Fflaky', {\n  retry: { attempts: 3, delayMs: 500, backoff: 2, statusCodes: [503] },\n});\n\n\u002F\u002F Disable retries for this call specifically.\nawait api('\u002Fcritical', { retry: { attempts: 0 } });\n",[19,1895,1896,1909,1934,1938,1942,1947],{"__ignoreMap":161},[165,1897,1898,1900,1902,1904,1907],{"class":167,"line":168},[165,1899,570],{"class":202},[165,1901,670],{"class":171},[165,1903,980],{"class":212},[165,1905,1906],{"class":175},"'\u002Fflaky'",[165,1908,1413],{"class":212},[165,1910,1911,1914,1917,1919,1921,1923,1925,1928,1931],{"class":167,"line":199},[165,1912,1913],{"class":212},"  retry: { attempts: ",[165,1915,1916],{"class":266},"3",[165,1918,295],{"class":212},[165,1920,298],{"class":266},[165,1922,301],{"class":212},[165,1924,292],{"class":266},[165,1926,1927],{"class":212},", statusCodes: [",[165,1929,1930],{"class":266},"503",[165,1932,1933],{"class":212},"] },\n",[165,1935,1936],{"class":167,"line":216},[165,1937,351],{"class":212},[165,1939,1940],{"class":167,"line":228},[165,1941,408],{"emptyLinePlaceholder":407},[165,1943,1944],{"class":167,"line":234},[165,1945,1946],{"class":195},"\u002F\u002F Disable retries for this call specifically.\n",[165,1948,1949,1951,1953,1955,1958,1961,1963],{"class":167,"line":246},[165,1950,570],{"class":202},[165,1952,670],{"class":171},[165,1954,980],{"class":212},[165,1956,1957],{"class":175},"'\u002Fcritical'",[165,1959,1960],{"class":212},", { retry: { attempts: ",[165,1962,1673],{"class":266},[165,1964,1579],{"class":212},[15,1966,1967,1968,1971,1972,1975,1976,54],{},"Delay for attempt ",[19,1969,1970],{},"n"," (0-indexed) is ",[19,1973,1974],{},"delayMs * backoff^n",". Default retryable status codes: ",[19,1977,1978],{},"[408, 429, 500, 502, 503, 504]",[151,1980,1982],{"id":1981},"upload-download-progress","Upload \u002F download progress",[15,1984,1985,1986,1988,1989,1992,1993,1996,1997,2000,2001,2004,2005,365,2008,2011,2012,2014],{},"Pass ",[19,1987,106],{}," to observe both phases. The callback receives ",[19,1990,1991],{},"{ phase, loaded, total, ratio }",". ",[19,1994,1995],{},"phase"," is ",[19,1998,1999],{},"'upload'"," while the body is being sent and ",[19,2002,2003],{},"'download'"," while the response is being received. ",[19,2006,2007],{},"total",[19,2009,2010],{},"ratio"," are ",[19,2013,1372],{}," when the length isn't known.",[156,2016,2018],{"className":442,"code":2017,"language":444,"meta":161,"style":161},"\u003Cscript setup lang=\"ts\">\nconst uploaded = ref(0);\nconst uploadRatio = ref(0);\n\nawait useApi()('\u002Fuploads', {\n  method: 'POST',\n  body: form,\n  retry: { attempts: 0 },\n  timeoutMs: 60_000,\n  onRequestProgress: ({ phase, loaded, ratio }) => {\n    if (phase === 'upload') {\n      uploaded.value = loaded;\n      if (ratio !== null) uploadRatio.value = ratio;\n    }\n  },\n});\n\u003C\u002Fscript>\n",[19,2019,2020,2036,2054,2071,2075,2088,2096,2101,2109,2119,2145,2162,2172,2194,2199,2203,2207],{"__ignoreMap":161},[165,2021,2022,2024,2026,2028,2030,2032,2034],{"class":167,"line":168},[165,2023,451],{"class":212},[165,2025,455],{"class":454},[165,2027,458],{"class":171},[165,2029,461],{"class":171},[165,2031,464],{"class":212},[165,2033,467],{"class":175},[165,2035,470],{"class":212},[165,2037,2038,2040,2043,2045,2048,2050,2052],{"class":167,"line":199},[165,2039,516],{"class":202},[165,2041,2042],{"class":266}," uploaded",[165,2044,421],{"class":202},[165,2046,2047],{"class":171}," ref",[165,2049,980],{"class":212},[165,2051,1673],{"class":266},[165,2053,541],{"class":212},[165,2055,2056,2058,2061,2063,2065,2067,2069],{"class":167,"line":216},[165,2057,516],{"class":202},[165,2059,2060],{"class":266}," uploadRatio",[165,2062,421],{"class":202},[165,2064,2047],{"class":171},[165,2066,980],{"class":212},[165,2068,1673],{"class":266},[165,2070,541],{"class":212},[165,2072,2073],{"class":167,"line":228},[165,2074,408],{"emptyLinePlaceholder":407},[165,2076,2077,2079,2081,2084,2086],{"class":167,"line":234},[165,2078,570],{"class":202},[165,2080,418],{"class":171},[165,2082,2083],{"class":212},"()(",[165,2085,1718],{"class":175},[165,2087,1413],{"class":212},[165,2089,2090,2092,2094],{"class":167,"line":246},[165,2091,1510],{"class":212},[165,2093,1513],{"class":175},[165,2095,243],{"class":212},[165,2097,2098],{"class":167,"line":260},[165,2099,2100],{"class":212},"  body: form,\n",[165,2102,2103,2105,2107],{"class":167,"line":272},[165,2104,1913],{"class":212},[165,2106,1673],{"class":266},[165,2108,306],{"class":212},[165,2110,2111,2114,2117],{"class":167,"line":286},[165,2112,2113],{"class":212},"  timeoutMs: ",[165,2115,2116],{"class":266},"60_000",[165,2118,243],{"class":212},[165,2120,2121,2124,2127,2129,2131,2134,2136,2138,2141,2143],{"class":167,"line":309},[165,2122,2123],{"class":171},"  onRequestProgress",[165,2125,2126],{"class":212},": ({ ",[165,2128,1995],{"class":486},[165,2130,47],{"class":212},[165,2132,2133],{"class":486},"loaded",[165,2135,47],{"class":212},[165,2137,2010],{"class":486},[165,2139,2140],{"class":212}," }) ",[165,2142,1336],{"class":202},[165,2144,481],{"class":212},[165,2146,2147,2150,2153,2156,2159],{"class":167,"line":320},[165,2148,2149],{"class":202},"    if",[165,2151,2152],{"class":212}," (phase ",[165,2154,2155],{"class":202},"===",[165,2157,2158],{"class":175}," 'upload'",[165,2160,2161],{"class":212},") {\n",[165,2163,2164,2167,2169],{"class":167,"line":331},[165,2165,2166],{"class":212},"      uploaded.value ",[165,2168,464],{"class":202},[165,2170,2171],{"class":212}," loaded;\n",[165,2173,2174,2177,2180,2183,2186,2189,2191],{"class":167,"line":342},[165,2175,2176],{"class":202},"      if",[165,2178,2179],{"class":212}," (ratio ",[165,2181,2182],{"class":202},"!==",[165,2184,2185],{"class":266}," null",[165,2187,2188],{"class":212},") uploadRatio.value ",[165,2190,464],{"class":202},[165,2192,2193],{"class":212}," ratio;\n",[165,2195,2196],{"class":167,"line":348},[165,2197,2198],{"class":212},"    }\n",[165,2200,2201],{"class":167,"line":735},[165,2202,345],{"class":212},[165,2204,2205],{"class":167,"line":740},[165,2206,351],{"class":212},[165,2208,2209,2211,2213],{"class":167,"line":750},[165,2210,546],{"class":212},[165,2212,455],{"class":454},[165,2214,470],{"class":212},[2216,2217],"demo-api-progress",{},[2219,2220,2222],"alert",{"type":2221},"info",[15,2223,2224,2225,2227,2228,2230,2231,2233,2234,2236,2237,54],{},"When ",[19,2226,106],{}," is set, the client swaps transport to ",[19,2229,110],{}," (the only way to observe upload progress in a browser). Interceptors, retry, timeout, ",[19,2232,92],{},", and ",[19,2235,118],{}," still work identically. The fast path (no progress callback) stays on native ",[19,2238,21],{},[151,2240,2242],{"id":2241},"error-handling","Error handling",[15,2244,2245,2246,2248,2249,2252],{},"Every failure throws an ",[19,2247,118],{},". It's the same class for HTTP errors and network errors (",[19,2250,2251],{},"status === 0"," means the request never reached a response).",[15,2254,2255,2256,2259],{},"The class implements the generic ",[19,2257,2258],{},"IError\u003CTErrors, TOtherKeys>"," interface — a framework-agnostic contract you can use to type your own error shapes or narrow the known field names:",[156,2261,2263],{"className":186,"code":2262,"language":188,"meta":161,"style":161},"import type { IError } from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n\ntype LoginError = IError\u003C'email' | 'password', 'hint'>;\n\u002F\u002F -> { message: string; details: { errors: { email: string; password: string } } & { hint?: string | Record\u003Cstring, string> } }\n",[19,2264,2265,2280,2284,2316],{"__ignoreMap":161},[165,2266,2267,2269,2271,2274,2276,2278],{"class":167,"line":168},[165,2268,387],{"class":202},[165,2270,390],{"class":202},[165,2272,2273],{"class":212}," { IError } ",[165,2275,396],{"class":202},[165,2277,399],{"class":175},[165,2279,402],{"class":212},[165,2281,2282],{"class":167,"line":199},[165,2283,408],{"emptyLinePlaceholder":407},[165,2285,2286,2289,2292,2294,2297,2299,2302,2305,2308,2310,2313],{"class":167,"line":216},[165,2287,2288],{"class":202},"type",[165,2290,2291],{"class":171}," LoginError",[165,2293,421],{"class":202},[165,2295,2296],{"class":171}," IError",[165,2298,451],{"class":212},[165,2300,2301],{"class":175},"'email'",[165,2303,2304],{"class":202}," |",[165,2306,2307],{"class":175}," 'password'",[165,2309,47],{"class":212},[165,2311,2312],{"class":175},"'hint'",[165,2314,2315],{"class":212},">;\n",[165,2317,2318],{"class":167,"line":228},[165,2319,2320],{"class":195},"\u002F\u002F -> { message: string; details: { errors: { email: string; password: string } } & { hint?: string | Record\u003Cstring, string> } }\n",[15,2322,2323,2324,2326,2327,2329,2330,2333,2334,2337,2338,2341,2342,2345],{},"Discriminate caught errors with ",[19,2325,136],{}," (or the equivalent static ",[19,2328,139],{},"). Prefer it over ",[19,2331,2332],{},"instanceof ApiError",": ",[19,2335,2336],{},"instanceof"," is unreliable when the package ends up duplicated in a bundle, across realms (iframes, workers), or after downleveling — ",[19,2339,2340],{},"isApiError"," uses a ",[19,2343,2344],{},"Symbol.for(...)"," brand that survives all three.",[156,2347,2349],{"className":186,"code":2348,"language":188,"meta":161,"style":161},"import { isApiError } from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n\ntry {\n  await api('\u002Fusers', { method: 'POST', body: { email: 'bad' } });\n} catch (e) {\n  if (isApiError(e)) {\n    console.log(e.status); \u002F\u002F 422\n    console.log(e.message); \u002F\u002F 'Validation failed'\n    console.log(e.details.errors); \u002F\u002F { email: 'Required' }\n    console.log(e.payload); \u002F\u002F raw server payload\n    console.log(e.response); \u002F\u002F the Response object, if any\n  }\n}\n",[19,2350,2351,2364,2368,2375,2399,2410,2422,2436,2448,2460,2472,2484,2489],{"__ignoreMap":161},[165,2352,2353,2355,2358,2360,2362],{"class":167,"line":168},[165,2354,387],{"class":202},[165,2356,2357],{"class":212}," { isApiError } ",[165,2359,396],{"class":202},[165,2361,399],{"class":175},[165,2363,402],{"class":212},[165,2365,2366],{"class":167,"line":199},[165,2367,408],{"emptyLinePlaceholder":407},[165,2369,2370,2373],{"class":167,"line":216},[165,2371,2372],{"class":202},"try",[165,2374,481],{"class":212},[165,2376,2377,2380,2382,2384,2387,2389,2391,2394,2397],{"class":167,"line":228},[165,2378,2379],{"class":202},"  await",[165,2381,670],{"class":171},[165,2383,980],{"class":212},[165,2385,2386],{"class":175},"'\u002Fusers'",[165,2388,1567],{"class":212},[165,2390,1513],{"class":175},[165,2392,2393],{"class":212},", body: { email: ",[165,2395,2396],{"class":175},"'bad'",[165,2398,1579],{"class":212},[165,2400,2401,2404,2407],{"class":167,"line":234},[165,2402,2403],{"class":212},"} ",[165,2405,2406],{"class":202},"catch",[165,2408,2409],{"class":212}," (e) {\n",[165,2411,2412,2415,2417,2419],{"class":167,"line":246},[165,2413,2414],{"class":202},"  if",[165,2416,1200],{"class":212},[165,2418,2340],{"class":171},[165,2420,2421],{"class":212},"(e)) {\n",[165,2423,2424,2427,2430,2433],{"class":167,"line":260},[165,2425,2426],{"class":212},"    console.",[165,2428,2429],{"class":171},"log",[165,2431,2432],{"class":212},"(e.status); ",[165,2434,2435],{"class":195},"\u002F\u002F 422\n",[165,2437,2438,2440,2442,2445],{"class":167,"line":272},[165,2439,2426],{"class":212},[165,2441,2429],{"class":171},[165,2443,2444],{"class":212},"(e.message); ",[165,2446,2447],{"class":195},"\u002F\u002F 'Validation failed'\n",[165,2449,2450,2452,2454,2457],{"class":167,"line":286},[165,2451,2426],{"class":212},[165,2453,2429],{"class":171},[165,2455,2456],{"class":212},"(e.details.errors); ",[165,2458,2459],{"class":195},"\u002F\u002F { email: 'Required' }\n",[165,2461,2462,2464,2466,2469],{"class":167,"line":309},[165,2463,2426],{"class":212},[165,2465,2429],{"class":171},[165,2467,2468],{"class":212},"(e.payload); ",[165,2470,2471],{"class":195},"\u002F\u002F raw server payload\n",[165,2473,2474,2476,2478,2481],{"class":167,"line":320},[165,2475,2426],{"class":212},[165,2477,2429],{"class":171},[165,2479,2480],{"class":212},"(e.response); ",[165,2482,2483],{"class":195},"\u002F\u002F the Response object, if any\n",[165,2485,2486],{"class":167,"line":331},[165,2487,2488],{"class":212},"  }\n",[165,2490,2491],{"class":167,"line":342},[165,2492,511],{"class":212},[151,2494,2496],{"id":2495},"interceptors","Interceptors",[15,2498,2499],{},"There are three kinds: request, response, and error. Register them via module options (file paths with a default export) or at runtime on the client.",[2501,2502,2504],"h3",{"id":2503},"authentication-header","Authentication header",[156,2506,2508],{"className":186,"code":2507,"language":188,"meta":161,"style":161},"\u002F\u002F ~\u002Fapi\u002Fon-request.ts\nimport type { RequestInterceptor } from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n\nconst onRequest: RequestInterceptor = (ctx) => {\n  const token = useCookie('token').value;\n  if (token) ctx.headers.Authorization = `Bearer ${token}`;\n};\nexport default onRequest;\n",[19,2509,2510,2515,2530,2534,2559,2580,2599,2604],{"__ignoreMap":161},[165,2511,2512],{"class":167,"line":168},[165,2513,2514],{"class":195},"\u002F\u002F ~\u002Fapi\u002Fon-request.ts\n",[165,2516,2517,2519,2521,2524,2526,2528],{"class":167,"line":199},[165,2518,387],{"class":202},[165,2520,390],{"class":202},[165,2522,2523],{"class":212}," { RequestInterceptor } ",[165,2525,396],{"class":202},[165,2527,399],{"class":175},[165,2529,402],{"class":212},[165,2531,2532],{"class":167,"line":216},[165,2533,408],{"emptyLinePlaceholder":407},[165,2535,2536,2538,2541,2543,2546,2548,2550,2553,2555,2557],{"class":167,"line":228},[165,2537,516],{"class":202},[165,2539,2540],{"class":171}," onRequest",[165,2542,427],{"class":202},[165,2544,2545],{"class":171}," RequestInterceptor",[165,2547,421],{"class":202},[165,2549,1200],{"class":212},[165,2551,2552],{"class":486},"ctx",[165,2554,1218],{"class":212},[165,2556,1336],{"class":202},[165,2558,481],{"class":212},[165,2560,2561,2564,2567,2569,2572,2574,2577],{"class":167,"line":234},[165,2562,2563],{"class":202},"  const",[165,2565,2566],{"class":266}," token",[165,2568,421],{"class":202},[165,2570,2571],{"class":171}," useCookie",[165,2573,980],{"class":212},[165,2575,2576],{"class":175},"'token'",[165,2578,2579],{"class":212},").value;\n",[165,2581,2582,2584,2587,2589,2592,2595,2597],{"class":167,"line":246},[165,2583,2414],{"class":202},[165,2585,2586],{"class":212}," (token) ctx.headers.Authorization ",[165,2588,464],{"class":202},[165,2590,2591],{"class":175}," `Bearer ${",[165,2593,2594],{"class":212},"token",[165,2596,722],{"class":175},[165,2598,402],{"class":212},[165,2600,2601],{"class":167,"line":260},[165,2602,2603],{"class":212},"};\n",[165,2605,2606,2608,2610],{"class":167,"line":272},[165,2607,203],{"class":202},[165,2609,206],{"class":202},[165,2611,2612],{"class":212}," onRequest;\n",[2501,2614,2616],{"id":2615},"error-redirect","Error redirect",[156,2618,2620],{"className":186,"code":2619,"language":188,"meta":161,"style":161},"\u002F\u002F ~\u002Fapi\u002Fon-error.ts\nimport type { ErrorInterceptor } from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n\nconst onError: ErrorInterceptor = (err, ctx) => {\n  if (err.status === 401) return navigateTo('\u002Flogin');\n  if (ctx.meta.silent) return;\n  useToast().error(err.message);\n};\nexport default onError;\n",[19,2621,2622,2627,2642,2646,2675,2702,2713,2726,2730],{"__ignoreMap":161},[165,2623,2624],{"class":167,"line":168},[165,2625,2626],{"class":195},"\u002F\u002F ~\u002Fapi\u002Fon-error.ts\n",[165,2628,2629,2631,2633,2636,2638,2640],{"class":167,"line":199},[165,2630,387],{"class":202},[165,2632,390],{"class":202},[165,2634,2635],{"class":212}," { ErrorInterceptor } ",[165,2637,396],{"class":202},[165,2639,399],{"class":175},[165,2641,402],{"class":212},[165,2643,2644],{"class":167,"line":216},[165,2645,408],{"emptyLinePlaceholder":407},[165,2647,2648,2650,2653,2655,2658,2660,2662,2665,2667,2669,2671,2673],{"class":167,"line":228},[165,2649,516],{"class":202},[165,2651,2652],{"class":171}," onError",[165,2654,427],{"class":202},[165,2656,2657],{"class":171}," ErrorInterceptor",[165,2659,421],{"class":202},[165,2661,1200],{"class":212},[165,2663,2664],{"class":486},"err",[165,2666,47],{"class":212},[165,2668,2552],{"class":486},[165,2670,1218],{"class":212},[165,2672,1336],{"class":202},[165,2674,481],{"class":212},[165,2676,2677,2679,2682,2684,2687,2689,2692,2695,2697,2700],{"class":167,"line":234},[165,2678,2414],{"class":202},[165,2680,2681],{"class":212}," (err.status ",[165,2683,2155],{"class":202},[165,2685,2686],{"class":266}," 401",[165,2688,1218],{"class":212},[165,2690,2691],{"class":202},"return",[165,2693,2694],{"class":171}," navigateTo",[165,2696,980],{"class":212},[165,2698,2699],{"class":175},"'\u002Flogin'",[165,2701,541],{"class":212},[165,2703,2704,2706,2709,2711],{"class":167,"line":246},[165,2705,2414],{"class":202},[165,2707,2708],{"class":212}," (ctx.meta.silent) ",[165,2710,2691],{"class":202},[165,2712,402],{"class":212},[165,2714,2715,2718,2721,2723],{"class":167,"line":260},[165,2716,2717],{"class":171},"  useToast",[165,2719,2720],{"class":212},"().",[165,2722,843],{"class":171},[165,2724,2725],{"class":212},"(err.message);\n",[165,2727,2728],{"class":167,"line":272},[165,2729,2603],{"class":212},[165,2731,2732,2734,2736],{"class":167,"line":286},[165,2733,203],{"class":202},[165,2735,206],{"class":202},[165,2737,2738],{"class":212}," onError;\n",[2501,2740,2742],{"id":2741},"runtime-registration","Runtime registration",[15,2744,2745,2746,1373,2749,1373,2752,2755],{},"Useful when the interceptor depends on a composable (i18n, toast, router) that isn't available at module-setup time. ",[19,2747,2748],{},"useRequest",[19,2750,2751],{},"useResponse",[19,2753,2754],{},"useError"," each return an unregister function.",[156,2757,2759],{"className":186,"code":2758,"language":188,"meta":161,"style":161},"export default defineNuxtPlugin(() => {\n  const { $apiProvider } = useNuxtApp();\n  const { locale } = useI18n();\n\n  const unregister = $apiProvider.useRequest((ctx) => {\n    ctx.headers['X-Locale'] = locale.value;\n  });\n});\n",[19,2760,2761,2777,2793,2811,2815,2840,2856,2861],{"__ignoreMap":161},[165,2762,2763,2765,2767,2770,2773,2775],{"class":167,"line":168},[165,2764,203],{"class":202},[165,2766,206],{"class":202},[165,2768,2769],{"class":171}," defineNuxtPlugin",[165,2771,2772],{"class":212},"(() ",[165,2774,1336],{"class":202},[165,2776,481],{"class":212},[165,2778,2779,2781,2783,2785,2787,2789,2791],{"class":167,"line":199},[165,2780,2563],{"class":202},[165,2782,928],{"class":212},[165,2784,360],{"class":266},[165,2786,933],{"class":212},[165,2788,464],{"class":202},[165,2790,436],{"class":171},[165,2792,663],{"class":212},[165,2794,2795,2797,2799,2802,2804,2806,2809],{"class":167,"line":216},[165,2796,2563],{"class":202},[165,2798,928],{"class":212},[165,2800,2801],{"class":266},"locale",[165,2803,933],{"class":212},[165,2805,464],{"class":202},[165,2807,2808],{"class":171}," useI18n",[165,2810,663],{"class":212},[165,2812,2813],{"class":167,"line":228},[165,2814,408],{"emptyLinePlaceholder":407},[165,2816,2817,2819,2822,2824,2827,2829,2832,2834,2836,2838],{"class":167,"line":234},[165,2818,2563],{"class":202},[165,2820,2821],{"class":266}," unregister",[165,2823,421],{"class":202},[165,2825,2826],{"class":212}," $apiProvider.",[165,2828,2748],{"class":171},[165,2830,2831],{"class":212},"((",[165,2833,2552],{"class":486},[165,2835,1218],{"class":212},[165,2837,1336],{"class":202},[165,2839,481],{"class":212},[165,2841,2842,2845,2848,2851,2853],{"class":167,"line":246},[165,2843,2844],{"class":212},"    ctx.headers[",[165,2846,2847],{"class":175},"'X-Locale'",[165,2849,2850],{"class":212},"] ",[165,2852,464],{"class":202},[165,2854,2855],{"class":212}," locale.value;\n",[165,2857,2858],{"class":167,"line":260},[165,2859,2860],{"class":212},"  });\n",[165,2862,2863],{"class":167,"line":272},[165,2864,351],{"class":212},[151,2866,145],{"id":2867},"framework-agnostic-core",[15,2869,2870],{},"Everything the Nuxt plugin wraps is available as a plain factory. Works in Node, Bun, Deno, a CLI, or a test.",[156,2872,2874],{"className":186,"code":2873,"language":188,"meta":161,"style":161},"import { createApiClient, isApiError } from '@alikhalilll\u002Fnuxt-api-provider\u002Fcore';\n\nconst client = createApiClient({\n  baseURL: 'https:\u002F\u002Fapi.github.com',\n  headers: { Accept: 'application\u002Fvnd.github+json' },\n  retry: { attempts: 2 },\n});\n\nclient.useRequest((ctx) => {\n  ctx.headers['User-Agent'] = 'my-cli\u002F1.0';\n  if (process.env.GITHUB_TOKEN) {\n    ctx.headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;\n  }\n});\n\nconst repo = await client\u003C{ stargazers_count: number }>('\u002Frepos\u002Fnuxt\u002Fnuxt');\n",[19,2875,2876,2890,2894,2908,2918,2928,2936,2940,2944,2961,2978,2990,3015,3019,3023,3027],{"__ignoreMap":161},[165,2877,2878,2880,2883,2885,2888],{"class":167,"line":168},[165,2879,387],{"class":202},[165,2881,2882],{"class":212}," { createApiClient, isApiError } ",[165,2884,396],{"class":202},[165,2886,2887],{"class":175}," '@alikhalilll\u002Fnuxt-api-provider\u002Fcore'",[165,2889,402],{"class":212},[165,2891,2892],{"class":167,"line":199},[165,2893,408],{"emptyLinePlaceholder":407},[165,2895,2896,2898,2901,2903,2906],{"class":167,"line":216},[165,2897,516],{"class":202},[165,2899,2900],{"class":266}," client",[165,2902,421],{"class":202},[165,2904,2905],{"class":171}," createApiClient",[165,2907,213],{"class":212},[165,2909,2910,2913,2916],{"class":167,"line":228},[165,2911,2912],{"class":212},"  baseURL: ",[165,2914,2915],{"class":175},"'https:\u002F\u002Fapi.github.com'",[165,2917,243],{"class":212},[165,2919,2920,2923,2926],{"class":167,"line":234},[165,2921,2922],{"class":212},"  headers: { Accept: ",[165,2924,2925],{"class":175},"'application\u002Fvnd.github+json'",[165,2927,306],{"class":212},[165,2929,2930,2932,2934],{"class":167,"line":246},[165,2931,1913],{"class":212},[165,2933,292],{"class":266},[165,2935,306],{"class":212},[165,2937,2938],{"class":167,"line":260},[165,2939,351],{"class":212},[165,2941,2942],{"class":167,"line":272},[165,2943,408],{"emptyLinePlaceholder":407},[165,2945,2946,2949,2951,2953,2955,2957,2959],{"class":167,"line":286},[165,2947,2948],{"class":212},"client.",[165,2950,2748],{"class":171},[165,2952,2831],{"class":212},[165,2954,2552],{"class":486},[165,2956,1218],{"class":212},[165,2958,1336],{"class":202},[165,2960,481],{"class":212},[165,2962,2963,2966,2969,2971,2973,2976],{"class":167,"line":309},[165,2964,2965],{"class":212},"  ctx.headers[",[165,2967,2968],{"class":175},"'User-Agent'",[165,2970,2850],{"class":212},[165,2972,464],{"class":202},[165,2974,2975],{"class":175}," 'my-cli\u002F1.0'",[165,2977,402],{"class":212},[165,2979,2980,2982,2985,2988],{"class":167,"line":320},[165,2981,2414],{"class":202},[165,2983,2984],{"class":212}," (process.env.",[165,2986,2987],{"class":266},"GITHUB_TOKEN",[165,2989,2161],{"class":212},[165,2991,2992,2995,2997,2999,3002,3004,3007,3009,3011,3013],{"class":167,"line":331},[165,2993,2994],{"class":212},"    ctx.headers.Authorization ",[165,2996,464],{"class":202},[165,2998,2591],{"class":175},[165,3000,3001],{"class":212},"process",[165,3003,54],{"class":175},[165,3005,3006],{"class":212},"env",[165,3008,54],{"class":175},[165,3010,2987],{"class":266},[165,3012,722],{"class":175},[165,3014,402],{"class":212},[165,3016,3017],{"class":167,"line":342},[165,3018,2488],{"class":212},[165,3020,3021],{"class":167,"line":348},[165,3022,351],{"class":212},[165,3024,3025],{"class":167,"line":735},[165,3026,408],{"emptyLinePlaceholder":407},[165,3028,3029,3031,3034,3036,3038,3040,3042,3045,3047,3049,3051,3054],{"class":167,"line":740},[165,3030,516],{"class":202},[165,3032,3033],{"class":266}," repo",[165,3035,421],{"class":202},[165,3037,524],{"class":202},[165,3039,2900],{"class":171},[165,3041,1228],{"class":212},[165,3043,3044],{"class":486},"stargazers_count",[165,3046,427],{"class":202},[165,3048,492],{"class":266},[165,3050,1247],{"class":212},[165,3052,3053],{"class":175},"'\u002Frepos\u002Fnuxt\u002Fnuxt'",[165,3055,541],{"class":212},[151,3057,3059],{"id":3058},"module-options","Module options",[3061,3062,3063,3082],"table",{},[3064,3065,3066],"thead",{},[3067,3068,3069,3073,3076,3079],"tr",{},[3070,3071,3072],"th",{},"Option",[3070,3074,3075],{},"Type",[3070,3077,3078],{},"Default",[3070,3080,3081],{},"Purpose",[3083,3084,3085,3104,3130,3150,3173,3193,3213,3231],"tbody",{},[3067,3086,3087,3093,3097,3101],{},[3088,3089,3090],"td",{},[19,3091,3092],{},"baseURL",[3088,3094,3095],{},[19,3096,82],{},[3088,3098,3099],{},[19,3100,1446],{},[3088,3102,3103],{},"Prepended to every relative endpoint.",[3067,3105,3106,3111,3115,3119],{},[3088,3107,3108],{},[19,3109,3110],{},"provideName",[3088,3112,3113],{},[19,3114,82],{},[3088,3116,3117],{},[19,3118,252],{},[3088,3120,3121,3122,3125,3126,3129],{},"Injected under ",[19,3123,3124],{},"$\u003Cname>",". Leading ",[19,3127,3128],{},"$"," is stripped.",[3067,3131,3132,3137,3142,3147],{},[3088,3133,3134],{},[19,3135,3136],{},"defaultTimeoutMs",[3088,3138,3139],{},[19,3140,3141],{},"number",[3088,3143,3144],{},[19,3145,3146],{},"20000",[3088,3148,3149],{},"Client-wide request timeout.",[3067,3151,3152,3157,3162,3166],{},[3088,3153,3154],{},[19,3155,3156],{},"server",[3088,3158,3159],{},[19,3160,3161],{},"boolean",[3088,3163,3164],{},[19,3165,278],{},[3088,3167,3168,3169,3172],{},"Register the plugin on the server. Set ",[19,3170,3171],{},"false"," for client-only.",[3067,3174,3175,3180,3185,3190],{},[3088,3176,3177],{},[19,3178,3179],{},"retry",[3088,3181,3182],{},[19,3183,3184],{},"Partial\u003CRetryOptions>",[3088,3186,3187],{},[19,3188,3189],{},"{}",[3088,3191,3192],{},"Default retry policy, overridable per call.",[3067,3194,3195,3200,3204,3207],{},[3088,3196,3197],{},[19,3198,3199],{},"onRequestPath",[3088,3201,3202],{},[19,3203,82],{},[3088,3205,3206],{},"—",[3088,3208,3209,3210,54],{},"Path to a module with a default-exported ",[19,3211,3212],{},"RequestInterceptor",[3067,3214,3215,3220,3224,3226],{},[3088,3216,3217],{},[19,3218,3219],{},"onSuccessPath",[3088,3221,3222],{},[19,3223,82],{},[3088,3225,3206],{},[3088,3227,3209,3228,54],{},[19,3229,3230],{},"ResponseInterceptor",[3067,3232,3233,3238,3242,3244],{},[3088,3234,3235],{},[19,3236,3237],{},"onErrorPath",[3088,3239,3240],{},[19,3241,82],{},[3088,3243,3206],{},[3088,3245,3209,3246,54],{},[19,3247,3248],{},"ErrorInterceptor",[151,3250,3252],{"id":3251},"exported-types","Exported types",[156,3254,3256],{"className":186,"code":3255,"language":188,"meta":161,"style":161},"import type {\n  ApiProviderClient,\n  ApiProviderModuleOptions,\n  ApiClientConfig,\n  RequestOptions,\n  RequestContext,\n  ResponseContext,\n  RequestInterceptor,\n  ResponseInterceptor,\n  ErrorInterceptor,\n  RetryOptions,\n  RequestProgress,\n  ProgressPhase,\n  ApiError,\n  ApiErrorDetails,\n  IError,\n  isApiError,\n} from '@alikhalilll\u002Fnuxt-api-provider\u002Ftypes';\n",[19,3257,3258,3266,3271,3276,3281,3286,3291,3296,3301,3306,3311,3316,3321,3326,3331,3336,3341,3346],{"__ignoreMap":161},[165,3259,3260,3262,3264],{"class":167,"line":168},[165,3261,387],{"class":202},[165,3263,390],{"class":202},[165,3265,481],{"class":212},[165,3267,3268],{"class":167,"line":199},[165,3269,3270],{"class":212},"  ApiProviderClient,\n",[165,3272,3273],{"class":167,"line":216},[165,3274,3275],{"class":212},"  ApiProviderModuleOptions,\n",[165,3277,3278],{"class":167,"line":228},[165,3279,3280],{"class":212},"  ApiClientConfig,\n",[165,3282,3283],{"class":167,"line":234},[165,3284,3285],{"class":212},"  RequestOptions,\n",[165,3287,3288],{"class":167,"line":246},[165,3289,3290],{"class":212},"  RequestContext,\n",[165,3292,3293],{"class":167,"line":260},[165,3294,3295],{"class":212},"  ResponseContext,\n",[165,3297,3298],{"class":167,"line":272},[165,3299,3300],{"class":212},"  RequestInterceptor,\n",[165,3302,3303],{"class":167,"line":286},[165,3304,3305],{"class":212},"  ResponseInterceptor,\n",[165,3307,3308],{"class":167,"line":309},[165,3309,3310],{"class":212},"  ErrorInterceptor,\n",[165,3312,3313],{"class":167,"line":320},[165,3314,3315],{"class":212},"  RetryOptions,\n",[165,3317,3318],{"class":167,"line":331},[165,3319,3320],{"class":212},"  RequestProgress,\n",[165,3322,3323],{"class":167,"line":342},[165,3324,3325],{"class":212},"  ProgressPhase,\n",[165,3327,3328],{"class":167,"line":348},[165,3329,3330],{"class":212},"  ApiError,\n",[165,3332,3333],{"class":167,"line":735},[165,3334,3335],{"class":212},"  ApiErrorDetails,\n",[165,3337,3338],{"class":167,"line":740},[165,3339,3340],{"class":212},"  IError,\n",[165,3342,3343],{"class":167,"line":750},[165,3344,3345],{"class":212},"  isApiError,\n",[165,3347,3348,3350,3352,3354],{"class":167,"line":761},[165,3349,2403],{"class":212},[165,3351,396],{"class":202},[165,3353,399],{"class":175},[165,3355,402],{"class":212},[3357,3358,3359],"style",{},"html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sOPea, html code.shiki .sOPea{--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sxg3X, html code.shiki .sxg3X{--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .s-3mD, html code.shiki .s-3mD{--shiki-default:#FFAB70;--shiki-dark:#FFAB70}",{"title":161,"searchDepth":199,"depth":199,"links":3361},[3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3381,3382,3383],{"id":153,"depth":199,"text":154},{"id":182,"depth":199,"text":183},{"id":354,"depth":199,"text":355},{"id":556,"depth":199,"text":557},{"id":829,"depth":199,"text":832},{"id":1365,"depth":199,"text":1366},{"id":1469,"depth":199,"text":1470},{"id":1544,"depth":199,"text":1545},{"id":1622,"depth":199,"text":1623},{"id":1728,"depth":199,"text":1729},{"id":1796,"depth":199,"text":1797},{"id":1883,"depth":199,"text":1884},{"id":1981,"depth":199,"text":1982},{"id":2241,"depth":199,"text":2242},{"id":2495,"depth":199,"text":2496,"children":3377},[3378,3379,3380],{"id":2503,"depth":216,"text":2504},{"id":2615,"depth":216,"text":2616},{"id":2741,"depth":216,"text":2742},{"id":2867,"depth":199,"text":145},{"id":3058,"depth":199,"text":3059},{"id":3251,"depth":199,"text":3252},"Strongly-typed fetch client for Nuxt 3\u002F4 with interceptors, retry\u002Fbackoff, and upload\u002Fdownload progress.","md",{},"\u002Fapi-provider",{"title":5,"description":3384},"UW3On_IXQVJp5TtX0P-656G2gbyzghX9ZsQVgjC8hw8",1776531510115]