Skip to content

Commit

Permalink
Merge pull request #6 from synacor/getWrappedComponent
Browse files Browse the repository at this point in the history
add getWrappedComponent method to provide and mergingProvide decorators
  • Loading branch information
billneff79 committed Mar 26, 2019
2 parents 937928c + 31be981 commit 04bfff5
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 3 deletions.
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -145,6 +145,8 @@ const Demo = (props, context) => {
};
const ProvidedDemo = provide({a: "b"})(Demo);

ProvidedDemo.getWrappedComponent() === Demo; // true

render( <ProvidedDemo /> );
```

Expand All @@ -167,6 +169,8 @@ const Demo = (props, context) => {
};
const ProvidedDemo = mergingProvide({a: "b"})(Demo);

ProvidedDemo.getWrappedComponent() === Demo; // true

render( <ProvidedDemo /> ); // "b"
```

Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -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",
Expand Down
16 changes: 14 additions & 2 deletions src/index.js
Expand Up @@ -146,9 +146,15 @@ export class MergingProvider {
* };
* const ProvidedDemo = provide({a: "b"})(Demo);
*
* ProvidedDemo.getWrappedComponent() === Demo; // true
*
* render( <ProvidedDemo /> );
*/
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;

Expand All @@ -166,6 +172,12 @@ Provider.provide = provide;
* };
* const ProvidedDemo = mergingProvide({a: "b"})(Demo);
*
* ProvidedDemo.getWrappedComponent() === Demo; // true
*
* render( <ProvidedDemo /> ); // "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;
};
40 changes: 40 additions & 0 deletions test/index.js
Expand Up @@ -93,6 +93,26 @@ describe('preact-context-provider', () => {
let ProvidedSpy = provide(context)(Spy);
expect(<ProvidedSpy foo="bar" />).to.equal(<Provider a={{ name: 'a' }} b="b"><Spy foo="bar" /></Provider>);
});

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()', () => {
Expand All @@ -104,5 +124,25 @@ describe('preact-context-provider', () => {
let MergingProvidedSpy = mergingProvide({ ...context, mergeProps: true })(Spy);
expect(<MergingProvidedSpy foo="bar" />).to.equal(<MergingProvider a={{ name: 'a' }} b="b" mergeProps><Spy foo="bar" /></MergingProvider>);
});

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);
});

});

});
});

0 comments on commit 04bfff5

Please sign in to comment.