UNPKG

next

Version:

The React Framework

109 lines (108 loc) 4.75 kB
import { workAsyncStorage } from '../app-render/work-async-storage.external'; import { postponeWithTracking } from '../app-render/dynamic-rendering'; import { throwInvariantForMissingStore, workUnitAsyncStorage } from '../app-render/work-unit-async-storage.external'; import { delayUntilRuntimeStage, makeHangingPromise } from '../dynamic-rendering-utils'; import { InvariantError } from '../../shared/lib/invariant-error'; export function createServerPathnameForMetadata(underlyingPathname) { const workStore = workAsyncStorage.getStore(); if (!workStore) { throw Object.defineProperty(new InvariantError('Expected workStore to be initialized'), "__NEXT_ERROR_CODE", { value: "E1068", enumerable: false, configurable: true }); } const workUnitStore = workUnitAsyncStorage.getStore(); if (workUnitStore) { switch(workUnitStore.type){ case 'prerender': case 'prerender-ppr': case 'prerender-legacy': { return createPrerenderPathname(underlyingPathname, workStore, workUnitStore); } case 'prerender-client': case 'validation-client': throw Object.defineProperty(new InvariantError('createServerPathnameForMetadata should not be called in client contexts.'), "__NEXT_ERROR_CODE", { value: "E1065", enumerable: false, configurable: true }); case 'cache': case 'private-cache': case 'unstable-cache': throw Object.defineProperty(new InvariantError('createServerPathnameForMetadata should not be called in cache contexts.'), "__NEXT_ERROR_CODE", { value: "E740", enumerable: false, configurable: true }); case 'generate-static-params': throw Object.defineProperty(new InvariantError('createServerPathnameForMetadata should not be called inside generateStaticParams.'), "__NEXT_ERROR_CODE", { value: "E1129", enumerable: false, configurable: true }); case 'prerender-runtime': return delayUntilRuntimeStage(workUnitStore, createRenderPathname(underlyingPathname)); case 'request': return createRenderPathname(underlyingPathname); default: workUnitStore; } } throwInvariantForMissingStore(); } function createPrerenderPathname(underlyingPathname, workStore, prerenderStore) { switch(prerenderStore.type){ case 'prerender': { const fallbackParams = prerenderStore.fallbackRouteParams; if (fallbackParams && fallbackParams.size > 0) { return makeHangingPromise(prerenderStore.renderSignal, workStore.route, '`pathname`'); } break; } case 'prerender-ppr': { const fallbackParams = prerenderStore.fallbackRouteParams; if (fallbackParams && fallbackParams.size > 0) { return makeErroringPathname(workStore, prerenderStore.dynamicTracking); } break; } case 'prerender-legacy': break; default: prerenderStore; } // We don't have any fallback params so we have an entirely static safe params object return Promise.resolve(underlyingPathname); } function makeErroringPathname(workStore, dynamicTracking) { let reject = null; const promise = new Promise((_, re)=>{ reject = re; }); const originalThen = promise.then.bind(promise); // We instrument .then so that we can generate a tracking event only if you actually // await this promise, not just that it is created. promise.then = (onfulfilled, onrejected)=>{ if (reject) { try { postponeWithTracking(workStore.route, 'metadata relative url resolving', dynamicTracking); } catch (error) { reject(error); reject = null; } } return originalThen(onfulfilled, onrejected); }; // We wrap in a noop proxy to trick the runtime into thinking it // isn't a native promise (it's not really). This is so that awaiting // the promise will call the `then` property triggering the lazy postpone return new Proxy(promise, {}); } function createRenderPathname(underlyingPathname) { return Promise.resolve(underlyingPathname); } //# sourceMappingURL=pathname.js.map