UNPKG

powerplatform-review-tool

Version:

Evaluate Power Platform solution zip files based on best practice patterns

103 lines (102 loc) 4.95 kB
"use strict"; 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); } } }