nitro.mjs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import { getRequestHeader, splitCookiesString, setResponseStatus, setResponseHeader, send, getRequestHeaders, eventHandler, appendResponseHeader, removeResponseHeader, createError, getResponseHeader, defineEventHandler, handleCacheHeaders, createEvent, fetchWithEvent, isEvent, setHeaders, sendRedirect, proxyRequest, createApp, createRouter as createRouter$1, toNodeListener, lazyEventHandler, getResponseStatus, setResponseHeaders } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/h3/dist/index.mjs';
  2. import destr from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/destr/dist/index.mjs';
  3. import { createHooks } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/hookable/dist/index.mjs';
  4. import { createFetch as createFetch$1, Headers as Headers$1 } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/ofetch/dist/node.mjs';
  5. import { createCall, createFetch } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/unenv/runtime/fetch/index.mjs';
  6. import { withQuery, joinURL, decodePath, withLeadingSlash, withoutTrailingSlash, parseURL, withoutBase, getQuery } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/ufo/dist/index.mjs';
  7. import { klona } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/klona/dist/index.mjs';
  8. import defu, { defuFn } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/defu/dist/defu.mjs';
  9. import { snakeCase } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/scule/dist/index.mjs';
  10. import { promises } from 'node:fs';
  11. import { fileURLToPath } from 'node:url';
  12. import { dirname, resolve } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/pathe/dist/index.mjs';
  13. import { hash } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/ohash/dist/index.mjs';
  14. import { createStorage, prefixStorage } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/unstorage/dist/index.mjs';
  15. import unstorage_47drivers_47fs from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/unstorage/drivers/fs.mjs';
  16. import file_58_47_47_47D_58_47pre_47nuxt_47sannongzixunwang_web_47node_modules_47nuxt_47dist_47core_47runtime_47nitro_47cache_45driver_46js from 'file:///D:/pre/nuxt/sannongzixunwang_web/node_modules/nuxt/dist/core/runtime/nitro/cache-driver.js';
  17. import unstorage_47drivers_47fs_45lite from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/unstorage/drivers/fs-lite.mjs';
  18. import { toRouteMatcher, createRouter } from 'file://D:/pre/nuxt/sannongzixunwang_web/node_modules/radix3/dist/index.mjs';
  19. function hasReqHeader(event, name, includes) {
  20. const value = getRequestHeader(event, name);
  21. return value && typeof value === "string" && value.toLowerCase().includes(includes);
  22. }
  23. function isJsonRequest(event) {
  24. if (hasReqHeader(event, "accept", "text/html")) {
  25. return false;
  26. }
  27. 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");
  28. }
  29. function normalizeError(error, isDev) {
  30. const cwd = typeof process.cwd === "function" ? process.cwd() : "/";
  31. const stack = (error.stack || "").split("\n").splice(1).filter((line) => line.includes("at ")).map((line) => {
  32. const text = line.replace(cwd + "/", "./").replace("webpack:/", "").replace("file://", "").trim();
  33. return {
  34. text,
  35. internal: line.includes("node_modules") && !line.includes(".cache") || line.includes("internal") || line.includes("new Promise")
  36. };
  37. });
  38. const statusCode = error.statusCode || 500;
  39. const statusMessage = error.statusMessage ?? (statusCode === 404 ? "Not Found" : "");
  40. const message = error.unhandled ? "internal server error" : error.message || error.toString();
  41. return {
  42. stack,
  43. statusCode,
  44. statusMessage,
  45. message
  46. };
  47. }
  48. function _captureError(error, type) {
  49. console.error(`[nitro] [${type}]`, error);
  50. useNitroApp().captureError(error, { tags: [type] });
  51. }
  52. function trapUnhandledNodeErrors() {
  53. process.on(
  54. "unhandledRejection",
  55. (error) => _captureError(error, "unhandledRejection")
  56. );
  57. process.on(
  58. "uncaughtException",
  59. (error) => _captureError(error, "uncaughtException")
  60. );
  61. }
  62. function joinHeaders(value) {
  63. return Array.isArray(value) ? value.join(", ") : String(value);
  64. }
  65. function normalizeFetchResponse(response) {
  66. if (!response.headers.has("set-cookie")) {
  67. return response;
  68. }
  69. return new Response(response.body, {
  70. status: response.status,
  71. statusText: response.statusText,
  72. headers: normalizeCookieHeaders(response.headers)
  73. });
  74. }
  75. function normalizeCookieHeader(header = "") {
  76. return splitCookiesString(joinHeaders(header));
  77. }
  78. function normalizeCookieHeaders(headers) {
  79. const outgoingHeaders = new Headers();
  80. for (const [name, header] of headers) {
  81. if (name === "set-cookie") {
  82. for (const cookie of normalizeCookieHeader(header)) {
  83. outgoingHeaders.append("set-cookie", cookie);
  84. }
  85. } else {
  86. outgoingHeaders.set(name, joinHeaders(header));
  87. }
  88. }
  89. return outgoingHeaders;
  90. }
  91. const errorHandler = (async function errorhandler(error, event) {
  92. const { stack, statusCode, statusMessage, message } = normalizeError(error);
  93. const errorObject = {
  94. url: event.path,
  95. statusCode,
  96. statusMessage,
  97. message,
  98. stack: "",
  99. // TODO: check and validate error.data for serialisation into query
  100. data: error.data
  101. };
  102. if (error.unhandled || error.fatal) {
  103. const tags = [
  104. "[nuxt]",
  105. "[request error]",
  106. error.unhandled && "[unhandled]",
  107. error.fatal && "[fatal]",
  108. Number(errorObject.statusCode) !== 200 && `[${errorObject.statusCode}]`
  109. ].filter(Boolean).join(" ");
  110. console.error(tags, (error.message || error.toString() || "internal server error") + "\n" + stack.map((l) => " " + l.text).join(" \n"));
  111. }
  112. if (event.handled) {
  113. return;
  114. }
  115. setResponseStatus(event, errorObject.statusCode !== 200 && errorObject.statusCode || 500, errorObject.statusMessage);
  116. if (isJsonRequest(event)) {
  117. setResponseHeader(event, "Content-Type", "application/json");
  118. return send(event, JSON.stringify(errorObject));
  119. }
  120. const reqHeaders = getRequestHeaders(event);
  121. const isRenderingError = event.path.startsWith("/__nuxt_error") || !!reqHeaders["x-nuxt-error"];
  122. const res = isRenderingError ? null : await useNitroApp().localFetch(
  123. withQuery(joinURL(useRuntimeConfig(event).app.baseURL, "/__nuxt_error"), errorObject),
  124. {
  125. headers: { ...reqHeaders, "x-nuxt-error": "true" },
  126. redirect: "manual"
  127. }
  128. ).catch(() => null);
  129. if (!res) {
  130. const { template } = await import('./error-500.mjs');
  131. if (event.handled) {
  132. return;
  133. }
  134. setResponseHeader(event, "Content-Type", "text/html;charset=UTF-8");
  135. return send(event, template(errorObject));
  136. }
  137. const html = await res.text();
  138. if (event.handled) {
  139. return;
  140. }
  141. for (const [header, value] of res.headers.entries()) {
  142. setResponseHeader(event, header, value);
  143. }
  144. setResponseStatus(event, res.status && res.status !== 200 ? res.status : undefined, res.statusText);
  145. return send(event, html);
  146. });
  147. const plugins = [
  148. ];
  149. const assets$1 = {};
  150. function readAsset (id) {
  151. const serverDir = dirname(fileURLToPath(globalThis._importMeta_.url));
  152. return promises.readFile(resolve(serverDir, assets$1[id].path))
  153. }
  154. const publicAssetBases = {"/_nuxt/builds/meta/":{"maxAge":31536000},"/_nuxt/builds/":{"maxAge":1},"/_nuxt/":{"maxAge":31536000}};
  155. function isPublicAssetURL(id = '') {
  156. if (assets$1[id]) {
  157. return true
  158. }
  159. for (const base in publicAssetBases) {
  160. if (id.startsWith(base)) { return true }
  161. }
  162. return false
  163. }
  164. function getAsset (id) {
  165. return assets$1[id]
  166. }
  167. const METHODS = /* @__PURE__ */ new Set(["HEAD", "GET"]);
  168. const EncodingMap = { gzip: ".gz", br: ".br" };
  169. const _9Bqcn7 = eventHandler((event) => {
  170. if (event.method && !METHODS.has(event.method)) {
  171. return;
  172. }
  173. let id = decodePath(
  174. withLeadingSlash(withoutTrailingSlash(parseURL(event.path).pathname))
  175. );
  176. let asset;
  177. const encodingHeader = String(
  178. getRequestHeader(event, "accept-encoding") || ""
  179. );
  180. const encodings = [
  181. ...encodingHeader.split(",").map((e) => EncodingMap[e.trim()]).filter(Boolean).sort(),
  182. ""
  183. ];
  184. if (encodings.length > 1) {
  185. appendResponseHeader(event, "Vary", "Accept-Encoding");
  186. }
  187. for (const encoding of encodings) {
  188. for (const _id of [id + encoding, joinURL(id, "index.html" + encoding)]) {
  189. const _asset = getAsset(_id);
  190. if (_asset) {
  191. asset = _asset;
  192. id = _id;
  193. break;
  194. }
  195. }
  196. }
  197. if (!asset) {
  198. if (isPublicAssetURL(id)) {
  199. removeResponseHeader(event, "Cache-Control");
  200. throw createError({
  201. statusMessage: "Cannot find static asset " + id,
  202. statusCode: 404
  203. });
  204. }
  205. return;
  206. }
  207. const ifNotMatch = getRequestHeader(event, "if-none-match") === asset.etag;
  208. if (ifNotMatch) {
  209. setResponseStatus(event, 304, "Not Modified");
  210. return "";
  211. }
  212. const ifModifiedSinceH = getRequestHeader(event, "if-modified-since");
  213. const mtimeDate = new Date(asset.mtime);
  214. if (ifModifiedSinceH && asset.mtime && new Date(ifModifiedSinceH) >= mtimeDate) {
  215. setResponseStatus(event, 304, "Not Modified");
  216. return "";
  217. }
  218. if (asset.type && !getResponseHeader(event, "Content-Type")) {
  219. setResponseHeader(event, "Content-Type", asset.type);
  220. }
  221. if (asset.etag && !getResponseHeader(event, "ETag")) {
  222. setResponseHeader(event, "ETag", asset.etag);
  223. }
  224. if (asset.mtime && !getResponseHeader(event, "Last-Modified")) {
  225. setResponseHeader(event, "Last-Modified", mtimeDate.toUTCString());
  226. }
  227. if (asset.encoding && !getResponseHeader(event, "Content-Encoding")) {
  228. setResponseHeader(event, "Content-Encoding", asset.encoding);
  229. }
  230. if (asset.size > 0 && !getResponseHeader(event, "Content-Length")) {
  231. setResponseHeader(event, "Content-Length", asset.size);
  232. }
  233. return readAsset(id);
  234. });
  235. const _lazy_LyzT3Z = () => import('../routes/index.mjs').then(function (n) { return n.i; });
  236. const _lazy_eQF6Qg = () => import('./renderer.mjs').then(function (n) { return n.r; });
  237. const handlers = [
  238. { route: '', handler: _9Bqcn7, lazy: false, middleware: true, method: undefined },
  239. { route: '/api', handler: _lazy_LyzT3Z, lazy: true, middleware: false, method: undefined },
  240. { route: '/**', handler: _lazy_eQF6Qg, lazy: true, middleware: false, method: undefined }
  241. ];
  242. const serverAssets = [{"baseName":"server","dir":"D:/pre/nuxt/sannongzixunwang_web/server/assets"}];
  243. const assets = createStorage();
  244. for (const asset of serverAssets) {
  245. assets.mount(asset.baseName, unstorage_47drivers_47fs({ base: asset.dir, ignore: (asset?.ignore || []) }));
  246. }
  247. const storage = createStorage({});
  248. storage.mount('/assets', assets);
  249. storage.mount('internal:nuxt:prerender', file_58_47_47_47D_58_47pre_47nuxt_47sannongzixunwang_web_47node_modules_47nuxt_47dist_47core_47runtime_47nitro_47cache_45driver_46js({"driver":"file:///D:/pre/nuxt/sannongzixunwang_web/node_modules/nuxt/dist/core/runtime/nitro/cache-driver.js","base":"D:/pre/nuxt/sannongzixunwang_web/.nuxt/cache/nitro/prerender"}));
  250. storage.mount('data', unstorage_47drivers_47fs_45lite({"driver":"fsLite","base":"D:\\pre\\nuxt\\sannongzixunwang_web\\.data\\kv"}));
  251. storage.mount('root', unstorage_47drivers_47fs({"driver":"fs","readOnly":true,"base":"D:\\pre\\nuxt\\sannongzixunwang_web","ignore":["**/node_modules/**","**/.git/**"]}));
  252. storage.mount('src', unstorage_47drivers_47fs({"driver":"fs","readOnly":true,"base":"D:\\pre\\nuxt\\sannongzixunwang_web\\server","ignore":["**/node_modules/**","**/.git/**"]}));
  253. storage.mount('build', unstorage_47drivers_47fs({"driver":"fs","readOnly":false,"base":"D:\\pre\\nuxt\\sannongzixunwang_web\\.nuxt","ignore":["**/node_modules/**","**/.git/**"]}));
  254. storage.mount('cache', unstorage_47drivers_47fs({"driver":"fs","readOnly":false,"base":"D:\\pre\\nuxt\\sannongzixunwang_web\\.nuxt\\cache","ignore":["**/node_modules/**","**/.git/**"]}));
  255. function useStorage(base = "") {
  256. return base ? prefixStorage(storage, base) : storage;
  257. }
  258. function defaultCacheOptions() {
  259. return {
  260. name: "_",
  261. base: "/cache",
  262. swr: true,
  263. maxAge: 1
  264. };
  265. }
  266. function defineCachedFunction(fn, opts = {}) {
  267. opts = { ...defaultCacheOptions(), ...opts };
  268. const pending = {};
  269. const group = opts.group || "nitro/functions";
  270. const name = opts.name || fn.name || "_";
  271. const integrity = opts.integrity || hash([fn, opts]);
  272. const validate = opts.validate || ((entry) => entry.value !== undefined);
  273. async function get(key, resolver, shouldInvalidateCache, event) {
  274. const cacheKey = [opts.base, group, name, key + ".json"].filter(Boolean).join(":").replace(/:\/$/, ":index");
  275. let entry = await useStorage().getItem(cacheKey).catch((error) => {
  276. console.error(`[nitro] [cache] Cache read error.`, error);
  277. useNitroApp().captureError(error, { event, tags: ["cache"] });
  278. }) || {};
  279. if (typeof entry !== "object") {
  280. entry = {};
  281. const error = new Error("Malformed data read from cache.");
  282. console.error("[nitro] [cache]", error);
  283. useNitroApp().captureError(error, { event, tags: ["cache"] });
  284. }
  285. const ttl = (opts.maxAge ?? 0) * 1e3;
  286. if (ttl) {
  287. entry.expires = Date.now() + ttl;
  288. }
  289. const expired = shouldInvalidateCache || entry.integrity !== integrity || ttl && Date.now() - (entry.mtime || 0) > ttl || validate(entry) === false;
  290. const _resolve = async () => {
  291. const isPending = pending[key];
  292. if (!isPending) {
  293. if (entry.value !== undefined && (opts.staleMaxAge || 0) >= 0 && opts.swr === false) {
  294. entry.value = undefined;
  295. entry.integrity = undefined;
  296. entry.mtime = undefined;
  297. entry.expires = undefined;
  298. }
  299. pending[key] = Promise.resolve(resolver());
  300. }
  301. try {
  302. entry.value = await pending[key];
  303. } catch (error) {
  304. if (!isPending) {
  305. delete pending[key];
  306. }
  307. throw error;
  308. }
  309. if (!isPending) {
  310. entry.mtime = Date.now();
  311. entry.integrity = integrity;
  312. delete pending[key];
  313. if (validate(entry) !== false) {
  314. let setOpts;
  315. if (opts.maxAge && !opts.swr) {
  316. setOpts = { ttl: opts.maxAge };
  317. }
  318. const promise = useStorage().setItem(cacheKey, entry, setOpts).catch((error) => {
  319. console.error(`[nitro] [cache] Cache write error.`, error);
  320. useNitroApp().captureError(error, { event, tags: ["cache"] });
  321. });
  322. if (event?.waitUntil) {
  323. event.waitUntil(promise);
  324. }
  325. }
  326. }
  327. };
  328. const _resolvePromise = expired ? _resolve() : Promise.resolve();
  329. if (entry.value === undefined) {
  330. await _resolvePromise;
  331. } else if (expired && event && event.waitUntil) {
  332. event.waitUntil(_resolvePromise);
  333. }
  334. if (opts.swr && validate(entry) !== false) {
  335. _resolvePromise.catch((error) => {
  336. console.error(`[nitro] [cache] SWR handler error.`, error);
  337. useNitroApp().captureError(error, { event, tags: ["cache"] });
  338. });
  339. return entry;
  340. }
  341. return _resolvePromise.then(() => entry);
  342. }
  343. return async (...args) => {
  344. const shouldBypassCache = await opts.shouldBypassCache?.(...args);
  345. if (shouldBypassCache) {
  346. return fn(...args);
  347. }
  348. const key = await (opts.getKey || getKey)(...args);
  349. const shouldInvalidateCache = await opts.shouldInvalidateCache?.(...args);
  350. const entry = await get(
  351. key,
  352. () => fn(...args),
  353. shouldInvalidateCache,
  354. args[0] && isEvent(args[0]) ? args[0] : undefined
  355. );
  356. let value = entry.value;
  357. if (opts.transform) {
  358. value = await opts.transform(entry, ...args) || value;
  359. }
  360. return value;
  361. };
  362. }
  363. function cachedFunction(fn, opts = {}) {
  364. return defineCachedFunction(fn, opts);
  365. }
  366. function getKey(...args) {
  367. return args.length > 0 ? hash(args, {}) : "";
  368. }
  369. function escapeKey(key) {
  370. return String(key).replace(/\W/g, "");
  371. }
  372. function defineCachedEventHandler(handler, opts = defaultCacheOptions()) {
  373. const variableHeaderNames = (opts.varies || []).filter(Boolean).map((h) => h.toLowerCase()).sort();
  374. const _opts = {
  375. ...opts,
  376. getKey: async (event) => {
  377. const customKey = await opts.getKey?.(event);
  378. if (customKey) {
  379. return escapeKey(customKey);
  380. }
  381. const _path = event.node.req.originalUrl || event.node.req.url || event.path;
  382. let _pathname;
  383. try {
  384. _pathname = escapeKey(decodeURI(parseURL(_path).pathname)).slice(0, 16) || "index";
  385. } catch {
  386. _pathname = "-";
  387. }
  388. const _hashedPath = `${_pathname}.${hash(_path)}`;
  389. const _headers = variableHeaderNames.map((header) => [header, event.node.req.headers[header]]).map(([name, value]) => `${escapeKey(name)}.${hash(value)}`);
  390. return [_hashedPath, ..._headers].join(":");
  391. },
  392. validate: (entry) => {
  393. if (!entry.value) {
  394. return false;
  395. }
  396. if (entry.value.code >= 400) {
  397. return false;
  398. }
  399. if (entry.value.body === undefined) {
  400. return false;
  401. }
  402. if (entry.value.headers.etag === "undefined" || entry.value.headers["last-modified"] === "undefined") {
  403. return false;
  404. }
  405. return true;
  406. },
  407. group: opts.group || "nitro/handlers",
  408. integrity: opts.integrity || hash([handler, opts])
  409. };
  410. const _cachedHandler = cachedFunction(
  411. async (incomingEvent) => {
  412. const variableHeaders = {};
  413. for (const header of variableHeaderNames) {
  414. const value = incomingEvent.node.req.headers[header];
  415. if (value !== undefined) {
  416. variableHeaders[header] = value;
  417. }
  418. }
  419. const reqProxy = cloneWithProxy(incomingEvent.node.req, {
  420. headers: variableHeaders
  421. });
  422. const resHeaders = {};
  423. let _resSendBody;
  424. const resProxy = cloneWithProxy(incomingEvent.node.res, {
  425. statusCode: 200,
  426. writableEnded: false,
  427. writableFinished: false,
  428. headersSent: false,
  429. closed: false,
  430. getHeader(name) {
  431. return resHeaders[name];
  432. },
  433. setHeader(name, value) {
  434. resHeaders[name] = value;
  435. return this;
  436. },
  437. getHeaderNames() {
  438. return Object.keys(resHeaders);
  439. },
  440. hasHeader(name) {
  441. return name in resHeaders;
  442. },
  443. removeHeader(name) {
  444. delete resHeaders[name];
  445. },
  446. getHeaders() {
  447. return resHeaders;
  448. },
  449. end(chunk, arg2, arg3) {
  450. if (typeof chunk === "string") {
  451. _resSendBody = chunk;
  452. }
  453. if (typeof arg2 === "function") {
  454. arg2();
  455. }
  456. if (typeof arg3 === "function") {
  457. arg3();
  458. }
  459. return this;
  460. },
  461. write(chunk, arg2, arg3) {
  462. if (typeof chunk === "string") {
  463. _resSendBody = chunk;
  464. }
  465. if (typeof arg2 === "function") {
  466. arg2(undefined);
  467. }
  468. if (typeof arg3 === "function") {
  469. arg3();
  470. }
  471. return true;
  472. },
  473. writeHead(statusCode, headers2) {
  474. this.statusCode = statusCode;
  475. if (headers2) {
  476. if (Array.isArray(headers2) || typeof headers2 === "string") {
  477. throw new TypeError("Raw headers is not supported.");
  478. }
  479. for (const header in headers2) {
  480. const value = headers2[header];
  481. if (value !== undefined) {
  482. this.setHeader(
  483. header,
  484. value
  485. );
  486. }
  487. }
  488. }
  489. return this;
  490. }
  491. });
  492. const event = createEvent(reqProxy, resProxy);
  493. event.fetch = (url, fetchOptions) => fetchWithEvent(event, url, fetchOptions, {
  494. fetch: useNitroApp().localFetch
  495. });
  496. event.$fetch = (url, fetchOptions) => fetchWithEvent(event, url, fetchOptions, {
  497. fetch: globalThis.$fetch
  498. });
  499. event.context = incomingEvent.context;
  500. event.context.cache = {
  501. options: _opts
  502. };
  503. const body = await handler(event) || _resSendBody;
  504. const headers = event.node.res.getHeaders();
  505. headers.etag = String(
  506. headers.Etag || headers.etag || `W/"${hash(body)}"`
  507. );
  508. headers["last-modified"] = String(
  509. headers["Last-Modified"] || headers["last-modified"] || (/* @__PURE__ */ new Date()).toUTCString()
  510. );
  511. const cacheControl = [];
  512. if (opts.swr) {
  513. if (opts.maxAge) {
  514. cacheControl.push(`s-maxage=${opts.maxAge}`);
  515. }
  516. if (opts.staleMaxAge) {
  517. cacheControl.push(`stale-while-revalidate=${opts.staleMaxAge}`);
  518. } else {
  519. cacheControl.push("stale-while-revalidate");
  520. }
  521. } else if (opts.maxAge) {
  522. cacheControl.push(`max-age=${opts.maxAge}`);
  523. }
  524. if (cacheControl.length > 0) {
  525. headers["cache-control"] = cacheControl.join(", ");
  526. }
  527. const cacheEntry = {
  528. code: event.node.res.statusCode,
  529. headers,
  530. body
  531. };
  532. return cacheEntry;
  533. },
  534. _opts
  535. );
  536. return defineEventHandler(async (event) => {
  537. if (opts.headersOnly) {
  538. if (handleCacheHeaders(event, { maxAge: opts.maxAge })) {
  539. return;
  540. }
  541. return handler(event);
  542. }
  543. const response = await _cachedHandler(
  544. event
  545. );
  546. if (event.node.res.headersSent || event.node.res.writableEnded) {
  547. return response.body;
  548. }
  549. if (handleCacheHeaders(event, {
  550. modifiedTime: new Date(response.headers["last-modified"]),
  551. etag: response.headers.etag,
  552. maxAge: opts.maxAge
  553. })) {
  554. return;
  555. }
  556. event.node.res.statusCode = response.code;
  557. for (const name in response.headers) {
  558. const value = response.headers[name];
  559. if (name === "set-cookie") {
  560. event.node.res.appendHeader(
  561. name,
  562. splitCookiesString(value)
  563. );
  564. } else {
  565. if (value !== undefined) {
  566. event.node.res.setHeader(name, value);
  567. }
  568. }
  569. }
  570. return response.body;
  571. });
  572. }
  573. function cloneWithProxy(obj, overrides) {
  574. return new Proxy(obj, {
  575. get(target, property, receiver) {
  576. if (property in overrides) {
  577. return overrides[property];
  578. }
  579. return Reflect.get(target, property, receiver);
  580. },
  581. set(target, property, value, receiver) {
  582. if (property in overrides) {
  583. overrides[property] = value;
  584. return true;
  585. }
  586. return Reflect.set(target, property, value, receiver);
  587. }
  588. });
  589. }
  590. const cachedEventHandler = defineCachedEventHandler;
  591. const inlineAppConfig = {
  592. "nuxt": {}
  593. };
  594. const appConfig = defuFn(inlineAppConfig);
  595. function getEnv(key, opts) {
  596. const envKey = snakeCase(key).toUpperCase();
  597. return destr(
  598. process.env[opts.prefix + envKey] ?? process.env[opts.altPrefix + envKey]
  599. );
  600. }
  601. function _isObject(input) {
  602. return typeof input === "object" && !Array.isArray(input);
  603. }
  604. function applyEnv(obj, opts, parentKey = "") {
  605. for (const key in obj) {
  606. const subKey = parentKey ? `${parentKey}_${key}` : key;
  607. const envValue = getEnv(subKey, opts);
  608. if (_isObject(obj[key])) {
  609. if (_isObject(envValue)) {
  610. obj[key] = { ...obj[key], ...envValue };
  611. applyEnv(obj[key], opts, subKey);
  612. } else if (envValue === undefined) {
  613. applyEnv(obj[key], opts, subKey);
  614. } else {
  615. obj[key] = envValue ?? obj[key];
  616. }
  617. } else {
  618. obj[key] = envValue ?? obj[key];
  619. }
  620. if (opts.envExpansion && typeof obj[key] === "string") {
  621. obj[key] = _expandFromEnv(obj[key]);
  622. }
  623. }
  624. return obj;
  625. }
  626. const envExpandRx = /{{(.*?)}}/g;
  627. function _expandFromEnv(value) {
  628. return value.replace(envExpandRx, (match, key) => {
  629. return process.env[key] || match;
  630. });
  631. }
  632. const _inlineRuntimeConfig = {
  633. "app": {
  634. "baseURL": "/",
  635. "buildId": "4b3b0468-531c-42ea-943f-00c00b72ca2f",
  636. "buildAssetsDir": "/_nuxt/",
  637. "cdnURL": ""
  638. },
  639. "nitro": {
  640. "envPrefix": "NUXT_",
  641. "routeRules": {
  642. "/__nuxt_error": {
  643. "cache": false
  644. },
  645. "/_nuxt/builds/meta/**": {
  646. "headers": {
  647. "cache-control": "public, max-age=31536000, immutable"
  648. }
  649. },
  650. "/_nuxt/builds/**": {
  651. "headers": {
  652. "cache-control": "public, max-age=1, immutable"
  653. }
  654. },
  655. "/_nuxt/**": {
  656. "headers": {
  657. "cache-control": "public, max-age=31536000, immutable"
  658. }
  659. }
  660. }
  661. },
  662. "public": {}
  663. };
  664. const envOptions = {
  665. prefix: "NITRO_",
  666. altPrefix: _inlineRuntimeConfig.nitro.envPrefix ?? process.env.NITRO_ENV_PREFIX ?? "_",
  667. envExpansion: _inlineRuntimeConfig.nitro.envExpansion ?? process.env.NITRO_ENV_EXPANSION ?? false
  668. };
  669. const _sharedRuntimeConfig = _deepFreeze(
  670. applyEnv(klona(_inlineRuntimeConfig), envOptions)
  671. );
  672. function useRuntimeConfig(event) {
  673. if (!event) {
  674. return _sharedRuntimeConfig;
  675. }
  676. if (event.context.nitro.runtimeConfig) {
  677. return event.context.nitro.runtimeConfig;
  678. }
  679. const runtimeConfig = klona(_inlineRuntimeConfig);
  680. applyEnv(runtimeConfig, envOptions);
  681. event.context.nitro.runtimeConfig = runtimeConfig;
  682. return runtimeConfig;
  683. }
  684. _deepFreeze(klona(appConfig));
  685. function _deepFreeze(object) {
  686. const propNames = Object.getOwnPropertyNames(object);
  687. for (const name of propNames) {
  688. const value = object[name];
  689. if (value && typeof value === "object") {
  690. _deepFreeze(value);
  691. }
  692. }
  693. return Object.freeze(object);
  694. }
  695. new Proxy(/* @__PURE__ */ Object.create(null), {
  696. get: (_, prop) => {
  697. console.warn(
  698. "Please use `useRuntimeConfig()` instead of accessing config directly."
  699. );
  700. const runtimeConfig = useRuntimeConfig();
  701. if (prop in runtimeConfig) {
  702. return runtimeConfig[prop];
  703. }
  704. return undefined;
  705. }
  706. });
  707. const config = useRuntimeConfig();
  708. const _routeRulesMatcher = toRouteMatcher(
  709. createRouter({ routes: config.nitro.routeRules })
  710. );
  711. function createRouteRulesHandler(ctx) {
  712. return eventHandler((event) => {
  713. const routeRules = getRouteRules(event);
  714. if (routeRules.headers) {
  715. setHeaders(event, routeRules.headers);
  716. }
  717. if (routeRules.redirect) {
  718. let target = routeRules.redirect.to;
  719. if (target.endsWith("/**")) {
  720. let targetPath = event.path;
  721. const strpBase = routeRules.redirect._redirectStripBase;
  722. if (strpBase) {
  723. targetPath = withoutBase(targetPath, strpBase);
  724. }
  725. target = joinURL(target.slice(0, -3), targetPath);
  726. } else if (event.path.includes("?")) {
  727. const query = getQuery(event.path);
  728. target = withQuery(target, query);
  729. }
  730. return sendRedirect(event, target, routeRules.redirect.statusCode);
  731. }
  732. if (routeRules.proxy) {
  733. let target = routeRules.proxy.to;
  734. if (target.endsWith("/**")) {
  735. let targetPath = event.path;
  736. const strpBase = routeRules.proxy._proxyStripBase;
  737. if (strpBase) {
  738. targetPath = withoutBase(targetPath, strpBase);
  739. }
  740. target = joinURL(target.slice(0, -3), targetPath);
  741. } else if (event.path.includes("?")) {
  742. const query = getQuery(event.path);
  743. target = withQuery(target, query);
  744. }
  745. return proxyRequest(event, target, {
  746. fetch: ctx.localFetch,
  747. ...routeRules.proxy
  748. });
  749. }
  750. });
  751. }
  752. function getRouteRules(event) {
  753. event.context._nitro = event.context._nitro || {};
  754. if (!event.context._nitro.routeRules) {
  755. event.context._nitro.routeRules = getRouteRulesForPath(
  756. withoutBase(event.path.split("?")[0], useRuntimeConfig().app.baseURL)
  757. );
  758. }
  759. return event.context._nitro.routeRules;
  760. }
  761. function getRouteRulesForPath(path) {
  762. return defu({}, ..._routeRulesMatcher.matchAll(path).reverse());
  763. }
  764. function createNitroApp() {
  765. const config = useRuntimeConfig();
  766. const hooks = createHooks();
  767. const captureError = (error, context = {}) => {
  768. const promise = hooks.callHookParallel("error", error, context).catch((error_) => {
  769. console.error("Error while capturing another error", error_);
  770. });
  771. if (context.event && isEvent(context.event)) {
  772. const errors = context.event.context.nitro?.errors;
  773. if (errors) {
  774. errors.push({ error, context });
  775. }
  776. if (context.event.waitUntil) {
  777. context.event.waitUntil(promise);
  778. }
  779. }
  780. };
  781. const h3App = createApp({
  782. debug: destr(false),
  783. onError: (error, event) => {
  784. captureError(error, { event, tags: ["request"] });
  785. return errorHandler(error, event);
  786. },
  787. onRequest: async (event) => {
  788. await nitroApp.hooks.callHook("request", event).catch((error) => {
  789. captureError(error, { event, tags: ["request"] });
  790. });
  791. },
  792. onBeforeResponse: async (event, response) => {
  793. await nitroApp.hooks.callHook("beforeResponse", event, response).catch((error) => {
  794. captureError(error, { event, tags: ["request", "response"] });
  795. });
  796. },
  797. onAfterResponse: async (event, response) => {
  798. await nitroApp.hooks.callHook("afterResponse", event, response).catch((error) => {
  799. captureError(error, { event, tags: ["request", "response"] });
  800. });
  801. }
  802. });
  803. const router = createRouter$1({
  804. preemptive: true
  805. });
  806. const localCall = createCall(toNodeListener(h3App));
  807. const _localFetch = createFetch(localCall, globalThis.fetch);
  808. const localFetch = (input, init) => _localFetch(input, init).then(
  809. (response) => normalizeFetchResponse(response)
  810. );
  811. const $fetch = createFetch$1({
  812. fetch: localFetch,
  813. Headers: Headers$1,
  814. defaults: { baseURL: config.app.baseURL }
  815. });
  816. globalThis.$fetch = $fetch;
  817. h3App.use(createRouteRulesHandler({ localFetch }));
  818. h3App.use(
  819. eventHandler((event) => {
  820. event.context.nitro = event.context.nitro || { errors: [] };
  821. const envContext = event.node.req?.__unenv__;
  822. if (envContext) {
  823. Object.assign(event.context, envContext);
  824. }
  825. event.fetch = (req, init) => fetchWithEvent(event, req, init, { fetch: localFetch });
  826. event.$fetch = (req, init) => fetchWithEvent(event, req, init, {
  827. fetch: $fetch
  828. });
  829. event.waitUntil = (promise) => {
  830. if (!event.context.nitro._waitUntilPromises) {
  831. event.context.nitro._waitUntilPromises = [];
  832. }
  833. event.context.nitro._waitUntilPromises.push(promise);
  834. if (envContext?.waitUntil) {
  835. envContext.waitUntil(promise);
  836. }
  837. };
  838. event.captureError = (error, context) => {
  839. captureError(error, { event, ...context });
  840. };
  841. })
  842. );
  843. for (const h of handlers) {
  844. let handler = h.lazy ? lazyEventHandler(h.handler) : h.handler;
  845. if (h.middleware || !h.route) {
  846. const middlewareBase = (config.app.baseURL + (h.route || "/")).replace(
  847. /\/+/g,
  848. "/"
  849. );
  850. h3App.use(middlewareBase, handler);
  851. } else {
  852. const routeRules = getRouteRulesForPath(
  853. h.route.replace(/:\w+|\*\*/g, "_")
  854. );
  855. if (routeRules.cache) {
  856. handler = cachedEventHandler(handler, {
  857. group: "nitro/routes",
  858. ...routeRules.cache
  859. });
  860. }
  861. router.use(h.route, handler, h.method);
  862. }
  863. }
  864. h3App.use(config.app.baseURL, router.handler);
  865. const app = {
  866. hooks,
  867. h3App,
  868. router,
  869. localCall,
  870. localFetch,
  871. captureError
  872. };
  873. return app;
  874. }
  875. function runNitroPlugins(nitroApp2) {
  876. for (const plugin of plugins) {
  877. try {
  878. plugin(nitroApp2);
  879. } catch (error) {
  880. nitroApp2.captureError(error, { tags: ["plugin"] });
  881. throw error;
  882. }
  883. }
  884. }
  885. const nitroApp = createNitroApp();
  886. function useNitroApp() {
  887. return nitroApp;
  888. }
  889. runNitroPlugins(nitroApp);
  890. function defineRenderHandler(render) {
  891. const runtimeConfig = useRuntimeConfig();
  892. return eventHandler(async (event) => {
  893. const nitroApp = useNitroApp();
  894. const ctx = { event, render, response: undefined };
  895. await nitroApp.hooks.callHook("render:before", ctx);
  896. if (!ctx.response) {
  897. if (event.path === `${runtimeConfig.app.baseURL}favicon.ico`) {
  898. setResponseHeader(event, "Content-Type", "image/x-icon");
  899. return send(
  900. event,
  901. "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
  902. );
  903. }
  904. ctx.response = await ctx.render(event);
  905. if (!ctx.response) {
  906. const _currentStatus = getResponseStatus(event);
  907. setResponseStatus(event, _currentStatus === 200 ? 500 : _currentStatus);
  908. return send(
  909. event,
  910. "No response returned from render handler: " + event.path
  911. );
  912. }
  913. }
  914. await nitroApp.hooks.callHook("render:response", ctx.response, ctx);
  915. if (ctx.response.headers) {
  916. setResponseHeaders(event, ctx.response.headers);
  917. }
  918. if (ctx.response.statusCode || ctx.response.statusMessage) {
  919. setResponseStatus(
  920. event,
  921. ctx.response.statusCode,
  922. ctx.response.statusMessage
  923. );
  924. }
  925. return ctx.response.body;
  926. });
  927. }
  928. export { useStorage as a, useNitroApp as b, defineRenderHandler as d, getRouteRules as g, trapUnhandledNodeErrors as t, useRuntimeConfig as u };
  929. //# sourceMappingURL=nitro.mjs.map