From 754b9747e7d477b3824c0de200267c836dfdc097 Mon Sep 17 00:00:00 2001 From: Bill Neff Date: Fri, 22 Mar 2019 16:27:58 -0400 Subject: [PATCH 1/2] add getWrappedComponent method to provide and mergingProvide decorators --- README.md | 4 ++++ src/index.js | 16 ++++++++++++++-- test/index.js | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cf5723b..5800488 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,8 @@ const Demo = (props, context) => { }; const ProvidedDemo = provide({a: "b"})(Demo); +ProvidedDemo.getWrappedComponent() === Demo; // true + render( ); ``` @@ -167,6 +169,8 @@ const Demo = (props, context) => { }; const ProvidedDemo = mergingProvide({a: "b"})(Demo); +ProvidedDemo.getWrappedComponent() === Demo; // true + render( ); // "b" ``` diff --git a/src/index.js b/src/index.js index d45a915..debf904 100644 --- a/src/index.js +++ b/src/index.js @@ -146,9 +146,15 @@ export class MergingProvider { * }; * const ProvidedDemo = provide({a: "b"})(Demo); * + * ProvidedDemo.getWrappedComponent() === Demo; // true + * * render( ); */ -export const provide = ctx => Child => props => h(Provider, ctx, h(Child, props)); +export const provide = ctx => Child => { + const ProviderWrapper = props => h(Provider, ctx, h(Child, props)); + ProviderWrapper.getWrappedComponent = Child && Child.getWrappedComponent || (() => Child); + return ProviderWrapper; +}; Provider.provide = provide; @@ -166,6 +172,12 @@ Provider.provide = provide; * }; * const ProvidedDemo = mergingProvide({a: "b"})(Demo); * + * ProvidedDemo.getWrappedComponent() === Demo; // true + * * render( ); // "b" */ -export const mergingProvide = ctx => Child => props => h(MergingProvider, ctx, h(Child, props)); +export const mergingProvide = ctx => Child => { + const MergingProviderWrapper = props => h(MergingProvider, ctx, h(Child, props)); + MergingProviderWrapper.getWrappedComponent = Child && Child.getWrappedComponent || (() => Child); + return MergingProviderWrapper; +}; diff --git a/test/index.js b/test/index.js index 5d6f09d..dc6065b 100644 --- a/test/index.js +++ b/test/index.js @@ -93,6 +93,26 @@ describe('preact-context-provider', () => { let ProvidedSpy = provide(context)(Spy); expect().to.equal(); }); + + describe('getWrappedComponent()', () => { + + it('should be a function', () => { + let Wrapped = provide(context)(Spy); + expect(Wrapped.getWrappedComponent).to.be.a('function'); + }); + + it('should return the Child component that it is wrapping', () => { + let Wrapped = provide(context)(Spy); + expect(Wrapped.getWrappedComponent()).to.equal(Spy); + }); + + it('should recursively call getWrappedComponent() on Child components to return the first non-decorator Child', () => { + let Wrapped = provide(context)(provide(context)(Spy)); + expect(Wrapped.getWrappedComponent()).to.equal(Spy); + }); + + }); + }); describe('mergingProvide()', () => { @@ -104,5 +124,25 @@ describe('preact-context-provider', () => { let MergingProvidedSpy = mergingProvide({ ...context, mergeProps: true })(Spy); expect().to.equal(); }); + + describe('getWrappedComponent()', () => { + + it('should be a function', () => { + let MergingProvidedSpy = mergingProvide({ ...context, mergeProps: true })(Spy); + expect(MergingProvidedSpy.getWrappedComponent).to.be.a('function'); + }); + + it('should return the Child component that it is wrapping', () => { + let MergingProvidedSpy = mergingProvide({ ...context, mergeProps: true })(Spy); + expect(MergingProvidedSpy.getWrappedComponent()).to.equal(Spy); + }); + + it('should recursively call getWrappedComponent() on Child components to return the first non-decorator Child', () => { + let MergingProvidedSpy = mergingProvide({ ...context, mergeProps: true })(mergingProvide({ ...context, mergeProps: true })(Spy)); + expect(MergingProvidedSpy.getWrappedComponent()).to.equal(Spy); + }); + + }); + }); }); From 31be981090bf3d5f1dc06059d8d969ad98dc7b1a Mon Sep 17 00:00:00 2001 From: Bill Neff Date: Fri, 22 Mar 2019 16:32:00 -0400 Subject: [PATCH 2/2] getWrappedComponent fix test script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81e85e4..29a3748 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "source": "src/index.js", "scripts": { "lint": "eslint src test", - "test": "npm-run-all -p lint test:unit test:prod", + "test": "npm-run-all -p lint test:unit build -s test:prod", "test:unit": "karma start karma.conf.js --single-run", "test:prod": "TEST_PRODUCTION=true npm run test:unit", "test:watch": "npm run test:unit -- --no-single-run",