Skip to content

Commit 367628c

Browse files
feat: register current runtime version in window (#6222)
Closes #6210
1 parent 28b14d9 commit 367628c

File tree

7 files changed

+56
-7
lines changed

7 files changed

+56
-7
lines changed

packages/base/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pkgJson from '../package.json';
12
import * as Device from './Device/index.js';
23
import * as hooks from './hooks/index.js';
34
import { I18nStore } from './stores/I18nStore.js';
@@ -9,3 +10,4 @@ export * from './utils/index.js';
910
export * from './hooks/index.js';
1011

1112
export { I18nStore, StyleStore, ThemingParameters, Device, hooks };
13+
export const version = pkgJson.version;

packages/charts/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pkgJson from '../package.json';
12
import { BarChart } from './components/BarChart/BarChart.js';
23
import { BarChartPlaceholder } from './components/BarChart/Placeholder.js';
34
import { BulletChart } from './components/BulletChart/BulletChart.js';
@@ -47,3 +48,4 @@ export {
4748
ColumnChartWithTrendPlaceholder,
4849
TimelineChartPlaceholder
4950
};
51+
export const version = pkgJson.version;

packages/compat/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pkgJson from '../package.json';
12
export * from './components/Loader/index.js';
23
export * from './components/OverflowToolbarButton/index.js';
34
export * from './components/OverflowToolbarToggleButton/index.js';
@@ -13,3 +14,4 @@ export * from './components/ToolbarSpacer/index.js';
1314
export { LoaderType } from './enums/LoaderType.js';
1415
export { ToolbarDesign } from './enums/ToolbarDesign.js';
1516
export { ToolbarStyle } from './enums/ToolbarStyle.js';
17+
export const version = pkgJson.version;

packages/main/src/components/ThemeProvider/index.tsx

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,21 @@ import type { StyleDataCSP } from '@ui5/webcomponents-base/dist/ManagedStyles.js
77
import { attachThemeLoaded, detachThemeLoaded } from '@ui5/webcomponents-base/dist/theming/ThemeLoaded.js';
88
import { I18nStore, StyleStore, useIsomorphicLayoutEffect, useStylesheet } from '@ui5/webcomponents-react-base';
99
import type { FC, ReactNode } from 'react';
10-
import { useId } from 'react';
10+
import { useEffect, useId } from 'react';
11+
import pkgJson from '../../../package.json';
12+
import { parseSemVer } from '../../internal/utils.js';
1113
import { styleData } from './ThemeProvider.css.js';
1214

15+
let _versionInfo = null;
16+
let _versionInfoInjected = false;
17+
18+
function getVersionInfo() {
19+
if (!_versionInfo) {
20+
_versionInfo = parseSemVer(pkgJson.version);
21+
}
22+
return _versionInfo;
23+
}
24+
1325
function ThemeProviderStyles() {
1426
const uniqueId = useId();
1527
useStylesheet(styleData, `${ThemeProvider.displayName}-${uniqueId}`);
@@ -79,6 +91,24 @@ const ThemeProvider: FC<ThemeProviderPropTypes> = (props: ThemeProviderPropTypes
7991
};
8092
}, []);
8193

94+
useEffect(() => {
95+
if (_versionInfoInjected) {
96+
return;
97+
}
98+
const versionInfo = getVersionInfo();
99+
globalThis['@ui5/webcomponents-react'] ??= {};
100+
globalThis['@ui5/webcomponents-react'].Runtimes ??= [];
101+
102+
globalThis['@ui5/webcomponents-react'].Runtimes.push(versionInfo);
103+
_versionInfoInjected = true;
104+
return () => {
105+
globalThis['@ui5/webcomponents-react'].Runtimes = globalThis['@ui5/webcomponents-react'].Runtimes.filter(
106+
(info) => info !== versionInfo
107+
);
108+
_versionInfoInjected = false;
109+
};
110+
}, []);
111+
82112
return (
83113
<>
84114
<ThemeProviderStyles />

packages/main/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pkgJson from '../package.json';
12
import * as AnalyticalTableHooks from './components/AnalyticalTable/pluginHooks/AnalyticalTableHooks.js';
23

34
export * from './components/ActionSheet/index.js';
@@ -37,3 +38,4 @@ export type { CommonProps, Ui5CustomEvent, Ui5DomRef, UI5WCSlotsNode, Nullable }
3738
export * from './webComponents/index.js';
3839

3940
export { AnalyticalTableHooks };
41+
export const version = pkgJson.version;

packages/main/src/internal/utils.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,18 @@ export function getTagNameWithoutScopingSuffix(tagName) {
5555
const tagNameSuffix = getCustomElementsScopingSuffix();
5656
return tagNameSuffix ? tagName.replace(`-${tagNameSuffix.toUpperCase()}`, '') : tagName;
5757
}
58+
59+
const SEMVER_REGEX =
60+
/^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
61+
62+
export function parseSemVer(version: string) {
63+
const parsed = SEMVER_REGEX.exec(version).groups;
64+
return {
65+
version,
66+
major: parseInt(parsed.major),
67+
minor: parseInt(parsed.minor),
68+
patch: parseInt(parsed.patch),
69+
prerelease: parsed.prerelease,
70+
buildMetadata: parsed.buildmetadata
71+
};
72+
}

packages/main/src/internal/withWebComponent.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import type { ComponentType, ReactElement, ReactNode, Ref } from 'react';
66
import { cloneElement, forwardRef, Fragment, isValidElement, useEffect, useState, version } from 'react';
77
import type { CommonProps, Ui5DomRef } from '../types/index.js';
88
import { useServerSideEffect } from './ssr.js';
9-
import { camelToKebabCase, capitalizeFirstLetter, kebabToCamelCase } from './utils.js';
10-
11-
const SEMVER_REGEX =
12-
/^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
9+
import { camelToKebabCase, capitalizeFirstLetter, kebabToCamelCase, parseSemVer } from './utils.js';
1310

1411
const createEventPropName = (eventName: string) => `on${capitalizeFirstLetter(kebabToCamelCase(eventName))}`;
1512

@@ -38,8 +35,7 @@ export const withWebComponent = <Props extends Record<string, any>, RefType = Ui
3835
eventProperties: string[],
3936
loader: () => Promise<unknown>
4037
) => {
41-
const reactMajorVersion = SEMVER_REGEX.exec(version)?.groups?.major;
42-
const webComponentsSupported = parseInt(reactMajorVersion) >= 19;
38+
const webComponentsSupported = parseSemVer(version).major >= 19;
4339
// displayName will be assigned in the individual files
4440
// eslint-disable-next-line react/display-name
4541
return forwardRef<RefType, Props & WithWebComponentPropTypes>((props, wcRef) => {

0 commit comments

Comments
 (0)