@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
185 lines (184 loc) • 8.05 kB
JavaScript
;
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createCommand = exports.CreateCommand = void 0;
const IToolCommand_1 = require("../IToolCommand");
const AutocompleteProviders_1 = require("../AutocompleteProviders");
const IGalleryItem_1 = require("../../IGalleryItem");
const ProjectExporter_1 = __importDefault(require("../../ProjectExporter"));
const ProjectUtilities_1 = __importDefault(require("../../ProjectUtilities"));
const Project_1 = __importStar(require("../../Project"));
const IProjectData_1 = require("../../IProjectData");
class CreateCommand extends IToolCommand_1.ToolCommandBase {
metadata = {
name: "create",
description: "Create a new Minecraft project from a template",
aliases: ["c", "new"],
category: "Project",
arguments: [
{
name: "template",
description: "Template ID (e.g., addonstarter, tsstarter, addonfull)",
type: "choice",
required: false,
defaultValue: "addonstarter",
autocompleteProvider: AutocompleteProviders_1.projectTemplateProvider,
},
{
name: "name",
description: "Project name",
type: "string",
required: false,
defaultValue: "my-project",
},
],
flags: [
{
name: "creator",
shortName: "c",
description: "Creator name for the project",
type: "string",
defaultValue: "Creator",
},
{
name: "description",
shortName: "d",
description: "Project description",
type: "string",
},
{
name: "output",
shortName: "o",
description: "Output folder path",
type: "path",
},
],
isWriteCommand: true,
examples: [
"/create",
"/create addonstarter my-addon",
"/create tsstarter my-ts-project --creator MyName",
'/create addonfull my-full-addon --description "A complete addon"',
],
};
async execute(context, args, flags) {
const templateId = args[0] || "addonstarter";
const projectName = args[1] || "my-project";
const creator = flags.creator || "Creator";
const description = flags.description || projectName;
const outputPath = flags.output;
if (!context.creatorTools) {
return this.error("NO_CREATOR_TOOLS", "No CreatorTools instance available.");
}
const creatorTools = context.creatorTools;
// Load gallery to find template
await creatorTools.loadGallery();
if (!creatorTools.gallery) {
return this.error("GALLERY_ERROR", "Could not load project gallery");
}
// Find the template
const galProject = await creatorTools.getGalleryProjectById(templateId);
if (!galProject) {
// List available templates
const projects = creatorTools.getGalleryProjectByType(IGalleryItem_1.GalleryItemType.project) || [];
const available = projects.map((p) => p.id).join(", ");
return this.error("TEMPLATE_NOT_FOUND", `Template '${templateId}' not found. Available: ${available}`);
}
context.output.info(`Creating project '${projectName}' from template '${galProject.title}'...`);
// Determine output location
let project;
if (outputPath) {
// Use specified output path
project = new Project_1.default(creatorTools, projectName, null);
project.localFolderPath = outputPath;
project.autoDeploymentMode = Project_1.ProjectAutoDeploymentMode.noAutoDeployment;
}
else if (context.project) {
// Use current project folder if available
project = context.project;
}
else {
// Create in projects storage
const newProjectName = await creatorTools.getNewProjectName(projectName);
project = await creatorTools.createNewProject(newProjectName, undefined, undefined, undefined, IProjectData_1.ProjectFocus.general, false, undefined);
}
if (!project) {
return this.error("PROJECT_ERROR", "Could not create project");
}
try {
// Sync from GitHub
project = await ProjectExporter_1.default.syncProjectFromGitHub(true, creatorTools, galProject.gitHubRepoName, galProject.gitHubOwner, galProject.gitHubBranch, galProject.gitHubFolder, projectName, project, galProject.fileList, async (message) => {
context.output.debug(message);
}, true);
// Apply customizations
if (creator) {
await ProjectUtilities_1.default.applyCreator(project, creator);
}
const suggestedShortName = ProjectUtilities_1.default.getSuggestedProjectShortName(creator, projectName);
await ProjectUtilities_1.default.processNewProject(project, projectName, description, suggestedShortName, false);
await project.save();
// Set context.project so the UI navigates into the newly created project
context.project = project;
const projectPath = project.projectFolder?.fullPath || project.localFolderPath || "unknown location";
context.output.success(`Project created at: ${projectPath}`);
return this.success(`Project '${projectName}' created successfully`, {
projectPath,
template: galProject.id,
name: projectName,
});
}
catch (error) {
const message = error instanceof Error ? error.message : String(error);
return this.error("CREATE_ERROR", `Failed to create project: ${message}`);
}
}
/**
* Custom completions for template argument.
*/
async getCompletions(context, args, partialArg, argIndex) {
if (argIndex === 0) {
// Complete template names
return (0, AutocompleteProviders_1.projectTemplateProvider)(partialArg, context);
}
return [];
}
}
exports.CreateCommand = CreateCommand;
exports.createCommand = new CreateCommand();