next
Version:
The React Framework
285 lines (284 loc) • 12.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
ClientHookDynamicError: null,
RENDER_STAGES_BY_DATA_KIND: null,
applyOwnerStack: null,
isClientHookDynamicError: null,
isHangingPromiseRejectionError: null,
makeClientHookHangingPromise: null,
makeDevtoolsIOAwarePromise: null,
makeDynamicHangingPromise: null,
makeFallbackParamsHangingPromise: null,
makePromiseFromTrigger: null,
makeRuntimeHangingPromise: null,
makeStageHangingPromise: null,
makeUntrackedHangingPromise: null,
trackFallbackParamsAccessed: null,
trackRuntimeDataAccessed: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
ClientHookDynamicError: function() {
return ClientHookDynamicError;
},
RENDER_STAGES_BY_DATA_KIND: function() {
return RENDER_STAGES_BY_DATA_KIND;
},
applyOwnerStack: function() {
return applyOwnerStack;
},
isClientHookDynamicError: function() {
return isClientHookDynamicError;
},
isHangingPromiseRejectionError: function() {
return isHangingPromiseRejectionError;
},
makeClientHookHangingPromise: function() {
return makeClientHookHangingPromise;
},
makeDevtoolsIOAwarePromise: function() {
return makeDevtoolsIOAwarePromise;
},
makeDynamicHangingPromise: function() {
return makeDynamicHangingPromise;
},
makeFallbackParamsHangingPromise: function() {
return makeFallbackParamsHangingPromise;
},
makePromiseFromTrigger: function() {
return makePromiseFromTrigger;
},
makeRuntimeHangingPromise: function() {
return makeRuntimeHangingPromise;
},
makeStageHangingPromise: function() {
return makeStageHangingPromise;
},
makeUntrackedHangingPromise: function() {
return makeUntrackedHangingPromise;
},
trackFallbackParamsAccessed: function() {
return trackFallbackParamsAccessed;
},
trackRuntimeDataAccessed: function() {
return trackRuntimeDataAccessed;
}
});
const _stagedrendering = require("./app-render/staged-rendering");
const _workunitasyncstorageexternal = require("./app-render/work-unit-async-storage.external");
const _runtimereactsexternal = require("./runtime-reacts.external");
function isHangingPromiseRejectionError(err) {
if (typeof err !== 'object' || err === null || !('digest' in err)) {
return false;
}
return err.digest === HANGING_PROMISE_REJECTION;
}
const HANGING_PROMISE_REJECTION = 'HANGING_PROMISE_REJECTION';
class HangingPromiseRejectionError extends Error {
constructor(route, expression){
super(`During prerendering, ${expression} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${expression} to a different context by using \`setTimeout\`, \`after\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route "${route}".`), this.route = route, this.expression = expression, this.digest = HANGING_PROMISE_REJECTION;
}
}
const CLIENT_HOOK_DYNAMIC = 'CLIENT_HOOK_DYNAMIC';
class ClientHookDynamicError extends Error {
constructor(route, expression){
super(`Route "${route}": Next.js encountered URL data \`${expression}\` in a Client Component outside of \`<Suspense>\`.\n\n` + `This blocks prerendering because the value is only available at runtime.\n\n` + `Ways to fix this:\n` + ` - [stream] Wrap the component in \`<Suspense fallback={...}>\` so the hook value streams in after prerendering\n` + ` - [block] Set \`export const instant = false\` to allow a blocking route\n\n` + `Learn more: https://nextjs.org/docs/messages/blocking-prerender-client-hook`), this.digest = CLIENT_HOOK_DYNAMIC;
Object.defineProperty(this, "__NEXT_ERROR_CODE", {
value: "E1433",
enumerable: false,
configurable: true
});
}
}
function isClientHookDynamicError(err) {
if (typeof err !== 'object' || err === null || !('digest' in err)) {
return false;
}
return err.digest === CLIENT_HOOK_DYNAMIC;
}
const abortListenersBySignal = new WeakMap();
function makeDynamicHangingPromise(signal, route, expression) {
return makeHangingPromiseWithError(signal, new HangingPromiseRejectionError(route, expression));
}
function makeUntrackedHangingPromise(signal, route, expression) {
return makeHangingPromiseWithError(signal, new HangingPromiseRejectionError(route, expression));
}
function makeRuntimeHangingPromise(signal, route, expression, workUnitStore) {
if (workUnitStore !== null) {
trackRuntimeDataAccessed(workUnitStore);
}
return makeHangingPromiseWithError(signal, new HangingPromiseRejectionError(route, expression));
}
function makeFallbackParamsHangingPromise(signal, route, expression, workUnitStore) {
if (workUnitStore !== null) {
trackFallbackParamsAccessed(workUnitStore);
}
return makeHangingPromiseWithError(signal, new HangingPromiseRejectionError(route, expression));
}
function makeStageHangingPromise(signal, route, expression, workUnitStore) {
trackRuntimeDataAccessed(workUnitStore);
return makeHangingPromiseWithError(signal, new HangingPromiseRejectionError(route, expression));
}
function trackRuntimeDataAccessed(workUnitStore) {
trackRuntimeDataAccessedImpl(workUnitStore, false);
}
function trackFallbackParamsAccessed(workUnitStore) {
trackRuntimeDataAccessedImpl(workUnitStore, true);
}
function trackRuntimeDataAccessedImpl(workUnitStore, isFallbackParamAccess) {
switch(workUnitStore.type){
case 'prerender':
{
var // Response-level flag (the payload's `u`, forwarded to segment
// responses as `needsRuntimeRequest`): resolved for every kind of
// access — a pre-upgrade fallback response must keep reporting that
// a runtime request would return more. The fulfillment row lands at
// the current position in the Flight stream, which is what makes the
// value rewindable per stage. Promise resolution is idempotent, so
// repeated accesses are free.
_workUnitStore_runtimeDataAccessed;
(_workUnitStore_runtimeDataAccessed = workUnitStore.runtimeDataAccessed) == null ? void 0 : _workUnitStore_runtimeDataAccessed.resolve(true);
// Hint cell (holds the build-constant
// PrefetchHint.ShouldAttemptStaticPrefetch value directly): a
// fallback-param access is transient when the route is
// fallback-upgradeable — ISR later produces the concrete prerender a
// static prefetch attempt would hit — so it leaves the hint intact.
// (Until that upgrade, the response-level flag above keeps directing
// the client to a runtime fallback; the hint only costs a wasted
// static attempt in the interim.) Every other access clears it.
const hintCell = workUnitStore.shouldAttemptStaticPrefetch;
if (hintCell !== null && (!isFallbackParamAccess || !workUnitStore.isFallbackUpgradeable)) {
hintCell.current = false;
}
break;
}
case 'prerender-client':
case 'prerender-ppr':
case 'prerender-legacy':
case 'prerender-runtime':
case 'validation-client':
case 'request':
case 'cache':
case 'private-cache':
case 'unstable-cache':
case 'generate-static-params':
break;
default:
workUnitStore;
}
}
function makeClientHookHangingPromise(signal, error) {
return makeHangingPromiseWithError(signal, error);
}
function makeHangingPromiseWithError(signal, error) {
if (signal.aborted) {
return Promise.reject(error);
} else {
const hangingPromise = new Promise((_, reject)=>{
const boundRejection = reject.bind(null, error);
let currentListeners = abortListenersBySignal.get(signal);
if (currentListeners) {
currentListeners.push(boundRejection);
} else {
const listeners = [
boundRejection
];
abortListenersBySignal.set(signal, listeners);
signal.addEventListener('abort', ()=>{
for(let i = 0; i < listeners.length; i++){
listeners[i]();
}
}, {
once: true
});
}
});
// We are fine if no one actually awaits this promise. We shouldn't consider this an unhandled rejection so
// we attach a noop catch handler here to suppress this warning. If you actually await somewhere or construct
// your own promise out of it you'll need to ensure you handle the error when it rejects.
hangingPromise.catch(ignoreReject);
return hangingPromise;
}
}
function ignoreReject() {}
function makePromiseFromTrigger(trigger, value) {
const promise = trigger.then(()=>value);
promise.catch(ignoreReject);
return promise;
}
function makeDevtoolsIOAwarePromise(underlying, requestStore, stage) {
if (requestStore.stagedRendering) {
// We resolve each stage in a timeout, so React DevTools will pick this up as IO.
return requestStore.stagedRendering.delayUntilStage(stage, undefined, underlying);
}
// in React DevTools if we resolve in a setTimeout we will observe
// the promise resolution as something that can suspend a boundary or root.
return new Promise((resolve)=>{
// Must use setTimeout to be considered IO React DevTools. setImmediate will not work.
setTimeout(()=>{
resolve(underlying);
}, 0);
});
}
const RENDER_STAGES_BY_DATA_KIND = {
sessionData: _stagedrendering.RenderStage.ShellRuntime,
staticLinkData: _stagedrendering.RenderStage.Static,
runtimeLinkData: _stagedrendering.RenderStage.Runtime
};
function applyOwnerStack(error) {
if (process.env.NODE_ENV !== 'production') {
var _getClientReact_captureOwnerStack, _getClientReact, _getServerReact_captureOwnerStack, _getServerReact;
let ownerStack;
const workUnitStore = _workunitasyncstorageexternal.workUnitAsyncStorage.getStore();
// captureOwnerStack() returns the owner stack for the current React
// rendering context. Inside a cache scope this only includes the inner
// component tree. The outer owner stack (captured before entering the
// cache boundary in use-cache-wrapper.ts) is stored on the cache store.
// We concatenate both to get the full component tree.
const innerOwnerStack = ((_getClientReact = (0, _runtimereactsexternal.getClientReact)()) == null ? void 0 : (_getClientReact_captureOwnerStack = _getClientReact.captureOwnerStack) == null ? void 0 : _getClientReact_captureOwnerStack.call(_getClientReact)) ?? ((_getServerReact = (0, _runtimereactsexternal.getServerReact)()) == null ? void 0 : (_getServerReact_captureOwnerStack = _getServerReact.captureOwnerStack) == null ? void 0 : _getServerReact_captureOwnerStack.call(_getServerReact));
switch(workUnitStore == null ? void 0 : workUnitStore.type){
case 'cache':
case 'private-cache':
ownerStack = (innerOwnerStack || '') + (workUnitStore.outerOwnerStack || '') || undefined;
break;
case 'unstable-cache':
case 'request':
case 'prerender':
case 'prerender-ppr':
case 'prerender-legacy':
case 'prerender-runtime':
case 'prerender-client':
case 'validation-client':
case 'generate-static-params':
case undefined:
ownerStack = innerOwnerStack;
break;
default:
workUnitStore;
}
if (ownerStack) {
let stack = ownerStack;
if (error.stack) {
const frames = [];
for (const frame of error.stack.split('\n').slice(1)){
if (frame.includes('react_stack_bottom_frame')) {
break;
}
frames.push(frame);
}
stack = '\n' + frames.join('\n') + stack;
}
error.stack = error.name + ': ' + error.message + stack;
}
}
return error;
}
//# sourceMappingURL=dynamic-rendering-utils.js.map