@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
627 lines (626 loc) • 72.3 kB
JavaScript
"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) {