UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

371 lines (370 loc) 13.4 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 ste_events_1 = require("ste-events"); const Utilities_1 = __importDefault(require("../core/Utilities")); const StorageUtilities_1 = __importDefault(require("../storage/StorageUtilities")); const IProjectItemData_1 = require("../app/IProjectItemData"); const BehaviorManifestDefinition_1 = __importDefault(require("./BehaviorManifestDefinition")); const MinecraftUtilities_1 = __importDefault(require("./MinecraftUtilities")); const Log_1 = __importDefault(require("../core/Log")); class ResourceManifestDefinition { _file; _id; _isLoaded = false; _loadedWithComments = false; definition; _onLoaded = new ste_events_1.EventDispatcher(); get isLoaded() { return this._isLoaded; } get file() { return this._file; } set file(newFile) { this._file = newFile; } get onLoaded() { return this._onLoaded.asEvent(); } get description() { if (!this.definition || !this.definition.header) { return undefined; } return this.definition.header.description; } set description(newDescription) { if (this.definition && this.definition.header && newDescription) { this.definition.header.description = newDescription; } } get packScope() { if (!this.definition || !this.definition.header) { return undefined; } return this.definition.header.pack_scope; } set packScope(newValue) { if (!this.definition || !this.definition.header) { return; } this.definition.header.pack_scope = newValue; } get productType() { if (!this.definition || !this.definition.metadata) { return undefined; } return this.definition.metadata.product_type; } set productType(value) { this.ensureMetadata(); if (!this.definition || !this.definition.metadata) { return; } this.definition.metadata.product_type = value; } get subpacks() { if (!this.definition || !this.definition.subpacks) { return undefined; } return this.definition.subpacks; } get capabilities() { if (!this.definition || !this.definition.capabilities) { return undefined; } return this.definition.capabilities; } get version() { if (!this.definition || !this.definition.header || !this.definition.header.version) { return undefined; } return this.definition.header.version; } get dependencies() { if (!this.definition || !this.definition.dependencies) { return undefined; } return this.definition.dependencies; } get name() { if (this.definition && this.definition.header) { return this.definition.header.name; } return undefined; } set name(newName) { if (this.definition && this.definition.header && newName) { this.definition.header.name = newName; } } get id() { if (this.definition && this.definition.header) { return this.definition.header.uuid; } return this._id; } set id(newId) { if (this.definition && this.definition.header && newId) { this.definition.header.uuid = newId; } this._id = newId; } async setUuid(newId, project) { const oldUuid = this.id; this.id = newId; if (newId && oldUuid && project) { await ResourceManifestDefinition.setNewResourcePackId(project, newId, oldUuid); } } ensureHeaderForProject(project) { return this.ensureHeader(project.title, project.description); } get minEngineVersion() { if (!this.definition || !this.definition.header || !this.definition.header.min_engine_version) { return undefined; } return this.definition.header.min_engine_version; } setMinEngineVersion(versionArray, project) { const header = this.ensureHeaderForProject(project); header.min_engine_version = versionArray; } static async setNewResourcePackId(project, newResourcePackId, oldResourcePackId) { const itemsCopy = project.getItemsCopy(); let setResourcePack = false; for (let i = 0; i < itemsCopy.length; i++) { const pi = itemsCopy[i]; if (pi.primaryFile) { if (pi.itemType === IProjectItemData_1.ProjectItemType.resourcePackManifestJson && !setResourcePack) { const rpManifestJson = await ResourceManifestDefinition.ensureOnFile(pi.primaryFile); if (rpManifestJson) { if (rpManifestJson.id && Utilities_1.default.uuidEqual(rpManifestJson.id, oldResourcePackId)) { rpManifestJson.id = newResourcePackId; setResourcePack = true; await rpManifestJson.save(); } else if (rpManifestJson.definition && rpManifestJson.definition.dependencies) { const deps = rpManifestJson.definition?.dependencies; for (const dep of deps) { if (dep.uuid === oldResourcePackId) { dep.uuid = newResourcePackId; } } await rpManifestJson.save(); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.behaviorPackManifestJson) { const bpManifestJson = await BehaviorManifestDefinition_1.default.ensureOnFile(pi.primaryFile); if (bpManifestJson) { if (bpManifestJson.definition && bpManifestJson.definition.dependencies) { const deps = bpManifestJson.definition?.dependencies; for (const dep of deps) { if (dep.uuid === oldResourcePackId) { dep.uuid = newResourcePackId; } } await bpManifestJson.save(); } } } } } } hasAddonProperties() { return this.productType === "addon" && this.packScope === "world"; } async setAddonProperties() { this.productType = "addon"; this.packScope = "world"; await this.save(); } randomizeModuleUuids(newDataModuleId, oldDataModuleId) { if (!this.definition) { return; } for (let i = 0; i < this.definition.modules.length; i++) { const mod = this.definition.modules[i]; if (mod.uuid) { if (oldDataModuleId && newDataModuleId && (mod.uuid === oldDataModuleId || mod.uuid === newDataModuleId)) { mod.uuid = newDataModuleId; } else { mod.uuid = Utilities_1.default.createUuid(); } } } } static async ensureOnFile(file, loadHandler) { let rmj; if (file.manager === undefined) { rmj = new ResourceManifestDefinition(); rmj.file = file; file.manager = rmj; } if (file.manager !== undefined && file.manager instanceof ResourceManifestDefinition) { rmj = file.manager; if (!rmj.isLoaded) { if (loadHandler) { rmj.onLoaded.subscribe(loadHandler); } await rmj.load(); } } return rmj; } persist() { if (this._file === undefined) { return false; } if (!this.definition) { Log_1.default.unexpectedUndefined("RMDP"); return false; } return this._file.setObjectContentIfSemanticallyDifferent(this.definition); } ensureDefinition(name, description) { if (!this.definition) { this.definition = { format_version: 2, header: { name: name, description: description, version: [0, 0, 1], min_engine_version: [1, 20, 10], uuid: Utilities_1.default.createUuid(), }, modules: [], dependencies: [], }; } } getSubpackByFolderName(folderName) { if (!this.definition) { return undefined; } if (!this.definition.subpacks) { return undefined; } for (const subpack of this.definition.subpacks) { if (subpack.folder_name === folderName) { return subpack; } } return undefined; } ensureHeader(name, description) { this.ensureDefinition(name, description); if (!this.definition) { throw new Error(); } if (!this.definition.header) { this.definition.header = this.getDefaultHeader(name, description); } return this.definition.header; } ensureMetadata() { if (!this.definition) { return undefined; } if (!this.definition.metadata) { this.definition.metadata = {}; } return this.definition.metadata; } ensureGeneratedWith(toolName, versionString) { const metadata = this.ensureMetadata(); if (!metadata) { return undefined; } if (!metadata.generated_with) { metadata.generated_with = {}; } if (!metadata.generated_with[toolName]) { metadata.generated_with[toolName] = []; } if (!metadata.generated_with[toolName].includes(versionString)) { metadata.generated_with[toolName].push(versionString); } } getDefaultHeader(name, description) { return { name: name, description: description, version: [0, 0, 1], min_engine_version: [1, 20, 10], uuid: Utilities_1.default.createUuid(), }; } async save() { if (this._file === undefined) { return; } if (this.persist()) { await this._file.saveContent(false); } } /** * Loads the definition from the file. * @param preserveComments If true, uses comment-preserving JSON parsing for edit/save cycles. * If false (default), uses efficient standard JSON parsing. * Can be called again with true to "upgrade" a read-only load to read/write. */ async load(preserveComments = false) { // If already loaded with comments, we have the "best" version - nothing more to do if (this._isLoaded && this._loadedWithComments) { return; } // If already loaded without comments and caller doesn't need comments, we're done if (this._isLoaded && !preserveComments) { return; } if (this._file === undefined) { return; } if (!this._file.isContentLoaded) { await this._file.loadContent(); } if (this._file.content === null || this._file.content instanceof Uint8Array) { this._isLoaded = true; this._loadedWithComments = preserveComments; this._onLoaded.dispatch(this, this); return; } // Use comment-preserving parser only when needed for editing this.definition = preserveComments ? StorageUtilities_1.default.getJsonObjectWithComments(this._file) : StorageUtilities_1.default.getJsonObject(this._file); this._isLoaded = true; this._loadedWithComments = preserveComments; this._onLoaded.dispatch(this, this); } static validatePackReferenceVersion(version) { if (!version) { return { isValid: false, errorMessage: "Missing version", }; } // Use MinecraftUtilities to parse version const versionArray = MinecraftUtilities_1.default.getVersionArrayFrom(version); if (!versionArray || versionArray.length !== 3 || !versionArray.every((v) => typeof v === "number" && v >= 0)) { return { isValid: false, errorMessage: "Invalid version format. Expected valid version string or array of 3 non-negative numbers", }; } return { isValid: true, versionArray: versionArray, }; } } exports.default = ResourceManifestDefinition;