Research
Security News
Kill Switch Hidden in npm Packages Typosquatting Chalk and Chokidar
Socket researchers found several malicious npm packages typosquatting Chalk and Chokidar, targeting Node.js developers with kill switches and data theft.
airbnb-prop-types
Advanced tools
The airbnb-prop-types package provides a collection of React propType validators that can be used to ensure that components receive props of the correct type, shape, and value. It extends the basic propTypes provided by React with more specific and useful validators, making it easier to catch bugs and enforce consistent prop usage across a codebase.
Primitive Type Validators
Allows for more specific type validation, such as ensuring a prop is a non-empty string.
import { string } from 'airbnb-prop-types';
Component.propTypes = {
name: string().isRequired,
};
Collection Validators
Enables validation of arrays, ensuring each item in the array matches the specified validator.
import { arrayOf } from 'airbnb-prop-types';
Component.propTypes = {
items: arrayOf(string()).isRequired,
};
Shape Validators
Allows for the validation of an object's shape, ensuring it matches a specific schema.
import { shape } from 'airbnb-prop-types';
Component.propTypes = {
user: shape({
id: number().isRequired,
name: string().isRequired,
}).isRequired,
};
Custom Validators
Provides the ability to create custom validators, such as forbidding extra props that are not explicitly specified.
import { forbidExtraProps } from 'airbnb-prop-types';
Component.propTypes = forbidExtraProps({
name: string().isRequired,
age: number(),
});
The original prop-types library used for React prop type validation. It offers basic type checking but lacks the more specific validators and features provided by airbnb-prop-types.
A library offering propType validators specifically designed for Immutable.js data structures. While it serves a niche use case compared to airbnb-prop-types, it's invaluable for projects using Immutable.js.
Yup is a JavaScript schema builder for value parsing and validation. Unlike airbnb-prop-types, which integrates directly with React prop types, Yup is more versatile and can be used outside of React for form validation and more.
Custom React PropType validators that we use at Airbnb. Use of airbnb-js-shims or the equivalent is recommended.
and
: ensure that all provided propType validators pass
foo: and([number, nonNegativeInteger])
between
: provide an object with an gt
or gte
number, and an lt
or lte
number (only one item allowed from each pairs; one or both pairs may be provided), and the resulting propType validator will ensure the prop value is a number within the given range. Alternatively, you can provide a function that takes the props
object and returns a number for each of the gt
/gte
/lt
/lte
values.
foo: between({ gte: 0, lte: 5 })
foo: between({ gt: 0, lt: 5 })
booleanSome
: provide a list of props, and all must be booleans, and at least one of them must be true
.
foo: booleanSome('small', 'medium', 'large')
childrenHavePropXorChildren
: ensure that either all children have the indicated prop, all children have children, or all children have neither.
foo: childrenHavePropXorChildren('bar')
childrenOf
: restrict the children prop to only allow children that pass the given propType validator.
children: childrenOf(number.isRequired)
childrenOfType
: restrict the children prop to only allow children of the given element types - takes a Component, an HTML tag name, or "*"
to match everything.
children: childrenOfType('span')
children: childrenOfType(Component)
childrenSequenceOf
: restrict the children prop to be a sequenceOf the given "specifiers" (see sequenceOf
)
children: childrenSequenceOf({validator: string, min: 0, max: 5})
componentWithName
: restrict the prop to only allow a component with a certain name/displayName. Accepts a string, or a regular expression. Also accepts an options
object with an optional stripHOCs
array of string HOC names to strip off before validating; an HOC name must not contain parentheses and must be in camelCase.
foo: componentWithName('Component')
foo: componentWithName('Component', { stripHOCs: ['withDirection', 'withStyles'] })
disallowedIf
: restrict the prop from being provided if the given other prop name matches the given other prop type. The other prop type validator only applies if the other prop name is not a null value.
foo: disallowedIf(string, 'bar', bool)
elementType
: require that the prop be a specific type of React element - takes a Component, an HTML tag name, or "*"
to match everything.
foo: elementType('span')
foo: elementType(Component)
empty
: a value that React renders to nothing: undefined
, null
, false
, the empty string, or an array of those things.
foo: empty()
explicitNull
: only allow null
or undefined
/omission - and only null
when required.
foo: explicitNull()
forbidExtraProps
: pass your entire propTypes
object into this function, and any nonspecified prop will error.
Component.propTypes = forbidExtraProps({foo: number.isRequired})
integer
: require the prop be an integer.
foo: integer()
keysOf
: pass in a proptype, and require all the keys of a prop to have that type
foo: keysOf(number)
mutuallyExclusiveProps
: provide a propType, and a list of props, and only one prop out of the list will be permitted, validated by the given propType.
foo: mutuallyExclusiveProps(bool, 'bar', 'sna')
mutuallyExclusiveTrueProps
: provide a list of props, and all must be booleans, and only one is allowed to be true.
foo: mutuallyExclusiveTrueProps('bar', 'sna')
nChildren
: require a specific amount of children.
children: nChildren(3)
children: nChildren(3, childrenOfType('span'))
nonNegativeInteger
: require that the prop be a number, that is 0, or a finite positive integer.
foo: nonNegativeInteger()
nonNegativeNumber
: require that the prop be a number, that is 0, or a finite positive number.
foo: nonNegativeNumber()
numericString
: require the prop be a string that is conceptually numeric.
foo: numericString()
object
: same as PropTypes.object
, but can be called outside of React's propType flow.or
: recursively allows only the provided propTypes, or arrays of those propTypes.
foo: or([bool.isRequired, explicitNull()])
predicate
: provide a predicate function, and an optional message, and will fail when the predicate returns false.
foo: predicate((x) => x % 2 === 0, 'must be an even integer')
range
: provide a min, and a max, and the prop must be an integer in the range [min, max)
foo: range(-1, 2)
ref
: require the prop to be a React ref. These can be either the object returned from React.createRef()
or "callback" refs.
foo: ref()
requiredBy
: pass in a prop name and propType, and require that the prop is defined and is not its default value if the passed in prop name is truthy. if the default value is not provided, defaults to checking against null
.
foo: requiredBy('bar', bool)
restrictedProp
: this prop is not permitted to be anything but null
or undefined
.
foo: restrictedProp()
foo: restrictedProp(new TypeError('Custom Error'))
sequenceOf
: takes 1 or more "specifiers": an object with a "validator" function (a propType validator), a "min" nonNegativeInteger, and a "max" nonNegativeInteger. If both "min" and "max" may be omitted, they default to 1; if only "max" is omitted, it defaults to Infinity; if only "min" is omitted, it defaults to 1.
foo: sequenceOf({validator: string, min: 0, max: 5})
shape
: takes a shape, and allows it to be enforced on any non-null/undefined value.
foo: shape({ length: oneOf([2]) })
stringEndsWith
: takes a non-empty string, and returns a validator that ensures the prop value is a string that ends with it.
foo: stringEndsWith('.png')
stringStartsWith
: takes a non-empty string, and returns a validator that ensures the prop value is a string that starts with it.
foo: stringStartsWith('prefix-')
uniqueArray
: this prop must be an array, and all values must be unique (determined by Object.is
). Like PropTypes.array
, but with uniqueness.
foo: uniqueArray()
uniqueArrayOf
: uniqueArray
, with a type validator applied. Like PropTypes.arrayOf
, but with uniqueness. Can also take an optional mapper function that allows for a non-standard unique calculation (otherwise, Object.is
is used by default). The function is applied to each element in the array, and the resulting values are compared using the standard unique calculation.
foo: uniqueArrayOf(number)
foo: uniqueArrayOf(element => element ** 2)
foo: uniqueArrayOf(element => element ** 2, 'test')
foo: uniqueArrayOf(array, element => element[0] ** 2, 'test')
valuesOf
: a non-object requiring PropTypes.objectOf
. Takes a propType validator, and applies it to every own value on the propValue.
foo: valuesOf(number)
withShape
: takes a PropType and a shape, and allows it to be enforced on any non-null/undefined value.
foo: withShape(array, { length: oneOf([2]) })
Since PropTypes
are typically not included in production builds of React, this library’s functionality serves no useful purpose. As such, when the NODE_ENV
environment variable is "production"
, instead of exporting the implementations of all these prop types, we export mock functions - in other words, something that ensures that no exceptions are thrown, but does no validation. When environment variables are inlined (via a browserify transform or webpack plugin), then tools like webpack or uglify are able to determine that only the mocks will be imported - and can avoid including the entire implementations in the final bundle that is sent to the browser. This allows for a much smaller ultimate file size, and faster in-browser performance, without sacrificing the benefits of PropTypes
themselves.
Clone the repo, npm install
, npm run react
, and run npm test
v2.17.0 - 2024-05-23
childrenOf
/childrenOfType
/childrenSequenceOf
: support fragments via renderableChildren
helper #71
5032f7f
c92c5c4
8586801
npmignore
0a366a6
6539947
auto-changelog
1255cd7
array.prototype.find
, array.prototype.flatmap
, function.prototype.name
, is-regex
, object-is
, object.assign
, object.entries
, prop-types
, prop-types-exact
7ed89ae
@babel/cli
, @babel/core
, @babel/register
, eslint
, eslint-plugin-import
, eslint-plugin-jsx-a11y
, eslint-plugin-react
af140ff
@babel/cli
, @babel/core
, @babel/register
, enzyme-adapter-react-helper
, eslint
, eslint-plugin-react
e560291
object-is
, object.assign
, react-is
4f12896
engines.node
9c6f8e6
aud
in posttest e9fb91a
2b14af0
is-regex
5c7bd2b
42d5f4d
predicate
validatorfunding
fieldhas
(#67)array.prototype.find
, function.prototype.name
, is-regex
, object.entries
, object-is
, react-is
@babel/cli
, @babel/core
, @babel/register
, airbnb-browser-shims
, enzyme
, enzyme-adapter-react-helper
, eslint
, eslint-config-airbnb
, eslint-plugin-import
, eslint-plugin-react
, enzyme-adapter-react-helper
, object-inspect
, object.values
, reflect.ownkeys
, rimraf
, safe-publish-latest
or
testsreact-is
enzyme-adapter-react-helper
, eslint
, eslint-config-airbnb
, rimraf
, safe-publish-latest
npm run test:prepare
in node >= 4node
v12
stringEndsWith
(#59)getComponentName
/componentWithName
: get display name from forwardRefs (#64)array.prototype.find
, function.prototype.name
@babel/cli
, @babel/core
, @babel/register
, babel-plugin-istanbul
, babel-preset-airbnb
, enzyme
, enzyme-adapter-react-helper
, eslint-config-airbnb
, eslint-plugin-import
, eslint-plugin-jsx-a11y
, eslint-plugin-react
ref
: Remove arity check (#57)ref
: ensure that the prop value is not a component (#55)ref
(#54)prop-types
, react-is
@babel/cli
, @babel/core
, @babel/register
, airbnb-browser-shims
, babel-plugin-istanbul
, babel-preset-airbnb
, enzyme
, enzyme-adapter-react-helper
, eslint
empty
elementType
: support forwardRefs and Context Provider/Consumerobject.entries
airbnb-browser-shims
, chai
, enzyme
, enzyme
, enzyme-adapter-react-helper
, eslint
, eslint-plugin-jsx-a11y
, eslint-plugin-react
, eslint-plugin-import
has
, prop-types
, prop-types-exact
enzyme
, enzyme-adapter-react-helper
, eslint
, eslint-config-airbnb
, eslint-plugin-import
, eslint-plugin-jsx-a11y
, eslint-plugin-react
, safe-publish-latest
componentWithName
: allow it to take a list of HOC names to strip off before validating (#41)eslint-plugin-import
, eslint-plugin-react
node
v10
requiredBy
validator (#30)stringStartsWith
booleanSome
object-is
instead of Object.is
prop-types
, function.prototype.name
, object.assign
, prop-types-exact
airbnb-browser-shims
, babel-cli
, babel-plugin-istanbul
, babel-plugin-transform-replace-object-assign
, babel-register
, chai
, eslint
, eslint-config-airbnb
, eslint-plugin-jsx-a11y
, eslint-plugin-react
, eslint-plugin-import
, react
, rimraf
node
v9
; pin included builds to LTS; use nvm install-latest-npm
enzyme-adapter-react-helper
nonNegativeInteger
: mock should match reality and not be a noopThunk, only a noopmapper
function to uniqueArrayOf
(#29, #28)function.prototype.name
eslint
, eslint-config-airbnb
getComponentName
more robust in IE (#27)prop-types-exact
babel-preset-airbnb
, chai
, eslint-plugin-airbnb
, eslint-plugin-import
, eslint-plugin-jsx-a11y
restrictedProp
: ensure it passes with a custom message when nullaryrestrictedProp
: add ability to overwrite error with custom function (#22)Object.assign
by transforming to object.assign
prop-types
babel-plugin-istanbul
, chai
, eslint-config-airbnb
, eslint-plugin-import
, eslint-plugin-jsx-a11y
, eslint-plugin-react
, mocha
node
v8
; npm
v5
+ breaks on node
< v4nyc
childrenHavePropXorChildren
Ensure validator skips over falsy childrenprop-types
babel-plugin-istanbul
, mocha
, nyc
, react
prop-types
package instead of React.PropTypes
array.prototype.find
, prop-types
babel-cli
, babel-register
, eslint
, nyc
, react
componentWithName
: throw if given a non-string/non-regex nameor
: ensure it works with explicitNull
(#12)between
: avoid React PropType warning by using valuesOf
instead of PropTypes.objectOf
or
: add some extra tests; remove unnecessary oneOfType
wrapperchildrenOfType
: add support for *
which supports anything.babel-cli
, babel-register
, eslint
, rimraf
, babel-plugin-istanbul
, eslint-plugin-react
childrenOfType
: partially revert fc0e37f84e1537a875c30d0db69b5121d790eb40childrenSequenceOf
sequenceOf
between
: allow it to take props-taking number thunks as option values as well.between
shape
nonNegativeNumber
elementType
childrenOf
object
keysOf
(#8)valuesOf
isPrimitive
and isPlainObject
helperswrapValidator
helperrenderableChildren
helpergetComponentName
helpernChildren
, restrictedProp
, childrenHavePropXorChildren
: add isRequired
for consistencyand
: isRequired
validator typeName should indicate such.npm run coverage
integer
eslint
, rimraf
numericString
explicitNull
airbnb-js-shims
, babel-cli
, babel-register
, eslint-plugin-react
childrenOfType
: improve the error messageeslint
, eslint-config-airbnb
, eslint-plugin-jsx-a11y
mutuallyExclusiveTrueProps
babel-cli
, babel-preset-airbnb
, babel-register
, eslint
.isRequired
NODE_ENV
is production
, export mocks instead of real validatorsuniqueArray
/uniqueArrayOf
withShape
restrictedProp
)safe-publish-latest
to devDepseslint
, eslint-config-airbnb
, eslint-plugin-import
, eslint-plugin-react
, eslint-plugin-jsx-a11y
, mocha
, react
; add missing babel-register
node
v7
forbidExtraProps
: add the componentName into the error messageforbidPropTypes
: allow propTypes to be processed multiple timesforbidPropTypes
: fix unknown props error messageforbidExtraProps
babel-cli
and
combinatorisRequired
to nonNegativeInteger
eslint-plugin-react
, mocha
mutuallyExclusiveProps
: include the “current” prop in the exclusives listisRequired
to mutuallyExclusiveProps
; ensure mutuallyExclusiveProps
is not required by defaultisRequired
to componentWithName
; ensure componentWithName
is not required by defaultsafe-publish-latest
FAQs
Custom React PropType validators that we use at Airbnb.
The npm package airbnb-prop-types receives a total of 1,175,655 weekly downloads. As such, airbnb-prop-types popularity was classified as popular.
We found that airbnb-prop-types demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 7 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers found several malicious npm packages typosquatting Chalk and Chokidar, targeting Node.js developers with kill switches and data theft.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.