From 23f00e412ae051959fc9387389846bf6bbc9a94e Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Fri, 29 Sep 2017 12:19:07 -0400 Subject: [PATCH 1/7] Make generators deterministic by default --- src/main.js | 4 ++-- test/main.js | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main.js b/src/main.js index ee7a8cd..f482c4d 100644 --- a/src/main.js +++ b/src/main.js @@ -49,8 +49,8 @@ const GENERATORS = { arrayOf: (type) => [generateOneProp(type)], instanceOf: (klass) => new klass(), objectOf: (type) => ({ key: generateOneProp(type) }), - oneOf: (values) => _.sample(values), - oneOfType: (types) => generateOneProp(_.extend(_.sample(types), { forceGeneration: true })), + oneOf: (values) => _.first(values), + oneOfType: (types) => generateOneProp(_.extend(_.first(types), { forceGeneration: true })), shape: (shape) => generateProps(shape) } diff --git a/test/main.js b/test/main.js index a449409..11f22e3 100644 --- a/test/main.js +++ b/test/main.js @@ -380,17 +380,17 @@ describe('generateProps', () => { describe('given a required oneOf', () => { describe('foo or bar', () => { - it('generates either foo or bar', () => { + it('generates the first option, foo', () => { const propTypes = { myFooOrBar: React.PropTypes.oneOf(['foo', 'bar']).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = ['foo', 'bar'] + const expected = 'foo' - generateProps(propTypes).myFooOrBar.should.be.oneOf(expected) - generateProps({ propTypes }).myFooOrBar.should.be.oneOf(expected) - generateProps(ComponentAsClass).myFooOrBar.should.be.oneOf(expected) - generateProps(ComponentAsFunction).myFooOrBar.should.be.oneOf(expected) + generateProps(propTypes).myFooOrBar.should.equal(expected) + generateProps({ propTypes }).myFooOrBar.should.equal(expected) + generateProps(ComponentAsClass).myFooOrBar.should.equal(expected) + generateProps(ComponentAsFunction).myFooOrBar.should.equal(expected) }) }) }) @@ -398,17 +398,17 @@ describe('generateProps', () => { describe('given a required oneOfType', () => { describe('bool or', () => { describe('number', () => { - it('generates either a bool or a number', () => { + it('generates the first option, a bool', () => { const propTypes = { myArrayOrBool: React.PropTypes.oneOfType([React.PropTypes.bool, React.PropTypes.number]).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = [true, 1] + const expected = true - generateProps(propTypes).myArrayOrBool.should.be.oneOf(expected) - generateProps({ propTypes }).myArrayOrBool.should.be.oneOf(expected) - generateProps(ComponentAsClass).myArrayOrBool.should.be.oneOf(expected) - generateProps(ComponentAsFunction).myArrayOrBool.should.be.oneOf(expected) + generateProps(propTypes).myArrayOrBool.should.equal(expected) + generateProps({ propTypes }).myArrayOrBool.should.equal(expected) + generateProps(ComponentAsClass).myArrayOrBool.should.equal(expected) + generateProps(ComponentAsFunction).myArrayOrBool.should.equal(expected) }) }) }) From 596b9e681de3a55db7b3b51724b2f971e7a5454d Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Fri, 29 Sep 2017 17:14:12 -0400 Subject: [PATCH 2/7] Add required/optional options TODO: Docs --- src/main.js | 20 ++++++++----- test/main.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 7 deletions(-) diff --git a/src/main.js b/src/main.js index f482c4d..26278d4 100644 --- a/src/main.js +++ b/src/main.js @@ -3,10 +3,7 @@ const sinon = require('sinon') const React = require('react') const { PropTypes } = React -// TODO: Options API -const options = { - required: true -} +let options const wrapPropTypes = () => { // Adds a .type key which allows the type to be derived during the @@ -50,13 +47,12 @@ const GENERATORS = { instanceOf: (klass) => new klass(), objectOf: (type) => ({ key: generateOneProp(type) }), oneOf: (values) => _.first(values), - oneOfType: (types) => generateOneProp(_.extend(_.first(types), { forceGeneration: true })), + oneOfType: (types) => forceGenerateOneProp(_.first(types)), shape: (shape) => generateProps(shape) } const shouldGenerate = (propType) => { return ( - propType.forceGeneration || // Generate required props, and this is the required version (options.required && !propType.isRequired) || // Generate optional props, and this is the optional version @@ -78,7 +74,17 @@ const generateOneProp = (propType, propName) => { } } -const generateProps = (arg) => { +const forceGenerateOneProp = (propType) => { + const generate = GENERATORS[propType.type] + const arg = propType.arg + if (generate) { + return generate(arg) + } +} + +const generateProps = (arg, opts) => { + options = _.defaults({}, opts, { required: true, optional: false }) + let propTypes if (!arg) { diff --git a/test/main.js b/test/main.js index 11f22e3..cedf95d 100644 --- a/test/main.js +++ b/test/main.js @@ -475,3 +475,83 @@ describe('generateProps', () => { }) }) }) + +describe('generateProps(opts)', () => { + const propTypes = { + optionalArray: React.PropTypes.array, + requiredArray: React.PropTypes.array.isRequired, + optionalBool: React.PropTypes.bool, + requiredBool: React.PropTypes.bool.isRequired, + optionalNumber: React.PropTypes.number, + requiredNumber: React.PropTypes.number.isRequired, + optionalObject: React.PropTypes.object, + requiredObject: React.PropTypes.object.isRequired, + optionalString: React.PropTypes.string, + requiredString: React.PropTypes.string.isRequired, + optionalAny: React.PropTypes.any, + requiredAny: React.PropTypes.any.isRequired, + optionalElement: React.PropTypes.element, + requiredElement: React.PropTypes.element.isRequired, + optionalNode: React.PropTypes.node, + requiredNode: React.PropTypes.node.isRequired + } + + const required = { + requiredArray: [], + requiredBool: true, + requiredNumber: 1, + requiredObject: {}, + requiredString: 'A String', + requiredAny: 'Any', + requiredElement: React.createElement('div'), + requiredNode: [React.createElement('div'), React.createElement('div')] + } + + const optional = { + optionalArray: [], + optionalBool: true, + optionalNumber: 1, + optionalObject: {}, + optionalString: 'A String', + optionalAny: 'Any', + optionalElement: React.createElement('div'), + optionalNode: [React.createElement('div'), React.createElement('div')] + } + + describe('given opts = ', () => { + describe('undefined', () => { + it('generates required props only by default', () => { + const expected = required + generateProps(propTypes).should.deep.equal(expected) + }) + }) + + describe('{ required: true }', () => { + it('generates required props', () => { + const expected = required + generateProps(propTypes, { required: true }).should.deep.equal(expected) + }) + }) + + describe('{ required: false }', () => { + it('does not generate required props', () => { + const expected = {} + generateProps(propTypes, { required: false }).should.deep.equal(expected) + }) + }) + + describe('{ optional: true }', () => { + it('generates optional props', () => { + const expected = Object.assign({}, required, optional) + generateProps(propTypes, { optional: true }).should.deep.equal(expected) + }) + }) + + describe('{ optional: false }', () => { + it('does not generate optional props', () => { + const expected = required + generateProps(propTypes, { optional: false }).should.deep.equal(expected) + }) + }) + }) +}) From fb2dd0ce32313f03626ff74384cfa759e39edf96 Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Fri, 29 Sep 2017 17:34:53 -0400 Subject: [PATCH 3/7] Add ability to override generators TODO: - tests - docs --- src/main.js | 7 ++++++- test/main.js | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index 26278d4..4fb9a2f 100644 --- a/src/main.js +++ b/src/main.js @@ -61,7 +61,7 @@ const shouldGenerate = (propType) => { } const generateOneProp = (propType, propName) => { - const generate = GENERATORS[propType.type] + const generate = options.generators[propType.type] const arg = propType.arg if (generate) { if (shouldGenerate(propType)) { @@ -84,6 +84,11 @@ const forceGenerateOneProp = (propType) => { const generateProps = (arg, opts) => { options = _.defaults({}, opts, { required: true, optional: false }) + if (opts && opts.generators) { + options.generators = _.defaults({}, opts.generators, GENERATORS) + } else { + options.generators = GENERATORS + } let propTypes diff --git a/test/main.js b/test/main.js index cedf95d..1921703 100644 --- a/test/main.js +++ b/test/main.js @@ -554,4 +554,13 @@ describe('generateProps(opts)', () => { }) }) }) + + describe('given opts.generators = ', () => { + describe('with bool override', () => { + it('generates a custom bool', () => { + const opts = { generators: { bool: () => false } } + generateProps(propTypes, opts).requiredBool.should.be.false + }) + }) + }) }) From 61e9012336fb0af75740cb79fdbbc1dc622ca549 Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Thu, 5 Oct 2017 08:45:25 -0400 Subject: [PATCH 4/7] Return noop as default func generator Since generators can be overridden, and since people have lots of preferences in mocking libraries, this shouldn't be prescriptive. This may improve performance in some test suites, and removes the sinon dependency entirely. --- package.json | 3 +-- src/main.js | 3 +-- test/main.js | 24 ++++++++++++------------ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index f6e6a06..4d6a449 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,7 @@ "src/*" ], "dependencies": { - "lodash": "^4.13.1", - "sinon": "^1.17.4" + "lodash": "^4.13.1" }, "devDependencies": { "babel-cli": "^6.16.0", diff --git a/src/main.js b/src/main.js index 4fb9a2f..00ab718 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,4 @@ const _ = require('lodash') -const sinon = require('sinon') const React = require('react') const { PropTypes } = React @@ -34,7 +33,7 @@ const GENERATORS = { // Simple types array: () => [], bool: () => true, - func: () => sinon.spy(), + func: () => () => {}, number: () => 1, object: () => ({}), string: () => 'A String', diff --git a/test/main.js b/test/main.js index 1921703..6b7d55a 100644 --- a/test/main.js +++ b/test/main.js @@ -54,10 +54,10 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - generateProps(propTypes).myFunc.id.should.match(/spy#[0-9]+/) - generateProps({ propTypes }).myFunc.id.should.match(/spy#[0-9]+/) - generateProps(ComponentAsClass).myFunc.id.should.match(/spy#[0-9]+/) - generateProps(ComponentAsFunction).myFunc.id.should.match(/spy#[0-9]+/) + generateProps(propTypes).myFunc.should.be.a('function') + generateProps({ propTypes }).myFunc.should.be.a('function') + generateProps(ComponentAsClass).myFunc.should.be.a('function') + generateProps(ComponentAsFunction).myFunc.should.be.a('function') }) }) @@ -188,10 +188,10 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - generateProps(propTypes).myArrayOfFuncs[0].id.should.match(/spy#[0-9]+/) - generateProps({ propTypes }).myArrayOfFuncs[0].id.should.match(/spy#[0-9]+/) - generateProps(ComponentAsClass).myArrayOfFuncs[0].id.should.match(/spy#[0-9]+/) - generateProps(ComponentAsFunction).myArrayOfFuncs[0].id.should.match(/spy#[0-9]+/) + generateProps(propTypes).myArrayOfFuncs[0].should.be.a('function') + generateProps({ propTypes }).myArrayOfFuncs[0].should.be.a('function') + generateProps(ComponentAsClass).myArrayOfFuncs[0].should.be.a('function') + generateProps(ComponentAsFunction).myArrayOfFuncs[0].should.be.a('function') }) }) @@ -310,10 +310,10 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - generateProps(propTypes).myObjectOfFuncs.key.id.should.match(/spy#[0-9]+/) - generateProps({ propTypes }).myObjectOfFuncs.key.id.should.match(/spy#[0-9]+/) - generateProps(ComponentAsClass).myObjectOfFuncs.key.id.should.match(/spy#[0-9]+/) - generateProps(ComponentAsFunction).myObjectOfFuncs.key.id.should.match(/spy#[0-9]+/) + generateProps(propTypes).myObjectOfFuncs.key.should.be.a('function') + generateProps({ propTypes }).myObjectOfFuncs.key.should.be.a('function') + generateProps(ComponentAsClass).myObjectOfFuncs.key.should.be.a('function') + generateProps(ComponentAsFunction).myObjectOfFuncs.key.should.be.a('function') }) }) From 2ac0e4608ea7d2d5df9423494decc15abe0f55bc Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Thu, 5 Oct 2017 08:47:20 -0400 Subject: [PATCH 5/7] Simplify some default generations --- src/main.js | 6 +++--- test/main.js | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main.js b/src/main.js index 00ab718..38f10fe 100644 --- a/src/main.js +++ b/src/main.js @@ -36,10 +36,10 @@ const GENERATORS = { func: () => () => {}, number: () => 1, object: () => ({}), - string: () => 'A String', - any: () => 'Any', + string: () => 'string', + any: () => 'any', element: () => React.createElement('div'), - node: () => [React.createElement('div'), React.createElement('div')], + node: () => 'node', // Complex types arrayOf: (type) => [generateOneProp(type)], diff --git a/test/main.js b/test/main.js index 6b7d55a..bae44aa 100644 --- a/test/main.js +++ b/test/main.js @@ -97,7 +97,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myString: 'A String' } + const expected = { myString: 'string' } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -112,7 +112,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myAny: 'Any' } + const expected = { myAny: 'any' } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -142,7 +142,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myNode: [React.createElement('div'), React.createElement('div')] } + const expected = { myNode: 'node' } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -231,7 +231,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myArrayOfStrings: ['A String'] } + const expected = { myArrayOfStrings: ['string'] } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -246,7 +246,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myArrayOfAnys: ['Any'] } + const expected = { myArrayOfAnys: ['any'] } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -353,7 +353,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myObjectOfStrings: { key: 'A String' } } + const expected = { myObjectOfStrings: { key: 'string' } } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -368,7 +368,7 @@ describe('generateProps', () => { ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes - const expected = { myObjectOfAnys: { key: 'Any' } } + const expected = { myObjectOfAnys: { key: 'any' } } generateProps(propTypes).should.deep.equal(expected) generateProps({ propTypes }).should.deep.equal(expected) @@ -501,10 +501,10 @@ describe('generateProps(opts)', () => { requiredBool: true, requiredNumber: 1, requiredObject: {}, - requiredString: 'A String', - requiredAny: 'Any', + requiredString: 'string', + requiredAny: 'any', requiredElement: React.createElement('div'), - requiredNode: [React.createElement('div'), React.createElement('div')] + requiredNode: 'node' } const optional = { @@ -512,10 +512,10 @@ describe('generateProps(opts)', () => { optionalBool: true, optionalNumber: 1, optionalObject: {}, - optionalString: 'A String', - optionalAny: 'Any', + optionalString: 'string', + optionalAny: 'any', optionalElement: React.createElement('div'), - optionalNode: [React.createElement('div'), React.createElement('div')] + optionalNode: 'node' } describe('given opts = ', () => { From 97bf9b48a7e53498f47ca6467c9e6bd11775b7e9 Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Thu, 5 Oct 2017 09:39:11 -0400 Subject: [PATCH 6/7] Support React 15.3+ and 16 --- package.json | 7 ++-- src/main.js | 2 +- src/prop-types.js | 6 +++ test/main.js | 101 +++++++++++++++++++++++----------------------- 4 files changed, 62 insertions(+), 54 deletions(-) create mode 100644 src/prop-types.js diff --git a/package.json b/package.json index 4d6a449..d943b6e 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "react": "^15.3.2" }, "peerDependencies": { - "react": "0.13.x || 0.14.x || ^15.0.0-0 || 15.x" + "react": "0.13.x || 0.14.x || ^15.0.0-0 || 15.x || 16.x" }, "scripts": { "build": "babel src -d dist", @@ -34,10 +34,11 @@ "coveralls": "cat ./coverage/lcov.info | coveralls", "postcoveralls": "rm -rf ./coverage", "test": "npm run react:13 && mocha && npm run react:14 && mocha && npm run react:15 && mocha", - "react:clean": "rm -rf node_modules/react node_modules/react-dom node_modules/react-addons-test-utils", + "react:clean": "rm -rf node_modules/react node_modules/react-dom node_modules/react-addons-test-utils node_modules/prop-types", "react:13": "npm run react:clean && npm i react@0.13", "react:14": "npm run react:clean && npm i react@0.14 react-dom@0.14 react-addons-test-utils@0.14", - "react:15": "npm run react:clean && npm i react@15 react-dom@15 react-addons-test-utils@15" + "react:15": "npm run react:clean && npm i react@15 react-dom@15 react-addons-test-utils@15", + "react:16": "npm run react:clean && npm i react@16 prop-types" }, "repository": { "type": "git", diff --git a/src/main.js b/src/main.js index 38f10fe..7e48c7c 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,6 @@ const _ = require('lodash') const React = require('react') -const { PropTypes } = React +const PropTypes = require('./prop-types') let options diff --git a/src/prop-types.js b/src/prop-types.js new file mode 100644 index 0000000..ce93321 --- /dev/null +++ b/src/prop-types.js @@ -0,0 +1,6 @@ +let PropTypes + +try { PropTypes = require('prop-types') } +catch (e) { PropTypes = require('react').PropTypes } + +module.exports = PropTypes diff --git a/test/main.js b/test/main.js index bae44aa..20ed465 100644 --- a/test/main.js +++ b/test/main.js @@ -1,4 +1,5 @@ const React = require('react') +const PropTypes = require('../src/prop-types') const ComponentAsClass = class extends React.Component { render() { 'component' } } const ComponentAsFunction = () => 'component' @@ -20,7 +21,7 @@ describe('generateProps', () => { describe('given a required array', () => { it('generates an array', () => { - const propTypes = { myArray: React.PropTypes.array.isRequired } + const propTypes = { myArray: PropTypes.array.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -35,7 +36,7 @@ describe('generateProps', () => { describe('given a required bool', () => { it('generates a bool', () => { - const propTypes = { myBool: React.PropTypes.bool.isRequired } + const propTypes = { myBool: PropTypes.bool.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -50,7 +51,7 @@ describe('generateProps', () => { describe('given a required func', () => { it('generates a func', () => { - const propTypes = { myFunc: React.PropTypes.func.isRequired } + const propTypes = { myFunc: PropTypes.func.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -63,7 +64,7 @@ describe('generateProps', () => { describe('given a required number', () => { it('generates a number', () => { - const propTypes = { myNumber: React.PropTypes.number.isRequired } + const propTypes = { myNumber: PropTypes.number.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -78,7 +79,7 @@ describe('generateProps', () => { describe('given a required object', () => { it('generates an object', () => { - const propTypes = { myObject: React.PropTypes.object.isRequired } + const propTypes = { myObject: PropTypes.object.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -93,7 +94,7 @@ describe('generateProps', () => { describe('given a required string', () => { it('generates a string', () => { - const propTypes = { myString: React.PropTypes.string.isRequired } + const propTypes = { myString: PropTypes.string.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -108,7 +109,7 @@ describe('generateProps', () => { describe('given a required any', () => { it('generates an any', () => { - const propTypes = { myAny: React.PropTypes.any.isRequired } + const propTypes = { myAny: PropTypes.any.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -123,7 +124,7 @@ describe('generateProps', () => { describe('given a required element', () => { it('generates a react element', () => { - const propTypes = { myElement: React.PropTypes.element.isRequired } + const propTypes = { myElement: PropTypes.element.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -138,7 +139,7 @@ describe('generateProps', () => { describe('given a required node', () => { it('generates a node', () => { - const propTypes = { myNode: React.PropTypes.node.isRequired } + const propTypes = { myNode: PropTypes.node.isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -154,7 +155,7 @@ describe('generateProps', () => { describe('given a required arrayOf', () => { describe('required arrays', () => { it('generates an array of arrays', () => { - const propTypes = { myArrayOfArrays: React.PropTypes.arrayOf(React.PropTypes.array.isRequired).isRequired } + const propTypes = { myArrayOfArrays: PropTypes.arrayOf(PropTypes.array.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -169,7 +170,7 @@ describe('generateProps', () => { describe('required bools', () => { it('generates an array of bools', () => { - const propTypes = { myArrayOfBools: React.PropTypes.arrayOf(React.PropTypes.bool.isRequired).isRequired } + const propTypes = { myArrayOfBools: PropTypes.arrayOf(PropTypes.bool.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -184,7 +185,7 @@ describe('generateProps', () => { describe('required funcs', () => { it('generates an array of funcs', () => { - const propTypes = { myArrayOfFuncs: React.PropTypes.arrayOf(React.PropTypes.func.isRequired).isRequired } + const propTypes = { myArrayOfFuncs: PropTypes.arrayOf(PropTypes.func.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -197,7 +198,7 @@ describe('generateProps', () => { describe('required numbers', () => { it('generates an array of numbers', () => { - const propTypes = { myArrayOfNumbers: React.PropTypes.arrayOf(React.PropTypes.number.isRequired).isRequired } + const propTypes = { myArrayOfNumbers: PropTypes.arrayOf(PropTypes.number.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -212,7 +213,7 @@ describe('generateProps', () => { describe('required objects', () => { it('generates an array of objects', () => { - const propTypes = { myArrayOfObjects: React.PropTypes.arrayOf(React.PropTypes.object.isRequired).isRequired } + const propTypes = { myArrayOfObjects: PropTypes.arrayOf(PropTypes.object.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -227,7 +228,7 @@ describe('generateProps', () => { describe('required strings', () => { it('generates an array of strings', () => { - const propTypes = { myArrayOfStrings: React.PropTypes.arrayOf(React.PropTypes.string.isRequired).isRequired } + const propTypes = { myArrayOfStrings: PropTypes.arrayOf(PropTypes.string.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -242,7 +243,7 @@ describe('generateProps', () => { describe('required anys', () => { it('generates an array of anys', () => { - const propTypes = { myArrayOfAnys: React.PropTypes.arrayOf(React.PropTypes.any.isRequired).isRequired } + const propTypes = { myArrayOfAnys: PropTypes.arrayOf(PropTypes.any.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -260,7 +261,7 @@ describe('generateProps', () => { it('generates a an instance of MyClass', () => { class MyClass {} - const propTypes = { myInstance: React.PropTypes.instanceOf(MyClass).isRequired } + const propTypes = { myInstance: PropTypes.instanceOf(MyClass).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -276,7 +277,7 @@ describe('generateProps', () => { describe('given a required objectOf', () => { describe('required arrays', () => { it('generates an array of arrays', () => { - const propTypes = { myObjectOfArrays: React.PropTypes.objectOf(React.PropTypes.array.isRequired).isRequired } + const propTypes = { myObjectOfArrays: PropTypes.objectOf(PropTypes.array.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -291,7 +292,7 @@ describe('generateProps', () => { describe('required bools', () => { it('generates an array of bools', () => { - const propTypes = { myObjectOfBools: React.PropTypes.objectOf(React.PropTypes.bool.isRequired).isRequired } + const propTypes = { myObjectOfBools: PropTypes.objectOf(PropTypes.bool.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -306,7 +307,7 @@ describe('generateProps', () => { describe('required funcs', () => { it('generates an array of funcs', () => { - const propTypes = { myObjectOfFuncs: React.PropTypes.objectOf(React.PropTypes.func.isRequired).isRequired } + const propTypes = { myObjectOfFuncs: PropTypes.objectOf(PropTypes.func.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -319,7 +320,7 @@ describe('generateProps', () => { describe('required numbers', () => { it('generates an array of numbers', () => { - const propTypes = { myObjectOfNumbers: React.PropTypes.objectOf(React.PropTypes.number.isRequired).isRequired } + const propTypes = { myObjectOfNumbers: PropTypes.objectOf(PropTypes.number.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -334,7 +335,7 @@ describe('generateProps', () => { describe('required objects', () => { it('generates an array of objects', () => { - const propTypes = { myObjectOfObjects: React.PropTypes.objectOf(React.PropTypes.object.isRequired).isRequired } + const propTypes = { myObjectOfObjects: PropTypes.objectOf(PropTypes.object.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -349,7 +350,7 @@ describe('generateProps', () => { describe('required strings', () => { it('generates an array of strings', () => { - const propTypes = { myObjectOfStrings: React.PropTypes.objectOf(React.PropTypes.string.isRequired).isRequired } + const propTypes = { myObjectOfStrings: PropTypes.objectOf(PropTypes.string.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -364,7 +365,7 @@ describe('generateProps', () => { describe('required anys', () => { it('generates an array of anys', () => { - const propTypes = { myObjectOfAnys: React.PropTypes.objectOf(React.PropTypes.any.isRequired).isRequired } + const propTypes = { myObjectOfAnys: PropTypes.objectOf(PropTypes.any.isRequired).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -381,7 +382,7 @@ describe('generateProps', () => { describe('given a required oneOf', () => { describe('foo or bar', () => { it('generates the first option, foo', () => { - const propTypes = { myFooOrBar: React.PropTypes.oneOf(['foo', 'bar']).isRequired } + const propTypes = { myFooOrBar: PropTypes.oneOf(['foo', 'bar']).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -399,7 +400,7 @@ describe('generateProps', () => { describe('bool or', () => { describe('number', () => { it('generates the first option, a bool', () => { - const propTypes = { myArrayOrBool: React.PropTypes.oneOfType([React.PropTypes.bool, React.PropTypes.number]).isRequired } + const propTypes = { myArrayOrBool: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -417,7 +418,7 @@ describe('generateProps', () => { describe('given a required shape', () => { describe('with a required array value', () => { it('generates an object with an array value', () => { - const propTypes = { myShape: React.PropTypes.shape({ myArray: React.PropTypes.array.isRequired }).isRequired } + const propTypes = { myShape: PropTypes.shape({ myArray: PropTypes.array.isRequired }).isRequired } ComponentAsClass.propTypes = propTypes ComponentAsFunction.propTypes = propTypes @@ -432,9 +433,9 @@ describe('generateProps', () => { describe('and a required bool', () => { it('generates an object with an array value and a bool value', () => { const propTypes = { - myShape: React.PropTypes.shape({ - myArray: React.PropTypes.array.isRequired, - myBool: React.PropTypes.bool.isRequired + myShape: PropTypes.shape({ + myArray: PropTypes.array.isRequired, + myBool: PropTypes.bool.isRequired }).isRequired } ComponentAsClass.propTypes = propTypes @@ -453,10 +454,10 @@ describe('generateProps', () => { describe('with a required number', () => { it('generates an object with an array value and a sub-object with bool value', () => { const propTypes = { - myShape: React.PropTypes.shape({ - myArray: React.PropTypes.array.isRequired, - mySubShape: React.PropTypes.shape({ - myNumber: React.PropTypes.number.isRequired + myShape: PropTypes.shape({ + myArray: PropTypes.array.isRequired, + mySubShape: PropTypes.shape({ + myNumber: PropTypes.number.isRequired }).isRequired }).isRequired } @@ -478,22 +479,22 @@ describe('generateProps', () => { describe('generateProps(opts)', () => { const propTypes = { - optionalArray: React.PropTypes.array, - requiredArray: React.PropTypes.array.isRequired, - optionalBool: React.PropTypes.bool, - requiredBool: React.PropTypes.bool.isRequired, - optionalNumber: React.PropTypes.number, - requiredNumber: React.PropTypes.number.isRequired, - optionalObject: React.PropTypes.object, - requiredObject: React.PropTypes.object.isRequired, - optionalString: React.PropTypes.string, - requiredString: React.PropTypes.string.isRequired, - optionalAny: React.PropTypes.any, - requiredAny: React.PropTypes.any.isRequired, - optionalElement: React.PropTypes.element, - requiredElement: React.PropTypes.element.isRequired, - optionalNode: React.PropTypes.node, - requiredNode: React.PropTypes.node.isRequired + optionalArray: PropTypes.array, + requiredArray: PropTypes.array.isRequired, + optionalBool: PropTypes.bool, + requiredBool: PropTypes.bool.isRequired, + optionalNumber: PropTypes.number, + requiredNumber: PropTypes.number.isRequired, + optionalObject: PropTypes.object, + requiredObject: PropTypes.object.isRequired, + optionalString: PropTypes.string, + requiredString: PropTypes.string.isRequired, + optionalAny: PropTypes.any, + requiredAny: PropTypes.any.isRequired, + optionalElement: PropTypes.element, + requiredElement: PropTypes.element.isRequired, + optionalNode: PropTypes.node, + requiredNode: PropTypes.node.isRequired } const required = { From cb2c4718b48211b534ab504cc35ae58b2f44f8bc Mon Sep 17 00:00:00 2001 From: Mark Battersby Date: Thu, 5 Oct 2017 12:15:39 -0400 Subject: [PATCH 7/7] Add CHANGELOG.md --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b749012 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,18 @@ +## [Unreleased] +
+ + Changes that have landed in master but are not yet released. + + +* Generators are now deterministic by default. Previously, snapshot tests might break if `oneOf` or `oneOfType` were used. +* `opts` can now be passed as the second arg to `generateProps` to generate or omit required or optional types. Default: `{ required: true, optional: false }` +* Generators can be overridden via the `opts` argument. Syntax: `generateProps(Component, { generators: { bool: () => false } })` +* `string`, `any`, and `node` generators now return exactly those strings. (`'string'`, `'any'`, or `'node'`) +* React 16 and the `prop-types` package are now supported. + +
+ +## 0.3.0 (October 5, 2017) +## 0.2.0 (October 18, 2016) +## 0.1.0 (October 18, 2016) +## 0.0.1 (July 14, 2016)