UNPKG

@pwrdrvr/microapps-app-release-cdk

Version:

Release app for the MicroApps framework, by PwrDrvr LLC. Provides the ability to control which version of an app is launched.

1,305 lines (1,141 loc) 74 kB
/** * @license React * react-server-dom-webpack-writer.browser.development.server.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ 'use strict'; if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; var React = require('react'); var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; function error(format) { { { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } printWarning('error', format, args); } } } function printWarning(level, format, args) { // When changing this logic, you might want to also // update consoleWithStackDev.www.js as well. { var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; var stack = ReactDebugCurrentFrame.getStackAddendum(); if (stack !== '') { format += '%s'; args = args.concat([stack]); } // eslint-disable-next-line react-internal/safe-string-coercion var argsWithFormat = args.map(function (item) { return String(item); }); // Careful: RN currently depends on this prefix argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it // breaks IE9: https://github.com/facebook/react/issues/13610 // eslint-disable-next-line react-internal/no-production-logging Function.prototype.apply.call(console[level], console, argsWithFormat); } } function scheduleWork(callback) { callback(); } var VIEW_SIZE = 512; var currentView = null; var writtenBytes = 0; function beginWriting(destination) { currentView = new Uint8Array(VIEW_SIZE); writtenBytes = 0; } function writeChunk(destination, chunk) { if (chunk.length === 0) { return; } if (chunk.length > VIEW_SIZE) { // this chunk may overflow a single view which implies it was not // one that is cached by the streaming renderer. We will enqueu // it directly and expect it is not re-used if (writtenBytes > 0) { destination.enqueue(new Uint8Array(currentView.buffer, 0, writtenBytes)); currentView = new Uint8Array(VIEW_SIZE); writtenBytes = 0; } destination.enqueue(chunk); return; } var bytesToWrite = chunk; var allowableBytes = currentView.length - writtenBytes; if (allowableBytes < bytesToWrite.length) { // this chunk would overflow the current view. We enqueue a full view // and start a new view with the remaining chunk if (allowableBytes === 0) { // the current view is already full, send it destination.enqueue(currentView); } else { // fill up the current view and apply the remaining chunk bytes // to a new view. currentView.set(bytesToWrite.subarray(0, allowableBytes), writtenBytes); // writtenBytes += allowableBytes; // this can be skipped because we are going to immediately reset the view destination.enqueue(currentView); bytesToWrite = bytesToWrite.subarray(allowableBytes); } currentView = new Uint8Array(VIEW_SIZE); writtenBytes = 0; } currentView.set(bytesToWrite, writtenBytes); writtenBytes += bytesToWrite.length; } function writeChunkAndReturn(destination, chunk) { writeChunk(destination, chunk); // in web streams there is no backpressure so we can alwas write more return true; } function completeWriting(destination) { if (currentView && writtenBytes > 0) { destination.enqueue(new Uint8Array(currentView.buffer, 0, writtenBytes)); currentView = null; writtenBytes = 0; } } function close(destination) { destination.close(); } var textEncoder = new TextEncoder(); function stringToChunk(content) { return textEncoder.encode(content); } function stringToPrecomputedChunk(content) { return textEncoder.encode(content); } function closeWithError(destination, error) { if (typeof destination.error === 'function') { // $FlowFixMe: This is an Error object or the destination accepts other types. destination.error(error); } else { // Earlier implementations doesn't support this method. In that environment you're // supposed to throw from a promise returned but we don't return a promise in our // approach. We could fork this implementation but this is environment is an edge // case to begin with. It's even less common to run this in an older environment. // Even then, this is not where errors are supposed to happen and they get reported // to a global callback in addition to this anyway. So it's fine just to close this. destination.close(); } } // This file is an intermediate layer to translate between Flight var stringify = JSON.stringify; function serializeRowHeader(tag, id) { return tag + id.toString(16) + ':'; } function processErrorChunk(request, id, message, stack) { var errorInfo = { message: message, stack: stack }; var row = serializeRowHeader('E', id) + stringify(errorInfo) + '\n'; return stringToChunk(row); } function processModelChunk(request, id, model) { // $FlowFixMe: `json` might be `undefined` when model is a symbol. var json = stringify(model, request.toJSON); var row = serializeRowHeader('J', id) + json + '\n'; return stringToChunk(row); } function processReferenceChunk(request, id, reference) { var json = stringify(reference); var row = serializeRowHeader('J', id) + json + '\n'; return stringToChunk(row); } function processModuleChunk(request, id, moduleMetaData) { // $FlowFixMe: `json` might be `undefined` when moduleMetaData is a symbol. var json = stringify(moduleMetaData); var row = serializeRowHeader('M', id) + json + '\n'; return stringToChunk(row); } function processProviderChunk(request, id, contextName) { var row = serializeRowHeader('P', id) + contextName + '\n'; return stringToChunk(row); } function processSymbolChunk(request, id, name) { var json = stringify(name); var row = serializeRowHeader('S', id) + json + '\n'; return stringToChunk(row); } // eslint-disable-next-line no-unused-vars var MODULE_TAG = Symbol.for('react.module.reference'); function getModuleKey(reference) { return reference.filepath + '#' + reference.name + (reference.async ? '#async' : ''); } function isModuleReference(reference) { return reference.$$typeof === MODULE_TAG; } function resolveModuleMetaData(config, moduleReference) { var resolvedModuleData = config[moduleReference.filepath][moduleReference.name]; if (moduleReference.async) { return { id: resolvedModuleData.id, chunks: resolvedModuleData.chunks, name: resolvedModuleData.name, async: true }; } else { return resolvedModuleData; } } // ATTENTION // When adding new symbols to this file, // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' // The Symbol used to tag the ReactElement-like types. var REACT_ELEMENT_TYPE = Symbol.for('react.element'); var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); var REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context'); var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); var REACT_MEMO_TYPE = Symbol.for('react.memo'); var REACT_LAZY_TYPE = Symbol.for('react.lazy'); var REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = Symbol.for('react.default_value'); // A reserved attribute. // It is handled by React separately and shouldn't be written to the DOM. var RESERVED = 0; // A simple string attribute. // Attributes that aren't in the filter are presumed to have this type. var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called // "enumerated" attributes with "true" and "false" as possible values. // When true, it should be set to a "true" string. // When false, it should be set to a "false" string. var BOOLEANISH_STRING = 2; // A real boolean attribute. // When true, it should be present (set either to an empty string or its name). // When false, it should be omitted. var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. // When true, it should be present (set either to an empty string or its name). // When false, it should be omitted. // For any other value, should be present with that value. var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. // When falsy, it should be removed. var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. // When falsy, it should be removed. var POSITIVE_NUMERIC = 6; function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) { this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; this.attributeName = attributeName; this.attributeNamespace = attributeNamespace; this.mustUseProperty = mustUseProperty; this.propertyName = name; this.type = type; this.sanitizeURL = sanitizeURL; this.removeEmptyString = removeEmptyString; } // When adding attributes to this list, be sure to also add them to // the `possibleStandardNames` module to ensure casing and incorrect // name warnings. var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular // elements (not just inputs). Now that ReactDOMInput assigns to the // defaultValue property -- do we need this? 'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style']; { reservedProps.push('innerText', 'textContent'); } reservedProps.forEach(function (name) { properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty name, // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // A few React string attributes have a different name. // This is a mapping from React prop names to the attribute names. [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { var name = _ref[0], attributeName = _ref[1]; properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are "enumerated" HTML attributes that accept "true" and "false". // In React, we let users pass `true` and `false` even though technically // these aren't boolean attributes (they are coerced to strings). ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty name.toLowerCase(), // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are "enumerated" SVG attributes that accept "true" and "false". // In React, we let users pass `true` and `false` even though technically // these aren't boolean attributes (they are coerced to strings). // Since these are SVG attributes, their attribute names are case-sensitive. ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty name, // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are HTML boolean attributes. ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM // on the client side because the browsers are inconsistent. Instead we call focus(). 'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata 'itemScope'].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty name.toLowerCase(), // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are the few React props that we set as DOM properties // rather than attributes. These are all booleans. ['checked', // Note: `option.selected` is not updated if `select.multiple` is // disabled with `removeAttribute`. We have special logic for handling this. 'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list, // you'll need to set attributeName to name.toLowerCase() // instead in the assignment below. ].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty name, // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are HTML attributes that are "overloaded booleans": they behave like // booleans, but can also accept a string value. ['capture', 'download' // NOTE: if you add a camelCased prop to this list, // you'll need to set attributeName to name.toLowerCase() // instead in the assignment below. ].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty name, // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are HTML attributes that must be positive numbers. ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list, // you'll need to set attributeName to name.toLowerCase() // instead in the assignment below. ].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty name, // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These are HTML attributes that must be numbers. ['rowSpan', 'start'].forEach(function (name) { properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty name.toLowerCase(), // attributeName null, // attributeNamespace false, // sanitizeURL false); }); var CAMELIZE = /[\-\:]([a-z])/g; var capitalize = function (token) { return token[1].toUpperCase(); }; // This is a list of all SVG attributes that need special casing, namespacing, // or boolean value assignment. Regular attributes that just accept strings // and have the same names are omitted, just like in the HTML attribute filter. // Some of these attributes can be hard to find. This list was created by // scraping the MDN documentation. ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list, // you'll need to set attributeName to name.toLowerCase() // instead in the assignment below. ].forEach(function (attributeName) { var name = attributeName.replace(CAMELIZE, capitalize); properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, null, // attributeNamespace false, // sanitizeURL false); }); // String SVG attributes with the xlink namespace. ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list, // you'll need to set attributeName to name.toLowerCase() // instead in the assignment below. ].forEach(function (attributeName) { var name = attributeName.replace(CAMELIZE, capitalize); properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL false); }); // String SVG attributes with the xml namespace. ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list, // you'll need to set attributeName to name.toLowerCase() // instead in the assignment below. ].forEach(function (attributeName) { var name = attributeName.replace(CAMELIZE, capitalize); properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL false); }); // These attribute exists both in HTML and SVG. // The attribute name is case-sensitive in SVG so we can't just use // the React name like we do for attributes that exist only in HTML. ['tabIndex', 'crossOrigin'].forEach(function (attributeName) { properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty attributeName.toLowerCase(), // attributeName null, // attributeNamespace false, // sanitizeURL false); }); // These attributes accept URLs. These must not allow javascript: URLS. // These will also need to accept Trusted Types object in the future. var xlinkHref = 'xlinkHref'; properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty 'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL false); ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty attributeName.toLowerCase(), // attributeName null, // attributeNamespace true, // sanitizeURL true); }); /** * CSS properties which accept numbers but are not in units of "px". */ var isUnitlessNumber = { animationIterationCount: true, aspectRatio: true, borderImageOutset: true, borderImageSlice: true, borderImageWidth: true, boxFlex: true, boxFlexGroup: true, boxOrdinalGroup: true, columnCount: true, columns: true, flex: true, flexGrow: true, flexPositive: true, flexShrink: true, flexNegative: true, flexOrder: true, gridArea: true, gridRow: true, gridRowEnd: true, gridRowSpan: true, gridRowStart: true, gridColumn: true, gridColumnEnd: true, gridColumnSpan: true, gridColumnStart: true, fontWeight: true, lineClamp: true, lineHeight: true, opacity: true, order: true, orphans: true, tabSize: true, widows: true, zIndex: true, zoom: true, // SVG-related properties fillOpacity: true, floodOpacity: true, stopOpacity: true, strokeDasharray: true, strokeDashoffset: true, strokeMiterlimit: true, strokeOpacity: true, strokeWidth: true }; /** * @param {string} prefix vendor-specific prefix, eg: Webkit * @param {string} key style name, eg: transitionDuration * @return {string} style name prefixed with `prefix`, properly camelCased, eg: * WebkitTransitionDuration */ function prefixKey(prefix, key) { return prefix + key.charAt(0).toUpperCase() + key.substring(1); } /** * Support style names that may come passed in prefixed by adding permutations * of vendor prefixes. */ var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an // infinite loop, because it iterates over the newly added props too. Object.keys(isUnitlessNumber).forEach(function (prop) { prefixes.forEach(function (prefix) { isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; }); }); var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare function isArray(a) { return isArrayImpl(a); } var startInlineScript = stringToPrecomputedChunk('<script>'); var endInlineScript = stringToPrecomputedChunk('</script>'); var startScriptSrc = stringToPrecomputedChunk('<script src="'); var startModuleSrc = stringToPrecomputedChunk('<script type="module" src="'); var scriptIntegirty = stringToPrecomputedChunk('" integrity="'); var endAsyncScript = stringToPrecomputedChunk('" async=""></script>'); var textSeparator = stringToPrecomputedChunk('<!-- -->'); var styleAttributeStart = stringToPrecomputedChunk(' style="'); var styleAssign = stringToPrecomputedChunk(':'); var styleSeparator = stringToPrecomputedChunk(';'); var attributeSeparator = stringToPrecomputedChunk(' '); var attributeAssign = stringToPrecomputedChunk('="'); var attributeEnd = stringToPrecomputedChunk('"'); var attributeEmptyString = stringToPrecomputedChunk('=""'); var endOfStartTag = stringToPrecomputedChunk('>'); var endOfStartTagSelfClosing = stringToPrecomputedChunk('/>'); var selectedMarkerAttribute = stringToPrecomputedChunk(' selected=""'); var leadingNewline = stringToPrecomputedChunk('\n'); var DOCTYPE = stringToPrecomputedChunk('<!DOCTYPE html>'); var endTag1 = stringToPrecomputedChunk('</'); var endTag2 = stringToPrecomputedChunk('>'); // A placeholder is a node inside a hidden partial tree that can be filled in later, but before // display. It's never visible to users. We use the template tag because it can be used in every // type of parent. <script> tags also work in every other tag except <colgroup>. var placeholder1 = stringToPrecomputedChunk('<template id="'); var placeholder2 = stringToPrecomputedChunk('"></template>'); var startCompletedSuspenseBoundary = stringToPrecomputedChunk('<!--$-->'); var startPendingSuspenseBoundary1 = stringToPrecomputedChunk('<!--$?--><template id="'); var startPendingSuspenseBoundary2 = stringToPrecomputedChunk('"></template>'); var startClientRenderedSuspenseBoundary = stringToPrecomputedChunk('<!--$!-->'); var endSuspenseBoundary = stringToPrecomputedChunk('<!--/$-->'); var clientRenderedSuspenseBoundaryError1 = stringToPrecomputedChunk('<template'); var clientRenderedSuspenseBoundaryErrorAttrInterstitial = stringToPrecomputedChunk('"'); var clientRenderedSuspenseBoundaryError1A = stringToPrecomputedChunk(' data-dgst="'); var clientRenderedSuspenseBoundaryError1B = stringToPrecomputedChunk(' data-msg="'); var clientRenderedSuspenseBoundaryError1C = stringToPrecomputedChunk(' data-stck="'); var clientRenderedSuspenseBoundaryError2 = stringToPrecomputedChunk('></template>'); var startSegmentHTML = stringToPrecomputedChunk('<div hidden id="'); var startSegmentHTML2 = stringToPrecomputedChunk('">'); var endSegmentHTML = stringToPrecomputedChunk('</div>'); var startSegmentSVG = stringToPrecomputedChunk('<svg aria-hidden="true" style="display:none" id="'); var startSegmentSVG2 = stringToPrecomputedChunk('">'); var endSegmentSVG = stringToPrecomputedChunk('</svg>'); var startSegmentMathML = stringToPrecomputedChunk('<math aria-hidden="true" style="display:none" id="'); var startSegmentMathML2 = stringToPrecomputedChunk('">'); var endSegmentMathML = stringToPrecomputedChunk('</math>'); var startSegmentTable = stringToPrecomputedChunk('<table hidden id="'); var startSegmentTable2 = stringToPrecomputedChunk('">'); var endSegmentTable = stringToPrecomputedChunk('</table>'); var startSegmentTableBody = stringToPrecomputedChunk('<table hidden><tbody id="'); var startSegmentTableBody2 = stringToPrecomputedChunk('">'); var endSegmentTableBody = stringToPrecomputedChunk('</tbody></table>'); var startSegmentTableRow = stringToPrecomputedChunk('<table hidden><tr id="'); var startSegmentTableRow2 = stringToPrecomputedChunk('">'); var endSegmentTableRow = stringToPrecomputedChunk('</tr></table>'); var startSegmentColGroup = stringToPrecomputedChunk('<table hidden><colgroup id="'); var startSegmentColGroup2 = stringToPrecomputedChunk('">'); var endSegmentColGroup = stringToPrecomputedChunk('</colgroup></table>'); // The following code is the source scripts that we then minify and inline below, // with renamed function names that we hope don't collide: // const COMMENT_NODE = 8; // const SUSPENSE_START_DATA = '$'; // const SUSPENSE_END_DATA = '/$'; // const SUSPENSE_PENDING_START_DATA = '$?'; // const SUSPENSE_FALLBACK_START_DATA = '$!'; // // function clientRenderBoundary(suspenseBoundaryID, errorDigest, errorMsg, errorComponentStack) { // // Find the fallback's first element. // const suspenseIdNode = document.getElementById(suspenseBoundaryID); // if (!suspenseIdNode) { // // The user must have already navigated away from this tree. // // E.g. because the parent was hydrated. // return; // } // // Find the boundary around the fallback. This is always the previous node. // const suspenseNode = suspenseIdNode.previousSibling; // // Tag it to be client rendered. // suspenseNode.data = SUSPENSE_FALLBACK_START_DATA; // // assign error metadata to first sibling // let dataset = suspenseIdNode.dataset; // if (errorDigest) dataset.dgst = errorDigest; // if (errorMsg) dataset.msg = errorMsg; // if (errorComponentStack) dataset.stck = errorComponentStack; // // Tell React to retry it if the parent already hydrated. // if (suspenseNode._reactRetry) { // suspenseNode._reactRetry(); // } // } // // function completeBoundary(suspenseBoundaryID, contentID) { // // Find the fallback's first element. // const suspenseIdNode = document.getElementById(suspenseBoundaryID); // const contentNode = document.getElementById(contentID); // // We'll detach the content node so that regardless of what happens next we don't leave in the tree. // // This might also help by not causing recalcing each time we move a child from here to the target. // contentNode.parentNode.removeChild(contentNode); // if (!suspenseIdNode) { // // The user must have already navigated away from this tree. // // E.g. because the parent was hydrated. That's fine there's nothing to do // // but we have to make sure that we already deleted the container node. // return; // } // // Find the boundary around the fallback. This is always the previous node. // const suspenseNode = suspenseIdNode.previousSibling; // // // Clear all the existing children. This is complicated because // // there can be embedded Suspense boundaries in the fallback. // // This is similar to clearSuspenseBoundary in ReactDOMHostConfig. // // TODO: We could avoid this if we never emitted suspense boundaries in fallback trees. // // They never hydrate anyway. However, currently we support incrementally loading the fallback. // const parentInstance = suspenseNode.parentNode; // let node = suspenseNode.nextSibling; // let depth = 0; // do { // if (node && node.nodeType === COMMENT_NODE) { // const data = node.data; // if (data === SUSPENSE_END_DATA) { // if (depth === 0) { // break; // } else { // depth--; // } // } else if ( // data === SUSPENSE_START_DATA || // data === SUSPENSE_PENDING_START_DATA || // data === SUSPENSE_FALLBACK_START_DATA // ) { // depth++; // } // } // // const nextNode = node.nextSibling; // parentInstance.removeChild(node); // node = nextNode; // } while (node); // // const endOfBoundary = node; // // // Insert all the children from the contentNode between the start and end of suspense boundary. // while (contentNode.firstChild) { // parentInstance.insertBefore(contentNode.firstChild, endOfBoundary); // } // suspenseNode.data = SUSPENSE_START_DATA; // if (suspenseNode._reactRetry) { // suspenseNode._reactRetry(); // } // } // // function completeSegment(containerID, placeholderID) { // const segmentContainer = document.getElementById(containerID); // const placeholderNode = document.getElementById(placeholderID); // // We always expect both nodes to exist here because, while we might // // have navigated away from the main tree, we still expect the detached // // tree to exist. // segmentContainer.parentNode.removeChild(segmentContainer); // while (segmentContainer.firstChild) { // placeholderNode.parentNode.insertBefore( // segmentContainer.firstChild, // placeholderNode, // ); // } // placeholderNode.parentNode.removeChild(placeholderNode); // } var completeSegmentFunction = 'function $RS(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)}'; var completeBoundaryFunction = 'function $RC(a,b){a=document.getElementById(a);b=document.getElementById(b);b.parentNode.removeChild(b);if(a){a=a.previousSibling;var f=a.parentNode,c=a.nextSibling,e=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d)if(0===e)break;else e--;else"$"!==d&&"$?"!==d&&"$!"!==d||e++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;b.firstChild;)f.insertBefore(b.firstChild,c);a.data="$";a._reactRetry&&a._reactRetry()}}'; var clientRenderFunction = 'function $RX(b,c,d,e){var a=document.getElementById(b);a&&(b=a.previousSibling,b.data="$!",a=a.dataset,c&&(a.dgst=c),d&&(a.msg=d),e&&(a.stck=e),b._reactRetry&&b._reactRetry())}'; var completeSegmentScript1Full = stringToPrecomputedChunk(completeSegmentFunction + ';$RS("'); var completeSegmentScript1Partial = stringToPrecomputedChunk('$RS("'); var completeSegmentScript2 = stringToPrecomputedChunk('","'); var completeSegmentScript3 = stringToPrecomputedChunk('")</script>'); var completeBoundaryScript1Full = stringToPrecomputedChunk(completeBoundaryFunction + ';$RC("'); var completeBoundaryScript1Partial = stringToPrecomputedChunk('$RC("'); var completeBoundaryScript2 = stringToPrecomputedChunk('","'); var completeBoundaryScript3 = stringToPrecomputedChunk('")</script>'); var clientRenderScript1Full = stringToPrecomputedChunk(clientRenderFunction + ';$RX("'); var clientRenderScript1Partial = stringToPrecomputedChunk('$RX("'); var clientRenderScript1A = stringToPrecomputedChunk('"'); var clientRenderScript2 = stringToPrecomputedChunk(')</script>'); var clientRenderErrorScriptArgInterstitial = stringToPrecomputedChunk(','); var rendererSigil; { // Use this to detect multiple renderers using the same context rendererSigil = {}; } // Used to store the parent path of all context overrides in a shared linked list. // Forming a reverse tree. var rootContextSnapshot = null; // We assume that this runtime owns the "current" field on all ReactContext instances. // This global (actually thread local) state represents what state all those "current", // fields are currently in. var currentActiveSnapshot = null; function popNode(prev) { { prev.context._currentValue = prev.parentValue; } } function pushNode(next) { { next.context._currentValue = next.value; } } function popToNearestCommonAncestor(prev, next) { if (prev === next) ; else { popNode(prev); var parentPrev = prev.parent; var parentNext = next.parent; if (parentPrev === null) { if (parentNext !== null) { throw new Error('The stacks must reach the root at the same time. This is a bug in React.'); } } else { if (parentNext === null) { throw new Error('The stacks must reach the root at the same time. This is a bug in React.'); } popToNearestCommonAncestor(parentPrev, parentNext); // On the way back, we push the new ones that weren't common. pushNode(next); } } } function popAllPrevious(prev) { popNode(prev); var parentPrev = prev.parent; if (parentPrev !== null) { popAllPrevious(parentPrev); } } function pushAllNext(next) { var parentNext = next.parent; if (parentNext !== null) { pushAllNext(parentNext); } pushNode(next); } function popPreviousToCommonLevel(prev, next) { popNode(prev); var parentPrev = prev.parent; if (parentPrev === null) { throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.'); } if (parentPrev.depth === next.depth) { // We found the same level. Now we just need to find a shared ancestor. popToNearestCommonAncestor(parentPrev, next); } else { // We must still be deeper. popPreviousToCommonLevel(parentPrev, next); } } function popNextToCommonLevel(prev, next) { var parentNext = next.parent; if (parentNext === null) { throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.'); } if (prev.depth === parentNext.depth) { // We found the same level. Now we just need to find a shared ancestor. popToNearestCommonAncestor(prev, parentNext); } else { // We must still be deeper. popNextToCommonLevel(prev, parentNext); } pushNode(next); } // Perform context switching to the new snapshot. // To make it cheap to read many contexts, while not suspending, we make the switch eagerly by // updating all the context's current values. That way reads, always just read the current value. // At the cost of updating contexts even if they're never read by this subtree. function switchContext(newSnapshot) { // The basic algorithm we need to do is to pop back any contexts that are no longer on the stack. // We also need to update any new contexts that are now on the stack with the deepest value. // The easiest way to update new contexts is to just reapply them in reverse order from the // perspective of the backpointers. To avoid allocating a lot when switching, we use the stack // for that. Therefore this algorithm is recursive. // 1) First we pop which ever snapshot tree was deepest. Popping old contexts as we go. // 2) Then we find the nearest common ancestor from there. Popping old contexts as we go. // 3) Then we reapply new contexts on the way back up the stack. var prev = currentActiveSnapshot; var next = newSnapshot; if (prev !== next) { if (prev === null) { // $FlowFixMe: This has to be non-null since it's not equal to prev. pushAllNext(next); } else if (next === null) { popAllPrevious(prev); } else if (prev.depth === next.depth) { popToNearestCommonAncestor(prev, next); } else if (prev.depth > next.depth) { popPreviousToCommonLevel(prev, next); } else { popNextToCommonLevel(prev, next); } currentActiveSnapshot = next; } } function pushProvider(context, nextValue) { var prevValue; { prevValue = context._currentValue; context._currentValue = nextValue; { if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) { error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.'); } context._currentRenderer = rendererSigil; } } var prevNode = currentActiveSnapshot; var newNode = { parent: prevNode, depth: prevNode === null ? 0 : prevNode.depth + 1, context: context, parentValue: prevValue, value: nextValue }; currentActiveSnapshot = newNode; return newNode; } function popProvider() { var prevSnapshot = currentActiveSnapshot; if (prevSnapshot === null) { throw new Error('Tried to pop a Context at the root of the app. This is a bug in React.'); } { var value = prevSnapshot.parentValue; if (value === REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED) { prevSnapshot.context._currentValue = prevSnapshot.context._defaultValue; } else { prevSnapshot.context._currentValue = value; } } return currentActiveSnapshot = prevSnapshot.parent; } function getActiveContext() { return currentActiveSnapshot; } function readContext(context) { var value = context._currentValue ; return value; } // Corresponds to ReactFiberWakeable and ReactFizzWakeable modules. Generally, // changes to one module should be reflected in the others. // TODO: Rename this module and the corresponding Fiber one to "Thenable" // instead of "Wakeable". Or some other more appropriate name. // TODO: Sparse arrays are bad for performance. function createThenableState() { // The ThenableState is created the first time a component suspends. If it // suspends again, we'll reuse the same state. return []; } function trackSuspendedWakeable(wakeable) { // If this wakeable isn't already a thenable, turn it into one now. Then, // when we resume the work loop, we can check if its status is // still pending. // TODO: Get rid of the Wakeable type? It's superseded by UntrackedThenable. var thenable = wakeable; // We use an expando to track the status and result of a thenable so that we // can synchronously unwrap the value. Think of this as an extension of the // Promise API, or a custom interface that is a superset of Thenable. // // If the thenable doesn't have a status, set it to "pending" and attach // a listener that will update its status and result when it resolves. switch (thenable.status) { case 'fulfilled': case 'rejected': // A thenable that already resolved shouldn't have been thrown, so this is // unexpected. Suggests a mistake in a userspace data library. Don't track // this thenable, because if we keep trying it will likely infinite loop // without ever resolving. // TODO: Log a warning? break; default: { if (typeof thenable.status === 'string') { // Only instrument the thenable if the status if not defined. If // it's defined, but an unknown value, assume it's been instrumented by // some custom userspace implementation. We treat it as "pending". break; } var pendingThenable = thenable; pendingThenable.status = 'pending'; pendingThenable.then(function (fulfilledValue) { if (thenable.status === 'pending') { var fulfilledThenable = thenable; fulfilledThenable.status = 'fulfilled'; fulfilledThenable.value = fulfilledValue; } }, function (error) { if (thenable.status === 'pending') { var rejectedThenable = thenable; rejectedThenable.status = 'rejected'; rejectedThenable.reason = error; } }); break; } } } function trackUsedThenable(thenableState, thenable, index) { // This is only a separate function from trackSuspendedWakeable for symmetry // with Fiber. // TODO: Disallow throwing a thenable directly. It must go through `use` (or // some equivalent for internal Suspense implementations). We can't do this in // Fiber yet because it's a breaking change but we can do it in Server // Components because Server Components aren't released yet. thenableState[index] = thenable; } function getPreviouslyUsedThenableAtIndex(thenableState, index) { if (thenableState !== null) { var thenable = thenableState[index]; if (thenable !== undefined) { return thenable; } } return null; } var currentRequest = null; var thenableIndexCounter = 0; var thenableState = null; function prepareToUseHooksForRequest(request) { currentRequest = request; } function resetHooksForRequest() { currentRequest = null; } function prepareToUseHooksForComponent(prevThenableState) { thenableIndexCounter = 0; thenableState = prevThenableState; } function getThenableStateAfterSuspending() { var state = thenableState; thenableState = null; return state; } function readContext$1(context) { { if (context.$$typeof !== REACT_SERVER_CONTEXT_TYPE) { error('Only createServerContext is supported in Server Components.'); } if (currentCache === null) { error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); } } return readContext(context); } var Dispatcher = { useMemo: function (nextCreate) { return nextCreate(); }, useCallback: function (callback) { return callback; }, useDebugValue: function () {}, useDeferredValue: unsupportedHook, useTransition: unsupportedHook, getCacheForType: function (resourceType) { if (!currentCache) { throw new Error('Reading the cache is only supported while rendering.'); } var entry = currentCache.get(resourceType); if (entry === undefined) { entry = resourceType(); // TODO: Warn if undefined? currentCache.set(resourceType, entry); } return entry; }, readContext: readContext$1, useContext: readContext$1, useReducer: unsupportedHook, useRef: unsupportedHook, useState: unsupportedHook, useInsertionEffect: unsupportedHook, useLayoutEffect: unsupportedHook, useImperativeHandle: unsupportedHook, useEffect: unsupportedHook, useId: useId, useMutableSource: unsupportedHook, useSyncExternalStore: unsupportedHook, useCacheRefresh: function () { return unsupportedRefresh; }, useMemoCache: function (size) { return new Array(size); }, use: use }; function unsupportedHook() { throw new Error('This Hook is not supported in Server Components.'); } function unsupportedRefresh() { if (!currentCache) { throw new Error('Refreshing the cache is not supported in Server Components.'); } } var currentCache = null; function setCurrentCache(cache) { currentCache = cache; return currentCache; } function getCurrentCache() { return currentCache; } function useId() { if (currentRequest === null) { throw new Error('useId can only be used while React is rendering'); } var id = currentRequest.identifierCount++; // use 'S' for Flight components to distinguish from 'R' and 'r' in Fizz/Client return ':' + currentRequest.identifierPrefix + 'S' + id.toString(32) + ':'; } function use(usable) { if (usable !== null && typeof usable === 'object') { if (typeof usable.then === 'function') { // This is a thenable. var thenable = usable; // Track the position of the thenable within this fiber. var index = thenableIndexCounter; thenableIndexCounter += 1; switch (thenable.status) { case 'fulfilled': { var fulfilledValue = thenable.value; return fulfilledValue; } case 'rejected': { var rejectedError = thenable.reason; throw rejectedError; } default: { var prevThenableAtIndex = getPreviouslyUsedThenableAtIndex(thenableState, index); if (prevThenableAtIndex !== null) { switch (prevThenableAtIndex.status) { case 'fulfilled': { var _fulfilledValue = prevThenableAtIndex.value; return _fulfilledValue; } case 'rejected': { var _rejectedError = prevThenableAtIndex.reason; throw _rejectedError; } default: { // The thenable still hasn't resolved. Suspend with the same // thenable as last time to avoid redundant listeners. throw prevThenableAtIndex; } } } else { // This is the first time something has been used at this index. // Stash the thenable at the current index so we can reuse it during // the next attempt. if (thenableState === null) { thenableState = createThenableState(); } trackUsedThenable(thenableState, thenable, index); // Suspend. // TODO: Throwing here is an implementation detail that allows us to // unwind the call stack. But we shouldn't allow it to leak into // userspace. Throw an opaque placeholder value instead of the // actual thenable. If it doesn't get captured by the work loop, log // a warning, because that means something in userspace must have // caught it. throw thenable; } } } } else if (usable.$$typeof === REACT_SERVER_CONTEXT_TYPE) { var context = usable; return readContext$1(context); } } // eslint-disable-next-line react-internal/safe-string-coercion throw new Error('An unsupported type was passed to use(): ' + String(usable)); } var ContextRegistry = ReactSharedInternals.ContextRegistry; function getOrCreateServerContext(globalName) { if (!ContextRegistry[globalName]) { ContextRegistry[globalName] = React.createServerContext(globalName, // $FlowFixMe function signature doesn't reflect the symbol value REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED); } return ContextRegistry[globalName]; } var PENDING = 0; var COMPLETED = 1; var ABORTED = 3; var ERRORED = 4; var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; function defaultErrorHandler(error) { console['error'](error); // Don't transform to our wrapper } var OPEN = 0; var CLOSING = 1; var CLOSED = 2; function createRequest(model, bundlerConfig, onError, context, identifierPrefix) { var abortSet = new Set(); var pingedTasks = []; var request = { status: OPEN, fatalError: null, destination: null, bundlerConfig: bundlerConfig, cache: new Map(), nextChunkId: 0, pendingChunks: 0, abortableTasks: abortSet, pingedTasks: pingedTasks, completedModuleChunks: [], completedJSONChunks: [], completedErrorChunks: [], writtenSymbols: new Map(), writtenModules: new Map(), writtenProviders: new Map(), identifierPrefix: identifierPrefix || '', identifierCount: 1, onError: onError === undefined ? defaultErrorHandler : onError, toJSON: function (key, value) { return resolveModelToJSON(request, this, key, value); } }; request.pendingChunks++; var rootContext = createRootContext(context); var rootTask = createTask(request, model, rootContext, abortSet); pingedTasks.push(rootTask); return request; } function createRootContext(reqContext) { return importServerContexts(reqContext); } var POP = {}; function attemptResolveElement(type, key, ref, props, prevThenableState) { if (ref !== null && ref !== undefined) { // When the ref moves to the regular props object this will implicitly // throw for functions. We could probably relax it to a DEV warning for other // cases. throw new Error('Refs cannot be used in server components, nor passed to client components.'); } if (typeof type === 'function') { if (isModuleReference(type)) { // This is a reference to a client component. return [REACT_ELEMENT_TYPE, type, key, props]; } // This is a server-side component. prepareToUseHooksForComponent(prevThenableState); return type(props); } else if (typeof type === 'string') { // This is a host element. E.g. HTML. return [REACT_ELEMENT_TYPE, type, key, props]; } else if (typeof type === 'symbol') { if (type === REACT_FRAGMENT_TYPE) { // For key-less fragments, we add a small optimization to avoid serializing // it as a wrapper. // TODO: If a key is specified, we should propagate its key to any children. // Same as if a server component has a key. return props.children; } // This might be a built-in React component. We'll let the client decide. // Any built-in works as long as its props are serializable. return [REACT_ELEMENT_TYPE, type, key, props]; } else if (type != null && typeof type === 'object') { if (isModuleReference(type)) { // This is a reference to a client component. return [REACT_ELEMENT_TYPE, type, key, props]; } switch (type.$$typeof) { case REACT_LAZY_TYPE: { var payload = type._payload; var init = type._init; var wrappedType = init(payload); return attemptResolveElement(wrappedType, key, ref, props, prevThenableState); } case REACT_FORWARD_REF_TYPE: { var render = type.render; prepareToUseHooksForComponent(prevThenableState); return render(props, undefined); } case REACT_MEMO_TYPE: { return attemptResolveElement(type.type, key, ref, props, prevThenableState); } case REACT_PROVIDER_TYPE: { pushProvider(type._context, props.value); { var extraKeys = Object.keys(props).filter(function (value) { if (value === 'children' || value === 'value') { return false; } return true; }); if (extraKeys.length !== 0) { error('ServerContext can only have a value prop and children. Found: %s', JSON.stringify(extraKeys)); } } // $FlowFixMe issue discovered when updating Flow