UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

185 lines (184 loc) 8.05 kB
"use strict"; // 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();