patch-react-proptypes-add-introspection
This hack (it's a nasty hack) adds metadata to propTypes
so that information about the intended type structure can be extracted in runtime for arbitrary React Components using the default React PropTypes library. So, warnings ahead:
- It only works for
React.PropTypes
. If the components you want to inspect are using customPropTypes
functions,patch-react-proptypes-add-introspection
will not be able to extract useful information from them. - This is a hack. I can't stress this enough. My guess is that a future proof, trustworthy solution would involve a more formalized set of types, such as those derived from Flow (although if those would be inspectable in some way on runtime or would require some build step, I do not know).
Install
npm install --save-dev patch-react-proptypes-add-introspection
Usage
Since patch-react-proptypes-add-introspection
literally patches the default PropTypes
methods, this dependency needs to be loaded before any Component meant to be introspected is loaded. For users of Babel, this means that you can't import
your component files, since the order of files loaded with import
is not guaranteed: instead, you need to use require
explicitly, and at some point after patch-react-proptypes-add-introspection
was imported.
const MyComponent = console
If your component was defined like this:
{ return <div></div>} MyComponentpropTypes = hasAny: PropTypesany hasAnyAndItsRequired: PropTypesanyisRequired anArrayPlease: PropTypesarray anArrayPleaseAndItsRequired: PropTypesarrayisRequired anArrayOfStuff: PropTypes anArrayOfStuffAndItsRequired: PropTypesisRequired aBool: PropTypesbool aBoolAndItsRequired: PropTypesboolisRequired anElement: PropTypeselement anElementAndItsRequired: PropTypeselementisRequired aFunc: PropTypesfunc aFuncAndItsRequired: PropTypesfuncisRequired anInstanceOf: PropTypes anInstanceOfAndItsRequired: PropTypesisRequired aNode: PropTypesnode aNodeAndItsRequired: PropTypesnodeisRequired aNumber: PropTypesnumber aNumberAndItsRequired: PropTypesnumberisRequired anObject: PropTypesobject anObjectAndItsRequired: PropTypesobjectisRequired anObjectOf: PropTypes anObjectOfAndItsRequired: PropTypesisRequired isOneOf: PropTypes isOneOfAndItsRequired: PropTypesisRequired isOneOfType: PropTypes isOneOfTypeAndItsRequired: PropTypesisRequired aShape: PropTypesshape a: PropTypesnumber b: PropTypesbool aShapeAndItsRequired: PropTypesshape c: PropTypes isRequired aString: PropTypesstring aStringAndItsRequired: PropTypesstringisRequired aSymbol: PropTypessymbol aSymbolAndItsRequired: PropTypessymbolisRequired
Then the output will be roughly:
hasAny: type: 'any' hasAnyAndItsRequired: type: 'any' isRequired: true anArrayPlease: type: 'array' anArrayPleaseAndItsRequired: type: 'array' isRequired: true anArrayOfStuff: type: 'arrayOf' structure: type: 'any' anArrayOfStuffAndItsRequired: type: 'arrayOf' isRequired: true structure: type: 'any' aBool: type: 'bool' aBoolAndItsRequired: type: 'bool' isRequired: true anElement: type: 'element' anElementAndItsRequired: type: 'element' isRequired: true aFunc: type: 'func' aFuncAndItsRequired: type: 'func' isRequired: true anInstanceOf: type: 'instanceOf' structure: Object anInstanceOfAndItsRequired: type: 'instanceOf' isRequired: true structure: Object aNode: type: 'node' aNodeAndItsRequired: type: 'node' isRequired: true aNumber: type: 'number' aNumberAndItsRequired: type: 'number' isRequired: true anObject: type: 'object' anObjectAndItsRequired: type: 'object' isRequired: true anObjectOf: type: 'objectOf' structure: type: 'array' anObjectOfAndItsRequired: type: 'objectOf' isRequired: true structure: type: 'array' isOneOf: type: 'oneOf' structure: 'a' 'b' isOneOfAndItsRequired: type: 'oneOf' isRequired: true structure: 'c' 'd' isOneOfType: type: 'oneOfType' structure: type: 'bool' type: 'number' isOneOfTypeAndItsRequired: type: 'oneOfType' isRequired: true structure: type: 'bool' type: 'number' aShape: type: 'shape' structure: a: type: 'number' b: type: 'bool' aShapeAndItsRequired: type: 'shape' isRequired: true structure: c: type: 'arrayOf' structure: type: 'number' aString: type: 'string' aStringAndItsRequired: type: 'string' isRequired: true aSymbol: type: 'symbol' aSymbolAndItsRequired: type: 'symbol' isRequired: true