You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			552 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			552 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |     value: true | ||
|  | }); | ||
|  | 0 && (module.exports = { | ||
|  |     validateRevalidate: null, | ||
|  |     validateTags: null, | ||
|  |     addImplicitTags: null, | ||
|  |     patchFetch: null | ||
|  | }); | ||
|  | function _export(target, all) { | ||
|  |     for(var name in all)Object.defineProperty(target, name, { | ||
|  |         enumerable: true, | ||
|  |         get: all[name] | ||
|  |     }); | ||
|  | } | ||
|  | _export(exports, { | ||
|  |     validateRevalidate: function() { | ||
|  |         return validateRevalidate; | ||
|  |     }, | ||
|  |     validateTags: function() { | ||
|  |         return validateTags; | ||
|  |     }, | ||
|  |     addImplicitTags: function() { | ||
|  |         return addImplicitTags; | ||
|  |     }, | ||
|  |     patchFetch: function() { | ||
|  |         return patchFetch; | ||
|  |     } | ||
|  | }); | ||
|  | const _constants = require("./trace/constants"); | ||
|  | const _tracer = require("./trace/tracer"); | ||
|  | const _constants1 = require("../../lib/constants"); | ||
|  | const _log = /*#__PURE__*/ _interop_require_wildcard(require("../../build/output/log")); | ||
|  | function _getRequireWildcardCache(nodeInterop) { | ||
|  |     if (typeof WeakMap !== "function") return null; | ||
|  |     var cacheBabelInterop = new WeakMap(); | ||
|  |     var cacheNodeInterop = new WeakMap(); | ||
|  |     return (_getRequireWildcardCache = function(nodeInterop) { | ||
|  |         return nodeInterop ? cacheNodeInterop : cacheBabelInterop; | ||
|  |     })(nodeInterop); | ||
|  | } | ||
|  | function _interop_require_wildcard(obj, nodeInterop) { | ||
|  |     if (!nodeInterop && obj && obj.__esModule) { | ||
|  |         return obj; | ||
|  |     } | ||
|  |     if (obj === null || typeof obj !== "object" && typeof obj !== "function") { | ||
|  |         return { | ||
|  |             default: obj | ||
|  |         }; | ||
|  |     } | ||
|  |     var cache = _getRequireWildcardCache(nodeInterop); | ||
|  |     if (cache && cache.has(obj)) { | ||
|  |         return cache.get(obj); | ||
|  |     } | ||
|  |     var newObj = {}; | ||
|  |     var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; | ||
|  |     for(var key in obj){ | ||
|  |         if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { | ||
|  |             var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; | ||
|  |             if (desc && (desc.get || desc.set)) { | ||
|  |                 Object.defineProperty(newObj, key, desc); | ||
|  |             } else { | ||
|  |                 newObj[key] = obj[key]; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     newObj.default = obj; | ||
|  |     if (cache) { | ||
|  |         cache.set(obj, newObj); | ||
|  |     } | ||
|  |     return newObj; | ||
|  | } | ||
|  | const isEdgeRuntime = process.env.NEXT_RUNTIME === "edge"; | ||
|  | function validateRevalidate(revalidateVal, pathname) { | ||
|  |     try { | ||
|  |         let normalizedRevalidate = undefined; | ||
|  |         if (revalidateVal === false) { | ||
|  |             normalizedRevalidate = revalidateVal; | ||
|  |         } else if (typeof revalidateVal === "number" && !isNaN(revalidateVal) && revalidateVal > -1) { | ||
|  |             normalizedRevalidate = revalidateVal; | ||
|  |         } else if (typeof revalidateVal !== "undefined") { | ||
|  |             throw new Error(`Invalid revalidate value "${revalidateVal}" on "${pathname}", must be a non-negative number or "false"`); | ||
|  |         } | ||
|  |         return normalizedRevalidate; | ||
|  |     } catch (err) { | ||
|  |         // handle client component error from attempting to check revalidate value
 | ||
|  |         if (err instanceof Error && err.message.includes("Invalid revalidate")) { | ||
|  |             throw err; | ||
|  |         } | ||
|  |         return undefined; | ||
|  |     } | ||
|  | } | ||
|  | function validateTags(tags, description) { | ||
|  |     const validTags = []; | ||
|  |     const invalidTags = []; | ||
|  |     for (const tag of tags){ | ||
|  |         if (typeof tag !== "string") { | ||
|  |             invalidTags.push({ | ||
|  |                 tag, | ||
|  |                 reason: "invalid type, must be a string" | ||
|  |             }); | ||
|  |         } else if (tag.length > _constants1.NEXT_CACHE_TAG_MAX_LENGTH) { | ||
|  |             invalidTags.push({ | ||
|  |                 tag, | ||
|  |                 reason: `exceeded max length of ${_constants1.NEXT_CACHE_TAG_MAX_LENGTH}` | ||
|  |             }); | ||
|  |         } else { | ||
|  |             validTags.push(tag); | ||
|  |         } | ||
|  |     } | ||
|  |     if (invalidTags.length > 0) { | ||
|  |         console.warn(`Warning: invalid tags passed to ${description}: `); | ||
|  |         for (const { tag, reason } of invalidTags){ | ||
|  |             console.log(`tag: "${tag}" ${reason}`); | ||
|  |         } | ||
|  |     } | ||
|  |     return validTags; | ||
|  | } | ||
|  | const getDerivedTags = (pathname)=>{ | ||
|  |     const derivedTags = [ | ||
|  |         `/layout` | ||
|  |     ]; | ||
|  |     // we automatically add the current path segments as tags
 | ||
|  |     // for revalidatePath handling
 | ||
|  |     if (pathname.startsWith("/")) { | ||
|  |         const pathnameParts = pathname.split("/"); | ||
|  |         for(let i = 1; i < pathnameParts.length + 1; i++){ | ||
|  |             let curPathname = pathnameParts.slice(0, i).join("/"); | ||
|  |             if (curPathname) { | ||
|  |                 // all derived tags other than the page are layout tags
 | ||
|  |                 if (!curPathname.endsWith("/page") && !curPathname.endsWith("/route")) { | ||
|  |                     curPathname = `${curPathname}${!curPathname.endsWith("/") ? "/" : ""}layout`; | ||
|  |                 } | ||
|  |                 derivedTags.push(curPathname); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     return derivedTags; | ||
|  | }; | ||
|  | function addImplicitTags(staticGenerationStore) { | ||
|  |     const newTags = []; | ||
|  |     const { pagePath, urlPathname } = staticGenerationStore; | ||
|  |     if (!Array.isArray(staticGenerationStore.tags)) { | ||
|  |         staticGenerationStore.tags = []; | ||
|  |     } | ||
|  |     if (pagePath) { | ||
|  |         const derivedTags = getDerivedTags(pagePath); | ||
|  |         for (let tag of derivedTags){ | ||
|  |             var _staticGenerationStore_tags; | ||
|  |             tag = `${_constants1.NEXT_CACHE_IMPLICIT_TAG_ID}${tag}`; | ||
|  |             if (!((_staticGenerationStore_tags = staticGenerationStore.tags) == null ? void 0 : _staticGenerationStore_tags.includes(tag))) { | ||
|  |                 staticGenerationStore.tags.push(tag); | ||
|  |             } | ||
|  |             newTags.push(tag); | ||
|  |         } | ||
|  |     } | ||
|  |     if (urlPathname) { | ||
|  |         var _staticGenerationStore_tags1; | ||
|  |         const parsedPathname = new URL(urlPathname, "http://n").pathname; | ||
|  |         const tag = `${_constants1.NEXT_CACHE_IMPLICIT_TAG_ID}${parsedPathname}`; | ||
|  |         if (!((_staticGenerationStore_tags1 = staticGenerationStore.tags) == null ? void 0 : _staticGenerationStore_tags1.includes(tag))) { | ||
|  |             staticGenerationStore.tags.push(tag); | ||
|  |         } | ||
|  |         newTags.push(tag); | ||
|  |     } | ||
|  |     return newTags; | ||
|  | } | ||
|  | function trackFetchMetric(staticGenerationStore, ctx) { | ||
|  |     if (!staticGenerationStore) return; | ||
|  |     if (!staticGenerationStore.fetchMetrics) { | ||
|  |         staticGenerationStore.fetchMetrics = []; | ||
|  |     } | ||
|  |     const dedupeFields = [ | ||
|  |         "url", | ||
|  |         "status", | ||
|  |         "method" | ||
|  |     ]; | ||
|  |     // don't add metric if one already exists for the fetch
 | ||
|  |     if (staticGenerationStore.fetchMetrics.some((metric)=>{ | ||
|  |         return dedupeFields.every((field)=>metric[field] === ctx[field]); | ||
|  |     })) { | ||
|  |         return; | ||
|  |     } | ||
|  |     staticGenerationStore.fetchMetrics.push({ | ||
|  |         url: ctx.url, | ||
|  |         cacheStatus: ctx.cacheStatus, | ||
|  |         cacheReason: ctx.cacheReason, | ||
|  |         status: ctx.status, | ||
|  |         method: ctx.method, | ||
|  |         start: ctx.start, | ||
|  |         end: Date.now(), | ||
|  |         idx: staticGenerationStore.nextFetchId || 0 | ||
|  |     }); | ||
|  | } | ||
|  | function patchFetch({ serverHooks, staticGenerationAsyncStorage }) { | ||
|  |     if (!globalThis._nextOriginalFetch) { | ||
|  |         globalThis._nextOriginalFetch = globalThis.fetch; | ||
|  |     } | ||
|  |     if (globalThis.fetch.__nextPatched) return; | ||
|  |     const { DynamicServerError } = serverHooks; | ||
|  |     const originFetch = globalThis._nextOriginalFetch; | ||
|  |     globalThis.fetch = async (input, init)=>{ | ||
|  |         var _init_method, _this; | ||
|  |         let url; | ||
|  |         try { | ||
|  |             url = new URL(input instanceof Request ? input.url : input); | ||
|  |             url.username = ""; | ||
|  |             url.password = ""; | ||
|  |         } catch  { | ||
|  |             // Error caused by malformed URL should be handled by native fetch
 | ||
|  |             url = undefined; | ||
|  |         } | ||
|  |         const fetchUrl = (url == null ? void 0 : url.href) ?? ""; | ||
|  |         const fetchStart = Date.now(); | ||
|  |         const method = (init == null ? void 0 : (_init_method = init.method) == null ? void 0 : _init_method.toUpperCase()) || "GET"; | ||
|  |         // Do create a new span trace for internal fetches in the
 | ||
|  |         // non-verbose mode.
 | ||
|  |         const isInternal = ((_this = init == null ? void 0 : init.next) == null ? void 0 : _this.internal) === true; | ||
|  |         const hideSpan = process.env.NEXT_OTEL_FETCH_DISABLED === "1"; | ||
|  |         return await (0, _tracer.getTracer)().trace(isInternal ? _constants.NextNodeServerSpan.internalFetch : _constants.AppRenderSpan.fetch, { | ||
|  |             hideSpan, | ||
|  |             kind: _tracer.SpanKind.CLIENT, | ||
|  |             spanName: [ | ||
|  |                 "fetch", | ||
|  |                 method, | ||
|  |                 fetchUrl | ||
|  |             ].filter(Boolean).join(" "), | ||
|  |             attributes: { | ||
|  |                 "http.url": fetchUrl, | ||
|  |                 "http.method": method, | ||
|  |                 "net.peer.name": url == null ? void 0 : url.hostname, | ||
|  |                 "net.peer.port": (url == null ? void 0 : url.port) || undefined | ||
|  |             } | ||
|  |         }, async ()=>{ | ||
|  |             var _getRequestMeta; | ||
|  |             const staticGenerationStore = staticGenerationAsyncStorage.getStore() || (fetch.__nextGetStaticStore == null ? void 0 : fetch.__nextGetStaticStore.call(fetch)); | ||
|  |             const isRequestInput = input && typeof input === "object" && typeof input.method === "string"; | ||
|  |             const getRequestMeta = (field)=>{ | ||
|  |                 // If request input is present but init is not, retrieve from input first.
 | ||
|  |                 const value = init == null ? void 0 : init[field]; | ||
|  |                 return value || (isRequestInput ? input[field] : null); | ||
|  |             }; | ||
|  |             // If the staticGenerationStore is not available, we can't do any
 | ||
|  |             // special treatment of fetch, therefore fallback to the original
 | ||
|  |             // fetch implementation.
 | ||
|  |             if (!staticGenerationStore || isInternal || staticGenerationStore.isDraftMode) { | ||
|  |                 return originFetch(input, init); | ||
|  |             } | ||
|  |             let revalidate = undefined; | ||
|  |             const getNextField = (field)=>{ | ||
|  |                 var _init_next, _init_next1, _input_next; | ||
|  |                 return typeof (init == null ? void 0 : (_init_next = init.next) == null ? void 0 : _init_next[field]) !== "undefined" ? init == null ? void 0 : (_init_next1 = init.next) == null ? void 0 : _init_next1[field] : isRequestInput ? (_input_next = input.next) == null ? void 0 : _input_next[field] : undefined; | ||
|  |             }; | ||
|  |             // RequestInit doesn't keep extra fields e.g. next so it's
 | ||
|  |             // only available if init is used separate
 | ||
|  |             let curRevalidate = getNextField("revalidate"); | ||
|  |             const tags = validateTags(getNextField("tags") || [], `fetch ${input.toString()}`); | ||
|  |             if (Array.isArray(tags)) { | ||
|  |                 if (!staticGenerationStore.tags) { | ||
|  |                     staticGenerationStore.tags = []; | ||
|  |                 } | ||
|  |                 for (const tag of tags){ | ||
|  |                     if (!staticGenerationStore.tags.includes(tag)) { | ||
|  |                         staticGenerationStore.tags.push(tag); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |             const implicitTags = addImplicitTags(staticGenerationStore); | ||
|  |             const isOnlyCache = staticGenerationStore.fetchCache === "only-cache"; | ||
|  |             const isForceCache = staticGenerationStore.fetchCache === "force-cache"; | ||
|  |             const isDefaultCache = staticGenerationStore.fetchCache === "default-cache"; | ||
|  |             const isDefaultNoStore = staticGenerationStore.fetchCache === "default-no-store"; | ||
|  |             const isOnlyNoStore = staticGenerationStore.fetchCache === "only-no-store"; | ||
|  |             const isForceNoStore = staticGenerationStore.fetchCache === "force-no-store"; | ||
|  |             const isUsingNoStore = !!staticGenerationStore.isUnstableNoStore; | ||
|  |             let _cache = getRequestMeta("cache"); | ||
|  |             let cacheReason = ""; | ||
|  |             if (typeof _cache === "string" && typeof curRevalidate !== "undefined") { | ||
|  |                 // when providing fetch with a Request input, it'll automatically set a cache value of 'default'
 | ||
|  |                 // we only want to warn if the user is explicitly setting a cache value
 | ||
|  |                 if (!(isRequestInput && _cache === "default")) { | ||
|  |                     _log.warn(`fetch for ${fetchUrl} on ${staticGenerationStore.urlPathname} specified "cache: ${_cache}" and "revalidate: ${curRevalidate}", only one should be specified.`); | ||
|  |                 } | ||
|  |                 _cache = undefined; | ||
|  |             } | ||
|  |             if (_cache === "force-cache") { | ||
|  |                 curRevalidate = false; | ||
|  |             } else if (_cache === "no-cache" || _cache === "no-store" || isForceNoStore || isOnlyNoStore) { | ||
|  |                 curRevalidate = 0; | ||
|  |             } | ||
|  |             if (_cache === "no-cache" || _cache === "no-store") { | ||
|  |                 cacheReason = `cache: ${_cache}`; | ||
|  |             } | ||
|  |             revalidate = validateRevalidate(curRevalidate, staticGenerationStore.urlPathname); | ||
|  |             const _headers = getRequestMeta("headers"); | ||
|  |             const initHeaders = typeof (_headers == null ? void 0 : _headers.get) === "function" ? _headers : new Headers(_headers || {}); | ||
|  |             const hasUnCacheableHeader = initHeaders.get("authorization") || initHeaders.get("cookie"); | ||
|  |             const isUnCacheableMethod = ![ | ||
|  |                 "get", | ||
|  |                 "head" | ||
|  |             ].includes(((_getRequestMeta = getRequestMeta("method")) == null ? void 0 : _getRequestMeta.toLowerCase()) || "get"); | ||
|  |             // if there are authorized headers or a POST method and
 | ||
|  |             // dynamic data usage was present above the tree we bail
 | ||
|  |             // e.g. if cookies() is used before an authed/POST fetch
 | ||
|  |             const autoNoCache = (hasUnCacheableHeader || isUnCacheableMethod) && staticGenerationStore.revalidate === 0; | ||
|  |             if (isForceNoStore) { | ||
|  |                 cacheReason = "fetchCache = force-no-store"; | ||
|  |             } | ||
|  |             if (isOnlyNoStore) { | ||
|  |                 if (_cache === "force-cache" || typeof revalidate !== "undefined" && (revalidate === false || revalidate > 0)) { | ||
|  |                     throw new Error(`cache: 'force-cache' used on fetch for ${fetchUrl} with 'export const fetchCache = 'only-no-store'`); | ||
|  |                 } | ||
|  |                 cacheReason = "fetchCache = only-no-store"; | ||
|  |             } | ||
|  |             if (isOnlyCache && _cache === "no-store") { | ||
|  |                 throw new Error(`cache: 'no-store' used on fetch for ${fetchUrl} with 'export const fetchCache = 'only-cache'`); | ||
|  |             } | ||
|  |             if (isForceCache && (typeof curRevalidate === "undefined" || curRevalidate === 0)) { | ||
|  |                 cacheReason = "fetchCache = force-cache"; | ||
|  |                 revalidate = false; | ||
|  |             } | ||
|  |             if (typeof revalidate === "undefined") { | ||
|  |                 if (isDefaultCache) { | ||
|  |                     revalidate = false; | ||
|  |                     cacheReason = "fetchCache = default-cache"; | ||
|  |                 } else if (autoNoCache) { | ||
|  |                     revalidate = 0; | ||
|  |                     cacheReason = "auto no cache"; | ||
|  |                 } else if (isDefaultNoStore) { | ||
|  |                     revalidate = 0; | ||
|  |                     cacheReason = "fetchCache = default-no-store"; | ||
|  |                 } else if (isUsingNoStore) { | ||
|  |                     revalidate = 0; | ||
|  |                     cacheReason = "noStore call"; | ||
|  |                 } else { | ||
|  |                     cacheReason = "auto cache"; | ||
|  |                     revalidate = typeof staticGenerationStore.revalidate === "boolean" || typeof staticGenerationStore.revalidate === "undefined" ? false : staticGenerationStore.revalidate; | ||
|  |                 } | ||
|  |             } else if (!cacheReason) { | ||
|  |                 cacheReason = `revalidate: ${revalidate}`; | ||
|  |             } | ||
|  |             if (// when force static is configured we don't bail from
 | ||
|  |             // `revalidate: 0` values
 | ||
|  |             !(staticGenerationStore.forceStatic && revalidate === 0) && // we don't consider autoNoCache to switch to dynamic during
 | ||
|  |             // revalidate although if it occurs during build we do
 | ||
|  |             !autoNoCache && // If the revalidate value isn't currently set or the value is less
 | ||
|  |             // than the current revalidate value, we should update the revalidate
 | ||
|  |             // value.
 | ||
|  |             (typeof staticGenerationStore.revalidate === "undefined" || typeof revalidate === "number" && (staticGenerationStore.revalidate === false || typeof staticGenerationStore.revalidate === "number" && revalidate < staticGenerationStore.revalidate))) { | ||
|  |                 // If we were setting the revalidate value to 0, we should try to
 | ||
|  |                 // postpone instead first.
 | ||
|  |                 if (revalidate === 0) { | ||
|  |                     staticGenerationStore.postpone == null ? void 0 : staticGenerationStore.postpone.call(staticGenerationStore, "revalidate: 0"); | ||
|  |                 } | ||
|  |                 staticGenerationStore.revalidate = revalidate; | ||
|  |             } | ||
|  |             const isCacheableRevalidate = typeof revalidate === "number" && revalidate > 0 || revalidate === false; | ||
|  |             let cacheKey; | ||
|  |             if (staticGenerationStore.incrementalCache && isCacheableRevalidate) { | ||
|  |                 try { | ||
|  |                     cacheKey = await staticGenerationStore.incrementalCache.fetchCacheKey(fetchUrl, isRequestInput ? input : init); | ||
|  |                 } catch (err) { | ||
|  |                     console.error(`Failed to generate cache key for`, input); | ||
|  |                 } | ||
|  |             } | ||
|  |             const fetchIdx = staticGenerationStore.nextFetchId ?? 1; | ||
|  |             staticGenerationStore.nextFetchId = fetchIdx + 1; | ||
|  |             const normalizedRevalidate = typeof revalidate !== "number" ? _constants1.CACHE_ONE_YEAR : revalidate; | ||
|  |             const doOriginalFetch = async (isStale, cacheReasonOverride)=>{ | ||
|  |                 const requestInputFields = [ | ||
|  |                     "cache", | ||
|  |                     "credentials", | ||
|  |                     "headers", | ||
|  |                     "integrity", | ||
|  |                     "keepalive", | ||
|  |                     "method", | ||
|  |                     "mode", | ||
|  |                     "redirect", | ||
|  |                     "referrer", | ||
|  |                     "referrerPolicy", | ||
|  |                     "window", | ||
|  |                     "duplex", | ||
|  |                     // don't pass through signal when revalidating
 | ||
|  |                     ...isStale ? [] : [ | ||
|  |                         "signal" | ||
|  |                     ] | ||
|  |                 ]; | ||
|  |                 if (isRequestInput) { | ||
|  |                     const reqInput = input; | ||
|  |                     const reqOptions = { | ||
|  |                         body: reqInput._ogBody || reqInput.body | ||
|  |                     }; | ||
|  |                     for (const field of requestInputFields){ | ||
|  |                         // @ts-expect-error custom fields
 | ||
|  |                         reqOptions[field] = reqInput[field]; | ||
|  |                     } | ||
|  |                     input = new Request(reqInput.url, reqOptions); | ||
|  |                 } else if (init) { | ||
|  |                     const initialInit = init; | ||
|  |                     init = { | ||
|  |                         body: init._ogBody || init.body | ||
|  |                     }; | ||
|  |                     for (const field of requestInputFields){ | ||
|  |                         // @ts-expect-error custom fields
 | ||
|  |                         init[field] = initialInit[field]; | ||
|  |                     } | ||
|  |                 } | ||
|  |                 // add metadata to init without editing the original
 | ||
|  |                 const clonedInit = { | ||
|  |                     ...init, | ||
|  |                     next: { | ||
|  |                         ...init == null ? void 0 : init.next, | ||
|  |                         fetchType: "origin", | ||
|  |                         fetchIdx | ||
|  |                     } | ||
|  |                 }; | ||
|  |                 return originFetch(input, clonedInit).then(async (res)=>{ | ||
|  |                     if (!isStale) { | ||
|  |                         trackFetchMetric(staticGenerationStore, { | ||
|  |                             start: fetchStart, | ||
|  |                             url: fetchUrl, | ||
|  |                             cacheReason: cacheReasonOverride || cacheReason, | ||
|  |                             cacheStatus: revalidate === 0 || cacheReasonOverride ? "skip" : "miss", | ||
|  |                             status: res.status, | ||
|  |                             method: clonedInit.method || "GET" | ||
|  |                         }); | ||
|  |                     } | ||
|  |                     if (res.status === 200 && staticGenerationStore.incrementalCache && cacheKey && isCacheableRevalidate) { | ||
|  |                         const bodyBuffer = Buffer.from(await res.arrayBuffer()); | ||
|  |                         try { | ||
|  |                             await staticGenerationStore.incrementalCache.set(cacheKey, { | ||
|  |                                 kind: "FETCH", | ||
|  |                                 data: { | ||
|  |                                     headers: Object.fromEntries(res.headers.entries()), | ||
|  |                                     body: bodyBuffer.toString("base64"), | ||
|  |                                     status: res.status, | ||
|  |                                     url: res.url | ||
|  |                                 }, | ||
|  |                                 revalidate: normalizedRevalidate | ||
|  |                             }, { | ||
|  |                                 fetchCache: true, | ||
|  |                                 revalidate, | ||
|  |                                 fetchUrl, | ||
|  |                                 fetchIdx, | ||
|  |                                 tags | ||
|  |                             }); | ||
|  |                         } catch (err) { | ||
|  |                             console.warn(`Failed to set fetch cache`, input, err); | ||
|  |                         } | ||
|  |                         const response = new Response(bodyBuffer, { | ||
|  |                             headers: new Headers(res.headers), | ||
|  |                             status: res.status | ||
|  |                         }); | ||
|  |                         Object.defineProperty(response, "url", { | ||
|  |                             value: res.url | ||
|  |                         }); | ||
|  |                         return response; | ||
|  |                     } | ||
|  |                     return res; | ||
|  |                 }); | ||
|  |             }; | ||
|  |             let handleUnlock = ()=>Promise.resolve(); | ||
|  |             let cacheReasonOverride; | ||
|  |             if (cacheKey && staticGenerationStore.incrementalCache) { | ||
|  |                 handleUnlock = await staticGenerationStore.incrementalCache.lock(cacheKey); | ||
|  |                 const entry = staticGenerationStore.isOnDemandRevalidate ? null : await staticGenerationStore.incrementalCache.get(cacheKey, { | ||
|  |                     kindHint: "fetch", | ||
|  |                     revalidate, | ||
|  |                     fetchUrl, | ||
|  |                     fetchIdx, | ||
|  |                     tags, | ||
|  |                     softTags: implicitTags | ||
|  |                 }); | ||
|  |                 if (entry) { | ||
|  |                     await handleUnlock(); | ||
|  |                 } else { | ||
|  |                     // in dev, incremental cache response will be null in case the browser adds `cache-control: no-cache` in the request headers
 | ||
|  |                     cacheReasonOverride = "cache-control: no-cache (hard refresh)"; | ||
|  |                 } | ||
|  |                 if ((entry == null ? void 0 : entry.value) && entry.value.kind === "FETCH") { | ||
|  |                     // when stale and is revalidating we wait for fresh data
 | ||
|  |                     // so the revalidated entry has the updated data
 | ||
|  |                     if (!(staticGenerationStore.isRevalidate && entry.isStale)) { | ||
|  |                         if (entry.isStale) { | ||
|  |                             staticGenerationStore.pendingRevalidates ??= {}; | ||
|  |                             if (!staticGenerationStore.pendingRevalidates[cacheKey]) { | ||
|  |                                 staticGenerationStore.pendingRevalidates[cacheKey] = doOriginalFetch(true).catch(console.error); | ||
|  |                             } | ||
|  |                         } | ||
|  |                         const resData = entry.value.data; | ||
|  |                         trackFetchMetric(staticGenerationStore, { | ||
|  |                             start: fetchStart, | ||
|  |                             url: fetchUrl, | ||
|  |                             cacheReason, | ||
|  |                             cacheStatus: "hit", | ||
|  |                             status: resData.status || 200, | ||
|  |                             method: (init == null ? void 0 : init.method) || "GET" | ||
|  |                         }); | ||
|  |                         const response = new Response(Buffer.from(resData.body, "base64"), { | ||
|  |                             headers: resData.headers, | ||
|  |                             status: resData.status | ||
|  |                         }); | ||
|  |                         Object.defineProperty(response, "url", { | ||
|  |                             value: entry.value.data.url | ||
|  |                         }); | ||
|  |                         return response; | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |             if (staticGenerationStore.isStaticGeneration && init && typeof init === "object") { | ||
|  |                 const { cache } = init; | ||
|  |                 // Delete `cache` property as Cloudflare Workers will throw an error
 | ||
|  |                 if (isEdgeRuntime) delete init.cache; | ||
|  |                 if (!staticGenerationStore.forceStatic && cache === "no-store") { | ||
|  |                     const dynamicUsageReason = `no-store fetch ${input}${staticGenerationStore.urlPathname ? ` ${staticGenerationStore.urlPathname}` : ""}`; | ||
|  |                     // If enabled, we should bail out of static generation.
 | ||
|  |                     staticGenerationStore.postpone == null ? void 0 : staticGenerationStore.postpone.call(staticGenerationStore, dynamicUsageReason); | ||
|  |                     // PPR is not enabled, or React postpone is not available, we
 | ||
|  |                     // should set the revalidate to 0.
 | ||
|  |                     staticGenerationStore.revalidate = 0; | ||
|  |                     const err = new DynamicServerError(dynamicUsageReason); | ||
|  |                     staticGenerationStore.dynamicUsageErr = err; | ||
|  |                     staticGenerationStore.dynamicUsageDescription = dynamicUsageReason; | ||
|  |                 } | ||
|  |                 const hasNextConfig = "next" in init; | ||
|  |                 const { next = {} } = init; | ||
|  |                 if (typeof next.revalidate === "number" && (typeof staticGenerationStore.revalidate === "undefined" || typeof staticGenerationStore.revalidate === "number" && next.revalidate < staticGenerationStore.revalidate)) { | ||
|  |                     if (!staticGenerationStore.forceDynamic && !staticGenerationStore.forceStatic && next.revalidate === 0) { | ||
|  |                         const dynamicUsageReason = `revalidate: 0 fetch ${input}${staticGenerationStore.urlPathname ? ` ${staticGenerationStore.urlPathname}` : ""}`; | ||
|  |                         // If enabled, we should bail out of static generation.
 | ||
|  |                         staticGenerationStore.postpone == null ? void 0 : staticGenerationStore.postpone.call(staticGenerationStore, dynamicUsageReason); | ||
|  |                         const err = new DynamicServerError(dynamicUsageReason); | ||
|  |                         staticGenerationStore.dynamicUsageErr = err; | ||
|  |                         staticGenerationStore.dynamicUsageDescription = dynamicUsageReason; | ||
|  |                     } | ||
|  |                     if (!staticGenerationStore.forceStatic || next.revalidate !== 0) { | ||
|  |                         staticGenerationStore.revalidate = next.revalidate; | ||
|  |                     } | ||
|  |                 } | ||
|  |                 if (hasNextConfig) delete init.next; | ||
|  |             } | ||
|  |             return doOriginalFetch(false, cacheReasonOverride).finally(handleUnlock); | ||
|  |         }); | ||
|  |     }; | ||
|  |     globalThis.fetch.__nextGetStaticStore = ()=>{ | ||
|  |         return staticGenerationAsyncStorage; | ||
|  |     }; | ||
|  |     globalThis.fetch.__nextPatched = true; | ||
|  | } | ||
|  | 
 | ||
|  | //# sourceMappingURL=patch-fetch.js.map
 |