Skip to content

Commit dca9b9a

Browse files
refactor(withWebComponent): new static wrapper & web components as peer dependency (#412)
BREAKING CHANGE: the dependencies `@ui5/webcomponents`, `@ui5/webcomponents-fiori` and `@ui5/webcomponents-icons` are now `peerDependencies` and have to be installed next to `@ui5/webcomponents-react`
1 parent 4665db7 commit dca9b9a

File tree

68 files changed

+1075
-445
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+1075
-445
lines changed

package.json

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@
2424
"@storybook/cli": "5.3.18",
2525
"@storybook/react": "5.3.18",
2626
"@storybook/theming": "5.3.18",
27+
"@ui5/webcomponents": "1.0.0-rc.6",
28+
"@ui5/webcomponents-fiori": "1.0.0-rc.6",
29+
"@ui5/webcomponents-icons": "1.0.0-rc.6",
2730
"react-docgen-typescript-loader": "3.7.2"
2831
},
2932
"devDependencies": {
30-
"@babel/core": "^7.8.7",
33+
"@babel/core": "^7.9.0",
3134
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0",
32-
"@babel/plugin-proposal-optional-chaining": "^7.8.0",
35+
"@babel/plugin-proposal-optional-chaining": "^7.9.0",
3336
"@rollup/plugin-json": "^4.0.2",
3437
"@rollup/plugin-node-resolve": "^7.1.1",
3538
"@rollup/plugin-replace": "^2.3.1",
@@ -44,8 +47,8 @@
4447
"@typescript-eslint/parser": "^2.19.0",
4548
"@webcomponents/webcomponentsjs": "^2.4.2",
4649
"babel-code-frame": "^6.26.0",
47-
"babel-loader": "^8.0.5",
48-
"babel-preset-react-app": "^9.1.1",
50+
"babel-loader": "^8.1.0",
51+
"babel-preset-react-app": "^9.1.2",
4952
"chalk": "^3.0.0",
5053
"cli-table": "^0.3.1",
5154
"dedent": "^0.7.0",
@@ -59,7 +62,7 @@
5962
"eslint-plugin-react": "^7.18.3",
6063
"filesize": "^6.0.1",
6164
"glob": "^7.1.6",
62-
"google-closure-compiler": "^20200204.0.0",
65+
"google-closure-compiler": "^20200315.0.0",
6366
"gzip-size": "^5.1.0",
6467
"husky": "^4.2.1",
6568
"identity-obj-proxy": "^3.0.0",
@@ -71,7 +74,7 @@
7174
"lerna": "^3.20.2",
7275
"lint-staged": "^9.5.0",
7376
"minimist": "^1.2.0",
74-
"mkdirp": "^1.0.3",
77+
"mkdirp": "^1.0.4",
7578
"ncp": "^2.0.0",
7679
"npm-run-all": "^4.1.5",
7780
"prettier": "^1.19.1",
@@ -81,7 +84,7 @@
8184
"rimraf": "^3.0.1",
8285
"rollup": "^2.3.1",
8386
"rollup-plugin-babel": "^4.3.2",
84-
"rollup-plugin-prettier": "^0.6.0",
87+
"rollup-plugin-prettier": "^0.7.0",
8588
"rollup-plugin-strip-banner": "^2.0.0",
8689
"shelljs": "^0.8.3",
8790
"sinon": "^8.1.1",

packages/main/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,15 @@
1414
"license": "Apache-2.0",
1515
"sideEffects": [
1616
"@ui5/webcomponents-icons/dist/icons/*",
17+
"@ui5/webcomponents/dist/*",
18+
"@ui5/webcomponents-fiori/dist/*",
1719
"*/ThemingSupport.js"
1820
],
1921
"scripts": {
2022
"clean": "rimraf cjs components enums interfaces internal lib webComponents index.esm.js index.d.ts",
2123
"postbuild": "rollup -c rollup.config.js"
2224
},
2325
"dependencies": {
24-
"@ui5/webcomponents": "1.0.0-rc.6",
25-
"@ui5/webcomponents-fiori": "1.0.0-rc.6",
26-
"@ui5/webcomponents-icons": "1.0.0-rc.6",
2726
"@ui5/webcomponents-react-base": "^0.9.0-rc.9",
2827
"lodash.debounce": "^4.0.8",
2928
"react-content-loader": "^5.0.2",
@@ -32,6 +31,9 @@
3231
"react-window": "^1.8.5"
3332
},
3433
"peerDependencies": {
34+
"@ui5/webcomponents": "1.0.0-rc.6",
35+
"@ui5/webcomponents-fiori": "1.0.0-rc.6",
36+
"@ui5/webcomponents-icons": "1.0.0-rc.6",
3537
"react": "^16.8.0",
3638
"react-dom": "^16.8.0"
3739
},

packages/main/scripts/create-web-components-wrapper.js

Lines changed: 89 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,64 @@ COMPONENTS_WITHOUT_DEMOS.add('ComboBoxItem');
4242
COMPONENTS_WITHOUT_DEMOS.add('MultiComboBoxItem');
4343
COMPONENTS_WITHOUT_DEMOS.add('SuggestionItem');
4444

45+
const TagNames = new Map();
46+
TagNames.set('Avatar', 'ui5-avatar');
47+
TagNames.set('Badge', 'ui5-badge');
48+
TagNames.set('BusyIndicator', 'ui5-busyindicator');
49+
TagNames.set('Button', 'ui5-button');
50+
TagNames.set('Calendar', 'ui5-calendar');
51+
TagNames.set('Card', 'ui5-card');
52+
TagNames.set('Carousel', 'ui5-carousel');
53+
TagNames.set('CheckBox', 'ui5-checkbox');
54+
TagNames.set('ComboBox', 'ui5-combobox');
55+
TagNames.set('ComboBoxItem', 'ui5-cb-item');
56+
TagNames.set('CustomListItem', 'ui5-li-custom');
57+
TagNames.set('DatePicker', 'ui5-datepicker');
58+
TagNames.set('Dialog', 'ui5-dialog');
59+
TagNames.set('FileUploader', 'ui5-file-uploader');
60+
TagNames.set('GroupHeaderListItem', 'ui5-li-groupheader');
61+
TagNames.set('Icon', 'ui5-icon');
62+
TagNames.set('Input', 'ui5-input');
63+
TagNames.set('Label', 'ui5-label');
64+
TagNames.set('Link', 'ui5-link');
65+
TagNames.set('List', 'ui5-list');
66+
TagNames.set('MessageStrip', 'ui5-messagestrip');
67+
TagNames.set('MultiComboBox', 'ui5-multi-combobox');
68+
TagNames.set('MultiComboBoxItem', 'ui5-mcb-item');
69+
TagNames.set('Option', 'ui5-option');
70+
TagNames.set('Panel', 'ui5-panel');
71+
TagNames.set('Popover', 'ui5-popover');
72+
TagNames.set('ProductSwitch', 'ui5-product-switch');
73+
TagNames.set('ProductSwitchItem', 'ui5-product-switch-item');
74+
TagNames.set('RadioButton', 'ui5-radiobutton');
75+
TagNames.set('ResponsivePopover', 'ui5-responsive-popover');
76+
TagNames.set('SegmentedButton', 'ui5-segmentedbutton');
77+
TagNames.set('Select', 'ui5-select');
78+
TagNames.set('ShellBar', 'ui5-shellbar');
79+
TagNames.set('ShellBarItem', 'ui5-shellbar-item');
80+
TagNames.set('StandardListItem', 'ui5-li');
81+
TagNames.set('SuggestionItem', 'ui5-suggestion-item');
82+
TagNames.set('Switch', 'ui5-switch');
83+
TagNames.set('Tab', 'ui5-tab');
84+
TagNames.set('TabContainer', 'ui5-tabcontainer');
85+
TagNames.set('Table', 'ui5-table');
86+
TagNames.set('TableCell', 'ui5-table-cell');
87+
TagNames.set('TableColumn', 'ui5-table-column');
88+
TagNames.set('TableRow', 'ui5-table-row');
89+
TagNames.set('TabSeparator', 'ui5-tab-separator');
90+
TagNames.set('TextArea', 'ui5-textarea');
91+
TagNames.set('Timeline', 'ui5-timeline');
92+
TagNames.set('TimelineItem', 'ui5-timeline-item');
93+
TagNames.set('TimePicker', 'ui5-timepicker');
94+
TagNames.set('Title', 'ui5-title');
95+
TagNames.set('Toast', 'ui5-toast');
96+
TagNames.set('ToggleButton', 'ui5-togglebutton');
97+
4598
const componentsFromFioriPackage = new Set(fioriWebComponentsSpec.symbols.map((componentSpec) => componentSpec.module));
4699

47100
const capitalizeFirstLetter = (s) => s.charAt(0).toUpperCase() + s.slice(1);
101+
const filterNonPublicAttributes = (prop) =>
102+
prop.visibility === 'public' && prop.readonly !== 'true' && prop.static !== true;
48103

49104
const getTypeScriptTypeForProperty = (property) => {
50105
switch (property.type) {
@@ -259,11 +314,20 @@ const getEventParameters = (parameters) => {
259314
};
260315
};
261316

262-
const createWebComponentWrapper = (name, types, importStatements, defaultProps) => {
317+
const createWebComponentWrapper = (
318+
name,
319+
types,
320+
importStatements,
321+
defaultProps,
322+
regularProps,
323+
booleanProps,
324+
slotProps,
325+
eventProps
326+
) => {
263327
return prettier.format(
264328
`
265329
import { withWebComponent } from '@ui5/webcomponents-react/lib/withWebComponent';
266-
import UI5${name} from '@ui5/webcomponents${componentsFromFioriPackage.has(name) ? '-fiori' : ''}/dist/${name}';
330+
import '@ui5/webcomponents${componentsFromFioriPackage.has(name) ? '-fiori' : ''}/dist/${name}';
267331
import React, { FC } from 'react';
268332
import { WithWebComponentPropTypes } from '../../internal/withWebComponent';
269333
${importStatements.join('\n')}
@@ -277,7 +341,16 @@ const createWebComponentWrapper = (name, types, importStatements, defaultProps)
277341
* <br />
278342
* <a href="https://sap.github.io/ui5-webcomponents/playground/components/${name}" target="_blank">UI5 Web Components Playground</a>
279343
*/
280-
const ${name}: FC<${name}PropTypes> = withWebComponent<${name}PropTypes>(UI5${name});
344+
const ${name}: FC<${name}PropTypes> = withWebComponent<${name}PropTypes>(
345+
'${TagNames.get(name)}',
346+
[${regularProps.map((v) => `'${v}'`).join(', ')}],
347+
[${booleanProps.map((v) => `'${v}'`).join(', ')}],
348+
[${slotProps
349+
.filter((name) => name !== 'children')
350+
.map((v) => `'${v}'`)
351+
.join(', ')}],
352+
[${eventProps.map((v) => `'${v}'`).join(', ')}]
353+
);
281354
282355
${name}.displayName = '${name}';
283356
@@ -525,17 +598,26 @@ resolvedWebComponents.forEach((componentSpec) => {
525598
componentSpec.module,
526599
propTypes,
527600
uniqueAdditionalImports,
528-
defaultProps
601+
defaultProps,
602+
(componentSpec.properties || [])
603+
.filter(filterNonPublicAttributes)
604+
.filter(({ type }) => type !== 'boolean' && type !== 'Boolean')
605+
.map(({ name }) => name),
606+
(componentSpec.properties || [])
607+
.filter(filterNonPublicAttributes)
608+
.filter(({ type }) => type === 'boolean' || type === 'Boolean')
609+
.map(({ name }) => name),
610+
(componentSpec.slots || []).filter(filterNonPublicAttributes).map(({ name }) => name),
611+
(componentSpec.events || []).filter(filterNonPublicAttributes).map(({ name }) => name)
529612
);
530613

531614
// check if folder exists and create it if necessary
532615
const webComponentFolderPath = path.join(WEB_COMPONENTS_ROOT_DIR, componentSpec.module);
533616
if (!fs.existsSync(webComponentFolderPath)) {
534617
fs.mkdirSync(webComponentFolderPath);
535618
}
536-
if (!fs.existsSync(path.join(webComponentFolderPath, 'index.tsx'))) {
537-
fs.writeFileSync(path.join(webComponentFolderPath, 'index.tsx'), webComponentWrapper);
538-
}
619+
620+
fs.writeFileSync(path.join(webComponentFolderPath, 'index.tsx'), webComponentWrapper);
539621

540622
// create test
541623
if (!fs.existsSync(path.join(webComponentFolderPath, `${componentSpec.module}.test.tsx`))) {

packages/main/src/interfaces/DynamicObjectList.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

packages/main/src/interfaces/Ui5Property.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

packages/main/src/interfaces/Ui5WebComponentMetadata.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/main/src/internal/WithWebComponent.test.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { mount } from 'enzyme';
21
import { Button } from '@ui5/webcomponents-react/lib/Button';
3-
import React, { cloneElement, FC } from 'react';
2+
import { mount } from 'enzyme';
3+
import React from 'react';
44
import { spy } from 'sinon';
5-
import { withWebComponent } from './withWebComponent';
65

76
describe('withWebComponent', () => {
87
test('Unmount Event Handlers correctly after prop update', () => {

0 commit comments

Comments
 (0)