nitro.mjs 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import { defineEventHandler, handleCacheHeaders, splitCookiesString, createEvent, fetchWithEvent, isEvent, eventHandler, setHeaders, sendRedirect, proxyRequest, getRequestHeader, setResponseHeaders, setResponseStatus, send, getRequestHeaders, setResponseHeader, getRequestURL, getResponseHeader, appendResponseHeader, removeResponseHeader, createError, createApp, createRouter as createRouter$1, toNodeListener, lazyEventHandler, getResponseStatus } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/h3@1.15.3/node_modules/h3/dist/index.mjs';
  2. import destr from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/destr@2.0.5/node_modules/destr/dist/index.mjs';
  3. import { createHooks } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/hookable@5.5.3/node_modules/hookable/dist/index.mjs';
  4. import { createFetch, Headers as Headers$1 } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/ofetch@1.4.1/node_modules/ofetch/dist/node.mjs';
  5. import { fetchNodeRequestHandler, callNodeRequestHandler } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/node-mock-http@1.0.0/node_modules/node-mock-http/dist/index.mjs';
  6. import { parseURL, withoutBase, joinURL, getQuery, withQuery, decodePath, withLeadingSlash, withoutTrailingSlash } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/ufo@1.6.1/node_modules/ufo/dist/index.mjs';
  7. import { createStorage, defineDriver, prefixStorage } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/unstorage@1.16.0_db0@0.3.2_ioredis@5.6.1/node_modules/unstorage/dist/index.mjs';
  8. import unstorage_47drivers_47fs from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/unstorage@1.16.0_db0@0.3.2_ioredis@5.6.1/node_modules/unstorage/drivers/fs.mjs';
  9. import fsDriver from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/unstorage@1.16.0_db0@0.3.2_ioredis@5.6.1/node_modules/unstorage/drivers/fs-lite.mjs';
  10. import lruCache from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/unstorage@1.16.0_db0@0.3.2_ioredis@5.6.1/node_modules/unstorage/drivers/lru-cache.mjs';
  11. import { digest } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/index.mjs';
  12. import { klona } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/klona@2.0.6/node_modules/klona/dist/index.mjs';
  13. import defu, { defuFn } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs';
  14. import { snakeCase } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs';
  15. import { getContext } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/unctx@2.4.1/node_modules/unctx/dist/index.mjs';
  16. import { toRouteMatcher, createRouter } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs';
  17. import { promises } from 'node:fs';
  18. import { fileURLToPath } from 'node:url';
  19. import { dirname, resolve } from 'file:///Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.mjs';
  20. const serverAssets = [{"baseName":"server","dir":"/Users/yuxin/local/code/ccdw-website/server/assets"}];
  21. const assets$1 = createStorage();
  22. for (const asset of serverAssets) {
  23. assets$1.mount(asset.baseName, unstorage_47drivers_47fs({ base: asset.dir, ignore: (asset?.ignore || []) }));
  24. }
  25. // @ts-check
  26. /**
  27. * @param {string} item
  28. */
  29. const normalizeFsKey = item => decodeURIComponent(item.replaceAll(':', '_'));
  30. /**
  31. * @param {{ base: string }} opts
  32. */
  33. const _47Users_47yuxin_47local_47code_47ccdw_45website_47node_modules_47_46pnpm_47nuxt_643_4617_464__64parcel_43watcher_642_465_461__64types_43node_6422_4615_4621_db0_640_463_462_ioredis_645_466_461_magicast_e2b60321bafda6f7a9390f7ac7478d38_47node_modules_47nuxt_47dist_47core_47runtime_47nitro_47utils_47cache_45driver_46js = defineDriver((opts) => {
  34. const fs = fsDriver({ base: opts.base });
  35. const lru = lruCache({ max: 1000 });
  36. return {
  37. ...fs, // fall back to file system - only the bottom three methods are used in renderer
  38. async setItem (key, value, opts) {
  39. await Promise.all([
  40. fs.setItem?.(normalizeFsKey(key), value, opts),
  41. lru.setItem?.(key, value, opts),
  42. ]);
  43. },
  44. async hasItem (key, opts) {
  45. return await lru.hasItem(key, opts) || await fs.hasItem(normalizeFsKey(key), opts)
  46. },
  47. async getItem (key, opts) {
  48. return await lru.getItem(key, opts) || await fs.getItem(normalizeFsKey(key), opts)
  49. },
  50. }
  51. });
  52. const storage = createStorage({});
  53. storage.mount('/assets', assets$1);
  54. storage.mount('internal:nuxt:prerender', _47Users_47yuxin_47local_47code_47ccdw_45website_47node_modules_47_46pnpm_47nuxt_643_4617_464__64parcel_43watcher_642_465_461__64types_43node_6422_4615_4621_db0_640_463_462_ioredis_645_466_461_magicast_e2b60321bafda6f7a9390f7ac7478d38_47node_modules_47nuxt_47dist_47core_47runtime_47nitro_47utils_47cache_45driver_46js({"driver":"/Users/yuxin/local/code/ccdw-website/node_modules/.pnpm/nuxt@3.17.4_@parcel+watcher@2.5.1_@types+node@22.15.21_db0@0.3.2_ioredis@5.6.1_magicast_e2b60321bafda6f7a9390f7ac7478d38/node_modules/nuxt/dist/core/runtime/nitro/utils/cache-driver.js","base":"/Users/yuxin/local/code/ccdw-website/.nuxt/cache/nitro/prerender"}));
  55. storage.mount('data', fsDriver({"driver":"fsLite","base":"./.data/kv"}));
  56. storage.mount('root', unstorage_47drivers_47fs({"driver":"fs","readOnly":true,"base":"/Users/yuxin/local/code/ccdw-website","watchOptions":{"ignored":[null]}}));
  57. storage.mount('src', unstorage_47drivers_47fs({"driver":"fs","readOnly":true,"base":"/Users/yuxin/local/code/ccdw-website/server","watchOptions":{"ignored":[null]}}));
  58. storage.mount('build', unstorage_47drivers_47fs({"driver":"fs","readOnly":false,"base":"/Users/yuxin/local/code/ccdw-website/.nuxt"}));
  59. storage.mount('cache', unstorage_47drivers_47fs({"driver":"fs","readOnly":false,"base":"/Users/yuxin/local/code/ccdw-website/.nuxt/cache"}));
  60. function useStorage(base = "") {
  61. return base ? prefixStorage(storage, base) : storage;
  62. }
  63. const Hasher = /* @__PURE__ */ (() => {
  64. class Hasher2 {
  65. buff = "";
  66. #context = /* @__PURE__ */ new Map();
  67. write(str) {
  68. this.buff += str;
  69. }
  70. dispatch(value) {
  71. const type = value === null ? "null" : typeof value;
  72. return this[type](value);
  73. }
  74. object(object) {
  75. if (object && typeof object.toJSON === "function") {
  76. return this.object(object.toJSON());
  77. }
  78. const objString = Object.prototype.toString.call(object);
  79. let objType = "";
  80. const objectLength = objString.length;
  81. objType = objectLength < 10 ? "unknown:[" + objString + "]" : objString.slice(8, objectLength - 1);
  82. objType = objType.toLowerCase();
  83. let objectNumber = null;
  84. if ((objectNumber = this.#context.get(object)) === void 0) {
  85. this.#context.set(object, this.#context.size);
  86. } else {
  87. return this.dispatch("[CIRCULAR:" + objectNumber + "]");
  88. }
  89. if (typeof Buffer !== "undefined" && Buffer.isBuffer && Buffer.isBuffer(object)) {
  90. this.write("buffer:");
  91. return this.write(object.toString("utf8"));
  92. }
  93. if (objType !== "object" && objType !== "function" && objType !== "asyncfunction") {
  94. if (this[objType]) {
  95. this[objType](object);
  96. } else {
  97. this.unknown(object, objType);
  98. }
  99. } else {
  100. const keys = Object.keys(object).sort();
  101. const extraKeys = [];
  102. this.write("object:" + (keys.length + extraKeys.length) + ":");
  103. const dispatchForKey = (key) => {
  104. this.dispatch(key);
  105. this.write(":");
  106. this.dispatch(object[key]);
  107. this.write(",");
  108. };
  109. for (const key of keys) {
  110. dispatchForKey(key);
  111. }
  112. for (const key of extraKeys) {
  113. dispatchForKey(key);
  114. }
  115. }
  116. }
  117. array(arr, unordered) {
  118. unordered = unordered === void 0 ? false : unordered;
  119. this.write("array:" + arr.length + ":");
  120. if (!unordered || arr.length <= 1) {
  121. for (const entry of arr) {
  122. this.dispatch(entry);
  123. }
  124. return;
  125. }
  126. const contextAdditions = /* @__PURE__ */ new Map();
  127. const entries = arr.map((entry) => {
  128. const hasher = new Hasher2();
  129. hasher.dispatch(entry);
  130. for (const [key, value] of hasher.#context) {
  131. contextAdditions.set(key, value);
  132. }
  133. return hasher.toString();
  134. });
  135. this.#context = contextAdditions;
  136. entries.sort();
  137. return this.array(entries, false);
  138. }
  139. date(date) {
  140. return this.write("date:" + date.toJSON());
  141. }
  142. symbol(sym) {
  143. return this.write("symbol:" + sym.toString());
  144. }
  145. unknown(value, type) {
  146. this.write(type);
  147. if (!value) {
  148. return;
  149. }
  150. this.write(":");
  151. if (value && typeof value.entries === "function") {
  152. return this.array(
  153. [...value.entries()],
  154. true
  155. /* ordered */
  156. );
  157. }
  158. }
  159. error(err) {
  160. return this.write("error:" + err.toString());
  161. }
  162. boolean(bool) {
  163. return this.write("bool:" + bool);
  164. }
  165. string(string) {
  166. this.write("string:" + string.length + ":");
  167. this.write(string);
  168. }
  169. function(fn) {
  170. this.write("fn:");
  171. if (isNativeFunction(fn)) {
  172. this.dispatch("[native]");
  173. } else {
  174. this.dispatch(fn.toString());
  175. }
  176. }
  177. number(number) {
  178. return this.write("number:" + number);
  179. }
  180. null() {
  181. return this.write("Null");
  182. }
  183. undefined() {
  184. return this.write("Undefined");
  185. }
  186. regexp(regex) {
  187. return this.write("regex:" + regex.toString());
  188. }
  189. arraybuffer(arr) {
  190. this.write("arraybuffer:");
  191. return this.dispatch(new Uint8Array(arr));
  192. }
  193. url(url) {
  194. return this.write("url:" + url.toString());
  195. }
  196. map(map) {
  197. this.write("map:");
  198. const arr = [...map];
  199. return this.array(arr, false);
  200. }
  201. set(set) {
  202. this.write("set:");
  203. const arr = [...set];
  204. return this.array(arr, false);
  205. }
  206. bigint(number) {
  207. return this.write("bigint:" + number.toString());
  208. }
  209. }
  210. for (const type of [
  211. "uint8array",
  212. "uint8clampedarray",
  213. "unt8array",
  214. "uint16array",
  215. "unt16array",
  216. "uint32array",
  217. "unt32array",
  218. "float32array",
  219. "float64array"
  220. ]) {
  221. Hasher2.prototype[type] = function(arr) {
  222. this.write(type + ":");
  223. return this.array([...arr], false);
  224. };
  225. }
  226. function isNativeFunction(f) {
  227. if (typeof f !== "function") {
  228. return false;
  229. }
  230. return Function.prototype.toString.call(f).slice(
  231. -15
  232. /* "[native code] }".length */
  233. ) === "[native code] }";
  234. }
  235. return Hasher2;
  236. })();
  237. function serialize(object) {
  238. const hasher = new Hasher();
  239. hasher.dispatch(object);
  240. return hasher.buff;
  241. }
  242. function hash(value) {
  243. return digest(typeof value === "string" ? value : serialize(value)).replace(/[-_]/g, "").slice(0, 10);
  244. }
  245. function defaultCacheOptions() {
  246. return {
  247. name: "_",
  248. base: "/cache",
  249. swr: true,
  250. maxAge: 1
  251. };
  252. }
  253. function defineCachedFunction(fn, opts = {}) {
  254. opts = { ...defaultCacheOptions(), ...opts };
  255. const pending = {};
  256. const group = opts.group || "nitro/functions";
  257. const name = opts.name || fn.name || "_";
  258. const integrity = opts.integrity || hash([fn, opts]);
  259. const validate = opts.validate || ((entry) => entry.value !== void 0);
  260. async function get(key, resolver, shouldInvalidateCache, event) {
  261. const cacheKey = [opts.base, group, name, key + ".json"].filter(Boolean).join(":").replace(/:\/$/, ":index");
  262. let entry = await useStorage().getItem(cacheKey).catch((error) => {
  263. console.error(`[cache] Cache read error.`, error);
  264. useNitroApp().captureError(error, { event, tags: ["cache"] });
  265. }) || {};
  266. if (typeof entry !== "object") {
  267. entry = {};
  268. const error = new Error("Malformed data read from cache.");
  269. console.error("[cache]", error);
  270. useNitroApp().captureError(error, { event, tags: ["cache"] });
  271. }
  272. const ttl = (opts.maxAge ?? 0) * 1e3;
  273. if (ttl) {
  274. entry.expires = Date.now() + ttl;
  275. }
  276. const expired = shouldInvalidateCache || entry.integrity !== integrity || ttl && Date.now() - (entry.mtime || 0) > ttl || validate(entry) === false;
  277. const _resolve = async () => {
  278. const isPending = pending[key];
  279. if (!isPending) {
  280. if (entry.value !== void 0 && (opts.staleMaxAge || 0) >= 0 && opts.swr === false) {
  281. entry.value = void 0;
  282. entry.integrity = void 0;
  283. entry.mtime = void 0;
  284. entry.expires = void 0;
  285. }
  286. pending[key] = Promise.resolve(resolver());
  287. }
  288. try {
  289. entry.value = await pending[key];
  290. } catch (error) {
  291. if (!isPending) {
  292. delete pending[key];
  293. }
  294. throw error;
  295. }
  296. if (!isPending) {
  297. entry.mtime = Date.now();
  298. entry.integrity = integrity;
  299. delete pending[key];
  300. if (validate(entry) !== false) {
  301. let setOpts;
  302. if (opts.maxAge && !opts.swr) {
  303. setOpts = { ttl: opts.maxAge };
  304. }
  305. const promise = useStorage().setItem(cacheKey, entry, setOpts).catch((error) => {
  306. console.error(`[cache] Cache write error.`, error);
  307. useNitroApp().captureError(error, { event, tags: ["cache"] });
  308. });
  309. if (event?.waitUntil) {
  310. event.waitUntil(promise);
  311. }
  312. }
  313. }
  314. };
  315. const _resolvePromise = expired ? _resolve() : Promise.resolve();
  316. if (entry.value === void 0) {
  317. await _resolvePromise;
  318. } else if (expired && event && event.waitUntil) {
  319. event.waitUntil(_resolvePromise);
  320. }
  321. if (opts.swr && validate(entry) !== false) {
  322. _resolvePromise.catch((error) => {
  323. console.error(`[cache] SWR handler error.`, error);
  324. useNitroApp().captureError(error, { event, tags: ["cache"] });
  325. });
  326. return entry;
  327. }
  328. return _resolvePromise.then(() => entry);
  329. }
  330. return async (...args) => {
  331. const shouldBypassCache = await opts.shouldBypassCache?.(...args);
  332. if (shouldBypassCache) {
  333. return fn(...args);
  334. }
  335. const key = await (opts.getKey || getKey)(...args);
  336. const shouldInvalidateCache = await opts.shouldInvalidateCache?.(...args);
  337. const entry = await get(
  338. key,
  339. () => fn(...args),
  340. shouldInvalidateCache,
  341. args[0] && isEvent(args[0]) ? args[0] : void 0
  342. );
  343. let value = entry.value;
  344. if (opts.transform) {
  345. value = await opts.transform(entry, ...args) || value;
  346. }
  347. return value;
  348. };
  349. }
  350. function cachedFunction(fn, opts = {}) {
  351. return defineCachedFunction(fn, opts);
  352. }
  353. function getKey(...args) {
  354. return args.length > 0 ? hash(args) : "";
  355. }
  356. function escapeKey(key) {
  357. return String(key).replace(/\W/g, "");
  358. }
  359. function defineCachedEventHandler(handler, opts = defaultCacheOptions()) {
  360. const variableHeaderNames = (opts.varies || []).filter(Boolean).map((h) => h.toLowerCase()).sort();
  361. const _opts = {
  362. ...opts,
  363. getKey: async (event) => {
  364. const customKey = await opts.getKey?.(event);
  365. if (customKey) {
  366. return escapeKey(customKey);
  367. }
  368. const _path = event.node.req.originalUrl || event.node.req.url || event.path;
  369. let _pathname;
  370. try {
  371. _pathname = escapeKey(decodeURI(parseURL(_path).pathname)).slice(0, 16) || "index";
  372. } catch {
  373. _pathname = "-";
  374. }
  375. const _hashedPath = `${_pathname}.${hash(_path)}`;
  376. const _headers = variableHeaderNames.map((header) => [header, event.node.req.headers[header]]).map(([name, value]) => `${escapeKey(name)}.${hash(value)}`);
  377. return [_hashedPath, ..._headers].join(":");
  378. },
  379. validate: (entry) => {
  380. if (!entry.value) {
  381. return false;
  382. }
  383. if (entry.value.code >= 400) {
  384. return false;
  385. }
  386. if (entry.value.body === void 0) {
  387. return false;
  388. }
  389. if (entry.value.headers.etag === "undefined" || entry.value.headers["last-modified"] === "undefined") {
  390. return false;
  391. }
  392. return true;
  393. },
  394. group: opts.group || "nitro/handlers",
  395. integrity: opts.integrity || hash([handler, opts])
  396. };
  397. const _cachedHandler = cachedFunction(
  398. async (incomingEvent) => {
  399. const variableHeaders = {};
  400. for (const header of variableHeaderNames) {
  401. const value = incomingEvent.node.req.headers[header];
  402. if (value !== void 0) {
  403. variableHeaders[header] = value;
  404. }
  405. }
  406. const reqProxy = cloneWithProxy(incomingEvent.node.req, {
  407. headers: variableHeaders
  408. });
  409. const resHeaders = {};
  410. let _resSendBody;
  411. const resProxy = cloneWithProxy(incomingEvent.node.res, {
  412. statusCode: 200,
  413. writableEnded: false,
  414. writableFinished: false,
  415. headersSent: false,
  416. closed: false,
  417. getHeader(name) {
  418. return resHeaders[name];
  419. },
  420. setHeader(name, value) {
  421. resHeaders[name] = value;
  422. return this;
  423. },
  424. getHeaderNames() {
  425. return Object.keys(resHeaders);
  426. },
  427. hasHeader(name) {
  428. return name in resHeaders;
  429. },
  430. removeHeader(name) {
  431. delete resHeaders[name];
  432. },
  433. getHeaders() {
  434. return resHeaders;
  435. },
  436. end(chunk, arg2, arg3) {
  437. if (typeof chunk === "string") {
  438. _resSendBody = chunk;
  439. }
  440. if (typeof arg2 === "function") {
  441. arg2();
  442. }
  443. if (typeof arg3 === "function") {
  444. arg3();
  445. }
  446. return this;
  447. },
  448. write(chunk, arg2, arg3) {
  449. if (typeof chunk === "string") {
  450. _resSendBody = chunk;
  451. }
  452. if (typeof arg2 === "function") {
  453. arg2(void 0);
  454. }
  455. if (typeof arg3 === "function") {
  456. arg3();
  457. }
  458. return true;
  459. },
  460. writeHead(statusCode, headers2) {
  461. this.statusCode = statusCode;
  462. if (headers2) {
  463. if (Array.isArray(headers2) || typeof headers2 === "string") {
  464. throw new TypeError("Raw headers is not supported.");
  465. }
  466. for (const header in headers2) {
  467. const value = headers2[header];
  468. if (value !== void 0) {
  469. this.setHeader(
  470. header,
  471. value
  472. );
  473. }
  474. }
  475. }
  476. return this;
  477. }
  478. });
  479. const event = createEvent(reqProxy, resProxy);
  480. event.fetch = (url, fetchOptions) => fetchWithEvent(event, url, fetchOptions, {
  481. fetch: useNitroApp().localFetch
  482. });
  483. event.$fetch = (url, fetchOptions) => fetchWithEvent(event, url, fetchOptions, {
  484. fetch: globalThis.$fetch
  485. });
  486. event.waitUntil = incomingEvent.waitUntil;
  487. event.context = incomingEvent.context;
  488. event.context.cache = {
  489. options: _opts
  490. };
  491. const body = await handler(event) || _resSendBody;
  492. const headers = event.node.res.getHeaders();
  493. headers.etag = String(
  494. headers.Etag || headers.etag || `W/"${hash(body)}"`
  495. );
  496. headers["last-modified"] = String(
  497. headers["Last-Modified"] || headers["last-modified"] || (/* @__PURE__ */ new Date()).toUTCString()
  498. );
  499. const cacheControl = [];
  500. if (opts.swr) {
  501. if (opts.maxAge) {
  502. cacheControl.push(`s-maxage=${opts.maxAge}`);
  503. }
  504. if (opts.staleMaxAge) {
  505. cacheControl.push(`stale-while-revalidate=${opts.staleMaxAge}`);
  506. } else {
  507. cacheControl.push("stale-while-revalidate");
  508. }
  509. } else if (opts.maxAge) {
  510. cacheControl.push(`max-age=${opts.maxAge}`);
  511. }
  512. if (cacheControl.length > 0) {
  513. headers["cache-control"] = cacheControl.join(", ");
  514. }
  515. const cacheEntry = {
  516. code: event.node.res.statusCode,
  517. headers,
  518. body
  519. };
  520. return cacheEntry;
  521. },
  522. _opts
  523. );
  524. return defineEventHandler(async (event) => {
  525. if (opts.headersOnly) {
  526. if (handleCacheHeaders(event, { maxAge: opts.maxAge })) {
  527. return;
  528. }
  529. return handler(event);
  530. }
  531. const response = await _cachedHandler(
  532. event
  533. );
  534. if (event.node.res.headersSent || event.node.res.writableEnded) {
  535. return response.body;
  536. }
  537. if (handleCacheHeaders(event, {
  538. modifiedTime: new Date(response.headers["last-modified"]),
  539. etag: response.headers.etag,
  540. maxAge: opts.maxAge
  541. })) {
  542. return;
  543. }
  544. event.node.res.statusCode = response.code;
  545. for (const name in response.headers) {
  546. const value = response.headers[name];
  547. if (name === "set-cookie") {
  548. event.node.res.appendHeader(
  549. name,
  550. splitCookiesString(value)
  551. );
  552. } else {
  553. if (value !== void 0) {
  554. event.node.res.setHeader(name, value);
  555. }
  556. }
  557. }
  558. return response.body;
  559. });
  560. }
  561. function cloneWithProxy(obj, overrides) {
  562. return new Proxy(obj, {
  563. get(target, property, receiver) {
  564. if (property in overrides) {
  565. return overrides[property];
  566. }
  567. return Reflect.get(target, property, receiver);
  568. },
  569. set(target, property, value, receiver) {
  570. if (property in overrides) {
  571. overrides[property] = value;
  572. return true;
  573. }
  574. return Reflect.set(target, property, value, receiver);
  575. }
  576. });
  577. }
  578. const cachedEventHandler = defineCachedEventHandler;
  579. const inlineAppConfig = {
  580. "nuxt": {}
  581. };
  582. const appConfig = defuFn(inlineAppConfig);
  583. function getEnv(key, opts) {
  584. const envKey = snakeCase(key).toUpperCase();
  585. return destr(
  586. process.env[opts.prefix + envKey] ?? process.env[opts.altPrefix + envKey]
  587. );
  588. }
  589. function _isObject(input) {
  590. return typeof input === "object" && !Array.isArray(input);
  591. }
  592. function applyEnv(obj, opts, parentKey = "") {
  593. for (const key in obj) {
  594. const subKey = parentKey ? `${parentKey}_${key}` : key;
  595. const envValue = getEnv(subKey, opts);
  596. if (_isObject(obj[key])) {
  597. if (_isObject(envValue)) {
  598. obj[key] = { ...obj[key], ...envValue };
  599. applyEnv(obj[key], opts, subKey);
  600. } else if (envValue === void 0) {
  601. applyEnv(obj[key], opts, subKey);
  602. } else {
  603. obj[key] = envValue ?? obj[key];
  604. }
  605. } else {
  606. obj[key] = envValue ?? obj[key];
  607. }
  608. if (opts.envExpansion && typeof obj[key] === "string") {
  609. obj[key] = _expandFromEnv(obj[key]);
  610. }
  611. }
  612. return obj;
  613. }
  614. const envExpandRx = /\{\{([^{}]*)\}\}/g;
  615. function _expandFromEnv(value) {
  616. return value.replace(envExpandRx, (match, key) => {
  617. return process.env[key] || match;
  618. });
  619. }
  620. const _inlineRuntimeConfig = {
  621. "app": {
  622. "baseURL": "/",
  623. "buildId": "f506e4e5-f256-4340-a9a0-f08f794c79a5",
  624. "buildAssetsDir": "/_nuxt/",
  625. "cdnURL": ""
  626. },
  627. "nitro": {
  628. "envPrefix": "NUXT_",
  629. "routeRules": {
  630. "/__nuxt_error": {
  631. "cache": false
  632. },
  633. "/_nuxt/builds/meta/**": {
  634. "headers": {
  635. "cache-control": "public, max-age=31536000, immutable"
  636. }
  637. },
  638. "/_nuxt/builds/**": {
  639. "headers": {
  640. "cache-control": "public, max-age=1, immutable"
  641. }
  642. },
  643. "/_nuxt/**": {
  644. "headers": {
  645. "cache-control": "public, max-age=31536000, immutable"
  646. }
  647. }
  648. }
  649. },
  650. "public": {}
  651. };
  652. const envOptions = {
  653. prefix: "NITRO_",
  654. altPrefix: _inlineRuntimeConfig.nitro.envPrefix ?? process.env.NITRO_ENV_PREFIX ?? "_",
  655. envExpansion: _inlineRuntimeConfig.nitro.envExpansion ?? process.env.NITRO_ENV_EXPANSION ?? false
  656. };
  657. const _sharedRuntimeConfig = _deepFreeze(
  658. applyEnv(klona(_inlineRuntimeConfig), envOptions)
  659. );
  660. function useRuntimeConfig(event) {
  661. if (!event) {
  662. return _sharedRuntimeConfig;
  663. }
  664. if (event.context.nitro.runtimeConfig) {
  665. return event.context.nitro.runtimeConfig;
  666. }
  667. const runtimeConfig = klona(_inlineRuntimeConfig);
  668. applyEnv(runtimeConfig, envOptions);
  669. event.context.nitro.runtimeConfig = runtimeConfig;
  670. return runtimeConfig;
  671. }
  672. _deepFreeze(klona(appConfig));
  673. function _deepFreeze(object) {
  674. const propNames = Object.getOwnPropertyNames(object);
  675. for (const name of propNames) {
  676. const value = object[name];
  677. if (value && typeof value === "object") {
  678. _deepFreeze(value);
  679. }
  680. }
  681. return Object.freeze(object);
  682. }
  683. new Proxy(/* @__PURE__ */ Object.create(null), {
  684. get: (_, prop) => {
  685. console.warn(
  686. "Please use `useRuntimeConfig()` instead of accessing config directly."
  687. );
  688. const runtimeConfig = useRuntimeConfig();
  689. if (prop in runtimeConfig) {
  690. return runtimeConfig[prop];
  691. }
  692. return void 0;
  693. }
  694. });
  695. getContext("nitro-app", {
  696. asyncContext: false,
  697. AsyncLocalStorage: void 0
  698. });
  699. const config = useRuntimeConfig();
  700. const _routeRulesMatcher = toRouteMatcher(
  701. createRouter({ routes: config.nitro.routeRules })
  702. );
  703. function createRouteRulesHandler(ctx) {
  704. return eventHandler((event) => {
  705. const routeRules = getRouteRules(event);
  706. if (routeRules.headers) {
  707. setHeaders(event, routeRules.headers);
  708. }
  709. if (routeRules.redirect) {
  710. let target = routeRules.redirect.to;
  711. if (target.endsWith("/**")) {
  712. let targetPath = event.path;
  713. const strpBase = routeRules.redirect._redirectStripBase;
  714. if (strpBase) {
  715. targetPath = withoutBase(targetPath, strpBase);
  716. }
  717. target = joinURL(target.slice(0, -3), targetPath);
  718. } else if (event.path.includes("?")) {
  719. const query = getQuery(event.path);
  720. target = withQuery(target, query);
  721. }
  722. return sendRedirect(event, target, routeRules.redirect.statusCode);
  723. }
  724. if (routeRules.proxy) {
  725. let target = routeRules.proxy.to;
  726. if (target.endsWith("/**")) {
  727. let targetPath = event.path;
  728. const strpBase = routeRules.proxy._proxyStripBase;
  729. if (strpBase) {
  730. targetPath = withoutBase(targetPath, strpBase);
  731. }
  732. target = joinURL(target.slice(0, -3), targetPath);
  733. } else if (event.path.includes("?")) {
  734. const query = getQuery(event.path);
  735. target = withQuery(target, query);
  736. }
  737. return proxyRequest(event, target, {
  738. fetch: ctx.localFetch,
  739. ...routeRules.proxy
  740. });
  741. }
  742. });
  743. }
  744. function getRouteRules(event) {
  745. event.context._nitro = event.context._nitro || {};
  746. if (!event.context._nitro.routeRules) {
  747. event.context._nitro.routeRules = getRouteRulesForPath(
  748. withoutBase(event.path.split("?")[0], useRuntimeConfig().app.baseURL)
  749. );
  750. }
  751. return event.context._nitro.routeRules;
  752. }
  753. function getRouteRulesForPath(path) {
  754. return defu({}, ..._routeRulesMatcher.matchAll(path).reverse());
  755. }
  756. function _captureError(error, type) {
  757. console.error(`[${type}]`, error);
  758. useNitroApp().captureError(error, { tags: [type] });
  759. }
  760. function trapUnhandledNodeErrors() {
  761. process.on(
  762. "unhandledRejection",
  763. (error) => _captureError(error, "unhandledRejection")
  764. );
  765. process.on(
  766. "uncaughtException",
  767. (error) => _captureError(error, "uncaughtException")
  768. );
  769. }
  770. function joinHeaders(value) {
  771. return Array.isArray(value) ? value.join(", ") : String(value);
  772. }
  773. function normalizeFetchResponse(response) {
  774. if (!response.headers.has("set-cookie")) {
  775. return response;
  776. }
  777. return new Response(response.body, {
  778. status: response.status,
  779. statusText: response.statusText,
  780. headers: normalizeCookieHeaders(response.headers)
  781. });
  782. }
  783. function normalizeCookieHeader(header = "") {
  784. return splitCookiesString(joinHeaders(header));
  785. }
  786. function normalizeCookieHeaders(headers) {
  787. const outgoingHeaders = new Headers();
  788. for (const [name, header] of headers) {
  789. if (name === "set-cookie") {
  790. for (const cookie of normalizeCookieHeader(header)) {
  791. outgoingHeaders.append("set-cookie", cookie);
  792. }
  793. } else {
  794. outgoingHeaders.set(name, joinHeaders(header));
  795. }
  796. }
  797. return outgoingHeaders;
  798. }
  799. function isJsonRequest(event) {
  800. if (hasReqHeader(event, "accept", "text/html")) {
  801. return false;
  802. }
  803. return hasReqHeader(event, "accept", "application/json") || hasReqHeader(event, "user-agent", "curl/") || hasReqHeader(event, "user-agent", "httpie/") || hasReqHeader(event, "sec-fetch-mode", "cors") || event.path.startsWith("/api/") || event.path.endsWith(".json");
  804. }
  805. function hasReqHeader(event, name, includes) {
  806. const value = getRequestHeader(event, name);
  807. return value && typeof value === "string" && value.toLowerCase().includes(includes);
  808. }
  809. const errorHandler$0 = (async function errorhandler(error, event, { defaultHandler }) {
  810. if (event.handled || isJsonRequest(event)) {
  811. return;
  812. }
  813. const defaultRes = await defaultHandler(error, event, { json: true });
  814. const statusCode = error.statusCode || 500;
  815. if (statusCode === 404 && defaultRes.status === 302) {
  816. setResponseHeaders(event, defaultRes.headers);
  817. setResponseStatus(event, defaultRes.status, defaultRes.statusText);
  818. return send(event, JSON.stringify(defaultRes.body, null, 2));
  819. }
  820. const errorObject = defaultRes.body;
  821. const url = new URL(errorObject.url);
  822. errorObject.url = withoutBase(url.pathname, useRuntimeConfig(event).app.baseURL) + url.search + url.hash;
  823. errorObject.message ||= "Server Error";
  824. errorObject.data ||= error.data;
  825. errorObject.statusMessage ||= error.statusMessage;
  826. delete defaultRes.headers["content-type"];
  827. delete defaultRes.headers["content-security-policy"];
  828. setResponseHeaders(event, defaultRes.headers);
  829. const reqHeaders = getRequestHeaders(event);
  830. const isRenderingError = event.path.startsWith("/__nuxt_error") || !!reqHeaders["x-nuxt-error"];
  831. const res = isRenderingError ? null : await useNitroApp().localFetch(
  832. withQuery(joinURL(useRuntimeConfig(event).app.baseURL, "/__nuxt_error"), errorObject),
  833. {
  834. headers: { ...reqHeaders, "x-nuxt-error": "true" },
  835. redirect: "manual"
  836. }
  837. ).catch(() => null);
  838. if (event.handled) {
  839. return;
  840. }
  841. if (!res) {
  842. const { template } = await import('../_/error-500.mjs');
  843. setResponseHeader(event, "Content-Type", "text/html;charset=UTF-8");
  844. return send(event, template(errorObject));
  845. }
  846. const html = await res.text();
  847. for (const [header, value] of res.headers.entries()) {
  848. setResponseHeader(event, header, value);
  849. }
  850. setResponseStatus(event, res.status && res.status !== 200 ? res.status : defaultRes.status, res.statusText || defaultRes.statusText);
  851. return send(event, html);
  852. });
  853. function defineNitroErrorHandler(handler) {
  854. return handler;
  855. }
  856. const errorHandler$1 = defineNitroErrorHandler(
  857. function defaultNitroErrorHandler(error, event) {
  858. const res = defaultHandler(error, event);
  859. setResponseHeaders(event, res.headers);
  860. setResponseStatus(event, res.status, res.statusText);
  861. return send(event, JSON.stringify(res.body, null, 2));
  862. }
  863. );
  864. function defaultHandler(error, event, opts) {
  865. const isSensitive = error.unhandled || error.fatal;
  866. const statusCode = error.statusCode || 500;
  867. const statusMessage = error.statusMessage || "Server Error";
  868. const url = getRequestURL(event, { xForwardedHost: true, xForwardedProto: true });
  869. if (statusCode === 404) {
  870. const baseURL = "/";
  871. if (/^\/[^/]/.test(baseURL) && !url.pathname.startsWith(baseURL)) {
  872. const redirectTo = `${baseURL}${url.pathname.slice(1)}${url.search}`;
  873. return {
  874. status: 302,
  875. statusText: "Found",
  876. headers: { location: redirectTo },
  877. body: `Redirecting...`
  878. };
  879. }
  880. }
  881. if (isSensitive && !opts?.silent) {
  882. const tags = [error.unhandled && "[unhandled]", error.fatal && "[fatal]"].filter(Boolean).join(" ");
  883. console.error(`[request error] ${tags} [${event.method}] ${url}
  884. `, error);
  885. }
  886. const headers = {
  887. "content-type": "application/json",
  888. // Prevent browser from guessing the MIME types of resources.
  889. "x-content-type-options": "nosniff",
  890. // Prevent error page from being embedded in an iframe
  891. "x-frame-options": "DENY",
  892. // Prevent browsers from sending the Referer header
  893. "referrer-policy": "no-referrer",
  894. // Disable the execution of any js
  895. "content-security-policy": "script-src 'none'; frame-ancestors 'none';"
  896. };
  897. setResponseStatus(event, statusCode, statusMessage);
  898. if (statusCode === 404 || !getResponseHeader(event, "cache-control")) {
  899. headers["cache-control"] = "no-cache";
  900. }
  901. const body = {
  902. error: true,
  903. url: url.href,
  904. statusCode,
  905. statusMessage,
  906. message: isSensitive ? "Server Error" : error.message,
  907. data: isSensitive ? void 0 : error.data
  908. };
  909. return {
  910. status: statusCode,
  911. statusText: statusMessage,
  912. headers,
  913. body
  914. };
  915. }
  916. const errorHandlers = [errorHandler$0, errorHandler$1];
  917. async function errorHandler(error, event) {
  918. for (const handler of errorHandlers) {
  919. try {
  920. await handler(error, event, { defaultHandler });
  921. if (event.handled) {
  922. return; // Response handled
  923. }
  924. } catch(error) {
  925. // Handler itself thrown, log and continue
  926. console.error(error);
  927. }
  928. }
  929. // H3 will handle fallback
  930. }
  931. const plugins = [
  932. ];
  933. const assets = {};
  934. function readAsset (id) {
  935. const serverDir = dirname(fileURLToPath(globalThis._importMeta_.url));
  936. return promises.readFile(resolve(serverDir, assets[id].path))
  937. }
  938. const publicAssetBases = {"/_nuxt/builds/meta/":{"maxAge":31536000},"/_nuxt/builds/":{"maxAge":1},"/_nuxt/":{"maxAge":31536000}};
  939. function isPublicAssetURL(id = '') {
  940. if (assets[id]) {
  941. return true
  942. }
  943. for (const base in publicAssetBases) {
  944. if (id.startsWith(base)) { return true }
  945. }
  946. return false
  947. }
  948. function getAsset (id) {
  949. return assets[id]
  950. }
  951. const METHODS = /* @__PURE__ */ new Set(["HEAD", "GET"]);
  952. const EncodingMap = { gzip: ".gz", br: ".br" };
  953. const _5MtcA1 = eventHandler((event) => {
  954. if (event.method && !METHODS.has(event.method)) {
  955. return;
  956. }
  957. let id = decodePath(
  958. withLeadingSlash(withoutTrailingSlash(parseURL(event.path).pathname))
  959. );
  960. let asset;
  961. const encodingHeader = String(
  962. getRequestHeader(event, "accept-encoding") || ""
  963. );
  964. const encodings = [
  965. ...encodingHeader.split(",").map((e) => EncodingMap[e.trim()]).filter(Boolean).sort(),
  966. ""
  967. ];
  968. if (encodings.length > 1) {
  969. appendResponseHeader(event, "Vary", "Accept-Encoding");
  970. }
  971. for (const encoding of encodings) {
  972. for (const _id of [id + encoding, joinURL(id, "index.html" + encoding)]) {
  973. const _asset = getAsset(_id);
  974. if (_asset) {
  975. asset = _asset;
  976. id = _id;
  977. break;
  978. }
  979. }
  980. }
  981. if (!asset) {
  982. if (isPublicAssetURL(id)) {
  983. removeResponseHeader(event, "Cache-Control");
  984. throw createError({ statusCode: 404 });
  985. }
  986. return;
  987. }
  988. const ifNotMatch = getRequestHeader(event, "if-none-match") === asset.etag;
  989. if (ifNotMatch) {
  990. setResponseStatus(event, 304, "Not Modified");
  991. return "";
  992. }
  993. const ifModifiedSinceH = getRequestHeader(event, "if-modified-since");
  994. const mtimeDate = new Date(asset.mtime);
  995. if (ifModifiedSinceH && asset.mtime && new Date(ifModifiedSinceH) >= mtimeDate) {
  996. setResponseStatus(event, 304, "Not Modified");
  997. return "";
  998. }
  999. if (asset.type && !getResponseHeader(event, "Content-Type")) {
  1000. setResponseHeader(event, "Content-Type", asset.type);
  1001. }
  1002. if (asset.etag && !getResponseHeader(event, "ETag")) {
  1003. setResponseHeader(event, "ETag", asset.etag);
  1004. }
  1005. if (asset.mtime && !getResponseHeader(event, "Last-Modified")) {
  1006. setResponseHeader(event, "Last-Modified", mtimeDate.toUTCString());
  1007. }
  1008. if (asset.encoding && !getResponseHeader(event, "Content-Encoding")) {
  1009. setResponseHeader(event, "Content-Encoding", asset.encoding);
  1010. }
  1011. if (asset.size > 0 && !getResponseHeader(event, "Content-Length")) {
  1012. setResponseHeader(event, "Content-Length", asset.size);
  1013. }
  1014. return readAsset(id);
  1015. });
  1016. const _SxA8c9 = defineEventHandler(() => {});
  1017. const _lazy_Jyjymq = () => import('../_/renderer.mjs').then(function (n) { return n.r; });
  1018. const handlers = [
  1019. { route: '', handler: _5MtcA1, lazy: false, middleware: true, method: undefined },
  1020. { route: '/__nuxt_island/**', handler: _SxA8c9, lazy: false, middleware: false, method: undefined },
  1021. { route: '/**', handler: _lazy_Jyjymq, lazy: true, middleware: false, method: undefined }
  1022. ];
  1023. function createNitroApp() {
  1024. const config = useRuntimeConfig();
  1025. const hooks = createHooks();
  1026. const captureError = (error, context = {}) => {
  1027. const promise = hooks.callHookParallel("error", error, context).catch((error_) => {
  1028. console.error("Error while capturing another error", error_);
  1029. });
  1030. if (context.event && isEvent(context.event)) {
  1031. const errors = context.event.context.nitro?.errors;
  1032. if (errors) {
  1033. errors.push({ error, context });
  1034. }
  1035. if (context.event.waitUntil) {
  1036. context.event.waitUntil(promise);
  1037. }
  1038. }
  1039. };
  1040. const h3App = createApp({
  1041. debug: destr(false),
  1042. onError: (error, event) => {
  1043. captureError(error, { event, tags: ["request"] });
  1044. return errorHandler(error, event);
  1045. },
  1046. onRequest: async (event) => {
  1047. event.context.nitro = event.context.nitro || { errors: [] };
  1048. const fetchContext = event.node.req?.__unenv__;
  1049. if (fetchContext?._platform) {
  1050. event.context = {
  1051. _platform: fetchContext?._platform,
  1052. // #3335
  1053. ...fetchContext._platform,
  1054. ...event.context
  1055. };
  1056. }
  1057. if (!event.context.waitUntil && fetchContext?.waitUntil) {
  1058. event.context.waitUntil = fetchContext.waitUntil;
  1059. }
  1060. event.fetch = (req, init) => fetchWithEvent(event, req, init, { fetch: localFetch });
  1061. event.$fetch = (req, init) => fetchWithEvent(event, req, init, {
  1062. fetch: $fetch
  1063. });
  1064. event.waitUntil = (promise) => {
  1065. if (!event.context.nitro._waitUntilPromises) {
  1066. event.context.nitro._waitUntilPromises = [];
  1067. }
  1068. event.context.nitro._waitUntilPromises.push(promise);
  1069. if (event.context.waitUntil) {
  1070. event.context.waitUntil(promise);
  1071. }
  1072. };
  1073. event.captureError = (error, context) => {
  1074. captureError(error, { event, ...context });
  1075. };
  1076. await nitroApp$1.hooks.callHook("request", event).catch((error) => {
  1077. captureError(error, { event, tags: ["request"] });
  1078. });
  1079. },
  1080. onBeforeResponse: async (event, response) => {
  1081. await nitroApp$1.hooks.callHook("beforeResponse", event, response).catch((error) => {
  1082. captureError(error, { event, tags: ["request", "response"] });
  1083. });
  1084. },
  1085. onAfterResponse: async (event, response) => {
  1086. await nitroApp$1.hooks.callHook("afterResponse", event, response).catch((error) => {
  1087. captureError(error, { event, tags: ["request", "response"] });
  1088. });
  1089. }
  1090. });
  1091. const router = createRouter$1({
  1092. preemptive: true
  1093. });
  1094. const nodeHandler = toNodeListener(h3App);
  1095. const localCall = (aRequest) => callNodeRequestHandler(nodeHandler, aRequest);
  1096. const localFetch = (input, init) => {
  1097. if (!input.toString().startsWith("/")) {
  1098. return globalThis.fetch(input, init);
  1099. }
  1100. return fetchNodeRequestHandler(
  1101. nodeHandler,
  1102. input,
  1103. init
  1104. ).then((response) => normalizeFetchResponse(response));
  1105. };
  1106. const $fetch = createFetch({
  1107. fetch: localFetch,
  1108. Headers: Headers$1,
  1109. defaults: { baseURL: config.app.baseURL }
  1110. });
  1111. globalThis.$fetch = $fetch;
  1112. h3App.use(createRouteRulesHandler({ localFetch }));
  1113. for (const h of handlers) {
  1114. let handler = h.lazy ? lazyEventHandler(h.handler) : h.handler;
  1115. if (h.middleware || !h.route) {
  1116. const middlewareBase = (config.app.baseURL + (h.route || "/")).replace(
  1117. /\/+/g,
  1118. "/"
  1119. );
  1120. h3App.use(middlewareBase, handler);
  1121. } else {
  1122. const routeRules = getRouteRulesForPath(
  1123. h.route.replace(/:\w+|\*\*/g, "_")
  1124. );
  1125. if (routeRules.cache) {
  1126. handler = cachedEventHandler(handler, {
  1127. group: "nitro/routes",
  1128. ...routeRules.cache
  1129. });
  1130. }
  1131. router.use(h.route, handler, h.method);
  1132. }
  1133. }
  1134. h3App.use(config.app.baseURL, router.handler);
  1135. const app = {
  1136. hooks,
  1137. h3App,
  1138. router,
  1139. localCall,
  1140. localFetch,
  1141. captureError
  1142. };
  1143. return app;
  1144. }
  1145. function runNitroPlugins(nitroApp2) {
  1146. for (const plugin of plugins) {
  1147. try {
  1148. plugin(nitroApp2);
  1149. } catch (error) {
  1150. nitroApp2.captureError(error, { tags: ["plugin"] });
  1151. throw error;
  1152. }
  1153. }
  1154. }
  1155. const nitroApp$1 = createNitroApp();
  1156. function useNitroApp() {
  1157. return nitroApp$1;
  1158. }
  1159. runNitroPlugins(nitroApp$1);
  1160. function defineRenderHandler(render) {
  1161. const runtimeConfig = useRuntimeConfig();
  1162. return eventHandler(async (event) => {
  1163. const nitroApp = useNitroApp();
  1164. const ctx = { event, render, response: void 0 };
  1165. await nitroApp.hooks.callHook("render:before", ctx);
  1166. if (!ctx.response) {
  1167. if (event.path === `${runtimeConfig.app.baseURL}favicon.ico`) {
  1168. setResponseHeader(event, "Content-Type", "image/x-icon");
  1169. return send(
  1170. event,
  1171. "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
  1172. );
  1173. }
  1174. ctx.response = await ctx.render(event);
  1175. if (!ctx.response) {
  1176. const _currentStatus = getResponseStatus(event);
  1177. setResponseStatus(event, _currentStatus === 200 ? 500 : _currentStatus);
  1178. return send(
  1179. event,
  1180. "No response returned from render handler: " + event.path
  1181. );
  1182. }
  1183. }
  1184. await nitroApp.hooks.callHook("render:response", ctx.response, ctx);
  1185. if (ctx.response.headers) {
  1186. setResponseHeaders(event, ctx.response.headers);
  1187. }
  1188. if (ctx.response.statusCode || ctx.response.statusMessage) {
  1189. setResponseStatus(
  1190. event,
  1191. ctx.response.statusCode,
  1192. ctx.response.statusMessage
  1193. );
  1194. }
  1195. return ctx.response.body;
  1196. });
  1197. }
  1198. const nitroApp = useNitroApp();
  1199. const localFetch = nitroApp.localFetch;
  1200. const closePrerenderer = () => nitroApp.hooks.callHook("close");
  1201. trapUnhandledNodeErrors();
  1202. export { useStorage as a, useNitroApp as b, closePrerenderer as c, defineRenderHandler as d, getRouteRules as g, localFetch as l, useRuntimeConfig as u };
  1203. //# sourceMappingURL=nitro.mjs.map