From 0359e39f7b93dedd3cb22e874f159e7f4a38dc22 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:14:10 +0530 Subject: [PATCH 1/3] Fix E2E test failures --- .../src/rpc-managers/mi-data-mapper/rpc-manager.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts index 0b9ad34a6d..e0986507e3 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts @@ -170,7 +170,13 @@ export class MiDataMapperRpcManager implements MIDataMapperAPI { async formatDMC(documentUri: string): Promise { const uri = Uri.file(documentUri); - const edits: TextEdit[] = await commands.executeCommand("vscode.executeFormatDocumentProvider", uri); + let edits: TextEdit[]; + try { + edits = await commands.executeCommand("vscode.executeFormatDocumentProvider", uri); + } catch (error) { + console.error("Error occurred while formatting DMC file: ", error); + return; + } const workspaceEdit = new WorkspaceEdit(); workspaceEdit.set(uri, edits); await workspace.applyEdit(workspaceEdit); From e49bed40e43498c67e7eda49e0e9ecd348e4cc13 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 15 Nov 2025 23:53:33 +0530 Subject: [PATCH 2/3] Enhance state machine actions to reset context properties and update project path handling --- .../ballerina-extension/src/stateMachine.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index c75d4b1a74..ece6890de7 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -61,6 +61,15 @@ const stateMachine = createMachine( on: { RESET_TO_EXTENSION_READY: { target: "extensionReady", + actions: assign({ + documentUri: undefined, + position: undefined, + identifier: undefined, + projectPath: undefined, + scope: undefined, + org: undefined, + package: undefined + }) }, UPDATE_PROJECT_STRUCTURE: { actions: [ @@ -241,6 +250,7 @@ const stateMachine = createMachine( actions: assign({ view: (context, event) => event.viewLocation.view, documentUri: (context, event) => event.viewLocation.documentUri, + projectPath: (context, event) => event.viewLocation?.projectPath, position: (context, event) => event.viewLocation.position, identifier: (context, event) => event.viewLocation.identifier, serviceType: (context, event) => event.viewLocation.serviceType, @@ -598,8 +608,8 @@ const stateMachine = createMachine( if (!selectedEntry?.location.view) { return resolve( context.workspacePath - ? { view: MACHINE_VIEW.WorkspaceOverview } - : { view: MACHINE_VIEW.PackageOverview, documentUri: context.documentUri } + ? { view: MACHINE_VIEW.WorkspaceOverview } + : { view: MACHINE_VIEW.PackageOverview, documentUri: context.documentUri } ); } From 279226a5f9c0844367ca6ffab87aba554412bd85 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sun, 16 Nov 2025 02:58:53 +0530 Subject: [PATCH 3/3] Update project info interface and enhance state machine to handle organization and package names --- .../src/interfaces/extended-lang-client.ts | 1 + .../ballerina-extension/src/stateMachine.ts | 14 +++++++++++--- .../ballerina-extension/src/utils/config.ts | 14 +++++++------- .../ConfigurableItem/ConfigObjectEditor.tsx | 8 +++++++- .../Configurables/ConfigurableItem/index.tsx | 18 ++++++++++++++++-- .../ViewConfigurableVariables/index.tsx | 19 ++++++++++++------- 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index 54a520f805..5293d4ab90 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1928,6 +1928,7 @@ export interface ProjectInfo { name?: string; title?: string; orgName?: string; + org?: string; version?: string; projectPath?: string; children?: ProjectInfo[]; diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index ece6890de7..e3fe6bfd03 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -19,7 +19,7 @@ import { fetchScope, getOrgPackageName, UndoRedoManager, - getPackageName + getOrgAndPackageName } from './utils'; import { buildProjectsStructure } from './utils/project-artifacts'; import { runCommandWithOutput } from './utils/runCommand'; @@ -248,6 +248,8 @@ const stateMachine = createMachine( OPEN_VIEW: { target: "viewActive", actions: assign({ + org: (context, event) => event.viewLocation?.org, + package: (context, event) => event.viewLocation?.package, view: (context, event) => event.viewLocation.view, documentUri: (context, event) => event.viewLocation.documentUri, projectPath: (context, event) => event.viewLocation?.projectPath, @@ -329,6 +331,7 @@ const stateMachine = createMachine( identifier: (context, event) => event.viewLocation.identifier, serviceType: (context, event) => event.viewLocation.serviceType, projectPath: (context, event) => event.viewLocation?.projectPath || context?.projectPath, + org: (context, event) => event.viewLocation?.org || context?.org, package: (context, event) => event.viewLocation?.package || context?.package, type: (context, event) => event.viewLocation?.type, isGraphql: (context, event) => event.viewLocation?.isGraphql, @@ -525,7 +528,7 @@ const stateMachine = createMachine( }, findView(context, event): Promise { return new Promise(async (resolve, reject) => { - const packageName = getPackageName(context.projectInfo, context.projectPath); + const { orgName, packageName } = getOrgAndPackageName(context.projectInfo, context.projectPath); if (!context.view && context.langClient) { if (!context.position || ("groupId" in context.position)) { if (!context.projectPath && context.workspacePath) { @@ -539,7 +542,8 @@ const stateMachine = createMachine( location: { view: MACHINE_VIEW.PackageOverview, documentUri: context.documentUri, - package: packageName || context.package + org: orgName || context.org, + package: packageName || context.package, } }); } @@ -557,6 +561,7 @@ const stateMachine = createMachine( documentUri: context.documentUri, position: context.position, identifier: context.identifier, + org: orgName || context.org, package: packageName || context.package, type: context?.type, isGraphql: context?.isGraphql, @@ -736,6 +741,9 @@ export function openView(type: EVENT_TYPE, viewLocation: VisualizerLocation, res } extension.hasPullModuleResolved = false; extension.hasPullModuleNotification = false; + const { orgName, packageName } = getOrgAndPackageName(StateMachine.context().projectInfo, viewLocation.projectPath); + viewLocation.org = orgName; + viewLocation.package = packageName; stateService.send({ type: type, viewLocation: viewLocation }); } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/config.ts b/workspaces/ballerina/ballerina-extension/src/utils/config.ts index 6bccd78cba..db426d0e86 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/config.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/config.ts @@ -136,12 +136,12 @@ function compareVersions( if (current.major !== minimum.major) { return current.major > minimum.major; } - + // Major versions are equal, compare minor if (current.minor !== minimum.minor) { return current.minor > minimum.minor; } - + // Major and minor are equal, compare patch return current.patch >= minimum.patch; } @@ -357,20 +357,20 @@ export function setupBIFiles(projectDir: string): void { }); } -export function getPackageName(projectInfo: ProjectInfo, projectPath: string): string { +export function getOrgAndPackageName(projectInfo: ProjectInfo, projectPath: string): { orgName: string, packageName: string } { if (!projectPath || !projectInfo) { - return ""; + return { orgName: '', packageName: '' }; } if (projectInfo.children?.length) { const matchedProject = projectInfo.children.find( (child) => child.projectPath === projectPath ); - + if (matchedProject) { - return matchedProject.title || matchedProject.name; + return { orgName: matchedProject.org || matchedProject.orgName, packageName: matchedProject.name }; } } - return projectInfo.title || projectInfo.name; + return { orgName: projectInfo.org || projectInfo.orgName, packageName: projectInfo.name || projectInfo.title }; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/ConfigObjectEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/ConfigObjectEditor.tsx index e08d568c43..1d0ad2500c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/ConfigObjectEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/ConfigObjectEditor.tsx @@ -499,11 +499,17 @@ export function ConfigObjectEditor(props: ObjectEditorProps) { // If there's an existing config value, parse it and merge with recordConfig if (configValue) { try { - let parsedValue; + let parsedValue: any; if (typeof configValue === 'string') { // Attempt to fix JSON if it is JavaScript-style (unquoted keys) const fixedJson = configValue.replace(/([{,]\s*)([a-zA-Z0-9_]+)\s*:/g, '$1"$2":'); parsedValue = JSON.parse(fixedJson); + // Check if there are string values that are not wrapped in quotes + Object.keys(parsedValue).forEach(key => { + if (typeof parsedValue[key] === 'string' && !/^".*"$/.test(parsedValue[key])) { + parsedValue[key] = `"${parsedValue[key]}"`; + } + }); } else { parsedValue = configValue; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/index.tsx index 0938d837ef..3139d7380e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ConfigurableItem/index.tsx @@ -124,6 +124,20 @@ export function ConfigurableItem(props: ConfigurableItemProps) { setEditConfigVariableFormOpen(true); }; + const handleTextAreaChange = (value: any) => { + if (configVariable.properties?.type?.value === 'string' && !/^".*"$/.test(value)) { + value = `"${value}"`; + } + handleUpdateConfigValue(value, configVariable); + } + + const getPlainValue = (value: string) => { + if (configVariable.properties?.type?.value === 'string' && /^".*"$/.test(value)) { + return value.replace(/^"|"$/g, ''); + } + return value; + } + const handleUpdateConfigValue = async (newValue: string, prevNode: ConfigVariable) => { const newConfigVarNode: ConfigVariable = { ...prevNode, @@ -304,13 +318,13 @@ export function ConfigurableItem(props: ConfigurableItemProps) { return Math.min(5, Math.ceil(value.length / 100)); })()} resize="vertical" - value={configVariable?.properties?.configValue?.value ? String(configVariable?.properties?.configValue?.value) : ''} + value={configVariable?.properties?.configValue?.value ? getPlainValue(String(configVariable?.properties?.configValue?.value)) : ''} style={{ width: '100%', maxWidth: '350px', minHeight: '20px' }} - onChange={(e: any) => handleUpdateConfigValue(e.target.value, configVariable)} + onChange={(e: any) => handleTextAreaChange(e.target.value)} >