powerplatform-review-tool
Version:
Evaluate Power Platform solution zip files based on best practice patterns
103 lines (102 loc) • 4.95 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.startReview = startReview;
/* eslint-disable @typescript-eslint/no-explicit-any */
const jszip_1 = __importDefault(require("jszip"));
const reviewCopilotComponents_1 = require("./reviewCopilotComponents");
const reviewPowerAppsComponents_1 = require("./reviewPowerAppsComponents");
const reviewPowerAutomateComponents_1 = require("./reviewPowerAutomateComponents");
// eslint-disable-next-line sonarjs/cognitive-complexity
/** @public */
async function startReview(solutionZipFile, solutionName, webapi, patternDetails, customPromptResults) {
try {
let zipContent;
// Retrieve solution zip via ExportSolution
if (solutionName) {
const exportSolutionRequest = {
SolutionName: solutionName,
Managed: false,
getMetadata: () => ({
boundParameter: null,
parameterTypes: {
SolutionName: { typeName: "Edm.String", structuralProperty: 1 },
Managed: { typeName: "Edm.Boolean", structuralProperty: 1 },
},
operationType: 0, // Action
operationName: "ExportSolution",
}),
};
try {
const response = await webapi.execute(exportSolutionRequest);
const responseBody = await response.json();
if (responseBody?.ExportSolutionFile) {
const exportedSolution = responseBody.ExportSolutionFile;
// Decode the Base64-encoded ExportSolutionFile into a Uint8Array (binary format) for JSZip processing.
const base64ToUint8Array = (base64) => {
const binaryString = typeof atob === "function" ? atob(base64) : Buffer.from(base64, "base64").toString("binary");
return Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
};
const exportedSolutionBuffer = base64ToUint8Array(exportedSolution);
const zip = new jszip_1.default();
zipContent = await zip.loadAsync(new File([new Blob([exportedSolutionBuffer.buffer], { type: "application/zip" })], solutionName));
}
else {
console.error("No solution found or failed to export the solution.");
return;
}
}
catch (error) {
if (error instanceof Error) {
console.error("Error exporting the solution:", error.message, error.stack);
}
else {
console.error("Unknown error occurred during solution export:", error);
}
return;
}
}
else if (solutionZipFile) {
const zip = new jszip_1.default();
zipContent = await zip.loadAsync(solutionZipFile);
}
if (zipContent) {
const copilotResult = await (0, reviewCopilotComponents_1.reviewCopilotComponents)(zipContent, patternDetails, customPromptResults);
const powerAppsResult = await (0, reviewPowerAppsComponents_1.reviewPowerAppsComponents)(zipContent, patternDetails);
const powerAutomateResult = await (0, reviewPowerAutomateComponents_1.reviewPowerAutomateComponents)(zipContent, patternDetails);
// Calculate total score
let totalScore = 0;
let componentCount = 0;
// Include score only if the component count is greater than zero
if (copilotResult.totalBots > 0) {
totalScore += Number(copilotResult.totalScore.replace("%", ""));
componentCount++;
}
if (powerAppsResult.totalApps > 0) {
totalScore += Number(powerAppsResult.totalScore.replace("%", ""));
componentCount++;
}
if (powerAutomateResult.totalFlows > 0) {
totalScore += Number(powerAutomateResult.totalScore.replace("%", ""));
componentCount++;
}
const SolutionScore = componentCount > 0 ? Math.round(totalScore / componentCount).toString() + "%" : "0%";
return {
Copilot: copilotResult,
PowerApps: powerAppsResult,
PowerAutomate: powerAutomateResult,
SolutionScore,
};
}
}
catch (err) {
if (err instanceof Error) {
console.error("An error occurred during review:", err.message, err.stack);
}
else {
console.error("Unknown error during review:", err);
}
}
}