Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
de6ac46
Show mocked diff in a tree view
MrRishabhJain Feb 28, 2025
9ca6204
refactored data provider
MrRishabhJain Mar 1, 2025
ce9b048
Download from pac
MrRishabhJain Mar 4, 2025
a7a129f
enhance diff logic
MrRishabhJain Mar 5, 2025
bfb1a25
refactor
MrRishabhJain Mar 5, 2025
21a681a
find model version
MrRishabhJain Apr 22, 2025
fc4a1fd
Added generate/import/export for diff reports
MrRishabhJain Apr 22, 2025
c7f6c6e
Refactor
MrRishabhJain Apr 22, 2025
841dee8
removed file type logic
MrRishabhJain Apr 23, 2025
03b2d1e
Added clear view functionality
MrRishabhJain Apr 23, 2025
55930d0
Added dropdown to org picker
MrRishabhJain Apr 23, 2025
404d68b
Fix report import file type parsing
MrRishabhJain Apr 23, 2025
58ddb31
Improved md report ensuring there is no cx data
MrRishabhJain Apr 23, 2025
ab0f6c7
refactor
MrRishabhJain Apr 25, 2025
de9ae55
fixed md report preview issue
MrRishabhJain Apr 25, 2025
e49e232
Merge branch 'main' into users/rishjain/metadata_diff_v1
Sep 2, 2025
1cf95b0
Add compareWithlocal to context menu
Sep 2, 2025
864d204
Add websiteId as a param
Sep 2, 2025
255081d
Handle expanded DM names
Sep 2, 2025
0b4af76
Fix for Edm sites
Sep 2, 2025
3094ee7
Show compare with local comand for inactive websites
Sep 3, 2025
f6a338c
Show diff in actions hub
Sep 4, 2025
fbf0d2b
move to bottom of AH
Sep 4, 2025
bbad960
Moved icons to context menu
Sep 4, 2025
75a749e
Hide trigger flow in menu
Sep 4, 2025
844e638
Added re-sync option
Sep 4, 2025
a07189b
Generate HTML report in place of markdown
Sep 4, 2025
6a87d47
Updated messages
Sep 4, 2025
45d7085
Tweaks to metadata diff header
Sep 4, 2025
848f52f
Added view and discard local changes
Sep 4, 2025
c4031a7
reset diff view on env change
Sep 4, 2025
c8be021
Added compare with env to power pages context menu
Sep 4, 2025
f784743
Telemetry and tests
Sep 4, 2025
e3f2c84
Telemetry enhancements
Sep 4, 2025
7e0c90a
Cleanup
Sep 4, 2025
7f5ea1b
Tests
Sep 5, 2025
2189596
Added ecs flag back
Oct 8, 2025
f67c6a8
Removed unused imports
Oct 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions loc/translations-export/vscode-powerplatform.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -1077,6 +1077,15 @@ The fifth line should be '[TRANSLATION HERE](command:powerplatform-walkthrough.s
<trans-unit id="powerpages.copilotPanel.clearConversation.title">
<source xml:lang="en">Clear Conversation</source>
</trans-unit>
<trans-unit id="microsoft.powerplatform.pages.actionsHub.compareWithLocal.title">
<source xml:lang="en">Compare with Local</source>
</trans-unit>
<trans-unit id="microsoft.powerplatform.pages.metadataDiff.login">
<source xml:lang="en">Compare your Power Pages website against a Power Pages environment to view any differences. [Learn more](https://go.microsoft.com/fwlink/?linkid=2305702).
[Get Started](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow)</source>
<note>This is a Markdown formatted string, and the formatting must persist across translations.
The second line should be '[TRANSLATION HERE](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow).', keeping brackets and the text in the parentheses unmodified</note>
</trans-unit>
<trans-unit id="powerpages.copilotPanel.title">
<source xml:lang="en">Copilot In Power Pages</source>
</trans-unit>
Expand Down Expand Up @@ -1210,6 +1219,9 @@ The second line should be '[TRANSLATION HERE](command:powerplatform-walkthrough.
<trans-unit id="microsoft-powerplatform-portals.navigation-loop.powerPagesFileExplorer.title">
<source xml:lang="en">POWER PAGES ACTIONS</source>
</trans-unit>
<trans-unit id="microsoft.powerplatform.pages.metadataDiff.title">
<source xml:lang="en">POWER PAGES METADATA COMPARATOR</source>
</trans-unit>
<trans-unit id="power-platform-activitybar.title">
<source xml:lang="en">Power Platform</source>
</trans-unit>
Expand Down
1 change: 1 addition & 0 deletions mdiff-util-test-GZVN8H/mod.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div>local & update</div>
1 change: 1 addition & 0 deletions mdiff-util-test-GZVN8H/onlyLocal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
local
1 change: 1 addition & 0 deletions mdiff-util-test-SNEPoI/siteA/mod.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div>remote & update</div>
1 change: 1 addition & 0 deletions mdiff-util-test-SNEPoI/siteA/onlyRemote.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
remote
1 change: 1 addition & 0 deletions mdiff-util-test-grYYYK/siteA/mod.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div>remote & update</div>
1 change: 1 addition & 0 deletions mdiff-util-test-grYYYK/siteA/onlyRemote.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
remote
1 change: 1 addition & 0 deletions mdiff-util-test-pjKmkH/mod.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div>local & update</div>
1 change: 1 addition & 0 deletions mdiff-util-test-pjKmkH/onlyLocal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
local
124 changes: 122 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"extends": "@istanbuljs/nyc-config-typescript",
"all": "true",
"include": [
"**/*.ts"
"**/*.ts"
],
"exclude": [
"**/*.test.ts"
Expand Down Expand Up @@ -194,6 +194,11 @@
"contents": "%microsoft.powerplatform.pages.actionsHub.login%",
"when": "!virtualWorkspace && pacCLI.authPanel.interactiveLoginSupported",
"enablement": "microsoft.powerplatform.environment.initialized && !microsoft.powerplatform.pages.actionsHub.loadingWebsites"
},
{
"view": "microsoft.powerplatform.pages.metadataDiff",
"contents": "%microsoft.powerplatform.pages.metadataDiff.login%",
"when": "!virtualWorkspace && pacCLI.authPanel.interactiveLoginSupported"
}
],
"commands": [
Expand Down Expand Up @@ -468,6 +473,10 @@
"command": "microsoft.powerplatform.pages.actionsHub.siteDetails",
"title": "%microsoft.powerplatform.pages.actionsHub.siteDetails.title%"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.compareWithLocal",
"title": "%microsoft.powerplatform.pages.actionsHub.compareWithLocal.title%"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.activeSite.downloadSite",
"title": "%microsoft.powerplatform.pages.actionsHub.activeSite.downloadSite.title%"
Expand All @@ -485,6 +494,54 @@
"category": "Power Pages",
"title": "%microsoft.powerplatform.pages.actionsHub.currentActiveSite.runCodeQLScreening.title%",
"when": "microsoft.powerplatform.pages.codeQlScanEnabled"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.triggerFlow",
"title": "Compare with Environment",
"category": "Power Pages Metadata Diff",
"icon": "$(cloud-download)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.generateReport",
"title": "Generate HTML Report",
"category": "Power Pages Metadata Diff",
"icon": "$(markdown)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.resync",
"title": "Re-sync",
"category": "Power Pages Metadata Diff",
"icon": "$(refresh)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.clearView",
"title": "Clear View",
"category": "Power Pages Metadata Diff",
"icon": "$(clear-all)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.exportReport",
"title": "Export Comparison View",
"category": "Power Pages Metadata Diff",
"icon": "$(save-as)"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.importReport",
"title": "Import Comparison View",
"category": "Power Pages Metadata Diff",
"icon": "$(folder-opened)"
},
{
"command": "metadataDiff.openComparison",
"title": "Open Comparison",
"category": "Power Pages Metadata Diff",
"icon": "$(diff)"
},
{
"command": "metadataDiff.discardLocalChanges",
"title": "Discard Local Changes",
"category": "Power Pages Metadata Diff",
"icon": "$(discard)"
}
],
"configuration": {
Expand Down Expand Up @@ -761,6 +818,10 @@
"command": "microsoft-powerapps-portals.webfile",
"group": "1_powerpages@5"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.triggerFlow",
"group": "1_powerpages@6"
},
{
"command": "microsoft-powerapps-portals.webtemplate",
"group": "1_powerpages@3"
Expand Down Expand Up @@ -979,6 +1040,10 @@
"command": "microsoft.powerplatform.pages.actionsHub.siteDetails",
"when": "never"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.compareWithLocal",
"when": "never"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.activeSite.downloadSite",
"when": "never"
Expand Down Expand Up @@ -1017,7 +1082,7 @@
"command": "powerpages.copilot.clearConversation",
"when": "view == powerpages.copilot",
"group": "navigation"
}
}
],
"view/item/context": [
{
Expand All @@ -1030,6 +1095,56 @@
"when": "!virtualWorkspace && view == pacCLI.authPanel",
"group": "inline"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.generateReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@1"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.triggerFlow",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@2"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.resync",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@3"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.clearView",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@4"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.exportReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@5"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.importReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffRoot && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@6"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.exportReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffItem && microsoft.powerplatform.pages.metadataDiffEnabled && microsoft.powerplatform.pages.metadataDiff.hasData",
"group": "metadataDiff@5"
},
{
"command": "microsoft.powerplatform.pages.metadataDiff.importReport",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffItem && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiff@6"
},
{
"command": "metadataDiff.openComparison",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffFileModified && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiffFile@1"
},
{
"command": "metadataDiff.discardLocalChanges",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == metadataDiffFileModified && microsoft.powerplatform.pages.metadataDiffEnabled",
"group": "metadataDiffFile@2"
},
{
"command": "pacCLI.authPanel.nameAuthProfile",
"when": "!virtualWorkspace && view == pacCLI.authPanel"
Expand Down Expand Up @@ -1167,6 +1282,11 @@
"command": "microsoft.powerplatform.pages.actionsHub.currentActiveSite.runCodeQLScreening",
"when": "view == microsoft.powerplatform.pages.actionsHub && viewItem == currentActiveSite && microsoft.powerplatform.pages.codeQlScanEnabled",
"group": "siteAction@7"
},
{
"command": "microsoft.powerplatform.pages.actionsHub.compareWithLocal",
"when": "view == microsoft.powerplatform.pages.actionsHub && (viewItem == currentActiveSite || viewItem == nonCurrentActiveSite || viewItem == inactiveSite)",
"group": "siteAction@9"
}
]
},
Expand Down
11 changes: 10 additions & 1 deletion package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
"microsoft.powerplatform.pages.actionsHub.switchEnvironment.title": "Change Environment",
"microsoft.powerplatform.pages.actionsHub.showEnvironmentDetails.title": "Show Environment Details",
"microsoft.powerplatform.pages.actionsHub.openSitesInStudio.title": "Open in Power Pages Studio",
"microsoft.powerplatform.pages.actionsHub.compareWithLocal.title": "Compare with Local",
"microsoft.powerplatform.pages.actionsHub.activeSite.previewSite.title": "Preview",
"microsoft.powerplatform.pages.actionsHub.login":{
"message": "Login and connect to a Power Pages environment to use Power Pages actions. [Learn more](https://go.microsoft.com/fwlink/?linkid=2305702).\n[Login](command:microsoft.powerplatform.pages.actionsHub.newAuthProfile)",
Expand All @@ -116,5 +117,13 @@
"microsoft.powerplatform.pages.actionsHub.activeSite.openInStudio.title": "Open in Power Pages Studio",
"microsoft.powerplatform.pages.actionsHub.inactiveSite.reactivateSite.title": "Reactivate Site",
"microsoft.powerplatform.pages.actionsHub.currentActiveSite.runCodeQLScreening.title": "Run CodeQL Screening",
"microsoft.powerplatform.pages.actionsHub.configuration.downloadSite.description": "The folder where site will be downloaded when using Power Pages Actions. Leave this empty to ask for a folder every time you download a site."
"microsoft.powerplatform.pages.actionsHub.configuration.downloadSite.description": "The folder where site will be downloaded when using Power Pages Actions. Leave this empty to ask for a folder every time you download a site.",
"microsoft.powerplatform.pages.metadataDiff.title": "POWER PAGES METADATA COMPARATOR",
"microsoft.powerplatform.pages.metadataDiff.login":{
"message": "Compare your Power Pages website against a Power Pages environment to view any differences. [Learn more](https://go.microsoft.com/fwlink/?linkid=2305702).\n[Get Started](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow)",
"comment": [
"This is a Markdown formatted string, and the formatting must persist across translations.",
"The second line should be '[TRANSLATION HERE](command:microsoft.powerplatform.pages.metadataDiff.triggerFlow).', keeping brackets and the text in the parentheses unmodified"
]
}
}
16 changes: 16 additions & 0 deletions src/client/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import { PROVIDER_ID } from "../common/services/Constants";
import { activateServerApiAutocomplete } from "../common/intellisense";
import { EnableServerLogicChanges } from "../common/ecs-features/ecsFeatureGates";
import { setServerApiTelemetryContext } from "../common/intellisense/ServerApiTelemetryContext";
import { MetadataDiffDesktop } from "./power-pages/metadata-diff/MetadataDiffDesktop";

let client: LanguageClient;
let _context: vscode.ExtensionContext;
Expand Down Expand Up @@ -281,6 +282,21 @@ export async function activate(
ActionsHub.initialize(context, pacTerminal)
]);

// Initialize Metadata Diff after ActionsHub so that its root node can attach; gated by ECS
try {
// Dynamic import to avoid circular reference at top-level during tests
const { EnableMetadataDiff } = await import("../common/ecs-features/ecsFeatureGates");
const { enableMetadataDiff } = ECSFeaturesClient.getConfig(EnableMetadataDiff);
if (enableMetadataDiff) {
await MetadataDiffDesktop.initialize(context, pacTerminal);
} else {
vscode.commands.executeCommand("setContext", "microsoft.powerplatform.pages.metadataDiffEnabled", false);
}
} catch (e) {
// Non-blocking – log minimal telemetry; avoid failing activation
oneDSLoggerWrapper.getLogger().traceError("MetadataDiffInitSkipped", (e as Error).message, e as Error);
}

vscode.commands.executeCommand('setContext', 'microsoft.powerplatform.environment.initialized', true);
}),

Expand Down
8 changes: 8 additions & 0 deletions src/client/pac/PacTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ export type OrgListOutput = {

export type PacOrgListOutput = PacOutputWithResultList<OrgListOutput>;

export type PagesList = {
FriendlyName: string,
WebsiteId: string,
ModelVersion: string
}

export type PacPagesListOutput = PacOutputWithResultList<PagesList>;

export type ActiveOrgOutput = {
OrgId: string,
UniqueName: string,
Expand Down
10 changes: 9 additions & 1 deletion src/client/pac/PacWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import * as readline from "readline";
import * as fs from "fs-extra";
import { ChildProcessWithoutNullStreams, spawn } from "child_process";
import { BlockingQueue } from "../../common/utilities/BlockingQueue";
import { PacOutput, PacAdminListOutput, PacAuthListOutput, PacSolutionListOutput, PacOrgListOutput, PacOrgWhoOutput, PacAuthWhoOutput } from "./PacTypes";
import { PacOutput, PacAdminListOutput, PacAuthListOutput, PacSolutionListOutput, PacOrgListOutput, PacOrgWhoOutput, PacAuthWhoOutput, PacPagesListOutput} from "./PacTypes";
import { v4 } from "uuid";
import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper";

Expand Down Expand Up @@ -188,6 +188,14 @@ export class PacWrapper {
return this.executeCommandAndParseResults<PacOutput>(new PacArguments("pages", "download", "-p", downloadPath, "-id", websiteId, "-mv", dataModelVersion.toString()));
}

public async pagesDownload(path: string, websiteId: string, modelVersion: string): Promise<PacOutput> {
return this.executeCommandAndParseResults<PacOutput>(new PacArguments("pages", "download", "-p", path, "-id", websiteId, "-mv", modelVersion));
}

public async pagesList(): Promise<PacPagesListOutput> {
return this.executeCommandAndParseResults<PacPagesListOutput>(new PacArguments("pages", "list", "--verbose"));
}

public exit(): void {
this.pacInterop.exit();
}
Expand Down
28 changes: 28 additions & 0 deletions src/client/power-pages/actions-hub/ActionsHubCommandHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,34 @@ export const showSiteDetails = async (siteTreeItem: SiteTreeItem) => {
}
}

export const compareWithLocal = async (siteTreeItem: SiteTreeItem) => {
const siteInfo = siteTreeItem.siteInfo;

traceInfo(
Constants.EventNames.ACTIONS_HUB_COMPARE_WITH_LOCAL_CALLED,
{
methodName: compareWithLocal.name,
siteId: siteInfo.websiteId,
dataModelVersion: siteInfo.dataModelVersion
}
);

try {
// Execute the compare with local command with specific website ID
await vscode.commands.executeCommand('microsoft.powerplatform.pages.metadataDiff.triggerFlowWithSite', siteInfo.websiteId);
} catch (error) {
traceError(
Constants.EventNames.ACTIONS_HUB_COMPARE_WITH_LOCAL_FAILED,
error as Error,
{
methodName: compareWithLocal.name,
siteId: siteInfo.websiteId,
dataModelVersion: siteInfo.dataModelVersion
}
);
}
}

const getDownloadFolderOptions = () => {
const options = [
{
Expand Down
Loading