Skip to content

Commit 0d9efd1

Browse files
committed
Removes hard dependency on react-async-bootstrapper. It is now up to the developer to install it should they wish to support server side rendering.
Updates the documentation. Refactors the API somewhat.
1 parent d333f27 commit 0d9efd1

11 files changed

+215
-366
lines changed

.nvmrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6.9.4
1+
6.10.0

README.md

+142-176
Large diffs are not rendered by default.

package.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@
5656
"react": "^0.14.0 || ^15.0.0-0",
5757
"react-dom": "^0.14.0 || ^15.0.0-0"
5858
},
59-
"dependencies": {
60-
"react-async-bootstrapper": "^0.0.2"
61-
},
59+
"dependencies": {},
6260
"devDependencies": {
6361
"app-root-dir": "1.0.2",
6462
"babel-cli": "6.24.0",
@@ -93,6 +91,7 @@
9391
"ramda": "0.23.0",
9492
"react": "15.4.2",
9593
"react-addons-test-utils": "15.4.2",
94+
"react-async-bootstrapper": "0.0.5",
9695
"react-dom": "15.4.2",
9796
"readline-sync": "1.4.6",
9897
"rimraf": "2.6.1",

src/AsyncComponentProvider.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import React from 'react'
22

3-
import createContext from './createContext'
3+
import createAsyncContext from './createAsyncContext'
44

55
class AsyncComponentProvider extends React.Component {
66
componentWillMount() {
7-
this.execContext = this.props.execContext || createContext()
8-
this.rehydrateState = this.props.initialState
7+
this.asyncContext = this.props.asyncContext || createAsyncContext()
8+
this.rehydrateState = this.props.rehydrateState
99
}
1010

1111
getChildContext() {
1212
return {
1313
asyncComponents: {
14-
getNextId: this.execContext.getNextId,
15-
registerComponent: this.execContext.registerComponent,
16-
getComponent: this.execContext.getComponent,
17-
registerError: this.execContext.registerError,
18-
getError: this.execContext.getError,
14+
getNextId: this.asyncContext.getNextId,
15+
registerComponent: this.asyncContext.registerComponent,
16+
getComponent: this.asyncContext.getComponent,
17+
registerError: this.asyncContext.registerError,
18+
getError: this.asyncContext.getError,
1919
getRehydrate: (id) => {
2020
const error = this.rehydrateState.errors[id]
2121
const resolved = this.rehydrateState.resolved[id]
@@ -38,22 +38,22 @@ class AsyncComponentProvider extends React.Component {
3838

3939
AsyncComponentProvider.propTypes = {
4040
children: React.PropTypes.node.isRequired,
41-
execContext: React.PropTypes.shape({
41+
asyncContext: React.PropTypes.shape({
4242
getNextId: React.PropTypes.func.isRequired,
4343
registerComponent: React.PropTypes.func.isRequired,
4444
getComponent: React.PropTypes.func.isRequired,
4545
registerError: React.PropTypes.func.isRequired,
4646
getError: React.PropTypes.func.isRequired,
4747
}),
48-
initialState: React.PropTypes.shape({
48+
rehydrateState: React.PropTypes.shape({
4949
resolved: React.PropTypes.object,
5050
errors: React.PropTypes.object,
5151
}),
5252
}
5353

5454
AsyncComponentProvider.defaultProps = {
55-
execContext: undefined,
56-
initialState: {
55+
asyncContext: undefined,
56+
rehydrateState: {
5757
resolved: {},
5858
errors: {},
5959
},

src/__tests__/__snapshots__/integration.test.js.snap

+8-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Object {
1717

1818
exports[`integration tests render server and client 3`] = `
1919
<AsyncComponentProvider
20-
execContext={
20+
asyncContext={
2121
Object {
2222
"getComponent": [Function],
2323
"getError": [Function],
@@ -27,7 +27,7 @@ exports[`integration tests render server and client 3`] = `
2727
"registerError": [Function],
2828
}
2929
}
30-
initialState={
30+
rehydrateState={
3131
Object {
3232
"errors": Object {},
3333
"resolved": Object {},
@@ -82,7 +82,7 @@ exports[`integration tests render server and client 3`] = `
8282

8383
exports[`integration tests render server and client 4`] = `
8484
<AsyncComponentProvider
85-
execContext={
85+
asyncContext={
8686
Object {
8787
"getComponent": [Function],
8888
"getError": [Function],
@@ -92,7 +92,7 @@ exports[`integration tests render server and client 4`] = `
9292
"registerError": [Function],
9393
}
9494
}
95-
initialState={
95+
rehydrateState={
9696
Object {
9797
"errors": Object {},
9898
"resolved": Object {},
@@ -157,7 +157,7 @@ exports[`integration tests render server and client 4`] = `
157157

158158
exports[`integration tests renders the ErrorComponent 1`] = `
159159
<AsyncComponentProvider
160-
execContext={
160+
asyncContext={
161161
Object {
162162
"getComponent": [Function],
163163
"getError": [Function],
@@ -167,7 +167,7 @@ exports[`integration tests renders the ErrorComponent 1`] = `
167167
"registerError": [Function],
168168
}
169169
}
170-
initialState={
170+
rehydrateState={
171171
Object {
172172
"errors": Object {},
173173
"resolved": Object {},
@@ -188,7 +188,7 @@ exports[`integration tests renders the ErrorComponent 1`] = `
188188

189189
exports[`integration tests renders the LoadingComponent 1`] = `
190190
<AsyncComponentProvider
191-
execContext={
191+
asyncContext={
192192
Object {
193193
"getComponent": [Function],
194194
"getError": [Function],
@@ -198,7 +198,7 @@ exports[`integration tests renders the LoadingComponent 1`] = `
198198
"registerError": [Function],
199199
}
200200
}
201-
initialState={
201+
rehydrateState={
202202
Object {
203203
"errors": Object {},
204204
"resolved": Object {},

src/__tests__/createAsyncComponent.test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import React from 'react'
22
import sinon from 'sinon'
33
import { mount } from 'enzyme'
44

5-
import createAsyncComponent from '../createAsyncComponent'
5+
import asyncComponent from '../asyncComponent'
66

7-
describe('createAsyncComponent', () => {
7+
describe('asyncComponent', () => {
88
const contextStub = {
99
asyncComponents: {
1010
getNextId: () => 1,
@@ -17,7 +17,7 @@ describe('createAsyncComponent', () => {
1717

1818
it('should handle unmounting ensuring that resolved promises do not call setState', () => {
1919
const resolveDelay = 10
20-
const Bob = createAsyncComponent({
20+
const Bob = asyncComponent({
2121
resolve: () =>
2222
new Promise(resolve =>
2323
setTimeout(() => resolve(() => <div>bob</div>), resolveDelay)),

src/__tests__/integration.test.js

+23-23
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React from 'react'
22
import { renderToStaticMarkup } from 'react-dom/server'
33
import { mount } from 'enzyme'
4+
import asyncBootstrapper from 'react-async-bootstrapper'
45

56
import {
67
AsyncComponentProvider,
7-
createContext,
8-
createAsyncComponent,
9-
asyncBootstrapper,
8+
createAsyncContext,
9+
asyncComponent,
1010
} from '../'
1111

1212
function Bob({ children }) {
@@ -15,35 +15,35 @@ function Bob({ children }) {
1515
Bob.propTypes = { children: React.PropTypes.node }
1616
Bob.defaultProps = { children: null }
1717

18-
const AsyncBob = createAsyncComponent({
18+
const AsyncBob = asyncComponent({
1919
resolve: () => new Promise(resolve => setTimeout(() => resolve(Bob), 10)),
2020
name: 'AsyncBob',
2121
})
2222

23-
const AsyncBobTwo = createAsyncComponent({
23+
const AsyncBobTwo = asyncComponent({
2424
resolve: () => new Promise(resolve => setTimeout(() => resolve(Bob), 10)),
2525
name: 'AsyncBobTwo',
2626
})
2727

28-
const AsyncBobThree = createAsyncComponent({
28+
const AsyncBobThree = asyncComponent({
2929
resolve: () => new Promise(resolve => setTimeout(() => resolve(Bob), 10)),
3030
name: 'AsyncBobThree',
3131
})
3232

33-
const DeferredAsyncBob = createAsyncComponent({
33+
const DeferredAsyncBob = asyncComponent({
3434
resolve: () => new Promise(resolve => setTimeout(() => resolve(Bob), 10)),
3535
ssrMode: 'defer',
3636
name: 'DeferredAsyncBob',
3737
LoadingComponent: () => <div>DeferredAsyncBob Loading</div>,
3838
})
3939

40-
const BoundaryAsyncBob = createAsyncComponent({
40+
const BoundaryAsyncBob = asyncComponent({
4141
resolve: () => new Promise(resolve => setTimeout(() => resolve(Bob), 10)),
4242
ssrMode: 'boundary',
4343
name: 'BoundaryAsyncBob',
4444
})
4545

46-
const ErrorAsyncComponent = createAsyncComponent({
46+
const ErrorAsyncComponent = asyncComponent({
4747
resolve: () =>
4848
new Promise(() => {
4949
throw new Error('This always errors')
@@ -53,10 +53,10 @@ const ErrorAsyncComponent = createAsyncComponent({
5353
ErrorComponent: ({ message }) => <div>{message}</div>,
5454
})
5555

56-
const createApp = (execContext, stateForClient) => (
56+
const createApp = (asyncContext, stateForClient) => (
5757
<AsyncComponentProvider
58-
execContext={execContext}
59-
initialState={stateForClient}
58+
asyncContext={asyncContext}
59+
rehydrateState={stateForClient}
6060
>
6161
<AsyncBob>
6262
<div>
@@ -87,7 +87,7 @@ describe('integration tests', () => {
8787
delete global.window
8888

8989
// "Server" side render...
90-
const serverContext = createContext()
90+
const serverContext = createAsyncContext()
9191
const serverApp = createApp(serverContext)
9292
return asyncBootstrapper(serverApp)
9393
.then(() => {
@@ -102,7 +102,7 @@ describe('integration tests', () => {
102102
})
103103
.then(({ serverHTML, stateForClient }) => {
104104
// "Client" side render...
105-
const clientContext = createContext()
105+
const clientContext = createAsyncContext()
106106
const clientApp = createApp(clientContext, stateForClient)
107107
return (
108108
asyncBootstrapper(clientApp)
@@ -126,17 +126,17 @@ describe('integration tests', () => {
126126
})
127127

128128
it('renders the LoadingComponent', () => {
129-
const Foo = createAsyncComponent({
129+
const Foo = asyncComponent({
130130
resolve: () =>
131131
new Promise(resolve =>
132132
setTimeout(() => resolve(() => <div>foo</div>), 100)),
133133
LoadingComponent: () => <div>Loading...</div>,
134134
})
135135

136-
const execContext = createContext()
136+
const asyncContext = createAsyncContext()
137137

138138
const app = (
139-
<AsyncComponentProvider execContext={execContext}>
139+
<AsyncComponentProvider asyncContext={asyncContext}>
140140
<Foo />
141141
</AsyncComponentProvider>
142142
)
@@ -147,18 +147,18 @@ describe('integration tests', () => {
147147
})
148148

149149
it('renders the ErrorComponent', () => {
150-
const Foo = createAsyncComponent({
150+
const Foo = asyncComponent({
151151
resolve: () => {
152152
throw new Error('An error occurred')
153153
},
154154
// eslint-disable-next-line react/prop-types
155155
ErrorComponent: ({ message }) => <div>{message}</div>,
156156
})
157157

158-
const execContext = createContext()
158+
const asyncContext = createAsyncContext()
159159

160160
const app = (
161-
<AsyncComponentProvider execContext={execContext}>
161+
<AsyncComponentProvider asyncContext={asyncContext}>
162162
<Foo />
163163
</AsyncComponentProvider>
164164
)
@@ -177,17 +177,17 @@ describe('integration tests', () => {
177177
it('a component only gets resolved once', () => {
178178
let resolveCount = 0
179179

180-
const Foo = createAsyncComponent({
180+
const Foo = asyncComponent({
181181
resolve: () => {
182182
resolveCount += 1
183183
return () => <div>foo</div>
184184
},
185185
})
186186

187-
const execContext = createContext()
187+
const asyncContext = createAsyncContext()
188188

189189
const app = (
190-
<AsyncComponentProvider execContext={execContext}>
190+
<AsyncComponentProvider asyncContext={asyncContext}>
191191
<Foo />
192192
</AsyncComponentProvider>
193193
)

src/createAsyncComponent.js renamed to src/asyncComponent.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react'
22

33
const validSSRModes = ['render', 'defer', 'boundary']
44

5-
function createAsyncComponent(args) {
5+
function asyncComponent(args) {
66
const {
77
name,
88
resolve,
@@ -13,7 +13,7 @@ function createAsyncComponent(args) {
1313
} = args
1414

1515
if (validSSRModes.indexOf(ssrMode) === -1) {
16-
throw new Error('Invalid ssrMode provided to createAsyncComponent')
16+
throw new Error('Invalid ssrMode provided to asyncComponent')
1717
}
1818

1919
let id = null
@@ -182,4 +182,4 @@ function createAsyncComponent(args) {
182182
return AsyncComponent
183183
}
184184

185-
export default createAsyncComponent
185+
export default asyncComponent

src/createContext.js renamed to src/createAsyncContext.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export default function createContext() {
1+
export default function createAsyncContext() {
22
let idPointer = 0
33
const registry = {}
44
const errorRegistry = {}

src/index.js

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
import asyncBootstrapper from 'react-async-bootstrapper'
21
import AsyncComponentProvider from './AsyncComponentProvider'
3-
import createContext from './createContext'
4-
import createAsyncComponent from './createAsyncComponent'
2+
import createAsyncContext from './createAsyncContext'
3+
import asyncComponent from './asyncComponent'
54

6-
export {
7-
AsyncComponentProvider,
8-
createContext,
9-
createAsyncComponent,
10-
asyncBootstrapper,
11-
}
5+
export { AsyncComponentProvider, createAsyncContext, asyncComponent }

0 commit comments

Comments
 (0)