From bd923c630fbe838a118b4865b786e9bc1edfc991 Mon Sep 17 00:00:00 2001 From: tyaginidhi Date: Mon, 29 Apr 2024 15:18:56 +0530 Subject: [PATCH 1/3] ECS support infra - Introducing ECS feature flag read call via a common module (#778) * ECS skeleton folder * ignore eslint for now * Update client logic and setup way to introduce new feature gates config read * Address nits * Update ECS API call to support more client configs * Make appname generic as well * take the telemetry changes later * update the constant app name for power pages * Update interface class for ecs feature flag filters and request feature config definition parameters * Update interface definitions * remove unused code * cleanup * minor renaming changes * Update src/common/ecs-features/ecsFeatureClient.ts Co-authored-by: Abdelmoumen Bouabdallah * Update src/common/ecs-features/ecsFeatureClient.ts Co-authored-by: Abdelmoumen Bouabdallah * Update src/common/ecs-features/constants.ts Co-authored-by: Abdelmoumen Bouabdallah * Address comments and update functions for extensibility * Call ecs client and make call for loading config * updated path names * update calling and comments * fix test cases * fix auth test cases * fix test * fix test * update for test case --------- Co-authored-by: Abdelmoumen Bouabdallah --- src/common/copilot/PowerPagesCopilot.ts | 8 +-- src/common/ecs-features/constants.ts | 14 ++++ src/common/ecs-features/ecsFeatureClient.ts | 50 ++++++++++++++ .../ecs-features/ecsFeatureFlagFilters.ts | 29 ++++++++ src/common/ecs-features/ecsFeatureGates.ts | 17 +++++ .../ecs-features/ecsFeatureProperties.ts | 68 +++++++++++++++++++ src/common/ecs-features/ecsFeatureUtil.ts | 38 +++++++++++ src/web/client/WebExtensionContext.ts | 4 +- .../client/common/authenticationProvider.ts | 13 ++-- src/web/client/extension.ts | 36 +++++++--- .../AuthenticationProvider.test.ts | 11 +-- .../integration/WebExtensionContext.test.ts | 12 ++-- .../integration/remoteFetchProvider.test.ts | 20 +++--- src/web/client/utilities/commonUtil.ts | 1 + 14 files changed, 278 insertions(+), 43 deletions(-) create mode 100644 src/common/ecs-features/constants.ts create mode 100644 src/common/ecs-features/ecsFeatureClient.ts create mode 100644 src/common/ecs-features/ecsFeatureFlagFilters.ts create mode 100644 src/common/ecs-features/ecsFeatureGates.ts create mode 100644 src/common/ecs-features/ecsFeatureProperties.ts create mode 100644 src/common/ecs-features/ecsFeatureUtil.ts diff --git a/src/common/copilot/PowerPagesCopilot.ts b/src/common/copilot/PowerPagesCopilot.ts index fb22cf84..351d75e4 100644 --- a/src/common/copilot/PowerPagesCopilot.ts +++ b/src/common/copilot/PowerPagesCopilot.ts @@ -277,11 +277,11 @@ export class PowerPagesCopilot implements vscode.WebviewViewProvider { if (feedbackValue === THUMBS_UP) { - sendTelemetryEvent(this.telemetry, { eventName: CopilotUserFeedbackThumbsUpEvent, copilotSessionId: sessionID, orgId: orgID, subScenario: String(messageScenario)}); + sendTelemetryEvent(this.telemetry, { eventName: CopilotUserFeedbackThumbsUpEvent, copilotSessionId: sessionID, orgId: orgID, subScenario: String(messageScenario) }); CESUserFeedback(this._extensionContext, sessionID, userID, THUMBS_UP, this.telemetry, this.geoName as string, messageScenario, tenantId) } else if (feedbackValue === THUMBS_DOWN) { - sendTelemetryEvent(this.telemetry, { eventName: CopilotUserFeedbackThumbsDownEvent, copilotSessionId: sessionID, orgId: orgID, subScenario: String(messageScenario)}); + sendTelemetryEvent(this.telemetry, { eventName: CopilotUserFeedbackThumbsDownEvent, copilotSessionId: sessionID, orgId: orgID, subScenario: String(messageScenario) }); CESUserFeedback(this._extensionContext, sessionID, userID, THUMBS_DOWN, this.telemetry, this.geoName as string, messageScenario, tenantId) } break; @@ -363,12 +363,12 @@ export class PowerPagesCopilot implements vscode.WebviewViewProvider { this.sendMessageToWebview({ type: 'userName', value: userName }); let metadataInfo = { entityName: '', formName: '' }; - let componentInfo : string[] = []; + let componentInfo: string[] = []; if (activeFileParams.dataverseEntity == ADX_ENTITYFORM || activeFileParams.dataverseEntity == ADX_ENTITYLIST) { metadataInfo = await getEntityName(telemetry, sessionID, activeFileParams.dataverseEntity); - const dataverseToken = await dataverseAuthentication(activeOrgUrl, true); + const dataverseToken = (await dataverseAuthentication(activeOrgUrl, true)).accessToken; if (activeFileParams.dataverseEntity == ADX_ENTITYFORM) { const formColumns = await getFormXml(metadataInfo.entityName, metadataInfo.formName, activeOrgUrl, dataverseToken, telemetry, sessionID); diff --git a/src/common/ecs-features/constants.ts b/src/common/ecs-features/constants.ts new file mode 100644 index 00000000..b3480f9a --- /dev/null +++ b/src/common/ecs-features/constants.ts @@ -0,0 +1,14 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +export const ECS_REQUEST_URL_TEMPLATE = "https://ecs.office.com/config/v1"; + +export const PowerPagesClientName = 'PortalsMakerExperiences'; // Project name in ECS Portal, Do not change this +export type ProjectTeam = typeof PowerPagesClientName; +export const PowerPagesAppName = 'powerpages-microsoft-com'; // Project name in ECS Portal, Do not change this +export type ProjectName = typeof PowerPagesAppName; + +export const VisualStudioCodeDevInsidersUrl = 'https://insiders.vscode.dev/power/portal'; // VScode dev insiders/pre-prod env +export const VisualStudioCodeDevUrl = 'https://vscode.dev/power/portal'; // VScode dev GA/prod env diff --git a/src/common/ecs-features/ecsFeatureClient.ts b/src/common/ecs-features/ecsFeatureClient.ts new file mode 100644 index 00000000..57b66da8 --- /dev/null +++ b/src/common/ecs-features/ecsFeatureClient.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import TelemetryReporter from "@vscode/extension-telemetry"; +import { ITelemetry } from "../../client/telemetry/ITelemetry"; +import { createECSRequestURL } from "./ecsFeatureUtil"; +import { ECSFeatureDefinition as ECSFeatureProperties } from "./ecsFeatureProperties"; +import { ECSAPIFeatureFlagFilters } from "./ecsFeatureFlagFilters"; + +export abstract class ECSFeaturesClient { + private static _ecsConfig: Record; + private static _featuresConfig = {}; + + // Initialize ECSFeatureClient - any client config can be fetched with utility function like below + // EnableMultifileVscodeWeb.getConfig().enableMultifileVscodeWeb + public static async init(telemetry: ITelemetry | TelemetryReporter, filters: ECSAPIFeatureFlagFilters, clientName: string) { + if (this._ecsConfig) return; + + const requestURL = createECSRequestURL(filters, clientName); + try { + const response = await fetch(requestURL, { + method: 'GET' + }); + if (!response.ok) { + throw new Error('Request failed'); + } + const result = await response.json(); + // Update telemetry in other PR + // telemetry.sendTelemetryEvent('ECSConfig', {}); + + // Initialize ECS config + this._ecsConfig = result[clientName]; + } catch (error) { + // Log error + // telemetry.sendTelemetryEvent('ECSConfigError', {}); + } + } + + public static getConfig, TeamName extends string>( + feature: ECSFeatureProperties + ) { + if (Object.keys(this._featuresConfig).length === 0) { + this._featuresConfig = this._ecsConfig && feature.extractECSFeatureFlagConfig?.(this._ecsConfig as TConfig); + } + + return Object.keys(this._featuresConfig).length === 0 ? feature.fallback : this._featuresConfig; + } +} diff --git a/src/common/ecs-features/ecsFeatureFlagFilters.ts b/src/common/ecs-features/ecsFeatureFlagFilters.ts new file mode 100644 index 00000000..e21381a9 --- /dev/null +++ b/src/common/ecs-features/ecsFeatureFlagFilters.ts @@ -0,0 +1,29 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +export interface ECSAPIFeatureFlagFilters { + /** + * Application AppName + * @example powerpages-microsoft-com + */ + AppName: string; + + /** The AAD user object ID or MSA. */ + UserID: string; + + /** The AAD tenant object ID. */ + TenantID: string; + + /** Unique Dataverse Environment ID */ + EnvID: string; + + /** + * Deployment region + * @example test, preview, prod + */ + Region: string; + + // TBD - more API call filters to be added later +} diff --git a/src/common/ecs-features/ecsFeatureGates.ts b/src/common/ecs-features/ecsFeatureGates.ts new file mode 100644 index 00000000..da22f7db --- /dev/null +++ b/src/common/ecs-features/ecsFeatureGates.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { PowerPagesClientName } from './constants'; +import { getFeatureConfigs } from './ecsFeatureUtil'; + +export const { + feature: EnableMultifileVscodeWeb +} = getFeatureConfigs({ + teamName: PowerPagesClientName, + description: 'Enable multiple file view in Visual Studio Code Web', + fallback: { + enableMultifileVscodeWeb: false, + }, +}); diff --git a/src/common/ecs-features/ecsFeatureProperties.ts b/src/common/ecs-features/ecsFeatureProperties.ts new file mode 100644 index 00000000..42492846 --- /dev/null +++ b/src/common/ecs-features/ecsFeatureProperties.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +/** + * Interface representing a Feature config in ECS. + */ +export interface ECSFeatureDefinition, TeamName extends string> { + /** + * Name of the Team owning the feature. Must match the "clientTeam" name configured in ECS. + */ + teamName: TeamName; + + /** + * Fallback config to be used while loading or if configs are unavailable. + */ + fallback: TConfig; + + /** + * Brief description of the feature (used for tracking/cleanup purposes) + */ + description?: string; + + /** + * Callback to extract the Feature-specific config from the Team config. + * @param config overall config for the Team. + */ + extractECSFeatureFlagConfig(config: TTeamConfig): Partial; +} + +export type ECSFeatureInfo, TeamName extends string> = Omit< + ECSFeatureDefinition, + 'extractECSFeatureFlagConfig' +>; + +/** + * Creates a Feature object based on the feature definition that includes fallback flags and the team owning the feature. + * @param featureInfo Feature definition specifying the fallback flags and the team owning the feature. + */ +export function createECSFeatureDefinition, TeamName extends string>( + featureInfo: ECSFeatureInfo +): ECSFeatureDefinition { + return { + ...featureInfo, + extractECSFeatureFlagConfig: (config) => extractECSFeatureFlagConfig(config, Object.keys(featureInfo.fallback)), + }; +} + +/** + * Extracts the feature-specific config, based on the provided keys, from the overall Project Team config + * @param teamConfig the overall config object for the Project Team + * @param keys property names to extract from the Project Team config + */ +function extractECSFeatureFlagConfig, TeamConfig extends TConfig>( + teamConfig: TeamConfig, + keys: (keyof TConfig)[] +): Partial { + const config: Partial = {}; + + for (const key of keys) { + if (typeof teamConfig[key] !== 'undefined') { + config[key] = teamConfig[key]; + } + } + + return config; +} diff --git a/src/common/ecs-features/ecsFeatureUtil.ts b/src/common/ecs-features/ecsFeatureUtil.ts new file mode 100644 index 00000000..d8fb297c --- /dev/null +++ b/src/common/ecs-features/ecsFeatureUtil.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { PowerPagesClientName, ECS_REQUEST_URL_TEMPLATE } from "./constants"; +import { ECSFeaturesClient } from "./ecsFeatureClient"; +import { ECSAPIFeatureFlagFilters } from "./ecsFeatureFlagFilters"; +import { ECSFeatureDefinition, ECSFeatureInfo, createECSFeatureDefinition } from "./ecsFeatureProperties"; + +export function createECSRequestURL(filters: ECSAPIFeatureFlagFilters, clientName = PowerPagesClientName): string { + const queryParams: { [key: string]: string } = { + AppName: filters.AppName, + EnvironmentID: filters.EnvID, + UserID: filters.UserID, + TenantID: filters.TenantID, + region: filters.Region + }; + + const queryString = Object.keys(queryParams) + .map(key => `${key}=${encodeURIComponent(queryParams[key])}`) + .join('&'); + + return `${ECS_REQUEST_URL_TEMPLATE}/${clientName}/1.0.0.0?${queryString}`; +} + +export function getFeatureConfigs, TeamName extends string>(featureInfo: ECSFeatureInfo) { + type EnhancedFeature = ECSFeatureDefinition & { + getConfig: () => Partial; + }; + + const feature = createECSFeatureDefinition(featureInfo) as EnhancedFeature; + feature.getConfig = () => ECSFeaturesClient.getConfig(feature); + + return { + feature: feature, + }; +} diff --git a/src/web/client/WebExtensionContext.ts b/src/web/client/WebExtensionContext.ts index 80e978b6..13778f90 100644 --- a/src/web/client/WebExtensionContext.ts +++ b/src/web/client/WebExtensionContext.ts @@ -370,7 +370,7 @@ class WebExtensionContext implements IWebExtensionContext { const dataverseOrgUrl = this.urlParametersMap.get( Constants.queryParameters.ORG_URL ) as string; - const accessToken: string = await dataverseAuthentication( + const { accessToken, userId } = await dataverseAuthentication( dataverseOrgUrl, firstTimeAuth ); @@ -378,6 +378,7 @@ class WebExtensionContext implements IWebExtensionContext { if (accessToken.length === 0) { // re-set all properties to default values this._dataverseAccessToken = ""; + this._userId = ""; this._websiteIdToLanguage = new Map(); this._websiteLanguageIdToPortalLanguageMap = new Map< string, @@ -394,6 +395,7 @@ class WebExtensionContext implements IWebExtensionContext { } this._dataverseAccessToken = accessToken; + this._userId = userId; } public async updateFileDetailsInContext( diff --git a/src/web/client/common/authenticationProvider.ts b/src/web/client/common/authenticationProvider.ts index 414f5ddb..24837e98 100644 --- a/src/web/client/common/authenticationProvider.ts +++ b/src/web/client/common/authenticationProvider.ts @@ -87,8 +87,9 @@ export async function intelligenceAPIAuthentication(telemetry: ITelemetry, sessi export async function dataverseAuthentication( dataverseOrgURL: string, firstTimeAuth = false -): Promise { +): Promise<{ accessToken: string, userId: string }> { let accessToken = ""; + let userId = ""; try { let session = await vscode.authentication.getSession( PROVIDER_ID, @@ -110,6 +111,9 @@ export async function dataverseAuthentication( } accessToken = session?.accessToken ?? ""; + userId = session?.account.id.split("/").pop() ?? + session?.account.id ?? + ""; if (!accessToken) { throw new Error(ERRORS.NO_ACCESS_TOKEN); } @@ -118,10 +122,7 @@ export async function dataverseAuthentication( WebExtensionContext.telemetry.sendInfoTelemetry( telemetryEventNames.WEB_EXTENSION_DATAVERSE_AUTHENTICATION_COMPLETED, { - userId: - session?.account.id.split("/").pop() ?? - session?.account.id ?? - "", + userId: userId } ); } @@ -140,7 +141,7 @@ export async function dataverseAuthentication( ); } - return accessToken; + return { accessToken, userId }; } export async function npsAuthentication( diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index dba6862d..2250b2c8 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -40,7 +40,9 @@ import { fetchArtemisResponse } from "../../common/ArtemisService"; import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; import { GeoNames } from "../../common/OneDSLoggerTelemetry/telemetryConstants"; import { sendingMessageToWebWorkerForCoPresence } from "./utilities/collaborationUtils"; -import {IPortalWebExtensionInitQueryParametersTelemetryData} from "./telemetry/webExtensionTelemetryInterface"; +import { ECSFeaturesClient } from "../../common/ecs-features/ecsFeatureClient"; +import { PowerPagesAppName, PowerPagesClientName } from "../../common/ecs-features/constants"; +import { IPortalWebExtensionInitQueryParametersTelemetryData } from "./telemetry/webExtensionTelemetryInterface"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -114,7 +116,7 @@ export function activate(context: vscode.ExtensionContext): void { logOneDSLogger(queryParamsMap); const orgId = queryParamsMap.get(queryParameters.ORG_ID) as string; const orgGeo = await fetchArtemisData(orgId); - WebExtensionContext.telemetry.sendInfoTelemetry(telemetryEventNames.WEB_EXTENSION_ORG_GEO,{orgGeo: orgGeo}); + WebExtensionContext.telemetry.sendInfoTelemetry(telemetryEventNames.WEB_EXTENSION_ORG_GEO, { orgGeo: orgGeo }); oneDSLoggerWrapper.instantiate(orgGeo); WebExtensionContext.telemetry.sendExtensionInitPathParametersTelemetry( @@ -146,6 +148,18 @@ export function activate(context: vscode.ExtensionContext): void { }, async () => { await portalsFS.readDirectory(WebExtensionContext.rootDirectory, true); + + // Initialize ECS config in webExtensionContext + await ECSFeaturesClient.init(WebExtensionContext.telemetry.getTelemetryReporter(), + { + AppName: PowerPagesAppName, + EnvID: queryParamsMap.get(queryParameters.ENV_ID) as string, + UserID: WebExtensionContext.userId, + TenantID: queryParamsMap.get(queryParameters.TENANT_ID) as string, + Region: queryParamsMap.get(queryParameters.REGION) as string + }, + PowerPagesClientName); + registerCopilot(context); processWillStartCollaboration(context); } @@ -629,14 +643,14 @@ function isActiveDocument(fileFsPath: string): boolean { ); } -async function fetchArtemisData(orgId: string) : Promise { - const artemisResponse = await fetchArtemisResponse(orgId, WebExtensionContext.telemetry.getTelemetryReporter()); - if (!artemisResponse) { - // Todo: Log in error telemetry. Runtime maintains another table for this kind of failure. We should do the same. - return ''; - } +async function fetchArtemisData(orgId: string): Promise { + const artemisResponse = await fetchArtemisResponse(orgId, WebExtensionContext.telemetry.getTelemetryReporter()); + if (!artemisResponse) { + // Todo: Log in error telemetry. Runtime maintains another table for this kind of failure. We should do the same. + return ''; + } - return artemisResponse[0].geoName as string; + return artemisResponse[0].geoName as string; } async function logArtemisTelemetry() { @@ -646,7 +660,7 @@ async function logArtemisTelemetry() { queryParameters.ORG_ID ) as string - const geoName= fetchArtemisData(orgId); + const geoName = fetchArtemisData(orgId); WebExtensionContext.telemetry.sendInfoTelemetry(telemetryEventNames.WEB_EXTENSION_ARTEMIS_RESPONSE, { orgId: orgId, geoName: String(geoName) }); } catch (error) { @@ -657,7 +671,7 @@ async function logArtemisTelemetry() { } } -function logOneDSLogger (queryParamsMap: Map) { +function logOneDSLogger(queryParamsMap: Map) { const telemetryData: IPortalWebExtensionInitQueryParametersTelemetryData = { eventName: telemetryEventNames.WEB_EXTENSION_INIT_QUERY_PARAMETERS, properties: { diff --git a/src/web/client/test/integration/AuthenticationProvider.test.ts b/src/web/client/test/integration/AuthenticationProvider.test.ts index 13539099..04ec0c01 100644 --- a/src/web/client/test/integration/AuthenticationProvider.test.ts +++ b/src/web/client/test/integration/AuthenticationProvider.test.ts @@ -13,7 +13,7 @@ import vscode from "vscode"; import WebExtensionContext from "../../WebExtensionContext"; import { telemetryEventNames } from "../../telemetry/constants"; import * as errorHandler from "../../common/errorHandler"; -import {oneDSLoggerWrapper} from "../../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; +import { oneDSLoggerWrapper } from "../../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; // eslint-disable-next-line @typescript-eslint/no-explicit-any let traceError: any @@ -56,7 +56,8 @@ describe("Authentication Provider", () => { const result = await dataverseAuthentication(dataverseOrgURL); sinon.assert.calledOnce(_mockgetSession); - expect(accessToken).eq(result); + expect(result.accessToken).eq("f068ee9f-a010-47b9-b1e1-7e6353730e7d"); + expect(result.userId).empty; }); it("dataverseAuthentication_return_blank_if_accessToken_is_null", async () => { @@ -81,7 +82,7 @@ describe("Authentication Provider", () => { ); //Act - const result = await dataverseAuthentication(dataverseOrgURL); + await dataverseAuthentication(dataverseOrgURL); sinon.assert.calledWith( showErrorDialog, @@ -96,7 +97,6 @@ describe("Authentication Provider", () => { sinon.assert.calledOnce(showErrorDialog); sinon.assert.calledOnce(sendErrorTelemetry); sinon.assert.calledOnce(_mockgetSession); - expect(result).empty; }); it("dataverseAuthentication_return_blank_if_exception_thrown", async () => { @@ -124,6 +124,7 @@ describe("Authentication Provider", () => { errorMessage ); sinon.assert.calledOnce(_mockgetSession); - expect(result).empty; + expect(result.accessToken).empty; + expect(result.userId).empty; }); }); diff --git a/src/web/client/test/integration/WebExtensionContext.test.ts b/src/web/client/test/integration/WebExtensionContext.test.ts index 491727bc..9274379d 100644 --- a/src/web/client/test/integration/WebExtensionContext.test.ts +++ b/src/web/client/test/integration/WebExtensionContext.test.ts @@ -100,7 +100,7 @@ describe("WebExtensionContext", () => { [Constants.queryParameters.ORG_URL, "PowerPages.com"], ]); - stub(authenticationProvider, "dataverseAuthentication").resolves(""); + stub(authenticationProvider, "dataverseAuthentication").resolves({ accessToken: "", userId: "" }); const telemetry = WebExtensionContext.telemetry; const sendErrorTelemetry = stub(telemetry, "sendErrorTelemetry"); @@ -144,7 +144,7 @@ describe("WebExtensionContext", () => { ]); stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); WebExtensionContext.setWebExtensionContext( @@ -322,7 +322,7 @@ describe("WebExtensionContext", () => { [Constants.queryParameters.ORG_URL, "PowerPages.com"], ]); - stub(authenticationProvider, "dataverseAuthentication").resolves(""); + stub(authenticationProvider, "dataverseAuthentication").resolves({ accessToken: "", userId: "" }); const noPermissions = stub(vscode.FileSystemError, "NoPermissions"); const telemetry = WebExtensionContext.telemetry; const sendErrorTelemetry = stub(telemetry, "sendErrorTelemetry"); @@ -370,7 +370,7 @@ describe("WebExtensionContext", () => { const dataverseAuthentication = stub( authenticationProvider, "dataverseAuthentication" - ).resolves(accessToken); + ).resolves({ accessToken: accessToken, userId: "" }); const getCustomRequestURL = stub( urlBuilderUtil, @@ -576,7 +576,7 @@ describe("WebExtensionContext", () => { const dataverseAuthentication = stub( authenticationProvider, "dataverseAuthentication" - ).resolves(accessToken); + ).resolves({ accessToken: accessToken, userId: "" }); const getCustomRequestURL = stub( urlBuilderUtil, @@ -704,7 +704,7 @@ describe("WebExtensionContext", () => { const dataverseAuthentication = stub( authenticationProvider, "dataverseAuthentication" - ).resolves(accessToken); + ).resolves({ accessToken: accessToken, userId: "" }); const getCustomRequestURL = stub( urlBuilderUtil, diff --git a/src/web/client/test/integration/remoteFetchProvider.test.ts b/src/web/client/test/integration/remoteFetchProvider.test.ts index 4b4c8834..ac66efd1 100644 --- a/src/web/client/test/integration/remoteFetchProvider.test.ts +++ b/src/web/client/test/integration/remoteFetchProvider.test.ts @@ -67,7 +67,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const _mockFetch = stub(fetch, "default").resolves({ @@ -259,7 +259,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const _mockFetch = stub(fetch, "default").resolves({ @@ -454,7 +454,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const portalFs = new PortalsFS(); @@ -544,7 +544,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const portalFs = new PortalsFS(); @@ -641,7 +641,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const portalFs = new PortalsFS(); @@ -742,7 +742,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const portalFs = new PortalsFS(); @@ -845,7 +845,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const portalFs = new PortalsFS(); @@ -949,7 +949,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const portalFs = new PortalsFS(); @@ -1047,7 +1047,7 @@ describe("remoteFetchProvider", () => { const accessToken = "ae3308da-d75b-4666-bcb8-8f33a3dd8a8d"; stub(authenticationProvider, "dataverseAuthentication").resolves( - accessToken + { accessToken: accessToken, userId: "" } ); const _mockFetch = stub(fetch, 'default').callsFake((url) => { @@ -1135,7 +1135,7 @@ describe("remoteFetchProvider", () => { true, // eslint-disable-next-line @typescript-eslint/no-explicit-any {} - ); + ); assert.calledWith(convertContentToUint8Array, // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/web/client/utilities/commonUtil.ts b/src/web/client/utilities/commonUtil.ts index 1106fb0f..8dfeacbe 100644 --- a/src/web/client/utilities/commonUtil.ts +++ b/src/web/client/utilities/commonUtil.ts @@ -224,6 +224,7 @@ export function getBackToStudioURL() { .replace("{.region}", region.toLowerCase() === STUDIO_PROD_REGION ? "" : `.${WebExtensionContext.urlParametersMap.get(queryParameters.REGION) as string}`) .replace("{webSiteId}", WebExtensionContext.urlParametersMap.get(queryParameters.WEBSITE_ID) as string); } + export function getSupportedImageFileExtensionsForEdit() { return ['png', 'jpg', 'webp', 'bmp', 'tga', 'ico', 'jpeg', 'bmp', 'dib', 'jif', 'jpe', 'tpic']; // Luna paint supported image file extensions } From 68adf35b90ccaebb4664798361414abcc4fe52cd Mon Sep 17 00:00:00 2001 From: tyaginidhi Date: Mon, 29 Apr 2024 15:24:51 +0530 Subject: [PATCH 2/3] copresence package update - remove package version override (#918) --- package-lock.json | 671 ++++++++++++++++++++++------------------------ package.json | 10 +- 2 files changed, 326 insertions(+), 355 deletions(-) diff --git a/package-lock.json b/package-lock.json index a4cf282a..4469b70a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.1-dev", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@fluidframework/azure-client": "^1.1.1", + "@fluidframework/azure-client": "^1.2.0", "@microsoft/1ds-core-js": "4.0.5", "@microsoft/1ds-post-js": "4.0.5", "@microsoft/generator-powerpages": "1.21.19", @@ -20,7 +20,7 @@ "cockatiel": "^3.1.1", "command-exists": "^1.2.9", "find-process": "^1.4.7", - "fluid-framework": "^1.3.3", + "fluid-framework": "^1.4.0", "glob": "^7.1.7", "gpt-tokenizer": "^2.1.1", "https-browserify": "^1.0.0", @@ -650,25 +650,25 @@ } }, "node_modules/@fluidframework/aqueduct": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/aqueduct/-/aqueduct-1.3.7.tgz", - "integrity": "sha512-eXWGpzXnATNUIta5xJauwW8QDqw7sCjaVsF2yk5me3aeRZ9vi5a6bWeHuheADMARyYPrTWoDVINFR0H3EXFnjg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/aqueduct/-/aqueduct-1.4.0.tgz", + "integrity": "sha512-b3I3fWGAWuXQbyuEFeeEi3GVVUOYPWJfFaB4httsu5Jn4C0QSkKxftkielDlor9/7rCJYjHc4IEWViaVO+kBbA==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-loader": "^1.3.7", - "@fluidframework/container-runtime": "^1.3.7", - "@fluidframework/container-runtime-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", - "@fluidframework/map": "^1.3.7", - "@fluidframework/request-handler": "^1.3.7", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/synthesize": "^1.3.7", - "@fluidframework/view-interfaces": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-loader": "^1.4.0", + "@fluidframework/container-runtime": "^1.4.0", + "@fluidframework/container-runtime-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", + "@fluidframework/map": "^1.4.0", + "@fluidframework/request-handler": "^1.4.0", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/synthesize": "^1.4.0", + "@fluidframework/view-interfaces": "^1.4.0", "uuid": "^8.3.1" } }, @@ -710,100 +710,30 @@ } }, "node_modules/@fluidframework/azure-client": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@fluidframework/azure-client/-/azure-client-1.1.1.tgz", - "integrity": "sha512-2raaGv2nWxdMbcrw9kuDhHd8coqqVloIoM7X19NmcCVP7FLkT7n8Fj2O/7gg8ccqsaMSXNWCRhbtMpca/lcD8g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@fluidframework/azure-client/-/azure-client-1.2.0.tgz", + "integrity": "sha512-jpfYF6I1uwwCqOc8X0fOgZz4Lj91QFzKV4S9lM7jSW84GxytlL3nDanj9+EYC+vLn4liRVaOCA3zRwpkDNXRWg==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", - "@fluidframework/common-utils": "^1.0.0", - "@fluidframework/container-definitions": "^1.3.3", - "@fluidframework/container-loader": "^1.3.3", - "@fluidframework/core-interfaces": "^1.3.3", - "@fluidframework/driver-definitions": "^1.3.3", - "@fluidframework/driver-utils": "^1.3.3", - "@fluidframework/fluid-static": "^1.3.3", - "@fluidframework/map": "^1.3.3", + "@fluidframework/common-utils": "^1.1.1", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-loader": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", + "@fluidframework/fluid-static": "^1.4.0", + "@fluidframework/map": "^1.4.0", "@fluidframework/protocol-definitions": "^1.0.0", - "@fluidframework/routerlicious-driver": "^1.3.3", - "@fluidframework/runtime-utils": "^1.3.3", - "@fluidframework/server-services-client": "^0.1036.5001", - "axios": "^0.21.2", + "@fluidframework/routerlicious-driver": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/server-services-client": "^0.1036.5002", + "axios": "^0.28.0", "uuid": "^8.3.1" }, "peerDependencies": { - "fluid-framework": "^1.3.3" - } - }, - "node_modules/@fluidframework/azure-client/node_modules/@fluidframework/server-services-client": { - "version": "0.1036.5001", - "resolved": "https://registry.npmjs.org/@fluidframework/server-services-client/-/server-services-client-0.1036.5001.tgz", - "integrity": "sha512-e+Zk2uPcds9yqlalAZ0PpfEAKPPUIpIoQb3YSm42ZVpAgQmLYIRqTpXrmTC7qdeQnSGFJUAliW4DfHBEwpSXlQ==", - "dependencies": { - "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/gitresources": "^0.1036.5001", - "@fluidframework/protocol-base": "^0.1036.5001", - "@fluidframework/protocol-definitions": "^0.1028.2000", - "axios": "^0.26.0", - "crc-32": "1.2.0", - "debug": "^4.1.1", - "json-stringify-safe": "^5.0.1", - "jsrsasign": "^10.2.0", - "jwt-decode": "^3.0.0", - "querystring": "^0.2.0", - "sillyname": "^0.1.0", - "uuid": "^8.3.1" - } - }, - "node_modules/@fluidframework/azure-client/node_modules/@fluidframework/server-services-client/node_modules/@fluidframework/common-utils": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@fluidframework/common-utils/-/common-utils-0.32.2.tgz", - "integrity": "sha512-PoGX7/l0vWKt5JaAxcgFOdGje30Q6qSE06YzFIKh9Ba3oq7B60+TFqu7c2ErQt6sNddmvcAcAiLVNaTGAip3vw==", - "dependencies": { - "@fluidframework/common-definitions": "^0.20.1", - "@types/events": "^3.0.0", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "events": "^3.1.0", - "lodash": "^4.17.21", - "sha.js": "^2.4.11" - } - }, - "node_modules/@fluidframework/azure-client/node_modules/@fluidframework/server-services-client/node_modules/@fluidframework/protocol-definitions": { - "version": "0.1028.2000", - "resolved": "https://registry.npmjs.org/@fluidframework/protocol-definitions/-/protocol-definitions-0.1028.2000.tgz", - "integrity": "sha512-ZUPCmPFcK7UAK4RkfVWfzQPAWFvYNm6ywP51V42YC38gCGye+Epvyr3beA+FSaHPIZGxm5+Uw52+ykTvmDb2UA==", - "dependencies": { - "@fluidframework/common-definitions": "^0.20.1" - } - }, - "node_modules/@fluidframework/azure-client/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "fluid-framework": "^1.4.0" } }, - "node_modules/@fluidframework/azure-client/node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" - }, "node_modules/@fluidframework/common-definitions": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@fluidframework/common-definitions/-/common-definitions-0.20.1.tgz", @@ -847,13 +777,13 @@ } }, "node_modules/@fluidframework/container-definitions": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/container-definitions/-/container-definitions-1.3.7.tgz", - "integrity": "sha512-ESO6uI6n6Xy6gk4Yee9BoVh0JjgnG7SIh79JFKIgGLOk9mQ2j3A8glHPtWTwMxgtvfr+NCHdcE6yleWGWnBU7g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-definitions/-/container-definitions-1.4.0.tgz", + "integrity": "sha512-UwyxdX739ltQhQ9Zr2n7mBKN2eYEVnY7GCsV60ZfLUawb021eeL0rVZZgT0t3BiTCCilBMl4Bw4KQ8XyYu2g/w==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", "events": "^3.1.0" } @@ -867,20 +797,20 @@ } }, "node_modules/@fluidframework/container-loader": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/container-loader/-/container-loader-1.3.7.tgz", - "integrity": "sha512-BDAW9cCD4VOV8vAHjv7/n6Bl9TOumkvBcvBJQfg9tXBnBDCxwgjvB5Azpg/rKlxZn9LXLArbTUd1oeT5i1B01g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-loader/-/container-loader-1.4.0.tgz", + "integrity": "sha512-D54tW/W5EXLb2nRUGCNd8bID9t9KVkQJmtnHfnQ/JggpaBWODaQRp2tCDtidwo8y6bkiqIheMGjIdjgP9SqJzw==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/driver-utils": "^1.3.7", - "@fluidframework/protocol-base": "^0.1036.5001", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", + "@fluidframework/protocol-base": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/telemetry-utils": "^1.3.7", + "@fluidframework/telemetry-utils": "^1.4.0", "abort-controller": "^3.0.0", "double-ended-queue": "^2.1.0-0", "events": "^3.1.0", @@ -935,41 +865,41 @@ } }, "node_modules/@fluidframework/container-runtime": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime/-/container-runtime-1.3.7.tgz", - "integrity": "sha512-dqzcvJlcSWfIS8iTWiqFk3uk+LInZK+gOcNUS2QWR+nOwzI70lQV+UqCb1lxErG1zRcQotga1yn+KSzccZlRxg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime/-/container-runtime-1.4.0.tgz", + "integrity": "sha512-KENgBxuPD7GdNmdjmsyVJpPKZwfXoRlzAxaMNhGdMSbi6oXDrd1LSekY5tchhsLWBpB5ucZpuvmSgbU+h9z3HQ==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-runtime-definitions": "^1.3.7", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/driver-utils": "^1.3.7", - "@fluidframework/garbage-collector": "^1.3.7", - "@fluidframework/protocol-base": "^0.1036.5001", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-runtime-definitions": "^1.4.0", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", + "@fluidframework/garbage-collector": "^1.4.0", + "@fluidframework/protocol-base": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/telemetry-utils": "^1.3.7", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/telemetry-utils": "^1.4.0", "double-ended-queue": "^2.1.0-0", "events": "^3.1.0", "uuid": "^8.3.1" } }, "node_modules/@fluidframework/container-runtime-definitions": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime-definitions/-/container-runtime-definitions-1.3.7.tgz", - "integrity": "sha512-86RzJm/2/j0es+4oKiJTSsC2/zkp2KGFR/2ALccl58Hru+zttnRMn31DIcc2c7YDNHB6IuaZ7V2UKh26AAnkAg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime-definitions/-/container-runtime-definitions-1.4.0.tgz", + "integrity": "sha512-0rlswYsMVQiD1/btlJ5Ebf3rfTyFd06E2/zRJiKWiaMzgmn9QqF7OoVtiJfAIUsyey+dR8hnI0IFlB1IMfIPOg==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7" + "@fluidframework/runtime-definitions": "^1.4.0" } }, "node_modules/@fluidframework/container-runtime-definitions/node_modules/@fluidframework/protocol-definitions": { @@ -1026,15 +956,15 @@ } }, "node_modules/@fluidframework/container-utils": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/container-utils/-/container-utils-1.3.7.tgz", - "integrity": "sha512-XFt6iSD6RzJ+1dafwwzFgWA9U0yEvda0328zAGNT//c5H6cNSipxDuos7CJrDJWy2goQkBuyTYxpiSzsi7dNWg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-utils/-/container-utils-1.4.0.tgz", + "integrity": "sha512-OKYpvuzz5N62gQn8JELMyuKEwJAlToiLNWJP/dn/PS1HCKux5C/Mg7Twdi19DCgXP/hp5qvzAd+EHPqYWxMUGg==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/telemetry-utils": "^1.3.7" + "@fluidframework/telemetry-utils": "^1.4.0" } }, "node_modules/@fluidframework/container-utils/node_modules/@fluidframework/common-utils": { @@ -1083,44 +1013,44 @@ } }, "node_modules/@fluidframework/core-interfaces": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/core-interfaces/-/core-interfaces-1.3.7.tgz", - "integrity": "sha512-Rzsb1xK4h5imIddai+BW+XNWnpM1FEZR9UBWSKb+vMr0PCVBJwe4BTi6vxA7+o8OgdzVMOmOZhqnivKNUrGYKw==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/core-interfaces/-/core-interfaces-1.4.0.tgz", + "integrity": "sha512-PDIglmsa9BgFh7Xhfs32KA3Q34/arTVHF4m3M0IuAByP4z8Oi2lVuNENZnBEk+IJMcrUhUDk5Q9LH8KGfoAw+Q==" }, "node_modules/@fluidframework/datastore": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/datastore/-/datastore-1.3.7.tgz", - "integrity": "sha512-RaGLO3VUCIQhbh5D6h2PLnZ79Fw2aUbZSCltiQdKBWbBp4FzUgP+qqrtzSTd62waIzCod50aODUBNoYP+MqqoA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/datastore/-/datastore-1.4.0.tgz", + "integrity": "sha512-xV8cfmNzGAcpbQMrtEXTe7N6h6IkybrStrguyhZB6zBFzaPw3RNeAsMTiSxEMeVkU4UFcnI/ZU2rMalzVVC3Tg==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/driver-utils": "^1.3.7", - "@fluidframework/garbage-collector": "^1.3.7", - "@fluidframework/protocol-base": "^0.1036.5001", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", + "@fluidframework/garbage-collector": "^1.4.0", + "@fluidframework/protocol-base": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/telemetry-utils": "^1.3.7", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/telemetry-utils": "^1.4.0", "lodash": "^4.17.21", "uuid": "^8.3.1" } }, "node_modules/@fluidframework/datastore-definitions": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/datastore-definitions/-/datastore-definitions-1.3.7.tgz", - "integrity": "sha512-ucco5cnYvJEVBtzdeB2vYrdnDswjYAyX2H/OnL4+3gffUcJWCIuXQuON+AHv3uw/ESrOP0CUhuYv6ulT1SajNQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/datastore-definitions/-/datastore-definitions-1.4.0.tgz", + "integrity": "sha512-Xmebp+XFyK2K8EIauQx10UdwOXYskuSyQt8pSZ6ggTMMFpUsnx44tSR8I8KacSFoYkrWzG/G64osRu23SPCcjQ==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7" + "@fluidframework/runtime-definitions": "^1.4.0" } }, "node_modules/@fluidframework/datastore-definitions/node_modules/@fluidframework/common-utils": { @@ -1214,16 +1144,16 @@ } }, "node_modules/@fluidframework/driver-base": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-base/-/driver-base-1.3.7.tgz", - "integrity": "sha512-egZTjkAAQXATbIj5K5Ou7mNfthIKpQzogjrU+l//lHVsXyKJhShsowl4mTLs9VvYfNE5NLove7fdSEoh1coyLA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-base/-/driver-base-1.4.0.tgz", + "integrity": "sha512-w3fYGp1Bkdjp9he3W3dSPQb1vU+zsRIcZZV9wGNfPA1ii7z9rnXzSgscn39IdLbZqvS2704endNwOIYHyBT34g==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/driver-utils": "^1.3.7", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/telemetry-utils": "^1.3.7" + "@fluidframework/telemetry-utils": "^1.4.0" } }, "node_modules/@fluidframework/driver-base/node_modules/@fluidframework/common-utils": { @@ -1272,12 +1202,12 @@ } }, "node_modules/@fluidframework/driver-definitions": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-definitions/-/driver-definitions-1.3.7.tgz", - "integrity": "sha512-JZfOgfkOA9sdmMDDs1L83UtU1Zoe73E0QFXu3hlL3JUllDEmMvwzZkwJf+H82PdpHTu/gR99lPMz3GVtWoU5hQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-definitions/-/driver-definitions-1.4.0.tgz", + "integrity": "sha512-ay6Wwl8zGS64fjDsdh2iOeKiVVxT57Opeqjp6DqSglnnJi6AkSfYVoOVlMZ5+vJTfYJN3N4ptjrP/i3Mao9zPA==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", - "@fluidframework/core-interfaces": "^1.3.7", + "@fluidframework/core-interfaces": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000" } }, @@ -1290,19 +1220,19 @@ } }, "node_modules/@fluidframework/driver-utils": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-utils/-/driver-utils-1.3.7.tgz", - "integrity": "sha512-N8dHnrgZJrvbC8DSY0MAbcFNhRJeoryQKYz0b7fjO3P/RE1GRQfU5phlBWlkQwJKPo5Zh+I9o2S6kQY1oz6DcQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-utils/-/driver-utils-1.4.0.tgz", + "integrity": "sha512-NPTFw54a+EnIzop7iwrHTONdt0UAjW59HhMlYVPMH8/aOBodddHl7oi2Ek96nZLc+6qruHImjJ+0OW+NxNS+Gw==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/gitresources": "^0.1036.5001", - "@fluidframework/protocol-base": "^0.1036.5001", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/gitresources": "^0.1036.5002", + "@fluidframework/protocol-base": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/telemetry-utils": "^1.3.7", - "axios": "^0.26.0", + "@fluidframework/telemetry-utils": "^1.4.0", + "axios": "^0.28.0", "uuid": "^8.3.1" } }, @@ -1352,22 +1282,22 @@ } }, "node_modules/@fluidframework/fluid-static": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-1.3.7.tgz", - "integrity": "sha512-Rnuvx/xjy6GuA2/VN2J3I2RLkVMLch1QVqlN5UWZqpSFUx3O8+NPTVC9pocTOnTJTvhO3dqgPmGpJgIigZizbQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-1.4.0.tgz", + "integrity": "sha512-YlSX6Ibm3HquB+swxoIJt6QM1Bd6R9rBHp/HYDR9/9JuQwCIqW1xvF2NHmXPN/TGl51DnbhSB0gtm9k6pYd7pg==", "dependencies": { - "@fluidframework/aqueduct": "^1.3.7", + "@fluidframework/aqueduct": "^1.4.0", "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-loader": "^1.3.7", - "@fluidframework/container-runtime-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-loader": "^1.4.0", + "@fluidframework/container-runtime-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/request-handler": "^1.3.7", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7" + "@fluidframework/request-handler": "^1.4.0", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0" } }, "node_modules/@fluidframework/fluid-static/node_modules/@fluidframework/common-utils": { @@ -1416,13 +1346,13 @@ } }, "node_modules/@fluidframework/garbage-collector": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/garbage-collector/-/garbage-collector-1.3.7.tgz", - "integrity": "sha512-w9FRDXN+/vWnL3JHBteGqY4Df1VvUXJ6DVR/PWJLh1pUyVUvpDAXya9ldxhmPw1CRja+TSc1nxwMWennJVAywQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/garbage-collector/-/garbage-collector-1.4.0.tgz", + "integrity": "sha512-bwt1mv3B2PcvVN/JqBkm8MwdRydVboBM7MguQkANDGkmUPD56dRzjBYEdOl3yNZJEO/xJ2v15RPrkf1coI78Bg==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/runtime-definitions": "^1.3.7" + "@fluidframework/runtime-definitions": "^1.4.0" } }, "node_modules/@fluidframework/garbage-collector/node_modules/@fluidframework/common-utils": { @@ -1463,25 +1393,25 @@ } }, "node_modules/@fluidframework/gitresources": { - "version": "0.1036.5001", - "resolved": "https://registry.npmjs.org/@fluidframework/gitresources/-/gitresources-0.1036.5001.tgz", - "integrity": "sha512-Beg1A/eR7wCPYYb5u5iqqc092NkWnSvl4XCn2ImA4FDKtnYggD2/KYd9Hp0feM6Z99aU4FYSBidL2NewWlvF7A==" + "version": "0.1036.5002", + "resolved": "https://registry.npmjs.org/@fluidframework/gitresources/-/gitresources-0.1036.5002.tgz", + "integrity": "sha512-/xdmCca+arU9x9tDGdIl2CCk0DmpWlFjZdcTdWjLNiexKMVKDrHmSw9vCpUMlGmECq8EOO7fyzBnAGM+nu+i0g==" }, "node_modules/@fluidframework/map": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/map/-/map-1.3.7.tgz", - "integrity": "sha512-O9YYytm3OIkl6BuC3WGQQtwJZnh50BjfkRGECvhJtMSgEvGE1U6STpk1xuOwnjcK7SsnrkNQd9hMCTZgUMe0VQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/map/-/map-1.4.0.tgz", + "integrity": "sha512-KBdHBxCcIvPtsUSqnc5Ztgs2U01FwgnsW8WF3bl+TGt55Xs4esm3+p43WNkET1YU5Q95RVocRVp03dYMN7xelQ==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", - "@fluidframework/driver-utils": "^1.3.7", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/shared-object-base": "^1.3.7", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/shared-object-base": "^1.4.0", "path-browserify": "^1.0.1" } }, @@ -1531,21 +1461,21 @@ } }, "node_modules/@fluidframework/merge-tree": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/merge-tree/-/merge-tree-1.3.7.tgz", - "integrity": "sha512-YA9/fRrTN8LkSw2H1/CgjkfWY1hW6PreHRJbBYZVVC469vXzMGOf+A8xBWS33A4U3oDNBj4ymVb9Ijy87vTKIA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/merge-tree/-/merge-tree-1.4.0.tgz", + "integrity": "sha512-UJq7AfD52bp8ecoJLxArGI8506hTFjkNYLU2TXj08Fn8pi6MYN8WBMrCgAGJ47P7ytP1YfXOOWLzeT2ODuYJYw==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/shared-object-base": "^1.3.7", - "@fluidframework/telemetry-utils": "^1.3.7" + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/shared-object-base": "^1.4.0", + "@fluidframework/telemetry-utils": "^1.4.0" } }, "node_modules/@fluidframework/merge-tree/node_modules/@fluidframework/common-utils": { @@ -1594,12 +1524,12 @@ } }, "node_modules/@fluidframework/protocol-base": { - "version": "0.1036.5001", - "resolved": "https://registry.npmjs.org/@fluidframework/protocol-base/-/protocol-base-0.1036.5001.tgz", - "integrity": "sha512-Btjy2bWVbVsmzNTBxTQZ9l/WXljsjDpGbBgJsn9GLacrTG9aDDtIVMXuwLAcEV1IVkxGcIipXryvfhbPHDYcMg==", + "version": "0.1036.5002", + "resolved": "https://registry.npmjs.org/@fluidframework/protocol-base/-/protocol-base-0.1036.5002.tgz", + "integrity": "sha512-mlI9okyLeSusGx7qU32NDJ4GJptSzVo3V6tPDhphPIOPtyOVTBuL4EQRFYdceoSLHlxEdVnQprwhyoRiMNw7Kw==", "dependencies": { "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/gitresources": "^0.1036.5001", + "@fluidframework/gitresources": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", "lodash": "^4.17.21" } @@ -1658,15 +1588,15 @@ } }, "node_modules/@fluidframework/request-handler": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/request-handler/-/request-handler-1.3.7.tgz", - "integrity": "sha512-bR1VsJ+KISQ+iklRrjy0OGnYYC/fwsDZcTOG9wbfslFGYt7GIIkFZhsaYDlIjYXBIDQhbZzXCeclxmTzrs2hAQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/request-handler/-/request-handler-1.4.0.tgz", + "integrity": "sha512-KDYjQcrdvSuHXBtIG+LkDCcIjiDdw1CKX4iWi/aQrbGOTFVyLzfb2SnEXOBz7sw0YuMhxf+S322KTcX/OWd12w==", "dependencies": { "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-runtime-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7" + "@fluidframework/container-runtime-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0" } }, "node_modules/@fluidframework/request-handler/node_modules/@fluidframework/common-utils": { @@ -1707,20 +1637,20 @@ } }, "node_modules/@fluidframework/routerlicious-driver": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/routerlicious-driver/-/routerlicious-driver-1.3.7.tgz", - "integrity": "sha512-mYBOCEaKdgrLihlBSzx7FMdRdjmu3MkIU5bWswEIaBiyBmrv+cVoqtKIaH30Myi+a7KQkmToFQ+ZSJ8kFVukJg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/routerlicious-driver/-/routerlicious-driver-1.4.0.tgz", + "integrity": "sha512-iyLywWEgo7zWYCiJj0GPzsrn4lmLw65GYJLEod57fBCk9eLRRxhQ2GJuu2k9XGV6nCFadEc1ZEKufDUNIiBPow==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/driver-base": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/driver-utils": "^1.3.7", - "@fluidframework/gitresources": "^0.1036.5001", - "@fluidframework/protocol-base": "^0.1036.5001", + "@fluidframework/driver-base": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/driver-utils": "^1.4.0", + "@fluidframework/gitresources": "^0.1036.5002", + "@fluidframework/protocol-base": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/server-services-client": "^0.1036.5001", - "@fluidframework/telemetry-utils": "^1.3.7", + "@fluidframework/server-services-client": "^0.1036.5002", + "@fluidframework/telemetry-utils": "^1.4.0", "cross-fetch": "^3.1.5", "json-stringify-safe": "5.0.1", "querystring": "^0.2.0", @@ -1751,26 +1681,6 @@ "@fluidframework/common-definitions": "^0.20.1" } }, - "node_modules/@fluidframework/routerlicious-driver/node_modules/@fluidframework/server-services-client": { - "version": "0.1036.5001", - "resolved": "https://registry.npmjs.org/@fluidframework/server-services-client/-/server-services-client-0.1036.5001.tgz", - "integrity": "sha512-e+Zk2uPcds9yqlalAZ0PpfEAKPPUIpIoQb3YSm42ZVpAgQmLYIRqTpXrmTC7qdeQnSGFJUAliW4DfHBEwpSXlQ==", - "dependencies": { - "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/gitresources": "^0.1036.5001", - "@fluidframework/protocol-base": "^0.1036.5001", - "@fluidframework/protocol-definitions": "^0.1028.2000", - "axios": "^0.26.0", - "crc-32": "1.2.0", - "debug": "^4.1.1", - "json-stringify-safe": "^5.0.1", - "jsrsasign": "^10.2.0", - "jwt-decode": "^3.0.0", - "querystring": "^0.2.0", - "sillyname": "^0.1.0", - "uuid": "^8.3.1" - } - }, "node_modules/@fluidframework/routerlicious-driver/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -1794,21 +1704,16 @@ "ieee754": "^1.2.1" } }, - "node_modules/@fluidframework/routerlicious-driver/node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" - }, "node_modules/@fluidframework/runtime-definitions": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/runtime-definitions/-/runtime-definitions-1.3.7.tgz", - "integrity": "sha512-AXE1FDgCl9nF5O4RCn7vdMzTIM4y7fXArAx6HpKMbaWZIVy/fsrGBJ+XFiKCblKtMKhcgv3TrbQlM3nUMSa6Iw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/runtime-definitions/-/runtime-definitions-1.4.0.tgz", + "integrity": "sha512-GewpwBxbeMutnHHXzVWsFYbGQJHKh8dFNqTiW0covMfaOOhXVSM0qzuf7RY7qX9n8Vn/bK3zF4WRo6gx/32fmg==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000" } }, @@ -1858,21 +1763,21 @@ } }, "node_modules/@fluidframework/runtime-utils": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/runtime-utils/-/runtime-utils-1.3.7.tgz", - "integrity": "sha512-CKzkYYaaYYxscU0NazuYu1gF1tiQxvZ5mHbTE5FxxxydGMEHcqKQ92eFwDdFYEpfJ8TyWBWpnYgyrU4g7dp89A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/runtime-utils/-/runtime-utils-1.4.0.tgz", + "integrity": "sha512-0drnuEdUja1m2401FXcsB9l66x5oCGjgW43mLjZgZFKcz5v5jYZml8OKWAtLmwfI/UNLJ9bQkb/nHQSM0Tf3Rw==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-runtime-definitions": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", - "@fluidframework/garbage-collector": "^1.3.7", - "@fluidframework/protocol-base": "^0.1036.5001", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-runtime-definitions": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", + "@fluidframework/garbage-collector": "^1.4.0", + "@fluidframework/protocol-base": "^0.1036.5002", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/telemetry-utils": "^1.3.7" + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/telemetry-utils": "^1.4.0" } }, "node_modules/@fluidframework/runtime-utils/node_modules/@fluidframework/common-utils": { @@ -1921,21 +1826,21 @@ } }, "node_modules/@fluidframework/sequence": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/sequence/-/sequence-1.3.7.tgz", - "integrity": "sha512-ctBdXecq4y+EZnAAtE/bHSj+jkByusqfemqUhA+NMM8pgIzD3oOO1JWpuIE/dZAjQLTamnXOmrOL4UkyB3dnmw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/sequence/-/sequence-1.4.0.tgz", + "integrity": "sha512-KV/BNdALIgKhlivGv7U4NRCRrDWLIgWEVB2Q/oSNdKF5kUgoQnl+iIQLQcpC8dGAB7YQyCHFZVi4glanyEPF5Q==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", - "@fluidframework/merge-tree": "^1.3.7", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", + "@fluidframework/merge-tree": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/shared-object-base": "^1.3.7", - "@fluidframework/telemetry-utils": "^1.3.7", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/shared-object-base": "^1.4.0", + "@fluidframework/telemetry-utils": "^1.4.0", "uuid": "^8.3.1" } }, @@ -1984,23 +1889,93 @@ "ieee754": "^1.2.1" } }, + "node_modules/@fluidframework/server-services-client": { + "version": "0.1036.5002", + "resolved": "https://registry.npmjs.org/@fluidframework/server-services-client/-/server-services-client-0.1036.5002.tgz", + "integrity": "sha512-2d0RSUXvfNlFgHVLiehiU4LgJheqGXlspIgug6U6nvPdwFGtQSbButh2SysBDFilIJ9E6Bacdd0P0e+4HRpCaQ==", + "dependencies": { + "@fluidframework/common-utils": "^0.32.2", + "@fluidframework/gitresources": "^0.1036.5002", + "@fluidframework/protocol-base": "^0.1036.5002", + "@fluidframework/protocol-definitions": "^0.1028.2000", + "axios": "^0.28.0", + "crc-32": "1.2.0", + "debug": "^4.1.1", + "json-stringify-safe": "^5.0.1", + "jsrsasign": "^11.1.0", + "jwt-decode": "^3.0.0", + "querystring": "^0.2.0", + "sillyname": "^0.1.0", + "uuid": "^8.3.1" + } + }, + "node_modules/@fluidframework/server-services-client/node_modules/@fluidframework/common-utils": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/@fluidframework/common-utils/-/common-utils-0.32.2.tgz", + "integrity": "sha512-PoGX7/l0vWKt5JaAxcgFOdGje30Q6qSE06YzFIKh9Ba3oq7B60+TFqu7c2ErQt6sNddmvcAcAiLVNaTGAip3vw==", + "dependencies": { + "@fluidframework/common-definitions": "^0.20.1", + "@types/events": "^3.0.0", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "events": "^3.1.0", + "lodash": "^4.17.21", + "sha.js": "^2.4.11" + } + }, + "node_modules/@fluidframework/server-services-client/node_modules/@fluidframework/protocol-definitions": { + "version": "0.1028.2000", + "resolved": "https://registry.npmjs.org/@fluidframework/protocol-definitions/-/protocol-definitions-0.1028.2000.tgz", + "integrity": "sha512-ZUPCmPFcK7UAK4RkfVWfzQPAWFvYNm6ywP51V42YC38gCGye+Epvyr3beA+FSaHPIZGxm5+Uw52+ykTvmDb2UA==", + "dependencies": { + "@fluidframework/common-definitions": "^0.20.1" + } + }, + "node_modules/@fluidframework/server-services-client/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@fluidframework/server-services-client/node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, "node_modules/@fluidframework/shared-object-base": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/shared-object-base/-/shared-object-base-1.3.7.tgz", - "integrity": "sha512-16ShEElTu60ZNxD4Em1PBbh77v//bHPHIaPJ9Tj8iI0zXGVIhhaY3RjhZScjhQFDhHEwJ0+rv/50X/xUzUXJ/w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/shared-object-base/-/shared-object-base-1.4.0.tgz", + "integrity": "sha512-NI94dsIyZL7s76UN/UVawd0JqV106cS84MaW1r9Qv91+QGU8aq/KCS3j8R9ZZ8pWFQ46sX9BT4CKa4hy4xZedw==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-runtime": "^1.3.7", - "@fluidframework/container-utils": "^1.3.7", - "@fluidframework/core-interfaces": "^1.3.7", - "@fluidframework/datastore": "^1.3.7", - "@fluidframework/datastore-definitions": "^1.3.7", + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-runtime": "^1.4.0", + "@fluidframework/container-utils": "^1.4.0", + "@fluidframework/core-interfaces": "^1.4.0", + "@fluidframework/datastore": "^1.4.0", + "@fluidframework/datastore-definitions": "^1.4.0", "@fluidframework/protocol-definitions": "^0.1028.2000", - "@fluidframework/runtime-definitions": "^1.3.7", - "@fluidframework/runtime-utils": "^1.3.7", - "@fluidframework/telemetry-utils": "^1.3.7", + "@fluidframework/runtime-definitions": "^1.4.0", + "@fluidframework/runtime-utils": "^1.4.0", + "@fluidframework/telemetry-utils": "^1.4.0", "uuid": "^8.3.1" } }, @@ -2050,14 +2025,14 @@ } }, "node_modules/@fluidframework/synthesize": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/synthesize/-/synthesize-1.3.7.tgz", - "integrity": "sha512-hojZEcVPM6ymDTiJkfYpDxQS28BaCjAA9KOqEa4a9RKljUXkxhVKl/flavofYWry/CgBw441e5KnXAZsAbmyoA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/synthesize/-/synthesize-1.4.0.tgz", + "integrity": "sha512-0pdq28pZ/cA/OVOp7KiUv8/bDxltwQy2ca7UJQGuyRDF9n1QcXoWC98liu2fB3/imahdfDi5pZ6l2vw/nIiFkA==" }, "node_modules/@fluidframework/telemetry-utils": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/telemetry-utils/-/telemetry-utils-1.3.7.tgz", - "integrity": "sha512-zM+GDOhZ2XKjPUm6PcGS9IDq3BvoiltH5X3j0dzODRR12xGtZIO2VBHTWlVtDjELw4n/TL/2Ftw+Kk2q/nIooQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/telemetry-utils/-/telemetry-utils-1.4.0.tgz", + "integrity": "sha512-WXG1ThL+WJLGdBtUGlCPPlIrHxqnc+zy+YHrYtqFnlIp+75W3W+YApR5dyP1uCfvapISoBPo0htK3WNIiyj8Rw==", "dependencies": { "@fluidframework/common-definitions": "^0.20.1", "@fluidframework/common-utils": "^0.32.2", @@ -2104,11 +2079,11 @@ } }, "node_modules/@fluidframework/view-interfaces": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@fluidframework/view-interfaces/-/view-interfaces-1.3.7.tgz", - "integrity": "sha512-9GlMGSkOZDLT7q7AHEd72Mjx15sKV43dZ61K91cK8Whx1eKx4vez/FFhXJl81bom37W+Gsl6iTy7ZRh8T1yj8g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@fluidframework/view-interfaces/-/view-interfaces-1.4.0.tgz", + "integrity": "sha512-YD0HE6rMpG6h/ELR717flLZ4Th0Ik0UUkECgaouW+Qy+Of+uPbi4KVoKRqTEEKzZqBFSbvSR5x3TlbmcXiEZnw==", "dependencies": { - "@fluidframework/core-interfaces": "^1.3.7" + "@fluidframework/core-interfaces": "^1.4.0" } }, "node_modules/@gulp-sourcemaps/identity-map": { @@ -3113,9 +3088,9 @@ "dev": true }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", @@ -7459,9 +7434,9 @@ } }, "node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -7491,9 +7466,9 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "engines": { "node": ">=10.0.0" } @@ -8815,16 +8790,16 @@ "dev": true }, "node_modules/fluid-framework": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/fluid-framework/-/fluid-framework-1.3.7.tgz", - "integrity": "sha512-NobiWALl9iz4rZnQT+Z0Kr583+Umaub7Ocp8LnCVEpr97hdlvnwpCrLj03cvwxZgpsuobHHTRTpGxabuZtehDQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/fluid-framework/-/fluid-framework-1.4.0.tgz", + "integrity": "sha512-Alq2+bwmIrYBZFh/8IynI4mfHvKExLahD1wQ1/4G0PiFYVtI6k2vpRVBofXijTJYq81y3WHN7ytzycW4g/JJrQ==", "dependencies": { - "@fluidframework/container-definitions": "^1.3.7", - "@fluidframework/container-loader": "^1.3.7", - "@fluidframework/driver-definitions": "^1.3.7", - "@fluidframework/fluid-static": "^1.3.7", - "@fluidframework/map": "^1.3.7", - "@fluidframework/sequence": "^1.3.7" + "@fluidframework/container-definitions": "^1.4.0", + "@fluidframework/container-loader": "^1.4.0", + "@fluidframework/driver-definitions": "^1.4.0", + "@fluidframework/fluid-static": "^1.4.0", + "@fluidframework/map": "^1.4.0", + "@fluidframework/sequence": "^1.4.0" } }, "node_modules/flush-write-stream": { @@ -12379,9 +12354,9 @@ ] }, "node_modules/jsrsasign": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.0.0.tgz", - "integrity": "sha512-BtRwVKS+5dsgPpAtzJcpo5OoWjSs1/zllSBG0+8o8/aV0Ki76m6iZwHnwnsqoTdhfFZDN1XIdcaZr5ZkP+H2gg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.1.0.tgz", + "integrity": "sha512-Ov74K9GihaK9/9WncTe1mPmvrO7Py665TUfUKvraXBpu+xcTWitrtuOwcjf4KMU9maPaYn0OuaWy0HOzy/GBXg==", "funding": { "url": "https://github.com/kjur/jsrsasign#donations" } @@ -18742,9 +18717,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", diff --git a/package.json b/package.json index 9d4ccfaf..2d287df8 100644 --- a/package.json +++ b/package.json @@ -1085,7 +1085,7 @@ "yargs": "^16.2.0" }, "dependencies": { - "@fluidframework/azure-client": "^1.1.1", + "@fluidframework/azure-client": "^1.2.0", "@microsoft/1ds-core-js": "4.0.5", "@microsoft/1ds-post-js": "4.0.5", "@microsoft/generator-powerpages": "1.21.19", @@ -1096,7 +1096,7 @@ "cockatiel": "^3.1.1", "command-exists": "^1.2.9", "find-process": "^1.4.7", - "fluid-framework": "^1.3.3", + "fluid-framework": "^1.4.0", "glob": "^7.1.7", "gpt-tokenizer": "^2.1.1", "https-browserify": "^1.0.0", @@ -1123,9 +1123,5 @@ "optionalDependencies": { "bufferutil": "^4.0.6", "utf-8-validate": "^5.0.9" - }, - "overrides": { - "jsrsasign": "^11.0.0", - "axios": "^0.28.0" } -} +} \ No newline at end of file From 2f015237515ecdc166d40d34902afd8b5e6f6ed3 Mon Sep 17 00:00:00 2001 From: tyaginidhi Date: Mon, 29 Apr 2024 18:05:29 +0530 Subject: [PATCH 3/3] Add error handing for power pages action button navigation scenarios (#919) --- src/web/client/utilities/commonUtil.ts | 12 +++++++++- .../webViews/powerPagesNavigationProvider.ts | 24 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/web/client/utilities/commonUtil.ts b/src/web/client/utilities/commonUtil.ts index 8dfeacbe..acc18a82 100644 --- a/src/web/client/utilities/commonUtil.ts +++ b/src/web/client/utilities/commonUtil.ts @@ -164,6 +164,10 @@ export function isNullOrUndefined(object: any | null | undefined): boolean { return object === null || object === undefined; } +export function isStringUndefinedOrEmpty(value: string | undefined): boolean { + return value === undefined || value === ''; +} + // Clean up the file name to remove special characters // Ex: For input: "my_file!@#$%^&*()_|+=?;:'\",<>{}[]\\/"; the output will be "my_file" export function getSanitizedFileName(fileName: string): string { @@ -219,6 +223,12 @@ export function getEnvironmentIdFromUrl() { export function getBackToStudioURL() { const region = WebExtensionContext.urlParametersMap.get(queryParameters.REGION) as string; + if (isStringUndefinedOrEmpty(WebExtensionContext.urlParametersMap.get(queryParameters.ENV_ID)) || + isStringUndefinedOrEmpty(WebExtensionContext.urlParametersMap.get(queryParameters.REGION)) || + isStringUndefinedOrEmpty(WebExtensionContext.urlParametersMap.get(queryParameters.WEBSITE_ID))) { + return undefined; + } + return BACK_TO_STUDIO_URL_TEMPLATE .replace("{environmentId}", getEnvironmentIdFromUrl()) .replace("{.region}", region.toLowerCase() === STUDIO_PROD_REGION ? "" : `.${WebExtensionContext.urlParametersMap.get(queryParameters.REGION) as string}`) @@ -270,7 +280,7 @@ export function getTeamChatURL(mail: string) { return "https://teams.microsoft.com/l/chat/0/0?users=" + encodeURIComponent(mail); } -export function getMailToPath (mail: string) { +export function getMailToPath(mail: string) { return `mailto:${mail}`; } diff --git a/src/web/client/webViews/powerPagesNavigationProvider.ts b/src/web/client/webViews/powerPagesNavigationProvider.ts index 77b19baa..1e538e61 100644 --- a/src/web/client/webViews/powerPagesNavigationProvider.ts +++ b/src/web/client/webViews/powerPagesNavigationProvider.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import * as path from 'path'; import WebExtensionContext from "../WebExtensionContext"; import { httpMethod, queryParameters } from '../common/constants'; -import { getBackToStudioURL } from '../utilities/commonUtil'; +import { getBackToStudioURL, isStringUndefinedOrEmpty } from '../utilities/commonUtil'; import { telemetryEventNames } from '../telemetry/constants'; export class PowerPagesNavigationProvider implements vscode.TreeDataProvider { @@ -63,6 +63,17 @@ export class PowerPagesNavigationProvider implements vscode.TreeDataProvider { let requestSentAtTime = new Date().getTime(); const websitePreviewUrl = WebExtensionContext.urlParametersMap.get(queryParameters.WEBSITE_PREVIEW_URL) as string; + + if (isStringUndefinedOrEmpty(websitePreviewUrl)) { + vscode.window.showErrorMessage(vscode.l10n.t("Preview site URL is not available")); + + WebExtensionContext.telemetry.sendErrorTelemetry( + telemetryEventNames.WEB_EXTENSION_PREVIEW_SITE_TRIGGERED, + vscode.l10n.t("Preview site URL is not available") + ); + return; + } + // Runtime clear cache call const requestUrl = `${websitePreviewUrl.endsWith('/') ? websitePreviewUrl : websitePreviewUrl.concat('/')}_services/cache/config`; @@ -122,6 +133,17 @@ export class PowerPagesNavigationProvider implements vscode.TreeDataProvider