Skip to content

Commit 360ca47

Browse files
committed
fix(flow): use (placeholder) type for React module, fix/improve docs
1 parent 543be4c commit 360ca47

File tree

12 files changed

+55
-46
lines changed

12 files changed

+55
-46
lines changed

README.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,15 @@ $ npm install --save react-flag-icon-css
3434
Apps bootstrapped with [`create-react-app`](https://github.com/facebookincubator/create-react-app) support this module out of the box, remember to set `useCssModules` to `false` (unfortunately `create-react-app` does not currently support Css modules).
3535

3636
```js
37+
// @flow
3738
import * as React from 'react';
3839
import FlagIconFactory from 'react-flag-icon-css'
3940

4041
// Please only use `FlagIconFactory` one time in your application, there is no
4142
// need to use it multiple times (it would slow down your app). You may place the
4243
// line below in a `FlagIcon.js` file in your 'components' directory, then
4344
// write `export default FlagIcon` after it and import it everywhere in your app.
44-
const FlagIcon = FlagIconFactory(React.default, { useCssModules: false })
45+
const FlagIcon = FlagIconFactory(React, { useCssModules: false })
4546
// ...
4647
```
4748

@@ -66,19 +67,28 @@ $ npm install --save-dev ...
6667
Import `FlagIconFactory` from `react-flag-icon-css`, it accepts the `React` module as the first argument and creates the `FlagIcon` component. *This approach ensures that `FlagIcon` uses your app's `React` instance, avoiding issues such as two versions of `React` being loaded at the same time.*
6768

6869
```js
70+
/* your-app/your-components/FlagIcon.js */
6971
// @flow
7072
import * as React from 'react'
71-
import ReactDOM from 'react-dom'
7273
import FlagIconFactory from 'react-flag-icon-css'
7374

7475
// Please only use `FlagIconFactory` one time in your application, there is no
7576
// need to use it multiple times (it would slow down your app). You may place the
7677
// line below in a `FlagIcon.js` file in your 'components' directory, then
7778
// write `export default FlagIcon` after it and import it everywhere in your app.
78-
const FlagIcon = FlagIconFactory(React.default)
79+
const FlagIcon = FlagIconFactory(React)
7980
// If you are not using css modules, write the following:
8081
// const FlagIcon = FlagIconFactory(React, { useCssModules: false })
8182

83+
export default FlagIcon
84+
```
85+
86+
```js
87+
/* your-app/app.js */
88+
import * as React from 'react';
89+
import ReactDOM from 'react-dom'
90+
import FlagIcon from './your-components/FlagIcon.js'
91+
8292
const App = (props = {}) =>
8393
<div>
8494
<FlagIcon code={props.code} size={props.size} />

src/FlagIcon/FlagIcon.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
// @flow
2-
import typeof ReactModule from 'react'
32
import type { Node } from 'react'
43
import type {
54
FlagIconPropsType,
65
FlagIconOptionsType,
76
FlagIconReturnType,
87
CssModuleType,
8+
ReactModuleType,
99
} from '../types/flow'
1010
import { makeClassnames } from '../functions'
1111

1212
const FlagIcon = <T>(
13-
React: ReactModule,
13+
React: ReactModuleType,
1414
options: FlagIconOptionsType<T>,
1515
styles?: CssModuleType,
1616
): FlagIconReturnType<T> => (props: FlagIconPropsType): Node => {

src/FlagIcon/FlagIconFactory.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// @flow
2-
import typeof ReactModule from 'react'
32
import FlagIcon from './FlagIcon'
43
import styles from '../styles'
54
import { makeStyles, makeFlagIconOptions } from '../functions'
@@ -11,10 +10,11 @@ import type {
1110
FlagIconFactoryReturnType,
1211
StandardFlagIconFactoryReturnType,
1312
CssModuleType,
13+
ReactModuleType,
1414
} from '../types/flow'
1515

1616
const FlagIconFactory = <T>(
17-
React: ReactModule,
17+
React: ReactModuleType,
1818
options?: FlagIconOptionsType<T>,
1919
): StandardFlagIconFactoryReturnType => {
2020
// We 'makeFlagIconOptions' by merging the default options with the (optional)
@@ -55,7 +55,7 @@ const FlagIconFactory = <T>(
5555
export default FlagIconFactory
5656

5757
const CustomFlagIconFactory = <T: { [string]: string }>(
58-
React: ReactModule,
58+
React: ReactModuleType,
5959
options?: FlagIconOptionsType<T>,
6060
): FlagIconFactoryReturnType<T> => FlagIconFactory(React, options)
6161
export { CustomFlagIconFactory }

src/__tests__/FlagIcon.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import testThemeStyles from './static/testThemeStyles.css'
1717
import { requiredProps, optionalProps } from './static/flagIconProps'
1818

1919
const { getCountryCodes } = countries
20-
const ReactDefault = React.default
2120

2221
// Utility functions.
2322

@@ -56,7 +55,7 @@ test('props: className', (t: *) => {
5655
const options = { useCssModules: false }
5756
const props = { ...requiredProps, className: 'some-css-rule' }
5857

59-
const FlagIcon = FlagIconFactory(ReactDefault, options)
58+
const FlagIcon = FlagIconFactory(React, options)
6059
const ReactFlagIcon = FlagIcon(props)
6160
testFlagIcon(t, ReactFlagIcon, options, props)
6261
})
@@ -69,13 +68,13 @@ test('props: styleName', (t: *) => {
6968
className: 'some-css-rule',
7069
}
7170

72-
const FlagIconModules = FlagIconFactory(ReactDefault, options)(props)
71+
const FlagIconModules = FlagIconFactory(React, options)(props)
7372
testFlagIcon(t, FlagIconModules, options, props)
7473
})
7574

7675
test('options:themeStyles', (t: *) => {
7776
const options = { themeStyles: testThemeStyles }
78-
const FlagIconCssModules = FlagIconFactory(ReactDefault, options)
77+
const FlagIconCssModules = FlagIconFactory(React, options)
7978
const ReactFlagIcon = FlagIconCssModules({ ...requiredProps })
8079

8180
const tree = render.create(ReactFlagIcon).toJSON()
@@ -124,7 +123,7 @@ test('props:children', (t: *) => {
124123

125124
const childrenClassName = 'test'
126125
const childrenText = 'test'
127-
const DummyComponent = DummyComponentFactory(ReactDefault)
126+
const DummyComponent = DummyComponentFactory(React)
128127
const children = DummyComponent({
129128
code: 'it',
130129
text: childrenText,

src/__tests__/FlagIconFactory.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import render from 'react-test-renderer'
55
import test from 'ava' // eslint-disable-line import/no-extraneous-dependencies
66
import FlagIconFactory from '../'
77

8-
const ReactDefault = React.default
9-
108
// SEE: https://github.com/facebook/flow/tree/master/packages/flow-upgrade
119
test('Works when React is imported in the "old way"', t => {
1210
const FlagIcon = FlagIconFactory(OldWayReact)
@@ -20,7 +18,7 @@ test('does not set FlagIcon.propTypes in production', t => {
2018
const previousEnv = process.env.NODE_ENV
2119
process.env.NODE_ENV = 'production'
2220

23-
const FlagIcon = FlagIconFactory(ReactDefault)
21+
const FlagIcon = FlagIconFactory(React)
2422

2523
process.env.NODE_ENV = previousEnv
2624
t.falsy(FlagIcon.propTypes)
@@ -30,7 +28,7 @@ test('sets FlagIcon.propTypes in development', t => {
3028
const previousEnv = process.env.NODE_ENV
3129
process.env.NODE_ENV = 'development'
3230

33-
const FlagIcon = FlagIconFactory(ReactDefault)
31+
const FlagIcon = FlagIconFactory(React)
3432

3533
process.env.NODE_ENV = previousEnv
3634
t.truthy(FlagIcon.propTypes)

src/__tests__/customCodes.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { CustomFlagIconFactory } from '../FlagIcon/FlagIconFactory'
77
import type { FlagIconOptionsType } from '../types/flow'
88
import { codes, styles } from './example-custom-flags'
99

10-
const ReactDefault = React.default
1110
const customCodes = codes
1211
const customCodesStyles = styles
1312
const themeStyles = {}
@@ -21,8 +20,8 @@ test('FlagIcon options > customCodes', (t: *) => {
2120
...customCodesStyles,
2221
},
2322
}
24-
const FlagIconCssModules = CustomFlagIconFactory(ReactDefault, options)
25-
const FlagIcon = CustomFlagIconFactory(ReactDefault, {
23+
const FlagIconCssModules = CustomFlagIconFactory(React, options)
24+
const FlagIcon = CustomFlagIconFactory(React, {
2625
...options,
2726
useCssModules: false,
2827
})
@@ -48,8 +47,8 @@ test('FlagIcon options > customCodes & !themeStyles', (t: *) => {
4847
const options: FlagIconOptionsType<*> = {
4948
customCodes,
5049
}
51-
const FlagIconCssModules = FlagIconFactory(ReactDefault, options)
52-
const FlagIcon = FlagIconFactory(ReactDefault, {
50+
const FlagIconCssModules = FlagIconFactory(React, options)
51+
const FlagIcon = FlagIconFactory(React, {
5352
...options,
5453
useCssModules: false,
5554
})
@@ -76,8 +75,8 @@ test('FlagIcon options > customCodes classes not in themeStyles', (t: *) => {
7675
'theme-base': 'lorem-ipsum',
7776
},
7877
}
79-
const FlagIconCssModules = FlagIconFactory(ReactDefault, options)
80-
const FlagIcon = FlagIconFactory(ReactDefault, {
78+
const FlagIconCssModules = FlagIconFactory(React, options)
79+
const FlagIcon = FlagIconFactory(React, {
8180
...options,
8281
useCssModules: false,
8382
})

src/__tests__/internals/DummyComponent.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
// and check that it all works in a single file (Flow types, React components,
77
// Flow tests).
88
import PropTypes from 'prop-types'
9-
import typeof ReactModule from 'react' // eslint-disable-line import/no-duplicates
109
// We import `ReactLibrary` exclusively for the Flow tests below.
1110
import ReactLibrary from 'react' // eslint-disable-line import/no-duplicates
1211
import type { Node, StatelessFunctionalComponent } from 'react'
12+
import type { ReactModuleType } from '../../types/flow'
1313

1414
// 1. Flow types.
1515
type DummyCodeType = 'it' | 'eu'
@@ -45,7 +45,7 @@ const makeCorrectCode = () => 'it'
4545
const makeWrongCode = () => 'wrong'
4646

4747
const DummyComponent = <T>(
48-
React: ReactModule,
48+
React: ReactModuleType,
4949
// eslint-disable-next-line react/prop-types
5050
): DummyReturnType<T> => (props: CustomDummyPropsType<T>): Node => (
5151
<div className={props.className}>
@@ -66,7 +66,7 @@ const makePropTypes = <T: {}>(options: DummyOptionsType<T> = {}) => ({
6666
})
6767

6868
const DummyComponentFactory = <T: {}>(
69-
React: ReactModule,
69+
React: ReactModuleType,
7070
options?: DummyOptionsType<T>,
7171
): StandardDummyFactoryReturnType => {
7272
const builtDummyComponent = DummyComponent(React)
@@ -80,7 +80,7 @@ const DummyComponentFactory = <T: {}>(
8080
}
8181

8282
const CustomDummyFactory = <T: {}>(
83-
React: ReactModule,
83+
React: React,
8484
options?: DummyOptionsType<T>,
8585
): DummyFactoryReturnType<T> => DummyComponentFactory(React, options)
8686

src/__tests__/internals/functions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export const makeFlagIcons = <T>(
5353

5454
return aOptions.map((options: FlagIconOptionsType<T>, i: number) => {
5555
const props = aProps[i]
56-
const FlagIcon = FlagIconFactory(React.default, options)
56+
const FlagIcon = FlagIconFactory(React, options)
5757

5858
return FlagIcon(props)
5959
})

src/__tests__/types/flow.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ import type {
2121
FlagIconOptionsType,
2222
} from '../../types/flow'
2323

24-
const ReactDefault = React.default
25-
2624
const makeWrongCode = () => 'wrong'
2725
const makeCorrectCode = () => 'it'
2826

@@ -50,7 +48,7 @@ const optionsCustomCodes = {
5048
}
5149

5250
// 3. FlagIconFactory, FlagIcon
53-
const FlagIconCssModules = FlagIconFactory(ReactDefault)
51+
const FlagIconCssModules = FlagIconFactory(React)
5452
FlagIconCssModules({ code: validCode })
5553

5654
// $FlowExpectError
@@ -75,7 +73,7 @@ const missingRequiredProps: FlagIconPropsType = {
7573
}
7674

7775
// 5. CustomFlagIconFactory
78-
const CustomFlagIcon = CustomFlagIconFactory(ReactDefault, optionsCustomCodes)
76+
const CustomFlagIcon = CustomFlagIconFactory(React, optionsCustomCodes)
7977

8078
let test = <CustomFlagIcon code={makeCorrectCode()} />
8179

@@ -159,19 +157,19 @@ const correctOptions: FlagIconOptionsType<*> = { useCssModules: false }
159157
// $FlowExpectError
160158
const wrongOptions: FlagIconOptionsType<*> = { useCssModules: 'wrong' }
161159

162-
FlagIconFactory(ReactDefault, correctOptions)
160+
FlagIconFactory(React, correctOptions)
163161

164162
// $FlowExpectError
165-
FlagIconFactory(ReactDefault, { useCssModules: 'wrong' })
163+
FlagIconFactory(React, { useCssModules: 'wrong' })
166164

167165
// 11. Dynamic loops (typical use case).
168166
const myAppCodes: FlagIconCodeType[] = ['it', 'eu', 'de', 'fr', 'es']
169167

170-
const MyFlagIcon = FlagIconFactory(ReactDefault)
168+
const MyFlagIcon = FlagIconFactory(React)
171169
myAppCodes.map(code => MyFlagIcon({ code }))
172170

173171
const myCustomCodes = { c1: 'Custom 1', c2: 'Custom 2' }
174-
const MyCustomFlagIcon = CustomFlagIconFactory(ReactDefault, {
172+
const MyCustomFlagIcon = CustomFlagIconFactory(React, {
175173
customCodes: myCustomCodes,
176174
})
177175
const myAppCodesWithCustom = [...myAppCodes, ...Object.keys(myCustomCodes)]

src/__tests__/types/propTypes.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import MakeConsoleHook, { ConsoleOutput } from '../internals/ConsoleHook'
77
import FlagIconFactory from '../../'
88
import { AddExactValidator } from '../../functions/propTypes'
99

10-
const ReactDefault = React.default
11-
1210
/**
1311
* TODO: remove 'ConsoleHook' as soon as possible. SEE: "Add ability to throw
1412
* "error instead of warning in tests": https://github.com/reactjs/prop-types/issues/28
@@ -22,7 +20,7 @@ test('FlagIconPropsType', (t: *) => {
2220

2321
// We set 'useCssModules' to false because otherwise a 'css modules' error
2422
// would be thrown, and this test is not about that.
25-
const FlagIcon = FlagIconFactory(ReactDefault, { useCssModules: false })
23+
const FlagIcon = FlagIconFactory(React, { useCssModules: false })
2624

2725
let element = <FlagIcon code="it" /> // eslint-disable-line no-unused-vars
2826
t.falsy(consoleHook.flushLog())
@@ -48,22 +46,22 @@ test('FlagIconPropsType', (t: *) => {
4846
test('FlagIconOptionsType', (t: *) => {
4947
const consoleHook = MakeConsoleHook({ outputType: ConsoleOutput.error })
5048

51-
FlagIconFactory(ReactDefault)
49+
FlagIconFactory(React)
5250
t.falsy(consoleHook.flushLog())
5351

54-
FlagIconFactory(ReactDefault, { useCssModules: true })
52+
FlagIconFactory(React, { useCssModules: true })
5553
t.falsy(consoleHook.flushLog())
5654

5755
// $FlowExpectError
58-
FlagIconFactory(ReactDefault, { useCssModules: false, wrong: 'lorem' })
56+
FlagIconFactory(React, { useCssModules: false, wrong: 'lorem' })
5957
t.truthy(consoleHook.flushLog())
6058

6159
// $FlowExpectError
62-
FlagIconFactory(ReactDefault, { useCssModules: 'string', themeStyles: {} })
60+
FlagIconFactory(React, { useCssModules: 'string', themeStyles: {} })
6361
t.truthy(consoleHook.flushLog())
6462

6563
// $FlowExpectError
66-
FlagIconFactory(ReactDefault, { anotherWrong: 'wrong' })
64+
FlagIconFactory(React, { anotherWrong: 'wrong' })
6765
t.truthy(consoleHook.flushLog())
6866

6967
consoleHook.detach()

0 commit comments

Comments
 (0)