[{"data":1,"prerenderedAt":932},["ShallowReactive",2],{"\u002Farticles\u002Fopen-weather-proxy":3,"\u002Farticles\u002Fopen-weather-proxy-surround":921},{"id":4,"title":5,"author":6,"body":7,"date":907,"description":13,"draft":908,"extension":94,"image":6,"lastmod":907,"meta":909,"minRead":6,"navigation":184,"path":917,"seo":918,"stem":919,"__hash__":920},"articles\u002Farticles\u002Fopen-weather-proxy.md","Nuxt Server-Side Proxy for Open Weather Api",null,{"type":8,"value":9,"toc":897},"minimark",[10,14,19,22,26,36,42,45,64,67,71,85,90,121,125,136,652,655,670,673,677,680,873,876,883,887,893],[11,12,13],"p",{},"A common problem when using open weather api is Cross-Origin Resource Sharing (CORS) issues. This typically happens when you're trying to make an API call from a web application running in a browser, and the browser blocks the request because the API server does not include the necessary CORS headers in its response. The quickest fix is to add a cors header however, as we do not control the api server we can not add a cors header even if we wanted too.",[15,16,18],"h2",{"id":17},"solutions","Solutions",[11,20,21],{},"There are many ways of resolving this issue but below two are the ones I tested and have worked for me.",[15,23,25],{"id":24},"cors-anywhere","CORS Anywhere",[11,27,28,29,35],{},"One service I found that worked for me was ",[30,31,25],"a",{"href":32,"rel":33},"https:\u002F\u002Fgithub.com\u002FRob--W\u002Fcors-anywhere",[34],"nofollow"," which adds CORS headers to the proxied request. To use it, we will need to append the hosted NodeJs server url before the api url.",[37,38,39],"note",{},[11,40,41],{},"Keep in mind that the public instance has a limited number of requests, so it's a good idea to host your own using the CORS Anywhere repository.",[11,43,44],{},"For example:",[46,47,53],"pre",{"className":48,"code":49,"language":50,"meta":51,"style":52},"language-txt shiki shiki-themes material-theme-lighter one-light one-dark-pro","https:\u002F\u002Fcors-anywhere.herokuapp.com\u002Fhttp:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002Fweather?q=london&APPID={apikey}\n\n","txt","icon=lucide:globe label=\"Request URL\"","",[54,55,56],"code",{"__ignoreMap":52},[57,58,61],"span",{"class":59,"line":60},"line",1,[57,62,63],{},"https:\u002F\u002Fcors-anywhere.herokuapp.com\u002Fhttp:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002Fweather?q=london&APPID={apikey}\n",[11,65,66],{},"Personally, for small projects, I prefer not to juggle multiple codebases (maybe I'm just a bit lazy 🤣). With NuxtJs, you can get everything done with less fuss and even add some extra features. I'm sure you can do the same with NextJs and serverless functions.",[15,68,70],{"id":69},"nuxt-server-side-proxy","Nuxt Server-Side Proxy",[11,72,73,74,77,78,81,82],{},"To start create a file in the ",[54,75,76],{},"api"," folder on nuxt server directory. I named it ",[54,79,80],{},"weather.js",". As nuxt has a file based routing the endpoint will be ",[54,83,84],{},"\u002Fapi\u002Fweather",[86,87,89],"h3",{"id":88},"file-structure","File structure",[46,91,95],{"className":92,"code":93,"language":94,"meta":52,"style":52},"language-md shiki shiki-themes material-theme-lighter one-light one-dark-pro","root\n├─ server\n│ ├─ api\n│ │ └─ weather.js\n","md",[54,96,97,103,109,115],{"__ignoreMap":52},[57,98,99],{"class":59,"line":60},[57,100,102],{"class":101},"sM89C","root\n",[57,104,106],{"class":59,"line":105},2,[57,107,108],{"class":101},"├─ server\n",[57,110,112],{"class":59,"line":111},3,[57,113,114],{"class":101},"│ ├─ api\n",[57,116,118],{"class":59,"line":117},4,[57,119,120],{"class":101},"│ │ └─ weather.js\n",[86,122,124],{"id":123},"server-side","Server Side",[11,126,127,128,131,132,135],{},"In the code snippet below, I'm setting up a basic API handler to get weather data using the ",[54,129,130],{},"fetch"," function. If you're more into ",[54,133,134],{},"axios",", feel free to swap it in instead.",[137,138,139],"code-collapse",{},[46,140,145],{"className":141,"code":142,"filename":143,"language":144,"meta":52,"style":52},"language-js shiki shiki-themes material-theme-lighter one-light one-dark-pro","import { getQuery } from 'h3';\n\nexport default defineEventHandler(async (event) => {\n  \u002F\u002F Extract query parameters from the event using getQuery\n  const { query } = getQuery(event);\n\n  \u002F\u002F Access runtime configuration to retrieve the API key for OpenWeatherMap\n  const config = useRuntimeConfig();\n  const apiKey = config.private.openWeatherApiKey;\n\n  \u002F\u002F Construct the API URL for the weather request\n  const apiUrl = `https:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002F${query}&units=metric&appid=${apiKey}`;\n\n  try {\n    const response = await fetch(apiUrl);\n    if (!response.ok) {\n      return {\n        statusCode: response.status,\n        body: { message: response.statusText },\n      };\n    }\n    const data = await response.json();\n    return {\n      status: 200,\n      message: 'Weather fetched successfully',\n      data,\n    };\n  } catch (error) {\n    return {\n      statusCode: 500,\n      body: { message: 'Internal Server Error' },\n    };\n  }\n});\n","server\u002Fapi\u002Fweather.js","js",[54,146,147,180,186,222,228,257,262,268,286,313,318,324,365,370,378,404,429,437,458,483,489,495,518,526,540,557,565,571,589,596,609,632,637,643],{"__ignoreMap":52},[57,148,149,153,157,161,164,167,171,174,177],{"class":59,"line":60},[57,150,152],{"class":151},"sQsOY","import",[57,154,156],{"class":155},"sB4Xn"," {",[57,158,160],{"class":159},"s8dPH"," getQuery",[57,162,163],{"class":155}," }",[57,165,166],{"class":151}," from",[57,168,170],{"class":169},"sVH1b"," '",[57,172,86],{"class":173},"spZWa",[57,175,176],{"class":169},"'",[57,178,179],{"class":155},";\n",[57,181,182],{"class":59,"line":105},[57,183,185],{"emptyLinePlaceholder":184},true,"\n",[57,187,188,191,195,199,202,206,209,213,216,219],{"class":59,"line":111},[57,189,190],{"class":151},"export",[57,192,194],{"class":193},"sH50Z"," default",[57,196,198],{"class":197},"spnjr"," defineEventHandler",[57,200,201],{"class":101},"(",[57,203,205],{"class":204},"sJvVP","async",[57,207,208],{"class":155}," (",[57,210,212],{"class":211},"s5f2p","event",[57,214,215],{"class":155},")",[57,217,218],{"class":204}," =>",[57,220,221],{"class":155}," {\n",[57,223,224],{"class":59,"line":117},[57,225,227],{"class":226},"seacL","  \u002F\u002F Extract query parameters from the event using getQuery\n",[57,229,231,234,236,240,242,246,248,251,253,255],{"class":59,"line":230},5,[57,232,233],{"class":204},"  const",[57,235,156],{"class":155},[57,237,239],{"class":238},"sMm83"," query",[57,241,163],{"class":155},[57,243,245],{"class":244},"syPST"," =",[57,247,160],{"class":197},[57,249,201],{"class":250},"sA0eD",[57,252,212],{"class":159},[57,254,215],{"class":250},[57,256,179],{"class":155},[57,258,260],{"class":59,"line":259},6,[57,261,185],{"emptyLinePlaceholder":184},[57,263,265],{"class":59,"line":264},7,[57,266,267],{"class":226},"  \u002F\u002F Access runtime configuration to retrieve the API key for OpenWeatherMap\n",[57,269,271,273,276,278,281,284],{"class":59,"line":270},8,[57,272,233],{"class":204},[57,274,275],{"class":238}," config",[57,277,245],{"class":244},[57,279,280],{"class":197}," useRuntimeConfig",[57,282,283],{"class":250},"()",[57,285,179],{"class":155},[57,287,289,291,294,296,299,302,306,308,311],{"class":59,"line":288},9,[57,290,233],{"class":204},[57,292,293],{"class":238}," apiKey",[57,295,245],{"class":244},[57,297,275],{"class":298},"scCn_",[57,300,301],{"class":155},".",[57,303,305],{"class":304},"sDC5J","private",[57,307,301],{"class":155},[57,309,310],{"class":159},"openWeatherApiKey",[57,312,179],{"class":155},[57,314,316],{"class":59,"line":315},10,[57,317,185],{"emptyLinePlaceholder":184},[57,319,321],{"class":59,"line":320},11,[57,322,323],{"class":226},"  \u002F\u002F Construct the API URL for the weather request\n",[57,325,327,329,332,334,337,340,344,347,350,353,355,358,360,363],{"class":59,"line":326},12,[57,328,233],{"class":204},[57,330,331],{"class":238}," apiUrl",[57,333,245],{"class":244},[57,335,336],{"class":169}," `",[57,338,339],{"class":173},"https:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002F",[57,341,343],{"class":342},"ssEfx","${",[57,345,346],{"class":159},"query",[57,348,349],{"class":342},"}",[57,351,352],{"class":173},"&units=metric&appid=",[57,354,343],{"class":342},[57,356,357],{"class":159},"apiKey",[57,359,349],{"class":342},[57,361,362],{"class":169},"`",[57,364,179],{"class":155},[57,366,368],{"class":59,"line":367},13,[57,369,185],{"emptyLinePlaceholder":184},[57,371,373,376],{"class":59,"line":372},14,[57,374,375],{"class":151},"  try",[57,377,221],{"class":155},[57,379,381,384,387,389,392,395,397,400,402],{"class":59,"line":380},15,[57,382,383],{"class":204},"    const",[57,385,386],{"class":238}," response",[57,388,245],{"class":244},[57,390,391],{"class":151}," await",[57,393,394],{"class":197}," fetch",[57,396,201],{"class":250},[57,398,399],{"class":159},"apiUrl",[57,401,215],{"class":250},[57,403,179],{"class":155},[57,405,407,410,412,415,418,420,423,426],{"class":59,"line":406},16,[57,408,409],{"class":151},"    if",[57,411,208],{"class":250},[57,413,414],{"class":244},"!",[57,416,417],{"class":298},"response",[57,419,301],{"class":155},[57,421,422],{"class":159},"ok",[57,424,425],{"class":250},") ",[57,427,428],{"class":155},"{\n",[57,430,432,435],{"class":59,"line":431},17,[57,433,434],{"class":151},"      return",[57,436,221],{"class":155},[57,438,440,444,448,450,452,455],{"class":59,"line":439},18,[57,441,443],{"class":442},"su13H","        statusCode",[57,445,447],{"class":446},"saKOp",":",[57,449,386],{"class":298},[57,451,301],{"class":155},[57,453,454],{"class":159},"status",[57,456,457],{"class":155},",\n",[57,459,461,464,466,468,471,473,475,477,480],{"class":59,"line":460},19,[57,462,463],{"class":442},"        body",[57,465,447],{"class":446},[57,467,156],{"class":155},[57,469,470],{"class":442}," message",[57,472,447],{"class":446},[57,474,386],{"class":298},[57,476,301],{"class":155},[57,478,479],{"class":159},"statusText",[57,481,482],{"class":155}," },\n",[57,484,486],{"class":59,"line":485},20,[57,487,488],{"class":155},"      };\n",[57,490,492],{"class":59,"line":491},21,[57,493,494],{"class":155},"    }\n",[57,496,498,500,503,505,507,509,511,514,516],{"class":59,"line":497},22,[57,499,383],{"class":204},[57,501,502],{"class":238}," data",[57,504,245],{"class":244},[57,506,391],{"class":151},[57,508,386],{"class":298},[57,510,301],{"class":155},[57,512,513],{"class":197},"json",[57,515,283],{"class":250},[57,517,179],{"class":155},[57,519,521,524],{"class":59,"line":520},23,[57,522,523],{"class":151},"    return",[57,525,221],{"class":155},[57,527,529,532,534,538],{"class":59,"line":528},24,[57,530,531],{"class":442},"      status",[57,533,447],{"class":446},[57,535,537],{"class":536},"sriKn"," 200",[57,539,457],{"class":155},[57,541,543,546,548,550,553,555],{"class":59,"line":542},25,[57,544,545],{"class":442},"      message",[57,547,447],{"class":446},[57,549,170],{"class":169},[57,551,552],{"class":173},"Weather fetched successfully",[57,554,176],{"class":169},[57,556,457],{"class":155},[57,558,560,563],{"class":59,"line":559},26,[57,561,562],{"class":159},"      data",[57,564,457],{"class":155},[57,566,568],{"class":59,"line":567},27,[57,569,570],{"class":155},"    };\n",[57,572,574,577,580,582,585,587],{"class":59,"line":573},28,[57,575,576],{"class":155},"  }",[57,578,579],{"class":151}," catch",[57,581,208],{"class":250},[57,583,584],{"class":159},"error",[57,586,425],{"class":250},[57,588,428],{"class":155},[57,590,592,594],{"class":59,"line":591},29,[57,593,523],{"class":151},[57,595,221],{"class":155},[57,597,599,602,604,607],{"class":59,"line":598},30,[57,600,601],{"class":442},"      statusCode",[57,603,447],{"class":446},[57,605,606],{"class":536}," 500",[57,608,457],{"class":155},[57,610,612,615,617,619,621,623,625,628,630],{"class":59,"line":611},31,[57,613,614],{"class":442},"      body",[57,616,447],{"class":446},[57,618,156],{"class":155},[57,620,470],{"class":442},[57,622,447],{"class":446},[57,624,170],{"class":169},[57,626,627],{"class":173},"Internal Server Error",[57,629,176],{"class":169},[57,631,482],{"class":155},[57,633,635],{"class":59,"line":634},32,[57,636,570],{"class":155},[57,638,640],{"class":59,"line":639},33,[57,641,642],{"class":155},"  }\n",[57,644,646,648,650],{"class":59,"line":645},34,[57,647,349],{"class":155},[57,649,215],{"class":101},[57,651,179],{"class":155},[11,653,654],{},"One cool thing I noticed about using this setup is that it hides both the API URL and the API key.",[46,656,658],{"className":48,"code":657,"language":50,"meta":52,"style":52},"Original URL: https:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002Fweather?q=London&units=metric&appid=${apiKey}\nMasked URL: https:\u002F\u002Fatmosdev.netlify.app\u002Fapi\u002Fweather?query=weather?q=London\n",[54,659,660,665],{"__ignoreMap":52},[57,661,662],{"class":59,"line":60},[57,663,664],{},"Original URL: https:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002Fweather?q=London&units=metric&appid=${apiKey}\n",[57,666,667],{"class":59,"line":105},[57,668,669],{},"Masked URL: https:\u002F\u002Fatmosdev.netlify.app\u002Fapi\u002Fweather?query=weather?q=London\n",[11,671,672],{},"So, not only does it simplify the URL, but it also keeps your API key under wraps.",[86,674,676],{"id":675},"client-side","Client Side",[11,678,679],{},"Now, all you need to do is pass in the query and fetch the data on the client side, and you're good to go!",[46,681,684],{"className":141,"code":682,"filename":683,"language":144,"meta":52,"style":52},"const getWeather = async (event) => {\n  try {\n    const response = await $fetch(`\u002Fapi\u002Fweather?query=London`);\n    if (response.status === 200) {\n      weather.value = response.data;\n    } else {\n      console.error(\"No data returned from the API\");\n    }\n  } catch (error) {\n    console.error(\"Error fetching weather data:\", error);\n  }\n};\n","git-request.js",[54,685,686,710,716,742,763,784,794,817,821,836,864,868],{"__ignoreMap":52},[57,687,688,691,695,697,700,702,704,706,708],{"class":59,"line":60},[57,689,690],{"class":204},"const",[57,692,694],{"class":693},"svfkx"," getWeather",[57,696,245],{"class":244},[57,698,699],{"class":204}," async",[57,701,208],{"class":155},[57,703,212],{"class":211},[57,705,215],{"class":155},[57,707,218],{"class":204},[57,709,221],{"class":155},[57,711,712,714],{"class":59,"line":105},[57,713,375],{"class":151},[57,715,221],{"class":155},[57,717,718,720,722,724,726,729,731,733,736,738,740],{"class":59,"line":111},[57,719,383],{"class":204},[57,721,386],{"class":238},[57,723,245],{"class":244},[57,725,391],{"class":151},[57,727,728],{"class":197}," $fetch",[57,730,201],{"class":250},[57,732,362],{"class":169},[57,734,735],{"class":173},"\u002Fapi\u002Fweather?query=London",[57,737,362],{"class":169},[57,739,215],{"class":250},[57,741,179],{"class":155},[57,743,744,746,748,750,752,754,757,759,761],{"class":59,"line":117},[57,745,409],{"class":151},[57,747,208],{"class":250},[57,749,417],{"class":298},[57,751,301],{"class":155},[57,753,454],{"class":159},[57,755,756],{"class":244}," ===",[57,758,537],{"class":536},[57,760,425],{"class":250},[57,762,428],{"class":155},[57,764,765,768,770,773,775,777,779,782],{"class":59,"line":230},[57,766,767],{"class":298},"      weather",[57,769,301],{"class":155},[57,771,772],{"class":159},"value",[57,774,245],{"class":244},[57,776,386],{"class":298},[57,778,301],{"class":155},[57,780,781],{"class":159},"data",[57,783,179],{"class":155},[57,785,786,789,792],{"class":59,"line":259},[57,787,788],{"class":155},"    }",[57,790,791],{"class":151}," else",[57,793,221],{"class":155},[57,795,796,799,801,803,805,808,811,813,815],{"class":59,"line":264},[57,797,798],{"class":298},"      console",[57,800,301],{"class":155},[57,802,584],{"class":197},[57,804,201],{"class":250},[57,806,807],{"class":169},"\"",[57,809,810],{"class":173},"No data returned from the API",[57,812,807],{"class":169},[57,814,215],{"class":250},[57,816,179],{"class":155},[57,818,819],{"class":59,"line":270},[57,820,494],{"class":155},[57,822,823,825,827,829,832,834],{"class":59,"line":288},[57,824,576],{"class":155},[57,826,579],{"class":151},[57,828,208],{"class":250},[57,830,584],{"class":831},"sWjah",[57,833,425],{"class":250},[57,835,428],{"class":155},[57,837,838,841,843,845,847,849,852,854,857,860,862],{"class":59,"line":315},[57,839,840],{"class":298},"    console",[57,842,301],{"class":155},[57,844,584],{"class":197},[57,846,201],{"class":250},[57,848,807],{"class":169},[57,850,851],{"class":173},"Error fetching weather data:",[57,853,807],{"class":169},[57,855,856],{"class":155},",",[57,858,859],{"class":831}," error",[57,861,215],{"class":250},[57,863,179],{"class":155},[57,865,866],{"class":59,"line":320},[57,867,642],{"class":155},[57,869,870],{"class":59,"line":326},[57,871,872],{"class":155},"};\n",[11,874,875],{},"Here is the API response data",[11,877,878],{},[879,880],"img",{"alt":881,"src":882},"weather api sample response","https:\u002F\u002Fik.imagekit.io\u002F3mh13v7xv4\u002Farticles\u002Fproxy-response.png?updatedAt=1723345992038",[15,884,886],{"id":885},"deployed-app","Deployed App",[11,888,889],{},[30,890,891],{"href":891,"rel":892},"https:\u002F\u002Fatmosapp.netlify.app\u002F",[34],[894,895,896],"style",{},"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 .sM89C, html code.shiki .sM89C{--shiki-light:#90A4AE;--shiki-default:#383A42;--shiki-dark:#ABB2BF}html pre.shiki code .sQsOY, html code.shiki .sQsOY{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#A626A4;--shiki-default-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:inherit}html pre.shiki code .sB4Xn, html code.shiki .sB4Xn{--shiki-light:#39ADB5;--shiki-default:#383A42;--shiki-dark:#ABB2BF}html pre.shiki code .s8dPH, html code.shiki .s8dPH{--shiki-light:#90A4AE;--shiki-default:#E45649;--shiki-dark:#E06C75}html pre.shiki code .sVH1b, html code.shiki .sVH1b{--shiki-light:#39ADB5;--shiki-default:#50A14F;--shiki-dark:#98C379}html pre.shiki code .spZWa, html code.shiki .spZWa{--shiki-light:#91B859;--shiki-default:#50A14F;--shiki-dark:#98C379}html pre.shiki code .sH50Z, html code.shiki .sH50Z{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#E45649;--shiki-default-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:inherit}html pre.shiki code .spnjr, html code.shiki .spnjr{--shiki-light:#6182B8;--shiki-default:#4078F2;--shiki-dark:#61AFEF}html pre.shiki code .sJvVP, html code.shiki .sJvVP{--shiki-light:#9C3EDA;--shiki-default:#A626A4;--shiki-dark:#C678DD}html pre.shiki code .s5f2p, html code.shiki .s5f2p{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#383A42;--shiki-default-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic}html pre.shiki code .seacL, html code.shiki .seacL{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0A1A7;--shiki-default-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic}html pre.shiki code .sMm83, html code.shiki .sMm83{--shiki-light:#90A4AE;--shiki-default:#986801;--shiki-dark:#E5C07B}html pre.shiki code .syPST, html code.shiki .syPST{--shiki-light:#39ADB5;--shiki-default:#0184BC;--shiki-dark:#56B6C2}html pre.shiki code .sA0eD, html code.shiki .sA0eD{--shiki-light:#E53935;--shiki-default:#383A42;--shiki-dark:#ABB2BF}html pre.shiki code .scCn_, html code.shiki .scCn_{--shiki-light:#90A4AE;--shiki-default:#383A42;--shiki-dark:#E5C07B}html pre.shiki code .sDC5J, html code.shiki .sDC5J{--shiki-light:#90A4AE;--shiki-default:#E45649;--shiki-dark:#E5C07B}html pre.shiki code .ssEfx, html code.shiki .ssEfx{--shiki-light:#39ADB5;--shiki-default:#CA1243;--shiki-dark:#C678DD}html pre.shiki code .su13H, html code.shiki .su13H{--shiki-light:#E53935;--shiki-default:#E45649;--shiki-dark:#E06C75}html pre.shiki code .saKOp, html code.shiki .saKOp{--shiki-light:#39ADB5;--shiki-default:#0184BC;--shiki-dark:#ABB2BF}html pre.shiki code .sriKn, html code.shiki .sriKn{--shiki-light:#F76D47;--shiki-default:#986801;--shiki-dark:#D19A66}html pre.shiki code .svfkx, html code.shiki .svfkx{--shiki-light:#90A4AE;--shiki-default:#4078F2;--shiki-dark:#61AFEF}html pre.shiki code .sWjah, html code.shiki .sWjah{--shiki-light:#90A4AE;--shiki-default:#383A42;--shiki-dark:#E06C75}",{"title":52,"searchDepth":105,"depth":105,"links":898},[899,900,901,906],{"id":17,"depth":105,"text":18},{"id":24,"depth":105,"text":25},{"id":69,"depth":105,"text":70,"children":902},[903,904,905],{"id":88,"depth":111,"text":89},{"id":123,"depth":111,"text":124},{"id":675,"depth":111,"text":676},{"id":885,"depth":105,"text":886},"2024-08-11",false,{"slug":910,"difficulty":911,"icon":912,"ogImage":913,"tags":915,"topic":912},"open-weather-proxy","beginner","nuxt",{"alt":914,"color":6},"Nuxt Proxy Server for Open Weather",[912,76,916],"proxy-server","\u002Farticles\u002Fopen-weather-proxy",{"title":5,"description":13},"articles\u002Fopen-weather-proxy","OZtZ9GAMVbyyszVj8tlet23mvrnXkIH3VHGJiU_TR8M",[922,927],{"title":923,"path":924,"stem":925,"description":926,"children":-1},"From Commit to Release: Automating GitHub Workflows","\u002Farticles\u002Fcommit-to-release","articles\u002Fcommit-to-release","This documentation describes an automated GitHub workflow system that handles pull request labelling and automated releases for both development and production environments. The system uses branch naming conventions to automatically label PRs, generates release notes, and manages versioning.",{"title":928,"path":929,"stem":930,"description":931,"children":-1},"PrimeVue Style Override","\u002Farticles\u002Fprimevue-style-override","articles\u002Fprimevue-style-override","The PrimeVue UI component library provides a wide range of components with their own design. In some cases, we need to customize them to better suit our own needs. There are different ways we can override the default styles of PrimeVue, but we need to keep a few things in mind to reduce headaches later down the line 😅.",1778820754461]