diff --git a/fixtures/flight/package.json b/fixtures/flight/package.json index 3470e72e753aa..3749cc993c5a5 100644 --- a/fixtures/flight/package.json +++ b/fixtures/flight/package.json @@ -18,6 +18,7 @@ "camelcase": "^5.2.0", "case-sensitive-paths-webpack-plugin": "2.2.0", "concurrently": "^5.0.0", + "cors": "^2.8.5", "css-loader": "2.1.1", "dotenv": "6.2.0", "dotenv-expand": "5.1.0", diff --git a/fixtures/flight/server/handler.server.js b/fixtures/flight/server/handler.server.js index d7715af9cc757..b147c9cbd5bc3 100644 --- a/fixtures/flight/server/handler.server.js +++ b/fixtures/flight/server/handler.server.js @@ -18,12 +18,17 @@ module.exports = async function(req, res) { // TODO: Read from a map on the disk. [resolve('../src/Counter.client.js')]: { id: './src/Counter.client.js', - chunks: ['1'], + chunks: ['2'], name: 'default', }, [resolve('../src/ShowMore.client.js')]: { id: './src/ShowMore.client.js', - chunks: ['2'], + chunks: ['3'], + name: 'default', + }, + [resolve('../src/AddTodo.client.js')]: { + id: './src/AddTodo.client.js', + chunks: ['1'], name: 'default', }, }); diff --git a/fixtures/flight/server/index.js b/fixtures/flight/server/index.js index 3d28e818bcf83..025500793505d 100644 --- a/fixtures/flight/server/index.js +++ b/fixtures/flight/server/index.js @@ -12,7 +12,10 @@ babelRegister({ }); const express = require('express'); +const cors = require('cors'); const app = express(); +app.use(cors()); +app.use(express.json()); // Application app.get('/', function(req, res) { @@ -25,18 +28,27 @@ app.get('/', function(req, res) { require('./handler.server.js')(req, res); }); +let todos = [ + { + id: 1, + text: 'Shave yaks', + }, + { + id: 2, + text: 'Eat kale!', + }, +]; + app.get('/todos', function(req, res) { - res.setHeader('Access-Control-Allow-Origin', '*'); - res.json([ - { - id: 1, - text: 'Shave yaks', - }, - { - id: 2, - text: 'Eat kale', - }, - ]); + res.json(todos); +}); + +app.post('/todos', function(req, res) { + todos.push({ + id: todos.length + 1, + text: req.body.text, + }); + res.json(todos); }); app.listen(3001, () => { diff --git a/fixtures/flight/src/AddTodo.client.js b/fixtures/flight/src/AddTodo.client.js new file mode 100644 index 0000000000000..42056f072e8cb --- /dev/null +++ b/fixtures/flight/src/AddTodo.client.js @@ -0,0 +1,33 @@ +import * as React from 'react'; + +import Container from './Container.js'; +import {RefreshContext} from './Context.client'; + +export default function Counter() { + const [text, setText] = React.useState(''); + const [startTransition, isPending] = React.unstable_useTransition(); + const refresh = React.useContext(RefreshContext); + return ( + + setText(e.target.value)} /> + + {isPending && ' ...'} + + ); +} diff --git a/fixtures/flight/src/App.server.js b/fixtures/flight/src/App.server.js index a0d9ae285ad23..0b906e8555713 100644 --- a/fixtures/flight/src/App.server.js +++ b/fixtures/flight/src/App.server.js @@ -3,8 +3,8 @@ import {fetch} from 'react-fetch'; import Container from './Container.js'; +import AddTodo from './AddTodo.client.js'; import Counter from './Counter.client.js'; - import ShowMore from './ShowMore.client.js'; export default function App() { @@ -18,6 +18,9 @@ export default function App() {
  • {todo.text}
  • ))} + +
    +

    Lorem ipsum

    diff --git a/fixtures/flight/src/Context.client.js b/fixtures/flight/src/Context.client.js new file mode 100644 index 0000000000000..3f1ee4c39fb58 --- /dev/null +++ b/fixtures/flight/src/Context.client.js @@ -0,0 +1,3 @@ +import * as React from 'react'; + +export const RefreshContext = React.createContext(null); diff --git a/fixtures/flight/src/index.js b/fixtures/flight/src/index.js index ce9595dbe5482..af33669eda691 100644 --- a/fixtures/flight/src/index.js +++ b/fixtures/flight/src/index.js @@ -2,20 +2,32 @@ import * as React from 'react'; import {Suspense} from 'react'; import ReactDOM from 'react-dom'; import ReactTransportDOMClient from 'react-transport-dom-webpack'; +import {RefreshContext} from './Context.client'; -let data = ReactTransportDOMClient.createFromFetch( +let initialData = ReactTransportDOMClient.createFromFetch( fetch('http://localhost:3001') ); function Content() { - return data.readRoot(); + let [data, setData] = React.useState(initialData); + + function refresh() { + setData( + ReactTransportDOMClient.createFromFetch(fetch('http://localhost:3001')) + ); + } + + return ( + + {data.readRoot()} + + ); } -ReactDOM.render( +ReactDOM.unstable_createRoot(document.getElementById('root')).render( Loading...}> - , - document.getElementById('root') + ); // Create entry points for Client Components. diff --git a/fixtures/flight/yarn.lock b/fixtures/flight/yarn.lock index ad74759fddff9..dbf21e0f51704 100644 --- a/fixtures/flight/yarn.lock +++ b/fixtures/flight/yarn.lock @@ -2804,6 +2804,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" @@ -6457,7 +6465,7 @@ oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" -object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.1.1, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -9309,7 +9317,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"