UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

627 lines (626 loc) 72.3 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 }); const Log_1 = __importDefault(require("../core/Log")); const Utilities_1 = __importDefault(require("../core/Utilities")); const SemanticVersion_1 = __importDefault(require("../core/versioning/SemanticVersion")); const BehaviorManifestDefinition_1 = __importDefault(require("../minecraft/BehaviorManifestDefinition")); const DesignManifestDefinition_1 = __importDefault(require("../minecraft/DesignManifestDefinition")); const MinecraftUtilities_1 = __importDefault(require("../minecraft/MinecraftUtilities")); const Pack_1 = require("../minecraft/Pack"); const ResourceManifestDefinition_1 = __importDefault(require("../minecraft/ResourceManifestDefinition")); const SkinManifestDefinition_1 = __importDefault(require("../minecraft/SkinManifestDefinition")); const StorageUtilities_1 = __importDefault(require("../storage/StorageUtilities")); const IProjectData_1 = require("./IProjectData"); const IProjectItemData_1 = require("./IProjectItemData"); const Project_1 = require("./Project"); const ProjectUtilities_1 = __importDefault(require("./ProjectUtilities")); class ProjectItemInference { static async inferProjectItemsFromFolder(project, folder, fileSystemPrefix, folderContext, variantLabel, isInWorld, rootFolder, depth, source, force, processingCallback) { if (project.projectFolder === null || (folder.name.startsWith(".") && !folder.name.startsWith(".vscode") && !folder.name.startsWith(".mct"))) { Log_1.default.debugAlert("Could not process folder: " + folder.storageRelativePath); return; } if (processingCallback) { processingCallback("Scanning '" + folder.storageRelativePath + "' for Minecraft project items."); } await folder.load(force ? force : false); let parentFolder = folder.parentFolder; if (parentFolder === project.projectFolder.parentFolder) { parentFolder = null; } const folderPathCanon = StorageUtilities_1.default.canonicalizePath(StorageUtilities_1.default.getFolderPath(folder.storageRelativePath)); // if we're inside of an MCPack or zip, the folder is "/" but the name of the mcpack file potentially // provides hints, so scoop out the name of the parent zip let basePathName = folderPathCanon; if (basePathName === "/" && folder.extendedPath.length > 1) { basePathName = StorageUtilities_1.default.getAvailableFolderName(folder); } const parentIsPacksRoot = parentFolder !== null && parentFolder.name.indexOf("_packs") >= 0 && (folderContext === Project_1.FolderContext.behaviorPack || folderContext === Project_1.FolderContext.resourcePack || folderContext === Project_1.FolderContext.skinPack); const lastUnderscore = folder.storageRelativePath.lastIndexOf("_"); if (!variantLabel && lastUnderscore >= 0 && parentIsPacksRoot) { // vanilla stores folders like: // chemistry // chemistry_1.20.50 // chemistry_1.20.60 // unify version variants with their parent let potentialVersionSection = folder.storageRelativePath.substring(lastUnderscore + 1); if (potentialVersionSection.endsWith("/")) { potentialVersionSection = potentialVersionSection.substring(0, potentialVersionSection.length - 1); } if (Utilities_1.default.isNumericIsh(potentialVersionSection) && potentialVersionSection.indexOf(".") > 0) { variantLabel = potentialVersionSection; } } if (folderPathCanon.indexOf("/checkpoint_input") >= 0 || folderPathCanon.indexOf("/metadata") >= 0 || folderPathCanon.indexOf("/type_definitions") >= 0 || folderPathCanon.indexOf("/typedefs") >= 0 || folderPathCanon.indexOf("/script_modules/") >= 0 || folderPathCanon.indexOf("/vanilladata_modules/") >= 0 || folderPathCanon.indexOf("/engine_modules/") >= 0 || folderPathCanon.indexOf("/command_modules/") >= 0) { folderContext = Project_1.FolderContext.typeDefs; } else if (folderPathCanon.indexOf("/data/") >= 0 || folderPathCanon.indexOf("/forms/") >= 0) { folderContext = Project_1.FolderContext.metaData; } else if (folderPathCanon.indexOf("/.vscode") >= 0) { folderContext = Project_1.FolderContext.vscodeFolder; } else if (folderPathCanon.indexOf("/.mct") >= 0) { folderContext = Project_1.FolderContext.mctoolsWorkingFolder; } else if (MinecraftUtilities_1.default.pathLooksLikeBehaviorPackName(basePathName)) { folderContext = Project_1.FolderContext.behaviorPack; } else if (MinecraftUtilities_1.default.pathLooksLikeDesignPackName(basePathName)) { folderContext = Project_1.FolderContext.designPack; } else if (MinecraftUtilities_1.default.pathLooksLikeSubPacksFolderName(basePathName)) { // note this check must be above the .resourcePack check folderContext = Project_1.FolderContext.resourcePackSubPack; } else if (MinecraftUtilities_1.default.pathLooksLikeResourcePackName(basePathName)) { folderContext = Project_1.FolderContext.resourcePack; } else if (MinecraftUtilities_1.default.pathLooksLikeSkinPackName(basePathName) && folderContext === Project_1.FolderContext.unknown) { folderContext = Project_1.FolderContext.skinPack; } else if (MinecraftUtilities_1.default.pathLooksLikePersonaPackName(basePathName) && folderContext === Project_1.FolderContext.unknown) { folderContext = Project_1.FolderContext.persona; } else if (MinecraftUtilities_1.default.pathLooksLikeWorldFolderName(basePathName) && folderContext === Project_1.FolderContext.unknown) { folderContext = Project_1.FolderContext.world; isInWorld = true; } else if ((folderPathCanon.indexOf("/docs/") >= 0 || folderPathCanon.indexOf("/@minecraft/") >= 0 || folderPathCanon.indexOf("/mojang-commands") >= 0) && folderContext === Project_1.FolderContext.unknown) { folderContext = Project_1.FolderContext.docs; if (project.docsContainer === null) { project.docsContainer = folder.parentFolder; } } if (folderContext === Project_1.FolderContext.unknown && (folder.files["manifest.json"] || folder.files["pack_manifest.json"]) && folder.files["skins.json"]) { folderContext = Project_1.FolderContext.skinPack; } if (folderContext === Project_1.FolderContext.unknown && (folder.files["manifest.json"] || folder.files["pack_manifest.json"]) && !folder.files["level.dat"] && !folder.files["levelname.txt"]) { for (const folderName in folder.folders) { if (folderName) { if (folderName.toLowerCase() === "persona" || folderName.toLowerCase().startsWith("persona_")) { folderContext = Project_1.FolderContext.persona; } } } } if (folderContext === Project_1.FolderContext.unknown && (folder.files["manifest.json"] || folder.files["pack_manifest.json"]) && !folder.files["level.dat"] && !folder.files["levelname.txt"]) { if (folder.folders["models"] || folder.folders["textures"] || folder.folders["lighting"] || folder.folders["subpacks"] || folder.folders["assets"] || folder.folders["sounds"] || folder.folders["texture_sets"] || folder.folders["sounds"] || folder.folders["ui"]) { folderContext = Project_1.FolderContext.resourcePack; } else if (folder.folders["scripts"] || folder.folders["features"] || folder.folders["entities"] || folder.folders["loot_tables"] || folder.folders["spawn_rules"] || folder.folders["functions"] || folder.folders["structures"] || folder.folders["recipes"] || folder.folders["trading"] || folder.folders["feature_rules"] || MinecraftUtilities_1.default.pathLooksLikeBehaviorPackName(basePathName)) { folderContext = Project_1.FolderContext.behaviorPack; } else if (MinecraftUtilities_1.default.pathLooksLikeResourcePackName(basePathName)) { folderContext = Project_1.FolderContext.resourcePack; } else if (MinecraftUtilities_1.default.pathLooksLikeDesignPackName(basePathName)) { folderContext = Project_1.FolderContext.designPack; } else { const manifestFile = folder.files["manifest.json"]; if (manifestFile) { if (!manifestFile?.isContentLoaded) { await manifestFile?.loadContent(); } const obj = StorageUtilities_1.default.getJsonObject(manifestFile); if (obj) { let modules = obj["modules"]; if (modules) { for (const module of modules) { if (module.type === "resources") { folderContext = Project_1.FolderContext.resourcePack; } else if (module.type === "script") { folderContext = Project_1.FolderContext.behaviorPack; } } } } } } } if (folder.files["world_behavior_packs.json"] || folder.files["world_resource_packs.json"] || folder.files["levelname.txt"]) { if (folderContext === Project_1.FolderContext.unknown) { folderContext = Project_1.FolderContext.world; } if (folder.parentFolder && !project.worldContainer) { project.worldContainer = folder.parentFolder; } } for (const fileName in folder.files) { const canonFileName = StorageUtilities_1.default.canonicalizeName(fileName); // console.log("Considering " + canonFileName + " in folder " + folder.storageRelativePath); if (canonFileName !== "gulpfile.js" && canonFileName !== "package-lock.json") { const candidateFile = folder.files[fileName]; if (candidateFile !== undefined) { let pi = null; let projectPath = undefined; if (fileSystemPrefix.length > 0) { projectPath = fileSystemPrefix + candidateFile.fullPath; pi = project.getItemByProjectPath(projectPath); } else { const frPath = candidateFile.getFolderRelativePath(rootFolder); if (frPath !== undefined) { projectPath = StorageUtilities_1.default.canonicalizePath(frPath); pi = project.getItemByProjectPath(projectPath); } } if ((pi === undefined || pi === null) && projectPath !== undefined) { const fileExtension = candidateFile.type ? candidateFile.type.toLowerCase() : candidateFile.type; const baseName = StorageUtilities_1.default.getBaseFromName(candidateFile.name); const folderPath = StorageUtilities_1.default.canonicalizePath(StorageUtilities_1.default.getFolderPath(projectPath)); const folderPathLower = folderPath.toLowerCase(); const projectPathLower = projectPath.toLowerCase(); const isResourcePack = folderContext === Project_1.FolderContext.resourcePack || folderContext === Project_1.FolderContext.resourcePackSubPack; if (canonFileName === "manifest.json" || canonFileName === "pack_manifest.json") { if (folderContext === Project_1.FolderContext.world) { project.defaultWorldFolder = folder; project.worldContainer = parentFolder; } if (!candidateFile.isContentLoaded) { await candidateFile.loadContent(false); } let newPiType = IProjectItemData_1.ProjectItemType.unknown; let tag = ""; if (folderContext === Project_1.FolderContext.behaviorPack) { newPiType = IProjectItemData_1.ProjectItemType.behaviorPackManifestJson; tag = "behaviorpackmanifest"; } else if (folderContext === Project_1.FolderContext.resourcePack) { newPiType = IProjectItemData_1.ProjectItemType.resourcePackManifestJson; tag = "resourcepackmanifest"; } else if (folderContext === Project_1.FolderContext.designPack) { newPiType = IProjectItemData_1.ProjectItemType.designPackManifestJson; tag = "designpackmanifest"; } else if (folderContext === Project_1.FolderContext.skinPack) { newPiType = IProjectItemData_1.ProjectItemType.skinPackManifestJson; tag = "skinpackmanifest"; } else if (folderContext === Project_1.FolderContext.persona) { newPiType = IProjectItemData_1.ProjectItemType.personaManifestJson; tag = "personapackmanifest"; } else if (folderContext === Project_1.FolderContext.world) { newPiType = IProjectItemData_1.ProjectItemType.worldTemplateManifestJson; tag = "worldtemplatemanifest"; } if (candidateFile.content !== undefined && candidateFile.content !== "" && !variantLabel && typeof candidateFile.content === "string") { if (newPiType === IProjectItemData_1.ProjectItemType.behaviorPackManifestJson) { const bpManifest = await BehaviorManifestDefinition_1.default.ensureOnFile(candidateFile); if (bpManifest && bpManifest.id) { project.defaultBehaviorPackUniqueId = bpManifest.id; if (bpManifest.name && !Utilities_1.default.isLikelyLocalizationKey(bpManifest.name)) { project.title = bpManifest.name; } if (bpManifest.description && !Utilities_1.default.isLikelyLocalizationKey(bpManifest.description)) { project.description = bpManifest.description; } if (bpManifest.version) { const sv = SemanticVersion_1.default.from(bpManifest.version); if (sv) { project.defaultBehaviorPackVersion = sv.asArray(); if (project.defaultBehaviorPackVersion !== undefined && project.defaultBehaviorPackVersion.length >= 3) { project.versionMajor = project.defaultBehaviorPackVersion[0]; project.versionMinor = project.defaultBehaviorPackVersion[1]; project.versionPatch = project.defaultBehaviorPackVersion[2]; } } } project.defaultBehaviorPackFolder = folder; project.behaviorPacksContainer = parentFolder; const scriptModuleId = bpManifest.getScriptModule()?.uuid; if (scriptModuleId) { project.defaultScriptModuleUniqueId = scriptModuleId; } project.ensurePackByFolder(folder, Pack_1.PackType.behavior, isInWorld); } } else if (newPiType === IProjectItemData_1.ProjectItemType.resourcePackManifestJson) { const rpManifest = await ResourceManifestDefinition_1.default.ensureOnFile(candidateFile); if (rpManifest && rpManifest.id) { project.defaultResourcePackUniqueId = rpManifest.id; if (rpManifest.name && !Utilities_1.default.isLikelyLocalizationKey(rpManifest.name)) { project.title = rpManifest.name; } if (rpManifest.description && !Utilities_1.default.isLikelyLocalizationKey(rpManifest.description)) { project.description = rpManifest.description; } if (rpManifest.version) { const sv = SemanticVersion_1.default.from(rpManifest.version); if (sv) { project.defaultResourcePackVersion = sv.asArray(); if (project.defaultResourcePackVersion !== undefined && project.defaultResourcePackVersion.length >= 3) { project.versionMajor = project.defaultResourcePackVersion[0]; project.versionMinor = project.defaultResourcePackVersion[1]; project.versionPatch = project.defaultResourcePackVersion[2]; } } } project.defaultResourcePackFolder = folder; project.resourcePacksContainer = parentFolder; const subpacks = rpManifest.subpacks; if (subpacks) { for (const subpack of subpacks) { if (subpack.folder_name) { const pv = project.ensureVariant(subpack.folder_name); if (subpack.memory_performance_tier !== undefined) { pv.memoryPerformanceTier = subpack.memory_performance_tier; } if (subpack.memory_tier !== undefined) { pv.memoryTier = subpack.memory_tier; } if (subpack.name) { pv.title = subpack.name; } } } } project.ensurePackByFolder(folder, Pack_1.PackType.resource, isInWorld); } } else if (newPiType === IProjectItemData_1.ProjectItemType.skinPackManifestJson) { const spManifest = await SkinManifestDefinition_1.default.ensureOnFile(candidateFile); if (spManifest) { if (spManifest.name && !Utilities_1.default.isLikelyLocalizationKey(spManifest.name)) { project.title = spManifest.name; } if (spManifest.description && !Utilities_1.default.isLikelyLocalizationKey(spManifest.description)) { project.description = spManifest.description; } project.defaultSkinPackFolder = folder; project.skinPacksContainer = parentFolder; project.ensurePackByFolder(folder, Pack_1.PackType.skin, isInWorld); } } else if (newPiType === IProjectItemData_1.ProjectItemType.designPackManifestJson) { const dpManifest = await DesignManifestDefinition_1.default.ensureOnFile(candidateFile); if (dpManifest) { if (dpManifest.name && !Utilities_1.default.isLikelyLocalizationKey(dpManifest.name)) { project.title = dpManifest.name; } if (dpManifest.description && !Utilities_1.default.isLikelyLocalizationKey(dpManifest.description)) { project.description = dpManifest.description; } project.defaultDesignPackFolder = folder; project.designPacksContainer = parentFolder; project.ensurePackByFolder(folder, Pack_1.PackType.design, isInWorld); } } } // Log.assert(newPiType !== ProjectItemType.unknown, "Unknown manifest.json file found."); project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, newPiType, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, tag, isInWorld); } else if (projectPathLower.endsWith("/scripts/index.js")) { if (!candidateFile.isContentLoaded) { await candidateFile.loadContent(); } let creationType = IProjectItemData_1.ProjectItemCreationType.normal; if (candidateFile.content === undefined || candidateFile.content === "" || (typeof candidateFile.content === "string" && candidateFile.content.indexOf(Project_1.AUTOGENERATED_CONTENT_TOKEN) >= 0)) { creationType = IProjectItemData_1.ProjectItemCreationType.generated; } project.ensureItemByTag("jsindex", "index.js", IProjectItemData_1.ProjectItemType.catalogIndexJs, projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, creationType, candidateFile, isInWorld); } else if (projectPathLower.endsWith(".mctp.json") && folderContext === Project_1.FolderContext.mctoolsWorkingFolder) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.mcToolsProjectPreferences, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (projectPathLower.endsWith("tasks.json") && folderContext === Project_1.FolderContext.vscodeFolder) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.vsCodeTasksJson, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (projectPathLower.endsWith("launch.json") && folderContext === Project_1.FolderContext.vscodeFolder) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.vsCodeLaunchJson, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (projectPathLower.endsWith("settings.json") && folderContext === Project_1.FolderContext.vscodeFolder) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.vsCodeSettingsJson, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (projectPathLower.endsWith("extensions.json") && folderContext === Project_1.FolderContext.vscodeFolder) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.vsCodeExtensionsJson, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (projectPathLower.endsWith("/tick.json")) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.tickJson, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (projectPathLower.endsWith("/levelname.txt") || projectPathLower.endsWith("/current") || projectPathLower.endsWith("/log") || projectPathLower.endsWith("/log.old") || projectPathLower.endsWith("/lock") || projectPathLower.indexOf("/db/manifest") >= 0 || projectPathLower.indexOf("/db/lost/manifest") >= 0) { // don't explicitly create an item for constituent world files at the moment } else if (fileExtension === "ldb" || fileExtension === "log") { // don't explicitly create an item for ldb or log files at the moment. } else if (fileExtension === "mcstructure") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.structure, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "mcfunction") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.MCFunction, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "material") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.material, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "vertex") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.materialVertex, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "md") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.markdownDocumentation, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "fragment") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.materialFragment, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "fragment") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.materialFragment, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "geometry") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.materialGeometry, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (canonFileName === "level.dat" && fileSystemPrefix.indexOf(".mcworld") < 0 && // don't create a project item if we're inside of a mcworld/mctemplate since that broader item has a link already fileSystemPrefix.indexOf(".mctemplate") < 0 && folderContext !== Project_1.FolderContext.behaviorPack) { isInWorld = true; project.ensureItemByProjectPath(folderPath, IProjectItemData_1.ProjectItemStorageType.folder, candidateFile.name, IProjectItemData_1.ProjectItemType.worldFolder, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (canonFileName === "level.dat_old") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.levelDatOld, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (canonFileName.endsWith(".js.map")) { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.jsMap, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (canonFileName === "just.config.ts") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.justConfigTs, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (canonFileName === "eslint.config.mjs") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.esLintConfigMjs, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "js") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.js, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "ts") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.ts, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "mcworld") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.MCWorld, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); await project.inferProjectItemsFromZipFile(projectPath, candidateFile, force); } else if (fileExtension === "mcproject") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.MCProject, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); await project.inferProjectItemsFromZipFile(projectPath, candidateFile, force); } else if (fileExtension === "mctemplate") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.MCTemplate, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); await project.inferProjectItemsFromZipFile(projectPath, candidateFile, force); } else if (fileExtension === "mcaddon") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.MCAddon, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); await project.inferProjectItemsFromZipFile(projectPath, candidateFile, force); } else if (fileExtension === "mcpack") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.MCPack, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); await project.inferProjectItemsFromZipFile(projectPath, candidateFile, force); } else if (fileExtension === "zip") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.zip, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); await project.inferProjectItemsFromZipFile(projectPath, candidateFile, force); } else if (fileExtension === "png" || fileExtension === "jpg" || fileExtension === "gif" || fileExtension === "psd" || fileExtension === "hdr" || fileExtension === "jpeg" || fileExtension === "tga") { let imageType = IProjectItemData_1.ProjectItemType.image; if (folderPathLower.indexOf("/marketing art/") >= 0) { imageType = IProjectItemData_1.ProjectItemType.marketingAssetImage; } else if (folderPathLower.indexOf("/store art/") >= 0) { imageType = IProjectItemData_1.ProjectItemType.storeAssetImage; } else if (folderPathLower.indexOf("/textures/ui/") >= 0) { imageType = IProjectItemData_1.ProjectItemType.uiTexture; } else if (folderPathLower.indexOf("/design_textures/") >= 0) { imageType = IProjectItemData_1.ProjectItemType.designTexture; } else if (folderPathLower.indexOf("/textures/") >= 0 || folderContext === Project_1.FolderContext.skinPack) { imageType = IProjectItemData_1.ProjectItemType.texture; } else if (baseName === "pack_icon" || folder.files["manifest.json"]) { imageType = IProjectItemData_1.ProjectItemType.packIconImage; } project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, imageType, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "ogg" || fileExtension === "flac" || fileExtension === "fsb" || fileExtension === "mp3" || fileExtension === "wav") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.audio, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "env" && baseName === "") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.env, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "lang") { project.ensureItemByProjectPath(projectPath, IProjectItemData_1.ProjectItemStorageType.singleFile, candidateFile.name, IProjectItemData_1.ProjectItemType.lang, folderContext, source, IProjectItemData_1.ProjectItemCreationType.normal, candidateFile, undefined, isInWorld); } else if (fileExtension === "json") { let newJsonType = IProjectItemData_1.ProjectItemType.unknownJson; let itemName = candidateFile.name; if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/loot_tables/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.lootTableBehavior; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/dialogue/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.dialogueBehaviorJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/recipes/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.recipeBehavior; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/spawn_rules/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.spawnRuleBehavior; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/cameras/") >= 0 && folderPathLower.indexOf("aim_assist_preset") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.aimAssistPresetJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/aim_assist/categories/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.aimAssistCategoryJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/aim_assist/presets/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.aimAssistPresetJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/behavior_trees/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.behaviorTreeJson; } else if (folderPathLower.indexOf("/spawn_groups/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.spawnGroupJson; } else if (isResourcePack && folderPathLower.indexOf("/atmospherics/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.atmosphericsJson; } else if (isResourcePack && folderPathLower.indexOf("/point_lights/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.pointLightsJson; } else if (isResourcePack && folderPathLower.indexOf("/color_grading/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.colorGradingJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/cameras/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.cameraBehaviorJson; } else if (folderContext === Project_1.FolderContext.resourcePack && folderPathLower.indexOf("/cameras/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.cameraResourceJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/trading/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.tradingBehaviorJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/animation_controllers/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.animationControllerBehaviorJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/animations/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.animationBehaviorJson; } else if (isResourcePack && projectPathLower.endsWith(".texture_set.json")) { // Check for texture_set.json BEFORE /models/ check - texture_set files can exist in /models/ folders // (e.g., /textures/models/armor/chain_1.texture_set.json) newJsonType = IProjectItemData_1.ProjectItemType.textureSetJson; } else if (isResourcePack && !baseName.endsWith("index") && // Skip index.json files - they're directory indices, not geometry (folderPathLower.indexOf("/models/") >= 0 || baseName.endsWith(".geo") || baseName.endsWith(".geometry"))) { newJsonType = IProjectItemData_1.ProjectItemType.modelGeometryJson; } else if (baseName.endsWith(".mci")) { newJsonType = IProjectItemData_1.ProjectItemType.contentIndexJson; } else if (baseName.endsWith(".mcr")) { newJsonType = IProjectItemData_1.ProjectItemType.contentReportJson; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/dimension/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.dimensionJson; } else if ((folderContext === Project_1.FolderContext.behaviorPack || folderContext === Project_1.FolderContext.unknown) && folderPathLower.indexOf("/features/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.featureBehavior; } else if ((folderContext === Project_1.FolderContext.behaviorPack || folderContext === Project_1.FolderContext.unknown) && folderPathLower.indexOf("/feature_rules/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.featureRuleBehavior; } else if (folderContext === Project_1.FolderContext.behaviorPack && folderPathLower.indexOf("/shapes/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.voxelShapeBehavior; } else if (isResourcePack && folderPathLower.indexOf("/animation_controllers/") >= 0) { newJsonType = IProjectItemData_1.ProjectItemType.animationControllerResourceJson; } else if (isResourcePack && folderPathLower.indexOf("/animations/") >= 0) {