create-mcbepack 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # create-mcbepack
2
2
 
3
- Interactive scaffolder for Minecraft Bedrock Edition add-on projects.
4
-
5
- It creates the pack folders, manifests, optional Script API entry point, package scripts, and Minecraft development-path configuration expected by `@mcbepack/cli`.
3
+ Interactive scaffolder for MCBEPACK projects.
6
4
 
7
5
  ## Usage
8
6
 
@@ -10,72 +8,15 @@ It creates the pack folders, manifests, optional Script API entry point, package
10
8
  bunx create-mcbepack
11
9
  ```
12
10
 
13
- The prompts ask for:
14
-
15
- - behavior pack and/or resource pack
16
- - project name, description, author, and minimum engine version
17
- - optional Script API support
18
- - TypeScript or JavaScript
19
- - stable, beta, or preview Script API release channel
20
- - Minecraft package modules to include
21
-
22
- ## Generated Scripts
23
-
24
- Script API projects include:
25
-
26
- ```json
27
- {
28
- "scripts": {
29
- "dev": "mcbepack dev",
30
- "build:zip": "mcbepack build -o zip",
31
- "build:mcpack": "mcbepack build -o mcpack",
32
- "build:mcaddon": "mcbepack build -o mcaddon",
33
- "update:stable": "mcbepack update -t stable",
34
- "update:beta": "mcbepack update -t beta",
35
- "update:preview": "mcbepack update -t preview"
36
- }
37
- }
38
- ```
39
-
40
- Non-script projects include the three build commands.
11
+ It creates behavior/resource packs, manifests, package scripts, and optional Script API setup.
41
12
 
42
- ## Generated Layout
43
-
44
- ```text
45
- my-addon/
46
- |-- scripts/
47
- | `-- index.ts
48
- |-- src/
49
- | |-- behavior_pack/
50
- | | |-- manifest.json
51
- | | `-- pack_icon.png
52
- | `-- resource_pack/
53
- | |-- manifest.json
54
- | `-- pack_icon.png
55
- |-- .env.local
56
- |-- .gitignore
57
- |-- package.json
58
- |-- README.md
59
- `-- tsconfig.json
60
- ```
61
-
62
- Some files are only created when the selected options need them.
63
-
64
- ## Local Development
65
-
66
- From the repository root:
13
+ ## Development
67
14
 
68
15
  ```bash
69
16
  bun install
70
17
  bun --cwd packages/create-mcbepack run build
71
18
  ```
72
19
 
73
- ## Related Packages
74
-
75
- - [`@mcbepack/cli`](../@mcbepack/cli)
76
- - [`@mcbepack/api`](../@mcbepack/api)
77
- - [`@mcbepack/common`](../@mcbepack/common)
78
-
79
20
  ## License
80
21
 
81
- GPL-3.0. See [LICENSE](./LICENSE).
22
+ GPL-3.0
@@ -0,0 +1,21 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { Extension } from "./enum.js";
4
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
+ export const SCRIPTS_BASE = [
6
+ { name: "export:zip", cmd: "mcbepack export zip", desc: "Export .zip" },
7
+ { name: "export:mcpack", cmd: "mcbepack export mcpack", desc: "Export .mcpack" },
8
+ { name: "export:mcaddon", cmd: "mcbepack export mcaddon", desc: "Export .mcaddon" },
9
+ ];
10
+ export const SCRIPTS_SCRIPT_API = [
11
+ { name: "dev", cmd: "mcbepack dev", desc: "Dev server" },
12
+ { name: "build", cmd: "mcbepack build", desc: "Build" },
13
+ { name: "update:stable", cmd: "mcbepack update stable", desc: "Update stable" },
14
+ { name: "update:beta", cmd: "mcbepack update beta", desc: "Update beta" },
15
+ { name: "update:preview", cmd: "mcbepack update preview", desc: "Update preview" },
16
+ ];
17
+ export const DIRECTORIES = {
18
+ template: path.join(__dirname, "..", "..", "templates"),
19
+ [Extension.Behavior]: path.join("src", "behavior_pack"),
20
+ [Extension.Resource]: path.join("src", "resource_pack"),
21
+ };
@@ -0,0 +1,24 @@
1
+ export var Extension;
2
+ (function (Extension) {
3
+ Extension["Behavior"] = "behavior";
4
+ Extension["Resource"] = "resource";
5
+ })(Extension || (Extension = {}));
6
+ export var ScriptLanguage;
7
+ (function (ScriptLanguage) {
8
+ ScriptLanguage["TypeScript"] = "typescript";
9
+ ScriptLanguage["JavaScript"] = "javascript";
10
+ })(ScriptLanguage || (ScriptLanguage = {}));
11
+ export var Release;
12
+ (function (Release) {
13
+ Release["Stable"] = "stable";
14
+ Release["Beta"] = "beta";
15
+ Release["Preview"] = "preview";
16
+ })(Release || (Release = {}));
17
+ export var PackageManager;
18
+ (function (PackageManager) {
19
+ PackageManager["Npm"] = "npm";
20
+ PackageManager["Yarn"] = "yarn";
21
+ PackageManager["Pnpm"] = "pnpm";
22
+ PackageManager["Bun"] = "bun";
23
+ PackageManager["Deno"] = "deno";
24
+ })(PackageManager || (PackageManager = {}));
@@ -0,0 +1,84 @@
1
+ import pkg from "../../package.json" with { type: "json" };
2
+ import { Extension } from "../config/enum.js";
3
+ import { json } from "../utils.js";
4
+ const pluginPackages = new Set();
5
+ export const ver = () => [1, 0, 0];
6
+ export function buildBaseManifest(context) {
7
+ return {
8
+ format_version: 2,
9
+ header: {
10
+ name: context.name,
11
+ description: context.description,
12
+ uuid: "",
13
+ version: ver(),
14
+ min_engine_version: context.minEngineVersion,
15
+ },
16
+ metadata: {
17
+ authors: context.author.split(",").map((s) => s.trim()).filter(Boolean),
18
+ generated_with: {
19
+ "create-mcbepack": pkg.version
20
+ },
21
+ },
22
+ };
23
+ }
24
+ export function buildBehaviorManifest(context) {
25
+ const base = buildBaseManifest(context);
26
+ const scriptDeps = context.script?.enabled
27
+ ? context.script.dependencies
28
+ .filter((d) => !pluginPackages.has(d.packageName))
29
+ .map((d) => ({ module_name: d.packageName, version: d.version }))
30
+ : [];
31
+ const resourceDep = context.script?.enabled && context.extensions.includes(Extension.Resource)
32
+ ? [
33
+ {
34
+ uuid: context.uuids.resource,
35
+ version: ver()
36
+ }
37
+ ]
38
+ : [];
39
+ return json({
40
+ ...base,
41
+ header: {
42
+ ...base.header,
43
+ uuid: context.uuids.behavior
44
+ },
45
+ ...(context.script?.enabled ? { capabilities: ["script_eval"] } : {}),
46
+ modules: context.script?.enabled
47
+ ? [
48
+ {
49
+ type: "script",
50
+ language: "javascript",
51
+ entry: "scripts/index.js",
52
+ uuid: context.uuids.scriptModule,
53
+ version: ver(),
54
+ }
55
+ ]
56
+ : [],
57
+ dependencies: [...scriptDeps, ...resourceDep],
58
+ });
59
+ }
60
+ export function buildResourceManifest(context) {
61
+ const base = buildBaseManifest(context);
62
+ return json({
63
+ ...base,
64
+ header: {
65
+ ...base.header,
66
+ uuid: context.uuids.resource
67
+ },
68
+ modules: [
69
+ {
70
+ type: "resources",
71
+ uuid: context.uuids.resourceModule,
72
+ version: ver()
73
+ }
74
+ ],
75
+ dependencies: context.extensions.includes(Extension.Behavior)
76
+ ? [
77
+ {
78
+ uuid: context.uuids.behavior,
79
+ version: ver()
80
+ }
81
+ ]
82
+ : [],
83
+ });
84
+ }
@@ -0,0 +1,23 @@
1
+ import { SCRIPTS_BASE, SCRIPTS_SCRIPT_API } from "../config/constant.js";
2
+ import { ScriptLanguage } from "../config/enum.js";
3
+ import { json } from "../utils.js";
4
+ export function buildPackageJson(context) {
5
+ const scripts = context.script?.enabled
6
+ ? [...SCRIPTS_SCRIPT_API, ...SCRIPTS_BASE]
7
+ : [...SCRIPTS_BASE];
8
+ const devDeps = { "@mcbepack/cli": "latest" };
9
+ if (context.script?.enabled) {
10
+ devDeps["@mcbepack/api"] = "latest";
11
+ if (context.script.language === ScriptLanguage.TypeScript) {
12
+ devDeps["typescript"] = "latest";
13
+ }
14
+ for (const dep of context.script.dependencies) {
15
+ devDeps[dep.packageName] = dep.fullVersion;
16
+ }
17
+ }
18
+ return json({
19
+ name: context.name,
20
+ scripts: Object.fromEntries(scripts.map((s) => [s.name, s.cmd])),
21
+ devDependencies: devDeps,
22
+ });
23
+ }
@@ -0,0 +1,20 @@
1
+ import { SCRIPTS_BASE, SCRIPTS_SCRIPT_API } from "../config/constant.js";
2
+ export function buildReadme(context) {
3
+ const pm = context.packageManager;
4
+ const scripts = context.script?.enabled
5
+ ? [...SCRIPTS_SCRIPT_API, ...SCRIPTS_BASE]
6
+ : [...SCRIPTS_BASE];
7
+ const cmds = scripts.map((s) => `${pm} run ${s.name.padEnd(16)} # ${s.desc}`).join("\n");
8
+ return `# ${context.name}
9
+
10
+ ${context.description}
11
+
12
+ > Generated with \`create-mcbepack\`
13
+
14
+ ## Commands
15
+
16
+ \`\`\`bash
17
+ ${cmds}
18
+ \`\`\`
19
+ `;
20
+ }
package/dist/index.js CHANGED
@@ -1,56 +1,70 @@
1
1
  #!/usr/bin/env node
2
- import fs from "node:fs";
2
+ import { execFileSync } from "node:child_process";
3
3
  import path from "node:path";
4
- import pc from "picocolors";
5
- import { collectProjectInfo } from "./utils/collect-info";
6
- import { generateFileList } from "./utils/generate-files";
7
- import { createFiles, previewFiles } from "./utils/create-files";
8
- import prompt from "./prompt";
9
- async function main() {
10
- try {
11
- console.log(pc.bold(pc.cyan("\nCreate MCBEPack\n")));
12
- const config = await collectProjectInfo();
13
- const files = generateFileList(config);
14
- previewFiles(files, config.name);
15
- console.log();
16
- const { confirmed } = await prompt.confirm({
17
- message: "Do you want to create this project?",
18
- default: true,
19
- });
20
- if (!confirmed) {
21
- console.log(pc.yellow("\nProject creation cancelled"));
22
- process.exit(0);
23
- }
24
- const projectRoot = path.join(process.cwd(), config.name);
25
- if (fs.existsSync(projectRoot)) {
26
- console.log(pc.red(`\nDirectory ${config.name} already exists`));
27
- process.exit(1);
28
- }
29
- createFiles(files);
30
- console.log(`\n${pc.green("Success!")} Created project ${pc.cyan(config.name)}`);
31
- console.log(pc.dim(` at: ${projectRoot}\n`));
32
- console.log(pc.bold("Next steps:\n"));
33
- console.log(` ${pc.cyan("1.")} cd ${config.name}`);
34
- if (config.script?.enabled) {
35
- console.log(` ${pc.cyan("2.")} bun install`);
36
- console.log(` ${pc.cyan("3.")} bun run dev\n`);
37
- }
38
- else {
39
- console.log(` ${pc.cyan("2.")} bun install`);
40
- console.log(` ${pc.cyan("3.")} Start developing your project\n`);
41
- }
42
- console.log(pc.dim("Available commands:"));
43
- if (config.script?.enabled) {
44
- console.log(pc.dim(" - bun run dev - Start development server"));
45
- console.log(pc.dim(" - bun run update:stable - Update Script API packages"));
4
+ import chalk from "chalk";
5
+ import { logger } from "@mcbepack/common";
6
+ import { DIRECTORIES } from "./config/constant.js";
7
+ import { Extension, ScriptLanguage } from "./config/enum.js";
8
+ import { buildBehaviorManifest, buildResourceManifest } from "./generator/manifest.js";
9
+ import { buildPackageJson } from "./generator/package.js";
10
+ import { buildReadme } from "./generator/readme.js";
11
+ import { confirmPrompt, createContext } from "./prompts.js";
12
+ import { FileGenerator } from "./utils.js";
13
+ try {
14
+ const context = await createContext();
15
+ const projectRoot = path.join(process.cwd(), context.name);
16
+ const confirmed = await confirmPrompt(`Do you want to continue with the following configuration?`);
17
+ if (!confirmed) {
18
+ logger.warn("Project creation cancelled.");
19
+ process.exit(0);
20
+ }
21
+ const generator = new FileGenerator(projectRoot);
22
+ generator.create(path.join(projectRoot, "README.md"), buildReadme(context));
23
+ generator.create(path.join(projectRoot, "package.json"), buildPackageJson(context));
24
+ if (context.extensions.includes(Extension.Behavior)) {
25
+ generator.create(path.join(projectRoot, DIRECTORIES.behavior, "manifest.json"), buildBehaviorManifest(context));
26
+ generator.copy(path.join(projectRoot, DIRECTORIES.behavior, "pack_icon.png"), path.join(DIRECTORIES.template, "pack_icon.png"));
27
+ }
28
+ if (context.extensions.includes(Extension.Resource)) {
29
+ generator.create(path.join(projectRoot, DIRECTORIES.resource, "manifest.json"), buildResourceManifest(context));
30
+ generator.copy(path.join(projectRoot, DIRECTORIES.resource, "pack_icon.png"), path.join(DIRECTORIES.template, "pack_icon.png"));
31
+ }
32
+ if (context.script?.enabled) {
33
+ const lang = context.script.language;
34
+ generator.create(path.join(projectRoot, "scripts", lang === ScriptLanguage.TypeScript ? "index.ts" : "index.js"), "export {};\n");
35
+ generator.copy(path.join(projectRoot, ".env.local"), path.join(DIRECTORIES.template, ".env.local.txt"));
36
+ generator.copy(path.join(projectRoot, ".gitignore"), path.join(DIRECTORIES.template, ".gitignore.txt"));
37
+ if (lang === ScriptLanguage.TypeScript) {
38
+ generator.copy(path.join(projectRoot, "tsconfig.json"), path.join(DIRECTORIES.template, "tsconfig.json"));
46
39
  }
47
- console.log(pc.dim(" - bun run build:zip - Build a .zip archive"));
48
- console.log(pc.dim(" - bun run build:mcpack - Build .mcpack archive(s)"));
49
- console.log(pc.dim(" - bun run build:mcaddon - Build a .mcaddon archive"));
50
40
  }
51
- catch (error) {
52
- console.error(pc.red("\nError occurred:"), error);
53
- process.exit(1);
41
+ generator.generate();
42
+ execFileSync(context.packageManager, ["install"], { cwd: projectRoot, stdio: "inherit" });
43
+ logger.done(`Created project ${context.name}`);
44
+ logger.field("Path", chalk.dim(projectRoot));
45
+ logger.section("Next steps");
46
+ logger.item(`${chalk.cyan("1.")} cd ${context.name}`);
47
+ if (context.script?.enabled) {
48
+ logger.item(`${chalk.cyan("2.")} ${context.packageManager} dev`);
49
+ }
50
+ else {
51
+ logger.item(`${chalk.cyan("2.")} Start developing your project`);
52
+ }
53
+ logger.section("Available commands");
54
+ if (context.script?.enabled) {
55
+ logger.info(`${context.packageManager} run dev - Start development server`);
56
+ logger.info(`${context.packageManager} run build - Build project files`);
54
57
  }
58
+ logger.info(`${context.packageManager} run export:zip - Export a .zip archive`);
59
+ logger.info(`${context.packageManager} run export:mcpack - Export .mcpack archive(s)`);
60
+ logger.info(`${context.packageManager} run export:mcaddon - Export a .mcaddon archive`);
61
+ if (context.script?.enabled) {
62
+ logger.info(`${context.packageManager} run update:stable - Update Script API (stable) packages`);
63
+ logger.info(`${context.packageManager} run update:beta - Update Script API (beta) packages`);
64
+ logger.info(`${context.packageManager} run update:preview - Update Script API (preview) packages`);
65
+ }
66
+ }
67
+ catch (err) {
68
+ logger.error(err instanceof Error ? err.message : String(err));
69
+ process.exit(1);
55
70
  }
56
- main();
@@ -0,0 +1,92 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import enquirer from "enquirer";
3
+ import { getDependency, MINECRAFT_PACKAGES } from "@mcbepack/common";
4
+ import { Extension, Release, ScriptLanguage } from "./config/enum.js";
5
+ import { detectPackageManager } from "./utils.js";
6
+ export async function createContext() {
7
+ const { extensions } = await enquirer.prompt({
8
+ type: "multiselect",
9
+ name: "extensions",
10
+ message: "What types of development do you need?",
11
+ choices: Object.values(Extension),
12
+ validate: (v) => v.length > 0 || "At least one extension type is required",
13
+ });
14
+ const info = await enquirer.prompt([
15
+ {
16
+ type: "input",
17
+ name: "name",
18
+ message: "What is the name of your project?"
19
+ },
20
+ {
21
+ type: "input",
22
+ name: "description",
23
+ message: "What is the description of your project?"
24
+ },
25
+ {
26
+ type: "input",
27
+ name: "author",
28
+ message: "What is the author's name? Use commas to separate multiple authors.",
29
+ },
30
+ {
31
+ type: "input",
32
+ name: "minEngineVersion",
33
+ message: "What is the minimum engine version required?",
34
+ initial: "1.26.0",
35
+ validate: (v) => /^\d+\.\d+\.\d+$/.test(v) || "Minimum engine version must be in the format x.x.x",
36
+ }
37
+ ]);
38
+ const context = {
39
+ ...info,
40
+ extensions,
41
+ packageManager: await detectPackageManager(),
42
+ uuids: {
43
+ behavior: randomUUID(),
44
+ resource: randomUUID(),
45
+ scriptModule: randomUUID(),
46
+ resourceModule: randomUUID(),
47
+ },
48
+ };
49
+ if (extensions.includes(Extension.Behavior)) {
50
+ const { useScript } = await enquirer.prompt({
51
+ type: "confirm",
52
+ name: "useScript",
53
+ message: "Do you want to add Script API to the behavior pack?",
54
+ initial: true,
55
+ });
56
+ if (useScript) {
57
+ const scriptConfig = await enquirer.prompt([
58
+ {
59
+ type: "select",
60
+ name: "language",
61
+ message: "Which language do you want to use?",
62
+ choices: Object.values(ScriptLanguage),
63
+ },
64
+ {
65
+ type: "select",
66
+ name: "release",
67
+ message: "What release channel would you like to use?",
68
+ choices: Object.values(Release),
69
+ },
70
+ {
71
+ type: "multiselect",
72
+ name: "packages",
73
+ message: "Which packages would you like to add?",
74
+ choices: [...MINECRAFT_PACKAGES.modules, ...MINECRAFT_PACKAGES.plugins],
75
+ validate: (v) => v.length > 0 || "At least one package is required",
76
+ },
77
+ ]);
78
+ const dependencies = await Promise.all(scriptConfig.packages.map((pkg) => getDependency(pkg, scriptConfig.release)));
79
+ context.script = { enabled: true, ...scriptConfig, dependencies };
80
+ }
81
+ }
82
+ return context;
83
+ }
84
+ export async function confirmPrompt(message, initial = true) {
85
+ const { ok } = await enquirer.prompt({
86
+ type: "confirm",
87
+ name: "ok",
88
+ message,
89
+ initial,
90
+ });
91
+ return ok;
92
+ }
package/dist/utils.js ADDED
@@ -0,0 +1,47 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { detect } from "package-manager-detector/detect";
4
+ import { PackageManager } from "./config/enum.js";
5
+ export function json(v) {
6
+ return `${JSON.stringify(v, null, 2)}\n`;
7
+ }
8
+ export async function detectPackageManager() {
9
+ const detected = await detect();
10
+ const name = detected?.name;
11
+ return Object.values(PackageManager).includes(name)
12
+ ? name
13
+ : PackageManager.Bun;
14
+ }
15
+ export class FileGenerator {
16
+ projectRoot;
17
+ files = [];
18
+ constructor(projectRoot) {
19
+ this.projectRoot = projectRoot;
20
+ }
21
+ create(destinationDir, content) {
22
+ this.files.push({ action: "create", destinationDir, content });
23
+ }
24
+ copy(destinationDir, originDir) {
25
+ this.files.push({ action: "copy", destinationDir, originDir });
26
+ }
27
+ generate() {
28
+ if (fs.existsSync(this.projectRoot)) {
29
+ throw new Error(`Directory already exists: ${path.basename(this.projectRoot)}`);
30
+ }
31
+ fs.mkdirSync(this.projectRoot);
32
+ const created = new Set([this.projectRoot]);
33
+ for (const file of this.files) {
34
+ const dir = path.dirname(file.destinationDir);
35
+ if (!created.has(dir)) {
36
+ fs.mkdirSync(dir, { recursive: true });
37
+ created.add(dir);
38
+ }
39
+ if (file.action === "copy") {
40
+ fs.copyFileSync(file.originDir, file.destinationDir);
41
+ }
42
+ else {
43
+ fs.writeFileSync(file.destinationDir, file.content);
44
+ }
45
+ }
46
+ }
47
+ }
package/package.json CHANGED
@@ -1,17 +1,8 @@
1
1
  {
2
2
  "name": "create-mcbepack",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "main": "dist/index.js",
5
- "dependencies": {
6
- "@mcbepack/common": "^1.0.1",
7
- "enquirer": "^2.4.1",
8
- "node-fetch": "^3.3.2",
9
- "nodemon": "^3.1.11",
10
- "picocolors": "^1.1.1"
11
- },
12
- "peerDependencies": {
13
- "typescript": "^5"
14
- },
5
+ "type": "module",
15
6
  "bin": {
16
7
  "create-mcbepack": "./dist/index.js"
17
8
  },
@@ -19,5 +10,13 @@
19
10
  "dev": "tsc --watch",
20
11
  "build": "tsc"
21
12
  },
22
- "type": "module"
13
+ "dependencies": {
14
+ "@mcbepack/common": "^1.0.1",
15
+ "enquirer": "^2.4.1",
16
+ "nodemon": "^3.1.11",
17
+ "package-manager-detector": "^1.6.0"
18
+ },
19
+ "devDependencies": {
20
+ "typescript": "^5"
21
+ }
23
22
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "ESNext",
3
+ "target": "esnext",
4
4
  "moduleResolution": "bundler",
5
- "module": "ESNext",
5
+ "module": "esnext",
6
6
  "resolvePackageJsonImports": true,
7
7
  "sourceMap": false
8
8
  },
package/dist/prompt.js DELETED
@@ -1,92 +0,0 @@
1
- import enquirer from 'enquirer';
2
- import { constants } from '@mcbepack/common';
3
- const extension = async () => {
4
- const response = await enquirer.prompt({
5
- type: 'multiselect',
6
- name: 'extensions',
7
- message: 'Select a extension type?',
8
- choices: [
9
- { name: 'behavior', message: 'Behavior Pack' },
10
- { name: 'resource', message: 'Resource Pack' },
11
- ]
12
- });
13
- return response;
14
- };
15
- const api = async () => {
16
- const response = await enquirer.prompt({
17
- type: "confirm",
18
- name: "api",
19
- message: "Do you want to add a script api to behavior?",
20
- initial: true
21
- });
22
- return response;
23
- };
24
- const info = async () => {
25
- const response = await enquirer.prompt([
26
- {
27
- type: 'input',
28
- name: 'name',
29
- message: 'What is the name of the project?',
30
- },
31
- {
32
- type: 'input',
33
- name: 'description',
34
- message: 'What is the description of the project?',
35
- },
36
- {
37
- type: 'input',
38
- name: 'author',
39
- message: 'What is the author\'s name? Use commas to separate multiple authors(,).',
40
- },
41
- {
42
- type: 'input',
43
- name: 'minimumEngineVersion',
44
- message: 'What is the minimum engine version required?',
45
- validate: input => {
46
- if (input.length === 0)
47
- return 'Minimum engine version is required';
48
- const version = input.split('.');
49
- const response = 'Minimum engine version must be in the format x.x.x';
50
- return version.every((v) => !isNaN(parseInt(v))) || response;
51
- }
52
- }
53
- ]);
54
- return response;
55
- };
56
- const script = async () => {
57
- const response = await enquirer.prompt([
58
- {
59
- type: 'select',
60
- name: 'language',
61
- message: 'Which language do you want to use?',
62
- choices: ['typescript', 'javascript']
63
- },
64
- {
65
- type: 'select',
66
- name: 'release',
67
- message: 'What game type would you like to use?',
68
- choices: ['stable', 'beta', 'preview'],
69
- },
70
- {
71
- type: 'multiselect',
72
- name: 'packages',
73
- message: 'Which packages would you like to add?',
74
- choices: [
75
- ...constants.packages.modules,
76
- ...constants.packages.plugins
77
- ],
78
- validate: input => input.length > 0 || 'At least one package is required'
79
- }
80
- ]);
81
- return response;
82
- };
83
- const confirm = async (options) => {
84
- const response = await enquirer.prompt({
85
- type: "confirm",
86
- name: "confirmed",
87
- message: options.message,
88
- initial: options.default ?? true
89
- });
90
- return response;
91
- };
92
- export default { extension, api, info, script, confirm };
package/dist/types.js DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1,54 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import pc from "picocolors";
3
- import { getDependency } from "@mcbepack/common";
4
- import prompt from "../prompt";
5
- export async function collectProjectInfo() {
6
- console.log(pc.bold("Please provide project information\n"));
7
- const { extensions } = await prompt.extension();
8
- const { name, description, author, minimumEngineVersion } = await prompt.info();
9
- const uuids = {
10
- behavior: randomUUID(),
11
- resource: randomUUID(),
12
- scriptModule: randomUUID(),
13
- };
14
- const config = {
15
- name,
16
- description,
17
- author,
18
- minimumEngineVersion,
19
- extensions,
20
- uuids,
21
- };
22
- if (extensions.includes("behavior")) {
23
- const { api } = await prompt.api();
24
- if (api) {
25
- const { language, release, packages } = await prompt.script();
26
- console.log(pc.dim("\nFetching dependencies..."));
27
- const dependencies = await Promise.all(packages.map(async (packageName) => {
28
- const dep = await getDependency(packageName, release);
29
- return {
30
- packageName: dep.packageName,
31
- version: dep.version,
32
- fullVersion: dep.fullVersion,
33
- };
34
- }));
35
- config.script = {
36
- enabled: true,
37
- language,
38
- release,
39
- packages,
40
- dependencies,
41
- };
42
- }
43
- else {
44
- config.script = {
45
- enabled: false,
46
- language: "javascript",
47
- release: "",
48
- packages: [],
49
- dependencies: [],
50
- };
51
- }
52
- }
53
- return config;
54
- }
@@ -1,77 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import pc from "picocolors";
4
- export function createFiles(files) {
5
- console.log(`\nCreating ${files.length} files...\n`);
6
- for (const file of files) {
7
- try {
8
- const dir = path.dirname(file.path);
9
- if (!fs.existsSync(dir)) {
10
- fs.mkdirSync(dir, { recursive: true });
11
- }
12
- if (file.type === "copy" && file.source) {
13
- fs.copyFileSync(file.source, file.path);
14
- }
15
- else {
16
- fs.writeFileSync(file.path, file.content);
17
- }
18
- console.log(` ${pc.green("[OK]")} ${path.relative(process.cwd(), file.path)}`);
19
- }
20
- catch (error) {
21
- console.error(` ${pc.red("[ERR]")} ${path.relative(process.cwd(), file.path)}`);
22
- throw error;
23
- }
24
- }
25
- }
26
- export function previewFiles(files, projectName) {
27
- console.log(`\nFiles to be created in ${pc.cyan(projectName)}:\n`);
28
- const projectRoot = path.join(process.cwd(), projectName);
29
- const tree = buildFileTree(files, projectRoot);
30
- printTree(tree);
31
- }
32
- function buildFileTree(files, projectRoot) {
33
- const root = {
34
- name: path.basename(projectRoot),
35
- type: "directory",
36
- children: new Map(),
37
- };
38
- for (const file of files) {
39
- const relativePath = path.relative(projectRoot, file.path);
40
- const parts = relativePath.split(path.sep);
41
- let current = root;
42
- for (let i = 0; i < parts.length; i++) {
43
- const part = parts[i];
44
- const isLast = i === parts.length - 1;
45
- if (!current.children) {
46
- current.children = new Map();
47
- }
48
- if (!current.children.has(part)) {
49
- current.children.set(part, {
50
- name: part,
51
- type: isLast ? "file" : "directory",
52
- children: isLast ? undefined : new Map(),
53
- });
54
- }
55
- current = current.children.get(part);
56
- }
57
- }
58
- return root;
59
- }
60
- function printTree(node, prefix = "", isLast = true) {
61
- const connector = isLast ? "`-- " : "|-- ";
62
- if (prefix === "") {
63
- console.log(` ${pc.cyan(node.name)}/`);
64
- }
65
- else {
66
- const displayName = node.type === "directory" ? `${pc.cyan(node.name)}/` : node.name;
67
- console.log(` ${prefix}${connector}${displayName}`);
68
- }
69
- if (node.children) {
70
- const children = Array.from(node.children.values());
71
- children.forEach((child, index) => {
72
- const isLastChild = index === children.length - 1;
73
- const newPrefix = prefix + (isLast ? " " : "| ");
74
- printTree(child, newPrefix, isLastChild);
75
- });
76
- }
77
- }
@@ -1,191 +0,0 @@
1
- import path from "node:path";
2
- import { fileURLToPath } from "node:url";
3
- import { constants } from "@mcbepack/common";
4
- const __filename = fileURLToPath(import.meta.url);
5
- const __dirname = path.dirname(__filename);
6
- export function generateFileList(config) {
7
- const files = [];
8
- const projectRoot = path.join(process.cwd(), config.name);
9
- const templatesDir = path.join(__dirname, "..", "..", "templates");
10
- const baseManifest = {
11
- format_version: 2,
12
- header: {
13
- name: config.name,
14
- description: config.description,
15
- uuid: "",
16
- version: [1, 0, 0],
17
- min_engine_version: config.minimumEngineVersion.split('.').map(Number),
18
- },
19
- metadata: {
20
- authors: config.author.split(',').map(a => a.trim()),
21
- generated_with: {
22
- "create-mcbepack": [1, 0, 0],
23
- },
24
- },
25
- };
26
- files.push({
27
- path: path.join(projectRoot, "README.md"),
28
- content: "",
29
- type: "copy",
30
- source: path.join(templatesDir, "README.md"),
31
- });
32
- if (config.extensions.includes("behavior")) {
33
- const bpRoot = path.join(projectRoot, "src", "behavior_pack");
34
- files.push({
35
- path: path.join(bpRoot, "pack_icon.png"),
36
- content: "",
37
- type: "copy",
38
- source: path.join(templatesDir, "pack_icon.png"),
39
- });
40
- const bpManifest = {
41
- ...baseManifest,
42
- header: {
43
- ...baseManifest.header,
44
- uuid: config.uuids.behavior,
45
- },
46
- capabilities: ['script_eval'],
47
- modules: [],
48
- dependencies: [],
49
- };
50
- if (config.script?.enabled) {
51
- bpManifest.modules = [
52
- {
53
- type: "script",
54
- language: "javascript",
55
- entry: "scripts/index.js",
56
- uuid: config.uuids.scriptModule,
57
- version: [1, 0, 0],
58
- },
59
- ];
60
- bpManifest.dependencies = [
61
- ...config.script.dependencies
62
- .filter(dep => !constants.packages.plugins.includes(dep.packageName))
63
- .map(dep => ({
64
- module_name: dep.packageName,
65
- version: dep.version,
66
- })),
67
- ];
68
- if (config.extensions.includes("resource")) {
69
- bpManifest.dependencies.push({
70
- uuid: config.uuids.resource,
71
- version: [1, 0, 0],
72
- });
73
- }
74
- files.push({
75
- path: path.join(projectRoot, ".env.local"),
76
- content: "",
77
- type: "copy",
78
- source: path.join(templatesDir, ".env.local.txt"),
79
- });
80
- files.push({
81
- path: path.join(projectRoot, ".gitignore"),
82
- content: "",
83
- type: "copy",
84
- source: path.join(templatesDir, ".gitignore.txt"),
85
- });
86
- const packageJson = {
87
- name: config.name,
88
- scripts: {
89
- dev: "mcbepack dev",
90
- "build:zip": "mcbepack build -o zip",
91
- "build:mcpack": "mcbepack build -o mcpack",
92
- "build:mcaddon": "mcbepack build -o mcaddon",
93
- "update:stable": "mcbepack update -t stable",
94
- "update:beta": "mcbepack update -t beta",
95
- "update:preview": "mcbepack update -t preview",
96
- },
97
- devDependencies: {
98
- "@mcbepack/cli": "latest",
99
- "@mcbepack/api": "latest",
100
- ...(config.script.language === "typescript" ? { "typescript": "latest" } : {}),
101
- ...Object.fromEntries(config.script.dependencies.map(dep => [dep.packageName, dep.fullVersion]))
102
- }
103
- };
104
- files.push({
105
- path: path.join(projectRoot, "package.json"),
106
- content: JSON.stringify(packageJson, null, 2),
107
- type: "file",
108
- });
109
- const scriptsDir = path.join(projectRoot, "scripts");
110
- if (config.script.language === "typescript") {
111
- files.push({
112
- path: path.join(scriptsDir, "index.ts"),
113
- content: "console.log('Hello World!');",
114
- type: "file",
115
- });
116
- files.push({
117
- path: path.join(projectRoot, "tsconfig.json"),
118
- content: "",
119
- type: "copy",
120
- source: path.join(templatesDir, "tsconfig.json"),
121
- });
122
- }
123
- else {
124
- files.push({
125
- path: path.join(scriptsDir, "index.js"),
126
- content: "console.log('Hello World!');",
127
- type: "file",
128
- });
129
- }
130
- }
131
- files.push({
132
- path: path.join(bpRoot, "manifest.json"),
133
- content: JSON.stringify(bpManifest, null, 2),
134
- type: "file",
135
- });
136
- }
137
- if (config.extensions.includes("resource")) {
138
- const rpRoot = path.join(projectRoot, "src", "resource_pack");
139
- files.push({
140
- path: path.join(rpRoot, "pack_icon.png"),
141
- content: "",
142
- type: "copy",
143
- source: path.join(templatesDir, "pack_icon.png"),
144
- });
145
- const rpManifest = {
146
- ...baseManifest,
147
- header: {
148
- ...baseManifest.header,
149
- uuid: config.uuids.resource,
150
- },
151
- modules: [
152
- {
153
- type: "resources",
154
- uuid: crypto.randomUUID(),
155
- version: [1, 0, 0],
156
- },
157
- ],
158
- dependencies: [],
159
- };
160
- if (config.extensions.includes("behavior")) {
161
- rpManifest.dependencies = [
162
- {
163
- uuid: config.uuids.behavior,
164
- version: [1, 0, 0],
165
- }
166
- ];
167
- }
168
- files.push({
169
- path: path.join(rpRoot, "manifest.json"),
170
- content: JSON.stringify(rpManifest, null, 2),
171
- type: "file",
172
- });
173
- }
174
- if (!config.script?.enabled) {
175
- files.push({
176
- path: path.join(projectRoot, "package.json"),
177
- content: JSON.stringify({
178
- scripts: {
179
- "build:zip": "mcbepack build -o zip",
180
- "build:mcpack": "mcbepack build -o mcpack",
181
- "build:mcaddon": "mcbepack build -o mcaddon",
182
- },
183
- devDependencies: {
184
- "@mcbepack/cli": "latest"
185
- }
186
- }, null, 2),
187
- type: "file",
188
- });
189
- }
190
- return files;
191
- }
@@ -1,54 +0,0 @@
1
- # MCBEPACK Project
2
-
3
- This add-on was created with `create-mcbepack`.
4
-
5
- ## Start
6
-
7
- Install dependencies:
8
-
9
- ```bash
10
- bun install
11
- ```
12
-
13
- Run the development watcher:
14
-
15
- ```bash
16
- bun run dev
17
- ```
18
-
19
- The dev command compiles Script API code from `scripts/` when present and syncs files from `src/behavior_pack` and `src/resource_pack` into Minecraft's development folders.
20
-
21
- ## Build
22
-
23
- ```bash
24
- bun run build:zip
25
- bun run build:mcpack
26
- bun run build:mcaddon
27
- ```
28
-
29
- Build outputs are written to `dist/`.
30
-
31
- ## Configure Minecraft Paths
32
-
33
- Edit `.env.local` if your Minecraft Bedrock installation uses a different location:
34
-
35
- ```env
36
- BASE_PATH="C:\Users\YourName\AppData\Roaming\Minecraft Bedrock\Users\Shared\games\com.mojang"
37
- RESOURCE_PATH="development_resource_packs"
38
- BEHAVIOR_PATH="development_behavior_packs"
39
- ```
40
-
41
- ## Project Structure
42
-
43
- ```text
44
- .
45
- |-- scripts/
46
- |-- src/
47
- | |-- behavior_pack/
48
- | `-- resource_pack/
49
- |-- .env.local
50
- |-- package.json
51
- `-- tsconfig.json
52
- ```
53
-
54
- Some folders only exist when they were selected during project creation.