UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

242 lines (240 loc) 11.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Log_1 = require("../core/Log"); const ClUtils_1 = require("./ClUtils"); const StorageUtilities_1 = require("../storage/StorageUtilities"); const NodeStorage_1 = require("../local/NodeStorage"); const IProjectInfoData_1 = require("../info/IProjectInfoData"); const worker_1 = require("threads/worker"); const CartoApp_1 = require("../app/CartoApp"); const ProjectInfoSet_1 = require("../info/ProjectInfoSet"); const IInfoItemData_1 = require("../info/IInfoItemData"); const LocalEnvironment_1 = require("../local/LocalEnvironment"); const ProjectUtilities_1 = require("../app/ProjectUtilities"); const ZipStorage_1 = require("../storage/ZipStorage"); let carto; let localEnv; let outputStorage; let outputStoragePath; let activeContext; async function executeTask(task) { if (!task.project) { Log_1.default.error("Could not find an associated project for the associated task."); return undefined; } activeContext = task.project?.ctorProjectName; if (localEnv === undefined) { localEnv = new LocalEnvironment_1.default(true); } localEnv.displayInfo = task.displayInfo; localEnv.displayVerbose = task.displayVerbose; if (carto === undefined) { CartoApp_1.default.hostType = CartoApp_1.HostType.toolsNodejs; carto = ClUtils_1.default.getCarto(localEnv); if (carto) { carto.onStatusAdded.subscribe(ClUtils_1.default.handleStatusAdded); } } if (!localEnv || !carto) { Log_1.default.error("Could not instantiate a local environment for the associated task."); return undefined; } if (!task.outputFolder) { outputStorage = undefined; } else if (task.outputFolder !== outputStoragePath) { outputStoragePath = task.outputFolder; outputStorage = new NodeStorage_1.default(task.outputFolder, ""); } try { switch (task.task) { case ClUtils_1.TaskType.validate: return validate(carto, task.project, task.arguments["suite"], task.arguments["exclusionList"], task.arguments["outputMci"] === true, task.arguments["outputType"], task.displayInfo, task.force); } } catch (e) { return e.toString(); } return undefined; } (0, worker_1.expose)(executeTask); async function validate(carto, projectStart, suite, exclusionList, outputMci, outputType, displayInfo, force) { const project = ClUtils_1.default.createProject(carto, projectStart); project.readOnlySafety = true; let jsonFile; let jsonFileExists = false; if (outputStorage && outputType !== ClUtils_1.OutputType.noReports) { jsonFile = outputStorage.rootFolder.ensureFile(StorageUtilities_1.default.ensureFileNameIsSafe(StorageUtilities_1.default.getBaseFromName(project.containerName)) + ".mcr.json"); jsonFileExists = await jsonFile.exists(); if (jsonFileExists && !force && !displayInfo) { await jsonFile.loadContent(false); let projectInfoData = StorageUtilities_1.default.getJsonObject(jsonFile); if (projectInfoData === undefined) { jsonFileExists = false; } else { let metaState = { projectContainerName: project.containerName, projectPath: project.projectFolder?.storageRelativePath, projectName: project.name, projectTitle: project.title, infoSetData: projectInfoData, }; project.dispose(); return [metaState]; } } } if (!jsonFileExists || force || displayInfo || outputType === ClUtils_1.OutputType.noReports) { return await validateAndDisposeProject(project, outputStorage, jsonFile, suite, exclusionList, outputMci, outputType); } else { Log_1.default.message("'" + project.name + "' has already been validated; skipping. Use --force to re-validate."); } return undefined; } async function validateAndDisposeProject(project, outputStorage, mcrJsonFile, suite, exclusionList, outputMci, outputType) { Log_1.default.verbose("Validating '" + project.name + "'" + (suite ? " with suite '" + suite + "'" : "") + "."); await project.inferProjectItemsFromFiles(); let pis; let suiteInst; if (!suite && !exclusionList) { pis = project.infoSet; } else { suiteInst = ProjectInfoSet_1.default.getSuiteFromString(suite ? suite : "default"); pis = new ProjectInfoSet_1.default(project, suiteInst, exclusionList ? [exclusionList] : undefined); } await pis.generateForProject(); const pisData = pis.getDataObject(); const resultStates = []; const projectSet = { projectContainerName: project.containerName, projectPath: project.projectFolder?.storageRelativePath, projectName: project.name, projectTitle: project.title, infoSetData: pisData, suite: suiteInst, }; resultStates.push(projectSet); pis.disconnectFromProject(); if (localEnv?.displayInfo || localEnv?.displayVerbose) { let lastMessage; for (let k = 0; k < pis.items.length; k++) { const item = pis.items[k]; const message = pis.itemToString(item); if (message !== lastMessage) { if ((localEnv.displayInfo || localEnv.displayVerbose) && item.itemType !== IInfoItemData_1.InfoItemType.info && item.itemType !== IInfoItemData_1.InfoItemType.featureAggregate) { if (item.itemType === IInfoItemData_1.InfoItemType.error || item.itemType === IInfoItemData_1.InfoItemType.testCompleteFail) { Log_1.default.error(message); lastMessage = message; } else { Log_1.default.message(message); lastMessage = message; } } else if (localEnv.displayVerbose) { Log_1.default.verbose(message); lastMessage = message; } } } } try { await outputResults(projectSet, pis, "", outputStorage, mcrJsonFile, outputMci, outputType); } catch (e) { Log_1.default.error(e); } // run derivative suites if no specific suite specified if (!suite || suite === "all") { const isAddon = await ProjectUtilities_1.default.getIsAddon(project); if (isAddon) { pis = new ProjectInfoSet_1.default(project, IProjectInfoData_1.ProjectInfoSuite.cooperativeAddOn); await pis.generateForProject(); const projectSet = { projectContainerName: project.containerName, projectPath: project.projectFolder?.storageRelativePath, projectName: project.name, projectTitle: project.title, infoSetData: pis.getDataObject(), suite: IProjectInfoData_1.ProjectInfoSuite.cooperativeAddOn, }; resultStates.push(projectSet); await outputResults(projectSet, pis, "addon", outputStorage, undefined); } const shouldRunPlatformVersion = pisData.info["CWave"] !== undefined; if (shouldRunPlatformVersion) { pis = new ProjectInfoSet_1.default(project, IProjectInfoData_1.ProjectInfoSuite.currentPlatformVersions); await pis.generateForProject(); const projectSet = { projectContainerName: project.containerName, projectPath: project.projectFolder?.storageRelativePath, projectName: project.name, projectTitle: project.title, infoSetData: pis.getDataObject(), suite: IProjectInfoData_1.ProjectInfoSuite.currentPlatformVersions, }; resultStates.push(projectSet); await outputResults(projectSet, pis, "currentplatform", outputStorage, undefined); } } project.dispose(); return resultStates; } async function outputResults(projectSet, pis, fileNameModifier, outputStorage, mcrJsonFile, outputMci, outputType) { if (outputStorage) { if (outputType !== ClUtils_1.OutputType.noReports) { const reportHtmlFile = outputStorage.rootFolder.ensureFile(StorageUtilities_1.default.ensureFileNameIsSafe(StorageUtilities_1.default.getBaseFromName(projectSet.projectContainerName)) + fileNameModifier + ".report.html"); const reportContent = pis.getReportHtml(projectSet.projectName, projectSet.projectPath, undefined); reportHtmlFile.setContent(reportContent); reportHtmlFile.saveContent(); } if (outputMci) { const indexFolder = outputStorage.rootFolder.ensureFolder("mci"); await indexFolder.ensureExists(); const mciContentFile = indexFolder.ensureFile(StorageUtilities_1.default.ensureFileNameIsSafe(StorageUtilities_1.default.getBaseFromName(projectSet.projectContainerName)) + fileNameModifier + ".mci.json"); const mciContentFileZip = indexFolder.ensureFile(StorageUtilities_1.default.ensureFileNameIsSafe(StorageUtilities_1.default.getBaseFromName(projectSet.projectContainerName)) + fileNameModifier + ".mci.json.zip"); let contentStr = ""; if (outputType === ClUtils_1.OutputType.noReports) { contentStr = pis.getStrictIndexJson(projectSet.projectName, projectSet.projectPath, undefined); } else { contentStr = pis.getIndexJson(projectSet.projectName, projectSet.projectPath, undefined); } mciContentFile.setContent(contentStr); mciContentFile.saveContent(); const zs = ZipStorage_1.default.fromJsonString(contentStr); const contentBytes = await zs.generateUint8ArrayAsync(); mciContentFileZip.setContent(contentBytes); mciContentFileZip.saveContent(); } if (outputType !== ClUtils_1.OutputType.noReports) { const csvFile = outputStorage.rootFolder.ensureFile(StorageUtilities_1.default.ensureFileNameIsSafe(StorageUtilities_1.default.getBaseFromName(projectSet.projectContainerName)) + fileNameModifier + ".csv"); const pisLines = pis.getItemCsvLines(); const csvContent = ProjectInfoSet_1.default.CommonCsvHeader + "\r\n" + pisLines.join("\n"); csvFile.setContent(csvContent); csvFile.saveContent(); } if (mcrJsonFile) { if (projectSet.infoSetData.index) { projectSet.infoSetData.index = undefined; } const mcrContent = JSON.stringify(projectSet.infoSetData, null, 2); mcrJsonFile.setContent(mcrContent); mcrJsonFile.saveContent(); } } } //# sourceMappingURL=../maps/cli/TaskWorker.js.map