UNPKG

3.27 kBJavaScriptView Raw
1/** @license React v16.13.1
2 * react-dom-unstable-fizz.browser.development.js
3 *
4 * Copyright (c) Facebook, Inc. and its affiliates.
5 *
6 * This source code is licensed under the MIT license found in the
7 * LICENSE file in the root directory of this source tree.
8 */
9
10'use strict';
11
12
13
14if (process.env.NODE_ENV !== "production") {
15 (function() {
16'use strict';
17
18function scheduleWork(callback) {
19 callback();
20}
21function flushBuffered(destination) {// WHATWG Streams do not yet have a way to flush the underlying
22 // transform streams. https://github.com/whatwg/streams/issues/960
23}
24function writeChunk(destination, buffer) {
25 destination.enqueue(buffer);
26 return destination.desiredSize > 0;
27}
28function close(destination) {
29 destination.close();
30}
31var textEncoder = new TextEncoder();
32function convertStringToBuffer(content) {
33 return textEncoder.encode(content);
34}
35
36function formatChunkAsString(type, props) {
37 var str = '<' + type + '>';
38
39 if (typeof props.children === 'string') {
40 str += props.children;
41 }
42
43 str += '</' + type + '>';
44 return str;
45}
46function formatChunk(type, props) {
47 return convertStringToBuffer(formatChunkAsString(type, props));
48}
49
50// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
51// nor polyfill, then a plain number is used for performance.
52var hasSymbol = typeof Symbol === 'function' && Symbol.for;
53var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
54
55function createRequest(children, destination) {
56 return {
57 destination: destination,
58 children: children,
59 completedChunks: [],
60 flowing: false
61 };
62}
63
64function performWork(request) {
65 var element = request.children;
66 request.children = null;
67
68 if (element && element.$$typeof !== REACT_ELEMENT_TYPE) {
69 return;
70 }
71
72 var type = element.type;
73 var props = element.props;
74
75 if (typeof type !== 'string') {
76 return;
77 }
78
79 request.completedChunks.push(formatChunk(type, props));
80
81 if (request.flowing) {
82 flushCompletedChunks(request);
83 }
84
85 flushBuffered(request.destination);
86}
87
88function flushCompletedChunks(request) {
89 var destination = request.destination;
90 var chunks = request.completedChunks;
91 request.completedChunks = [];
92
93 try {
94 for (var i = 0; i < chunks.length; i++) {
95 var chunk = chunks[i];
96 writeChunk(destination, chunk);
97 }
98 } finally {
99 }
100
101 close(destination);
102}
103
104function startWork(request) {
105 request.flowing = true;
106 scheduleWork(function () {
107 return performWork(request);
108 });
109}
110function startFlowing(request) {
111 request.flowing = false;
112 flushCompletedChunks(request);
113}
114
115function renderToReadableStream(children) {
116 var request;
117 return new ReadableStream({
118 start: function (controller) {
119 request = createRequest(children, controller);
120 startWork(request);
121 },
122 pull: function (controller) {
123 startFlowing(request);
124 },
125 cancel: function (reason) {}
126 });
127}
128
129var ReactDOMFizzServerBrowser = {
130 renderToReadableStream: renderToReadableStream
131};
132
133// TODO: decide on the top-level export form.
134// This is hacky but makes it work with both Rollup and Jest
135
136
137var unstableFizz_browser = ReactDOMFizzServerBrowser.default || ReactDOMFizzServerBrowser;
138
139module.exports = unstableFizz_browser;
140 })();
141}