@@ -63,14 +65,50 @@ export const About: React.FC = () => {
{formatMessage(`SDK runtime packages`)}
-
- - {process.env.SDK_PACKAGE_VERSION || 'Unknown'} - +
+

+ DotNet: + {botBuilderVersion.dotnet || '...'} ( + + nuget + + , + + release + + ) +

+

+ JavaScript: + {botBuilderVersion.js || '...'} ( + + npm + + , + + release + + ) +

diff --git a/Composer/packages/client/src/pages/about/styles.js b/Composer/packages/client/src/pages/about/styles.js index 2ad6da7c7f..63af3c1226 100644 --- a/Composer/packages/client/src/pages/about/styles.js +++ b/Composer/packages/client/src/pages/about/styles.js @@ -39,7 +39,7 @@ export const smallerText = css` export const diagnosticsInfoText = css` display: flex; justify-content: space-between; - width: 550px; + max-width: 700px; font-size: 24px; `; diff --git a/Composer/packages/client/src/recoilModel/atoms/appState.ts b/Composer/packages/client/src/recoilModel/atoms/appState.ts index 48cc0ef82f..37d5fb42b3 100644 --- a/Composer/packages/client/src/recoilModel/atoms/appState.ts +++ b/Composer/packages/client/src/recoilModel/atoms/appState.ts @@ -332,6 +332,11 @@ export const userHasNodeInstalledState = atom({ default: true, }); +export const botBuilderVersionState = atom<{ dotnet: string; js: string }>({ + key: getFullyQualifiedKey('botBuilderVersion'), + default: { dotnet: '', js: '' }, +}); + export const warnAboutDotNetState = atom({ key: getFullyQualifiedKey('warnAboutDotNetState'), default: false, diff --git a/Composer/packages/client/src/recoilModel/dispatchers/application.ts b/Composer/packages/client/src/recoilModel/dispatchers/application.ts index ccc593b62d..8daa5aba29 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/application.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/application.ts @@ -5,6 +5,7 @@ import { CallbackInterface, useRecoilCallback } from 'recoil'; import debounce from 'lodash/debounce'; import formatMessage from 'format-message'; +import { getBotBuilderVersion } from '@bfc/shared'; import { appUpdateState, @@ -24,6 +25,7 @@ import { showWarningDiagnosticsState, projectsForDiagnosticsFilterState, templateFeedUrlState, + botBuilderVersionState, } from '../atoms/appState'; import { AppUpdaterStatus, CreationFlowStatus, CreationFlowType } from '../../constants'; import OnboardingState from '../../utils/onboardingStorage'; @@ -161,6 +163,18 @@ export const applicationDispatcher = () => { } }); + const setBotBuilderVersion = useRecoilCallback(({ set }: CallbackInterface) => async () => { + try { + const versions = await getBotBuilderVersion(); + set(botBuilderVersionState, versions); + } catch (err) { + set(applicationErrorState, { + message: formatMessage('Error getting BotBuilder version from BotFramework-Components repository'), + summary: err.message, + }); + } + }); + const fetchTemplateFeedUrl = useRecoilCallback(({ set }: CallbackInterface) => async () => { try { const response = await httpClient.get(`/assets/templateFeedUrl`); @@ -234,5 +248,6 @@ export const applicationDispatcher = () => { setProjectsForDiagnosticsFilter, fetchTemplateFeedUrl, setTemplateFeedUrl, + setBotBuilderVersion, }; }; diff --git a/Composer/packages/client/src/telemetry/TelemetryClient.ts b/Composer/packages/client/src/telemetry/TelemetryClient.ts index e4d466bfc2..c7aa3b4dfd 100644 --- a/Composer/packages/client/src/telemetry/TelemetryClient.ts +++ b/Composer/packages/client/src/telemetry/TelemetryClient.ts @@ -56,7 +56,6 @@ export default class TelemetryClient { ...this._additionalProperties?.(), timestamp: Date.now(), composerVersion: process.env.COMPOSER_VERSION || 'unknown', - sdkPackageVersion: process.env.SDK_PACKAGE_VERSION || 'unknown', }; } } diff --git a/Composer/packages/client/src/telemetry/useInitializeLogger.ts b/Composer/packages/client/src/telemetry/useInitializeLogger.ts index e3dac22ebd..ce417f5773 100644 --- a/Composer/packages/client/src/telemetry/useInitializeLogger.ts +++ b/Composer/packages/client/src/telemetry/useInitializeLogger.ts @@ -6,7 +6,13 @@ import { useRecoilValue } from 'recoil'; import { PageNames } from '@bfc/shared'; import camelCase from 'lodash/camelCase'; -import { currentProjectIdState, dispatcherState, featureFlagsState, userSettingsState } from '../recoilModel'; +import { + currentProjectIdState, + dispatcherState, + featureFlagsState, + userSettingsState, + botBuilderVersionState, +} from '../recoilModel'; import { getPageName } from '../utils/getPageName'; import { useLocation } from '../utils/hooks'; @@ -19,6 +25,7 @@ export const useInitializeLogger = () => { const rootProjectId = useRecoilValue(currentProjectIdState); const { telemetry } = useRecoilValue(userSettingsState); const featureFlags = useRecoilValue(featureFlagsState); + const botBuilderVersion = useRecoilValue(botBuilderVersionState); const reducedFeatureFlags = Object.entries(featureFlags).reduce( (acc, [key, { enabled }]) => ({ ...acc, @@ -33,7 +40,12 @@ export const useInitializeLogger = () => { const page = useMemo(() => getPageName(pathname), [pathname]); - TelemetryClient.setup(telemetry, { rootProjectId, page, ...reducedFeatureFlags }); + TelemetryClient.setup(telemetry, { + rootProjectId, + page, + sdkPackageVersion: botBuilderVersion, + ...reducedFeatureFlags, + }); useEffect(() => { // Update user settings when the user opens the app to ensure diff --git a/Composer/packages/lib/shared/src/getBotBuilderVersion.ts b/Composer/packages/lib/shared/src/getBotBuilderVersion.ts new file mode 100644 index 0000000000..1cdd3ac395 --- /dev/null +++ b/Composer/packages/lib/shared/src/getBotBuilderVersion.ts @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import axios from 'axios'; + +/** + * Function created to retrieve BotBuilder versions from BotFramework-Components repository containing the following example content as reference: + * + * ```js + * // Copyright (c) Microsoft Corporation. + * // Licensed under the MIT License. + * + * const dotnet = { + * name: 'dotnet', + * defaultSdkVersion: '4.18.1', + * }; + * + * const js = { + * name: 'js', + * defaultSdkVersion: '4.18.0-preview', + * }; + * + * module.exports = { dotnet, js }; + * ``` + */ +const getField = (content: string, path: string) => { + const [key, ...fields] = path.split('.'); + const objectPath = fields.reduce((acc, val, i, arr) => { + const objKey = i < arr.length - 1 ? '{' : ''; + return acc + `.+?(?<=${val}:${objKey})`; + }, ''); + const withQuotes = `('|")(.+?)('|")(}|,)`; + const withoutQuotes = `\\w+|\\d+`; + const pattern = `${key}={${objectPath}(${withQuotes}|${withoutQuotes})`; + const oneLine = content.replace(/\r?\n|\r|\s+/g, ''); + // eslint-disable-next-line security/detect-non-literal-regexp + const regex = oneLine.match(new RegExp(pattern)); + if (!regex) { + return; + } + const value = regex[1].match(withQuotes) ? regex[3] : regex[1]; + return value; +}; + +/** + * Gets BotBuilder version for DotNet and JavaScript from BotFramework-Components repository. + */ +export const getBotBuilderVersion = async () => { + const defaultValues = { dotnet: 'unknown', js: 'unknown' }; + try { + const url = + 'https://raw.githubusercontent.com/microsoft/botframework-components/main/generators/generator-bot-adaptive/platforms.js'; + const { data } = await axios.get(url); + const version = { + dotnet: getField(data, 'dotnet.defaultSdkVersion') || defaultValues.dotnet, + js: getField(data, 'js.defaultSdkVersion') || defaultValues.js, + }; + return version; + } catch (e) { + console?.error(e); + return defaultValues; + } +}; diff --git a/Composer/packages/lib/shared/src/index.ts b/Composer/packages/lib/shared/src/index.ts index ff4e33fd0b..06c7d1f6c9 100644 --- a/Composer/packages/lib/shared/src/index.ts +++ b/Composer/packages/lib/shared/src/index.ts @@ -17,6 +17,7 @@ export * from './EditorAPI'; export * from './featureFlagUtils'; export * from './functionUtils'; export * from './generateUniqueId'; +export * from './getBotBuilderVersion'; export * from './icons'; export * from './labelMap'; export * from './lgUtils'; diff --git a/extensions/azurePublish/yarn-berry.lock b/extensions/azurePublish/yarn-berry.lock index ab1525367c..21331effe4 100644 --- a/extensions/azurePublish/yarn-berry.lock +++ b/extensions/azurePublish/yarn-berry.lock @@ -2009,7 +2009,7 @@ __metadata: "@bfc/shared@file:../../Composer/packages/lib/shared::locator=azurePublish%40workspace%3A.": version: 0.0.0 - resolution: "@bfc/shared@file:../../Composer/packages/lib/shared#../../Composer/packages/lib/shared::hash=a5867b&locator=azurePublish%40workspace%3A." + resolution: "@bfc/shared@file:../../Composer/packages/lib/shared#../../Composer/packages/lib/shared::hash=6d4444&locator=azurePublish%40workspace%3A." dependencies: "@botframework-composer/types": "*" format-message: 6.2.4 @@ -2023,7 +2023,7 @@ __metadata: react: 16.13.1 react-dom: 16.13.1 tslib: 2.4.0 - checksum: ebeeecad54bdc747bf37541b84ab31423f3450057a46dcf078683c02b6204b4d26c33ad62e0f9e9b7726c53ae4d36a3406af1b42b7f6a758692229c8ba07c459 + checksum: f87ccf0570136fd48e8baacdfe7c27d33801bbb9745b83614cf0ba3ad6b3a928f39aefb02457bf6c30a4972fd6332a9dbf1ef3a298d0fc062dc103c04cc104a9 languageName: node linkType: hard diff --git a/extensions/azurePublishNew/yarn-berry.lock b/extensions/azurePublishNew/yarn-berry.lock index 6ad7fed28f..862eedbacd 100644 --- a/extensions/azurePublishNew/yarn-berry.lock +++ b/extensions/azurePublishNew/yarn-berry.lock @@ -2046,7 +2046,7 @@ __metadata: "@bfc/shared@file:../../Composer/packages/lib/shared::locator=azure-publish-new%40workspace%3A.": version: 0.0.0 - resolution: "@bfc/shared@file:../../Composer/packages/lib/shared#../../Composer/packages/lib/shared::hash=a5867b&locator=azure-publish-new%40workspace%3A." + resolution: "@bfc/shared@file:../../Composer/packages/lib/shared#../../Composer/packages/lib/shared::hash=6d4444&locator=azure-publish-new%40workspace%3A." dependencies: "@botframework-composer/types": "*" format-message: 6.2.4 @@ -2060,7 +2060,7 @@ __metadata: react: 16.13.1 react-dom: 16.13.1 tslib: 2.4.0 - checksum: ebeeecad54bdc747bf37541b84ab31423f3450057a46dcf078683c02b6204b4d26c33ad62e0f9e9b7726c53ae4d36a3406af1b42b7f6a758692229c8ba07c459 + checksum: f87ccf0570136fd48e8baacdfe7c27d33801bbb9745b83614cf0ba3ad6b3a928f39aefb02457bf6c30a4972fd6332a9dbf1ef3a298d0fc062dc103c04cc104a9 languageName: node linkType: hard