Skip to content

Commit 480db11

Browse files
committed
feat: support different types of arguments for the renderable
This allows to pass several arguments to the renderable function or an argument that is different from a plain object.
1 parent a789c28 commit 480db11

File tree

11 files changed

+143
-47
lines changed

11 files changed

+143
-47
lines changed

.size-snapshot.json

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
{
22
"dist/react-render-callback.umd.js": {
3-
"bundled": 3153,
4-
"minified": 1305,
5-
"gzipped": 622
3+
"bundled": 4399,
4+
"minified": 1771,
5+
"gzipped": 759
66
},
77
"dist/react-render-callback.esm.js": {
8-
"bundled": 2422,
9-
"minified": 1315,
10-
"gzipped": 579,
8+
"bundled": 2730,
9+
"minified": 1567,
10+
"gzipped": 649,
1111
"treeshaked": {
1212
"rollup": {
13-
"code": 269,
14-
"import_statements": 101
13+
"code": 289,
14+
"import_statements": 121
1515
},
1616
"webpack": {
17-
"code": 1316
17+
"code": 1369
1818
}
1919
}
2020
},
2121
"dist/react-render-callback.cjs.js": {
22-
"bundled": 2579,
23-
"minified": 1432,
24-
"gzipped": 617
22+
"bundled": 2903,
23+
"minified": 1695,
24+
"gzipped": 686
2525
},
2626
"dist/react-render-callback.umd.min.js": {
27-
"bundled": 3186,
28-
"minified": 1291,
29-
"gzipped": 611
27+
"bundled": 4432,
28+
"minified": 1757,
29+
"gzipped": 749
3030
}
3131
}

README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ const render = require('react-render-callback')
139139

140140
since: v1.1.0
141141

142-
> Returns a function (`(props) => ...`) to render `renderable` with `props`.
142+
> Returns a function (`(...args) => ...`) to render `renderable` with.
143143

144144
```js
145145
// esm
@@ -152,6 +152,22 @@ Accepts the same arguments (except `props`) as `render()`. It exists mainly
152152
to pre-determine (read cache) what type `renderable` is, to prevent these
153153
checks on every invocation.
154154

155+
Additionally the returned method accepts more than one argument. This allows
156+
to provide several parameters to the render function.
157+
158+
```js
159+
const render = createRender((a, b, c) => ({a, b, c}))
160+
render(1, 2, 3)
161+
// -> { a: 1, b: 2, c: 3 }
162+
```
163+
164+
If only one argument is passed and it is a plain object, that argument is merged
165+
with (if defined) the `defaultProps` of the `renderable`.
166+
167+
**returns**
168+
169+
a function (`(...args) => ...`)
170+
155171
### Example
156172

157173
```js

babel.config.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@ module.exports = api => {
33

44
const babelConfig = require('kcd-scripts/babel')(api)
55

6-
if (process.env.BUILD_FORMAT !== 'umd') {
7-
babelConfig.plugins.unshift([
8-
'@babel/plugin-transform-runtime',
9-
{
10-
corejs: 2,
11-
helpers: true,
12-
regenerator: false,
13-
useESModules: false,
14-
},
15-
])
16-
}
6+
babelConfig.plugins.unshift([
7+
'@babel/plugin-transform-runtime',
8+
{
9+
helpers: true,
10+
regenerator: false,
11+
useESModules:
12+
process.env.NODE_ENV !== 'test' && process.env.BUILD_FORMAT !== 'cjs',
13+
},
14+
])
1715

1816
if (process.env.NODE_ENV === 'test') {
1917
babelConfig.plugins.unshift('dynamic-import-node')

other/misc-tests/jest.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ module.exports = Object.assign(jestConfig, {
44
displayName: 'react-render-callback',
55
roots: ['.'],
66
testEnvironment: 'jsdom',
7+
transformIgnorePatterns: [],
78
})

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
"react": "^0.14.0 || ^15.0.0-0 || ^16.0.0-0"
3636
},
3737
"dependencies": {
38-
"@babel/runtime-corejs2": "^7.0.0"
38+
"@babel/runtime": "^7.0.0",
39+
"is-plain-object": "^2.0.4"
3940
},
4041
"devDependencies": {
4142
"@babel/plugin-transform-runtime": "^7.0.0",

rollup.config.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@ module.exports = () => {
33

44
const rollupConfig = getRollupConfig()
55

6-
if (process.env.BUILD_FORMAT !== 'umd') {
7-
replace(rollupConfig.plugins, 'babel', () => {
8-
const babel = require('rollup-plugin-babel')
6+
replace(rollupConfig.plugins, 'babel', () => {
7+
const babel = require('rollup-plugin-babel')
98

10-
return babel({
11-
exclude: 'node_modules/**',
12-
babelrc: true,
13-
runtimeHelpers: true,
14-
})
9+
return babel({
10+
exclude: 'node_modules/**',
11+
babelrc: true,
12+
runtimeHelpers: true,
1513
})
16-
}
14+
})
1715

1816
return rollupConfig
1917
}

src/createRender.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
11
import {isValidElement, createElement, cloneElement} from 'react'
22

3-
import isReactComponent from './internal/isReactComponent'
3+
import isPlainObject from 'is-plain-object'
4+
5+
import constant from './internal/constant'
46
import falsyToNull from './internal/falsyToNull'
7+
import isReactComponent from './internal/isReactComponent'
58

69
export default (renderable, options) => {
710
if (isReactComponent(renderable)) {
811
return props => createElement(renderable, props)
912
}
1013

1114
if (typeof renderable === 'function') {
12-
return falsyToNull(props =>
13-
renderable({...renderable.defaultProps, ...props}),
14-
)
15+
return (...args) => {
16+
const element =
17+
args.length === 1 && isPlainObject(args[0])
18+
? renderable(
19+
renderable.defaultProps
20+
? {...renderable.defaultProps, ...args[0]}
21+
: args[0],
22+
)
23+
: renderable(...args)
24+
25+
return falsyToNull(element)
26+
}
1527
}
1628

1729
if (options && options.cloneElement && isValidElement(renderable)) {
1830
return props => cloneElement(renderable, props)
1931
}
2032

2133
// must be something else
22-
return falsyToNull(() => renderable)
34+
return constant(falsyToNull(renderable))
2335
}

src/createRender.test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import createRender from './createRender'
2+
3+
describe('createRender', () => {
4+
it('should invoke function with several args', () => {
5+
const result = Symbol('result')
6+
7+
const renderable = jest.fn()
8+
renderable.mockReturnValueOnce(result)
9+
10+
const render = createRender(renderable)
11+
12+
expect(render({foo: 'bar'}, 'buz')).toBe(result)
13+
14+
expect(renderable.mock).toMatchInlineSnapshot(`
15+
Object {
16+
"calls": Array [
17+
Array [
18+
Object {
19+
"foo": "bar",
20+
},
21+
"buz",
22+
],
23+
],
24+
"instances": Array [
25+
undefined,
26+
],
27+
"invocationCallOrder": Array [
28+
1,
29+
],
30+
"results": Array [
31+
Object {
32+
"isThrow": false,
33+
"value": Symbol(result),
34+
},
35+
],
36+
}
37+
`)
38+
})
39+
})

src/internal/constant.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default value => () => value

src/internal/falsyToNull.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
import isFalsy from './isFalsy'
22

3-
export default render => props => {
4-
const element = render(props)
5-
6-
return isFalsy(element) ? null : element
7-
}
3+
export default value => (isFalsy(value) ? null : value)

0 commit comments

Comments
 (0)