Skip to content

Commit 0f46e53

Browse files
authored
Merge pull request #1 from TriPSs/master
Added possibility to also register react components directly
2 parents 7ac7b00 + e935030 commit 0f46e53

File tree

6 files changed

+78
-31
lines changed

6 files changed

+78
-31
lines changed

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@ const Cart = (): JSX.Element => {
4949
// src/App.tsx
5050
import { populate, register } from 'react-abode';
5151

52-
register('Cart', () => import('./modules/Cart/Cart')); // Each module must have the component you want to render as a default export
52+
// Import can be used to reguster component
53+
register('Cart', () => import('./modules/Cart/Cart'));
54+
55+
// Component can also be used directly
56+
import Cart from './modules/Cart/Cart'
57+
58+
register('Cart', () => Cart);
5359

5460
populate({ attributes: { classname: 'some-class-name' } });
5561
```
@@ -79,6 +85,10 @@ If you do not want to use `data-component` you can change the component selector
7985

8086
You can use `getActiveComponents` to get a list of all Abode elements currently in your DOM.
8187

88+
#### getRegisteredComponents
89+
90+
You can use `getRegisteredComponents` to get all registered components.
91+
8292
### Populate parameters
8393

8494
The `populate` function can be passed an object with options.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "0.1.7",
2+
"version": "0.2.0",
33
"license": "MIT",
44
"repository": {
55
"type": "git",
@@ -35,6 +35,10 @@
3535
"name": "react-abode",
3636
"author": "Bram Kaashoek",
3737
"module": "dist/react-abode.esm.js",
38+
"dependencies": {
39+
"react": ">=16",
40+
"react-dom": ">=16"
41+
},
3842
"devDependencies": {
3943
"@types/react": "^16.9.23",
4044
"@types/react-dom": "^16.9.5",
@@ -44,10 +48,6 @@
4448
"tslib": "^2.0.0",
4549
"typescript": "^3.9.7"
4650
},
47-
"peerDependencies": {
48-
"react": ">=16",
49-
"react-dom": ">=16"
50-
},
5151
"resolutions": {
5252
"serialize-javascript": "^3.1.0"
5353
}

src/abode.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { render } from 'react-dom';
2-
import { createElement } from 'react';
2+
import { createElement, FC } from 'react';
33

44
interface RegisteredComponents {
55
[key: string]: Promise<any>;
@@ -18,11 +18,15 @@ interface PopulateOptions {
1818
callback?: Function;
1919
}
2020

21+
export type RegisterPromise = () => Promise<any>;
22+
export type RegisterComponent = () => FC<any>;
23+
export type RegisterFN = RegisterPromise | RegisterComponent;
24+
2125
export let componentSelector = 'data-component';
2226
export let components: RegisteredComponents = {};
2327
export let unPopulatedElements: Element[] = [];
2428

25-
export const register = (name: string, fn: () => Promise<any>) => {
29+
export const register = (name: string, fn: RegisterFN) => {
2630
components[name] = retry(fn, 10, 20);
2731
};
2832

@@ -53,6 +57,10 @@ export const setComponentSelector = (selector: string) => {
5357
componentSelector = selector;
5458
};
5559

60+
export const getRegisteredComponents = () => {
61+
return components;
62+
};
63+
5664
export const getActiveComponents = () => {
5765
return Array.from(
5866
new Set(getAbodeElements().map(el => el.getAttribute(componentSelector)))
@@ -120,8 +128,9 @@ export const renderAbode = async (el: Element) => {
120128
throw new Error(`no component registered for ${componentName}`);
121129
}
122130

123-
// @ts-ignore
124-
render(createElement(module.default, props), el);
131+
const element = module.default || module;
132+
133+
render(createElement(element, props), el);
125134
};
126135

127136
export const trackPropChanges = (el: Element) => {

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ export {
33
setComponentSelector,
44
register,
55
getScriptProps,
6+
getRegisteredComponents,
67
getActiveComponents,
78
} from './abode';

test/abode.test.tsx

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
getCleanPropName,
33
getAbodeElements,
4+
getRegisteredComponents,
45
unPopulatedElements,
56
setUnpopulatedElements,
67
getElementProps,
@@ -12,6 +13,8 @@ import {
1213
populate,
1314
delay,
1415
} from '../src/abode';
16+
// @ts-ignore
17+
import TestComponent from './TestComponent';
1518

1619
import 'mutationobserver-shim';
1720
global.MutationObserver = window.MutationObserver;
@@ -102,30 +105,56 @@ describe('exported functions', () => {
102105
register('TestComponent', () => import('./TestComponent'));
103106
expect(Object.keys(components)).toEqual(['TestComponent']);
104107
expect(Object.values(components).length).toEqual(1);
105-
const promise = Object.values(components)[0];
108+
let promise = Object.values(components)[0];
106109
expect(typeof promise.then).toEqual('function');
107-
const module = await promise;
110+
let module = await promise;
111+
expect(typeof module).toEqual('object');
108112
expect(Object.keys(module)).toEqual(['default']);
113+
114+
register('TestComponent2', () => TestComponent);
115+
expect(Object.keys(components)).toEqual([
116+
'TestComponent',
117+
'TestComponent2',
118+
]);
119+
expect(Object.values(components).length).toEqual(2);
120+
promise = Object.values(components)[1];
121+
expect(typeof promise.then).toEqual('function');
122+
module = await promise;
123+
expect(typeof module).toEqual('function');
109124
});
110125

111126
it('populate', async () => {
112127
const abodeElement = document.createElement('div');
113128
abodeElement.setAttribute('data-component', 'TestComponent');
129+
const abodeSecondElement = document.createElement('div');
130+
abodeSecondElement.setAttribute('data-component', 'TestComponent2');
114131
document.body.appendChild(abodeElement);
132+
document.body.appendChild(abodeSecondElement);
115133
expect(document.body.innerHTML).toEqual(
116-
`<div data-component="TestComponent"></div>`
134+
`<div data-component="TestComponent"></div><div data-component="TestComponent2"></div>`
117135
);
118136

119137
register('TestComponent', () => import('./TestComponent'));
120-
populate();
138+
register('TestComponent2', () => TestComponent);
139+
await populate();
121140

122141
await delay(20);
123142

124143
expect(document.body.innerHTML).toEqual(
125-
`<div data-component="TestComponent" react-abode-populated="true"><div>testing 1 2 3 </div></div>`
144+
`<div data-component="TestComponent" react-abode-populated="true"><div>testing 1 2 3 </div></div>` +
145+
`<div data-component="TestComponent2" react-abode-populated="true"><div>testing 1 2 3 </div></div>`
126146
);
127147
});
128148

149+
it('getRegisteredComponents', () => {
150+
register('TestComponent', () => import('./TestComponent'));
151+
register('TestComponent2', () => TestComponent);
152+
153+
const registeredComponents = getRegisteredComponents();
154+
155+
expect(Object.keys(registeredComponents).length).toEqual(2);
156+
});
157+
129158
it.skip('getActiveComponents', () => {});
130159
it.skip('setComponentSelector', () => {});
131160
it.skip('register', () => {});

yarn.lock

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4679,7 +4679,7 @@ prompts@^2.0.1:
46794679
kleur "^3.0.3"
46804680
sisteransi "^1.0.4"
46814681

4682-
prop-types@^15.6.2, prop-types@^15.7.2:
4682+
prop-types@^15.7.2:
46834683
version "15.7.2"
46844684
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
46854685
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -4718,29 +4718,27 @@ randombytes@^2.1.0:
47184718
dependencies:
47194719
safe-buffer "^5.1.0"
47204720

4721-
react-dom@^16.13.1:
4722-
version "16.13.1"
4723-
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
4724-
integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
4721+
react-dom@>=16:
4722+
version "17.0.1"
4723+
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6"
4724+
integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==
47254725
dependencies:
47264726
loose-envify "^1.1.0"
47274727
object-assign "^4.1.1"
4728-
prop-types "^15.6.2"
4729-
scheduler "^0.19.1"
4728+
scheduler "^0.20.1"
47304729

47314730
react-is@^16.8.1, react-is@^16.8.4:
47324731
version "16.13.1"
47334732
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
47344733
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
47354734

4736-
react@^16.13.1:
4737-
version "16.13.1"
4738-
resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
4739-
integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
4735+
react@>=16:
4736+
version "17.0.1"
4737+
resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127"
4738+
integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==
47404739
dependencies:
47414740
loose-envify "^1.1.0"
47424741
object-assign "^4.1.1"
4743-
prop-types "^15.6.2"
47444742

47454743
read-pkg-up@^2.0.0:
47464744
version "2.0.0"
@@ -5132,10 +5130,10 @@ sax@^1.2.4:
51325130
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
51335131
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
51345132

5135-
scheduler@^0.19.1:
5136-
version "0.19.1"
5137-
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
5138-
integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
5133+
scheduler@^0.20.1:
5134+
version "0.20.1"
5135+
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c"
5136+
integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==
51395137
dependencies:
51405138
loose-envify "^1.1.0"
51415139
object-assign "^4.1.1"

0 commit comments

Comments
 (0)