UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

129 lines (128 loc) 6.51 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CheckVanillaDuplicatesInfoGeneratorTest = void 0; const ProjectInfoItem_1 = __importDefault(require("../ProjectInfoItem")); const IInfoItemData_1 = require("../IInfoItemData"); const Database_1 = __importDefault(require("../../minecraft/Database")); var CheckVanillaDuplicatesInfoGeneratorTest; (function (CheckVanillaDuplicatesInfoGeneratorTest) { CheckVanillaDuplicatesInfoGeneratorTest[CheckVanillaDuplicatesInfoGeneratorTest["completeVanillaCopy"] = 101] = "completeVanillaCopy"; CheckVanillaDuplicatesInfoGeneratorTest[CheckVanillaDuplicatesInfoGeneratorTest["partialVanillaCopy"] = 102] = "partialVanillaCopy"; })(CheckVanillaDuplicatesInfoGeneratorTest || (exports.CheckVanillaDuplicatesInfoGeneratorTest = CheckVanillaDuplicatesInfoGeneratorTest = {})); // Files that are allowed to be complete copies of vanilla const ALLOWLISTED_FILES = ["texts/languages.json"]; // Files that are restricted from being partial copies const RESTRICTED_FILES = [ "/ui/", "/materials/", "models/mobs.json", "sounds/sound_definitions.json", "textures/item_texture.json", "textures/terrain_texture.json", "blocks.json", ]; // Extensions to check for partial copies const EXTENSIONS = [".json", ".material"]; // Message suffix matching C# implementation const RESOURCE_PACK_SUFFIX = "Vanilla files can be seen at https://aka.ms/resourcepacktemplate."; /*********** * Generator for Checking Vanilla Duplicates * * Will check: * * Complete copies of vanilla files * * Partial copies of vanilla files (for restricted files) * * @see {@link ../../../public/data/forms/mctoolsval/vandupes.form.json} for topic definitions */ class CheckVanillaDuplicatesInfoGenerator { id = "VANDUPES"; title = "Vanilla Duplicates"; summarize(info, infoSet) { info.completeVanillaCopy = infoSet.getSummedDataValue(this.id, CheckVanillaDuplicatesInfoGeneratorTest.completeVanillaCopy); info.partialVanillaCopy = infoSet.getSummedDataValue(this.id, CheckVanillaDuplicatesInfoGeneratorTest.partialVanillaCopy); } async generate(project, contentIndex) { const items = []; // Get the hash catalog from the content index const hashCatalog = contentIndex.hashCatalog; // Load vanilla hash catalog for comparison await Database_1.default.loadReleaseVanillaInfoHashes(); const projItems = project.getItemsCopy(); for (const item of projItems) { const itemPath = item.projectPath || ""; if (ALLOWLISTED_FILES.some((allowedFile) => itemPath.includes(allowedFile))) { continue; } await item.ensureStorage(); if (!item.primaryFile) { continue; } // Find hashes for this file in the catalog const fileHashes = Object.entries(hashCatalog).filter(([hash, details]) => details.filePath === item.projectPath); // Check for complete copy of vanilla file (file with empty propertyName) const completeFileHash = fileHashes.find(([hash, details]) => details.propertyName === ""); if (completeFileHash) { const completeHashResult = await this.checkCompleteVanillaCopy(completeFileHash[0], item); if (completeHashResult) { items.push(completeHashResult); continue; } } // Check for partial copies (properties with non-empty propertyName) if (this.isRestrictedFile(itemPath) && this.hasRestrictedExtension(item.primaryFile.fullPath)) { const propertyHashes = fileHashes.filter(([hash, details]) => details.propertyName !== ""); const partialHashResults = await this.checkPartialVanillaCopy(propertyHashes, item); items.push(...partialHashResults); } } return items; } isRestrictedFile(filePath) { return RESTRICTED_FILES.some((restrictedFile) => filePath.includes(restrictedFile)); } hasRestrictedExtension(filePath) { // Extract file extension from path const extension = "." + filePath.split(".").pop()?.toLowerCase() || ""; return EXTENSIONS.includes(extension); } async checkCompleteVanillaCopy(fileHash, item) { // Check if this hash exists in the vanilla hash catalog if (!Database_1.default.releaseVanillaContentHashes) { return null; } const vanillaDetails = Database_1.default.releaseVanillaContentHashes[fileHash]; if (vanillaDetails && vanillaDetails.propertyName === "") { // This is a complete file match return new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.warning, this.id, CheckVanillaDuplicatesInfoGeneratorTest.completeVanillaCopy, `Complete copy of a vanilla file [${vanillaDetails.fileName}]. ${RESOURCE_PACK_SUFFIX}`, item, item.name); } return null; } async checkPartialVanillaCopy(propertyHashes, item) { const results = []; if (!Database_1.default.releaseVanillaContentHashes) { return results; } try { // Check each property hash from the catalog for (const [hash, details] of propertyHashes) { // Check if this property hash exists in the vanilla hash catalog const vanillaDetails = Database_1.default.releaseVanillaContentHashes[hash]; if (vanillaDetails && vanillaDetails.propertyName !== "" && item.name.toLowerCase() === vanillaDetails.fileName.toLowerCase()) { results.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.warning, this.id, CheckVanillaDuplicatesInfoGeneratorTest.partialVanillaCopy, `Partial copy of a vanilla file [${item.name}] at property [${details.propertyName}]. ${RESOURCE_PACK_SUFFIX}`, item, details.propertyName)); } } } catch (error) { console.error("Error checking partial vanilla copy:", error); } return results; } } exports.default = CheckVanillaDuplicatesInfoGenerator;