UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

63 lines (62 loc) 3.25 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const TestDefinition_1 = require("../tests/TestDefinition"); const ProjectItemUtilities_1 = require("../../app/ProjectItemUtilities"); const ForbiddenFiles_1 = require("./data/ForbiddenFiles"); const StorageUtilities_1 = __importDefault(require("../../storage/StorageUtilities")); var ForbiddenTest; (function (ForbiddenTest) { ForbiddenTest["FailedToReadFile"] = "FailedToReadFile"; ForbiddenTest["ExtNotInAllowList"] = "ExtNotInAllowList"; ForbiddenTest["InvalidFileName"] = "InvalidFileName"; ForbiddenTest["ContainsInvalidCharacter"] = "ContainsInvalidCharacter"; })(ForbiddenTest || (ForbiddenTest = {})); const ForbiddenTests = { FailedToReadFile: { id: 101, title: "Failed To Read File" }, ExtNotInAllowList: { id: 102, title: "File Does Not Have Allowed Extension" }, InvalidFileName: { id: 103, title: "File Name Is Blocked" }, ContainsInvalidCharacter: { id: 104, title: "File Name Contains Invalid Character" }, }; /** * Validates files against forbidden file lists and allowed extensions. * * @see {@link ../../../public/data/forms/mctoolsval/forbfile.form.json} for topic definitions */ class CheckForbiddenFilesGenerator { id = "FORBFILE"; title = "Forbidden Files"; canAlwaysProcess = true; async generate(project) { const packs = project.packs.map((pack) => [pack.getPackItems(), pack.packType]); const templates = (0, ProjectItemUtilities_1.getWorldTemplates)(project.items).map((template) => [template.items, "WorldTemplate"]); const packages = [...packs, ...templates]; const results = await Promise.all(packages.map(([items, type]) => this.validateItemPackage(items, type))); return results.flat(); } async validateItemPackage(items, type) { // I'm avoiding reading ("ensuring") the whole file, we just need the path, we do need to extract the extension though const files = items.map((item) => [item, "." + StorageUtilities_1.default.getTypeFromName(item.name)]); const fileResults = files.flatMap(([item, ext]) => this.resultsForFile(type, item, ext)); return fileResults; } resultsForFile(type, item, ext) { const results = []; const allowedExts = ForbiddenFiles_1.AllowedExtensionsByType[type]; const isFolder = item.projectPath?.endsWith("/"); if (!isFolder && allowedExts !== "*" && !allowedExts.has(ext)) { results.push((0, TestDefinition_1.resultFromTest)(ForbiddenTests.ExtNotInAllowList, { id: this.id, item, data: ext })); } if (ForbiddenFiles_1.BlockedFilesByType[type].has(item.name)) { results.push((0, TestDefinition_1.resultFromTest)(ForbiddenTests.InvalidFileName, { id: this.id, item })); } if (item.projectPath?.includes("$")) { results.push((0, TestDefinition_1.resultFromTest)(ForbiddenTests.ContainsInvalidCharacter, { id: this.id, item })); } return results; } summarize() { } } exports.default = CheckForbiddenFilesGenerator;