From 5b9854af83fbc52e00b45b3313b734707f3540d4 Mon Sep 17 00:00:00 2001 From: Jim Fitzpatrick Date: Mon, 1 Oct 2018 21:59:29 -0400 Subject: [PATCH] Fix oneOf when used with Symbols - Fixes error due to an attempt to coerce a Symbol to a string - Improves formatting of the "expected" portion of the generated warning, outputting for example `["Symbol(A)","Symbol(B)"]` rather than `[null,null]` Fixes #10 --- __tests__/PropTypesDevelopmentReact15.js | 6 ++++++ __tests__/PropTypesDevelopmentStandalone-test.js | 6 ++++++ __tests__/PropTypesProductionReact15-test.js | 6 ++++++ factoryWithTypeCheckers.js | 9 +++++++-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/__tests__/PropTypesDevelopmentReact15.js b/__tests__/PropTypesDevelopmentReact15.js index ebc9590..74d15f2 100644 --- a/__tests__/PropTypesDevelopmentReact15.js +++ b/__tests__/PropTypesDevelopmentReact15.js @@ -850,6 +850,12 @@ describe('PropTypesDevelopmentReact15', () => { 'Invalid prop `testProp` of value `false` supplied to ' + '`testComponent`, expected one of [0,"false"].', ); + typeCheckFail( + PropTypes.oneOf([Symbol('red'), Symbol('blue')]), + Symbol('green'), + 'Invalid prop `testProp` of value `Symbol(green)` supplied to ' + + '`testComponent`, expected one of ["Symbol(red)","Symbol(blue)"].', + ); }); it('should not warn for valid values', () => { diff --git a/__tests__/PropTypesDevelopmentStandalone-test.js b/__tests__/PropTypesDevelopmentStandalone-test.js index 4267b6e..74687dd 100644 --- a/__tests__/PropTypesDevelopmentStandalone-test.js +++ b/__tests__/PropTypesDevelopmentStandalone-test.js @@ -852,6 +852,12 @@ describe('PropTypesDevelopmentStandalone', () => { 'Invalid prop `testProp` of value `false` supplied to ' + '`testComponent`, expected one of [0,"false"].', ); + typeCheckFail( + PropTypes.oneOf([Symbol('red'), Symbol('blue')]), + Symbol('green'), + 'Invalid prop `testProp` of value `Symbol(green)` supplied to ' + + '`testComponent`, expected one of ["Symbol(red)","Symbol(blue)"].', + ); }); it('should not warn for valid values', () => { diff --git a/__tests__/PropTypesProductionReact15-test.js b/__tests__/PropTypesProductionReact15-test.js index f2afa67..1059617 100644 --- a/__tests__/PropTypesProductionReact15-test.js +++ b/__tests__/PropTypesProductionReact15-test.js @@ -718,6 +718,12 @@ describe('PropTypesProductionReact15', () => { 'Invalid prop `testProp` of value `false` supplied to ' + '`testComponent`, expected one of [0,"false"].', ); + expectNoop( + PropTypes.oneOf([Symbol('red'), Symbol('blue')]), + Symbol('green'), + 'Invalid prop `testProp` of value `Symbol(green)` supplied to ' + + '`testComponent`, expected one of ["Symbol(red)","Symbol(blue)"].', + ); }); it('should not warn for valid values', () => { diff --git a/factoryWithTypeCheckers.js b/factoryWithTypeCheckers.js index 1942d0e..1f9af32 100644 --- a/factoryWithTypeCheckers.js +++ b/factoryWithTypeCheckers.js @@ -302,8 +302,13 @@ module.exports = function(isValidElement, throwOnDirectAccess) { } } - var valuesString = JSON.stringify(expectedValues); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + if (getPropType(value) === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); } return createChainableTypeChecker(validate); }