create-mcbe 0.1.0-beta.4 → 0.1.0-beta.5

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
@@ -34,6 +34,12 @@ Use `--json` when an agent needs machine-readable output:
34
34
  npm create mcbe@latest my-addon -- --template bepack-addon --yes --install --json
35
35
  ```
36
36
 
37
+ Create a gameplay-ready behavior pack and resource pack with a player-join starter:
38
+
39
+ ```bash
40
+ npm create mcbe@latest my-game -- --template begame --yes
41
+ ```
42
+
37
43
  ## Templates
38
44
 
39
45
  | Template | Description |
@@ -41,6 +47,7 @@ npm create mcbe@latest my-addon -- --template bepack-addon --yes --install --jso
41
47
  | `sapi-pro` | SAPI-Pro behavior pack with the built-in `sapi-pro` BePack plugin |
42
48
  | `bepack-behavior` | TypeScript behavior pack managed by BePack |
43
49
  | `bepack-addon` | TypeScript behavior pack and resource pack managed by BePack |
50
+ | `begame` | Gameplay-ready TypeScript add-on with behavior and resource packs managed by BePack |
44
51
  | `behavior-pack` | Data-only behavior pack without scripts or build tools |
45
52
  | `resource-pack` | Data-only resource pack without scripts or build tools |
46
53
 
@@ -50,6 +57,8 @@ List available templates:
50
57
  npm create mcbe@latest -- --list-templates
51
58
  ```
52
59
 
60
+ BePack templates generate a `dev` script that copies into the Minecraft development folder. On Windows the generated `bepack.config.ts` sets `copy: { defaultTarget: "win" }` (the same default `bepack init` writes), so `npm run dev` works immediately. BePack's built-in copy targets are Windows-only paths, so on macOS and Linux no copy target is written and the `--copy` flag is dropped from the script — add `copy.targets` (plus `--copy`) once you have a destination.
61
+
53
62
  ## Common options
54
63
 
55
64
  - `--template <id>`: Select a template.
package/dist/index.js CHANGED
@@ -46,8 +46,8 @@ ${o}${e}
46
46
  `}case`submit`:{let e=o?`${n?` `:``}${t(`dim`,o)}`:``;return`${r}${n?t(`gray`,R):``}${e}`}case`cancel`:{let e=o?` ${t([`strikethrough`,`dim`],o)}`:``,i=n?t(`gray`,R):``;return`${r}${i}${e}${o.trim()?`
47
47
  ${i}`:``}`}default:return`${r}${n?`${t(`cyan`,R)} `:``}${a}
48
48
  ${n?t(`cyan`,z):``}
49
- `}}}).prompt();let G=!0;const K=typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};let ze=0;if(K.process&&K.process.env&&K.process.stdout){let{FORCE_COLOR:e,NODE_DISABLE_COLORS:t,NO_COLOR:n,TERM:r,COLORTERM:i}=K.process.env;G=t||n||e===`0`?!1:e===`1`||e===`2`||e===`3`?!0:r===`dumb`?!1:`CI`in K.process.env&&[`TRAVIS`,`CIRCLECI`,`APPVEYOR`,`GITLAB_CI`,`GITHUB_ACTIONS`,`BUILDKITE`,`DRONE`].some(e=>e in K.process.env)?!0:process.stdout.isTTY,G&&(ze=process.platform===`win32`||i&&(i===`truecolor`||i===`24bit`)?3:r&&(r.endsWith(`-256color`)||r.endsWith(`256`))?2:1)}let Be={enabled:G,supportLevel:ze};function q(e,t,n=1){let r=`\x1b[${e}m`,i=`\x1b[${t}m`,a=RegExp(`\\x1b\\[${t}m`,`g`);return e=>Be.enabled&&Be.supportLevel>=n?r+(``+e).replace(a,r)+i:``+e}q(0,0);const Ve=q(1,22),He=q(2,22);q(3,23),q(4,24),q(7,27),q(8,28),q(9,29),q(30,39);const Ue=q(31,39),We=q(32,39);q(33,39),q(34,39),q(35,39);const Ge=q(36,39);q(97,39),q(90,39),q(37,39),q(91,39),q(92,39),q(93,39),q(94,39),q(95,39),q(96,39),q(40,49),q(41,49),q(42,49),q(43,49),q(44,49),q(45,49),q(46,49),q(107,49),q(100,49),q(101,49),q(102,49),q(103,49),q(104,49),q(105,49),q(106,49),q(47,49);async function J(e){try{return await s.access(e),!0}catch{return!1}}async function Ke(e){if(!await J(e))return!0;let t=await s.readdir(e);return t.length===0||t.every(e=>e===`.git`)}async function qe(e){await s.mkdir(e,{recursive:!0});let t=await s.readdir(e);await Promise.all(t.map(async t=>{t!==`.git`&&await s.rm(o.join(e,t),{recursive:!0,force:!0})}))}async function Je(e,t){await s.mkdir(t,{recursive:!0});let n=await s.readdir(e,{withFileTypes:!0});for(let r of n){if(r.name===`.DS_Store`)continue;let n=o.join(e,r.name),i=o.join(t,Ye(r.name));if(r.isDirectory())await Je(n,i);else if(r.isFile())await s.mkdir(o.dirname(i),{recursive:!0}),await s.copyFile(n,i);else if(r.isSymbolicLink()){let e=await s.readlink(n);await s.symlink(e,i)}}}function Ye(e){return e===`_gitignore`?`.gitignore`:e===`_npmrc`?`.npmrc`:e}function Xe(){let e=process.env.npm_config_user_agent||``;return e.startsWith(`pnpm`)?`pnpm`:e.startsWith(`yarn`)?`yarn`:e.startsWith(`bun`)?`bun`:`npm`}function Ze(e){return{npm:`npm@11`,pnpm:`pnpm@9`,yarn:`yarn@1.22`,bun:`bun@1`}[e]}function Qe(e,t){return e===`npm`?`npm run ${t}`:e===`yarn`?`yarn ${t}`:e===`bun`?`bun run ${t}`:`pnpm ${t}`}async function $e(e,t){await Y(e,e===`yarn`?[]:[`install`],t)}async function et(e,t){for(let n of e)await Y(`npx`,[`--yes`,`skills@latest`,`add`,n,`--copy`,`--yes`],t)}function tt(e){return e.map(e=>`npx --yes skills@latest add ${e} --copy --yes`).join(` && `)}async function nt(e){await Y(`git`,[`init`],e)}function Y(e,t,n){return new Promise((r,i)=>{let a=c(e,t,{cwd:n,stdio:`ignore`,shell:process.platform===`win32`});a.on(`error`,i),a.on(`close`,n=>{n===0?r():i(/* @__PURE__ */ Error(`${e} ${t.join(` `)} failed with code ${n}`))})})}function rt(e){return e.trim().replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/\s+/g,`-`).replace(/_/g,`-`).toLowerCase().replace(/[^a-z0-9@/.-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)||`mcbe-addon`}function it(e){let t=e.trim(),n=t.toLowerCase().replace(/([a-z])([A-Z])/g,`$1_$2`).replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`mcbe_${at(t)}`;return`${/^[a-z]/.test(n)?n:`mcbe_${n}`}_${l.randomBytes(3).toString(`hex`)}`}function at(e){return l.createHash(`sha1`).update(e,`utf8`).digest(`hex`).slice(0,8)}async function ot(e){let t=await s.readFile(e,`utf8`);return JSON.parse(t)}async function st(e,t){await s.writeFile(e,`${JSON.stringify(t,null,2)}\n`,`utf8`)}async function ct(e,t){let n=await ot(e);return await t(n),await st(e,n),n}async function X(e){let t=[[o.join(e.root,`bp`,`manifest.json`),`BP`],[o.join(e.root,`rp`,`manifest.json`),`RP`],[o.join(e.root,`manifest.json`),e.template.id===`resource-pack`?`RP`:`BP`]];for(let[n,r]of t)await J(n)&&await ct(n,t=>{t.header.name=`${e.projectName} ${r}`,t.header.description=`${e.projectName} ${r.toLowerCase()}`,t.header.uuid=l.randomUUID();for(let e of t.modules??[])e.uuid=l.randomUUID()})}async function lt(e,t){await X(e);let n=JSON.parse(await s.readFile(o.join(e.root,t.bpRoot,`manifest.json`),`utf8`)),r=t.rpRoot?JSON.parse(await s.readFile(o.join(e.root,t.rpRoot,`manifest.json`),`utf8`)):void 0,i=n.modules?.find(e=>e.type===`script`);t.namespace&&await ut(e,it(e.projectName));let a={name:e.packageName,version:`1.0.0`,description:`${e.projectName} Bedrock add-on`,target:`latest`,packs:{bp:{root:t.bpRoot,uuid:n.header.uuid,...i?.uuid?{moduleUuid:i.uuid}:{},compile:{entry:`src/main.ts`},dependencies:t.dependencies??{"@minecraft/server":`stable`}},...r?{rp:{root:t.rpRoot,uuid:r.header.uuid,moduleUuid:r.modules?.[0]?.uuid}}:{}},pack:{outDir:`dist`},...t.replaceBuiltins?{replace:{builtins:{NAME:!0,DESCRIPTION:!0,VERSION:!0,UUID:!0}}}:{}};await s.writeFile(o.join(e.root,`bepack.config.ts`),dt(a,t.plugin,e.installBepack),`utf8`)}async function ut(e,t){let n=o.join(e.root,`src`,`main.ts`);if(!await J(n))return;let r=await s.readFile(n,`utf8`);await s.writeFile(n,r.replaceAll(`**NAMESPACE**`,t),`utf8`)}function dt(e,t,n){let r=JSON.stringify(e,null,2).replace(/\n( +)"([a-zA-Z_$][a-zA-Z0-9_$]*)": /g,`
50
- $1$2: `),i=t?r.replace(/^\{\n/,n?`{\n plugins: [${t.call}],\n`:`{\n plugins: ['${t.name}'],\n`):r,a=n&&t?`import { defineConfig, ${t.importName} } from '@bepack/cli';`:n?`import { defineConfig } from '@bepack/cli';`:``,o=n?`defineConfig(${i})`:i;return`${a?`${a}\n\n`:``}export default ${o};\n`}function Z(e){let{id:t,title:n,description:r,templateDir:i,skills:a,...o}=e;return{id:t,title:n,description:r,templateDir:i,defaultPackageManager:`npm`,skills:a,workflow:`bepack`,prepare:e=>lt(e,o)}}const Q=[Z({id:`sapi-pro`,title:`SAPI-Pro + BEPack`,description:`SAPI-Pro behavior pack managed and packed by BEPack.`,templateDir:`sapi-pro`,bpRoot:`.`,dependencies:{"@minecraft/server":`stable`,"@minecraft/server-ui":`stable`,"@minecraft/vanilla-data":`stable`,"sapi-pro":`stable`},plugin:{name:`sapi-pro`,importName:`sapiPro`,call:`sapiPro()`},replaceBuiltins:!0,namespace:!0}),Z({id:`bepack-behavior`,title:`BEPack Behavior Pack`,description:`TypeScript Script API behavior pack built and packed by BEPack.`,templateDir:`bepack-behavior`,bpRoot:`.`}),Z({id:`bepack-addon`,title:`BEPack Add-on (BP + RP)`,description:`TypeScript behavior pack plus resource pack, managed by BEPack.`,templateDir:`bepack-addon`,bpRoot:`bp`,rpRoot:`rp`}),{id:`behavior-pack`,title:`Behavior Pack`,description:`Simple behavior pack without scripts or build tools.`,templateDir:`behavior-pack`,prepare:X},{id:`resource-pack`,title:`Resource Pack`,description:`Simple resource pack without scripts or build tools.`,templateDir:`resource-pack`,prepare:X}];function ft(e){return o.join(e,`package.json`)}async function pt(e,t){return ct(ft(e),t)}async function mt(e,t){return pt(e,e=>{e.name=t.name,t.packageManager&&(e.packageManager=Ze(t.packageManager))})}const ht=o.resolve(o.dirname(u(import.meta.url)),`..`);async function gt(e){let t=await _t(e);bt(t);let n=await vt(e),r=await yt(e,n),i=o.resolve(e.cwd,t),a=e.packageManager||n.defaultPackageManager||`npm`,s={cli:e,cwd:e.cwd,root:i,projectName:t,packageName:rt(t),template:n,packageManager:a,installBepack:r,templateOptions:n.defaultOptions??{}};await xt(s),await Je(o.resolve(ht,`templates`,n.templateDir),i),await J(o.join(i,`package.json`))&&(await mt(i,{name:s.packageName,packageManager:a}),n.workflow===`bepack`&&!r&&await Tt(i)),await n.prepare?.(s);let c=!1;e.git&&(await nt(i),c=!0);let l=!1,u=!1;if(e.install){await J(o.join(i,`package.json`))&&(n.workflow===`bepack`&&r?(await $e(a,i),await wt(a,`bepack:install`,i)):n.workflow===`bepack`?await Y(`bepack`,[`install`],i):await $e(a,i),l=!0);let t=Ct(n.skills);!e.skipSkillsInstall&&t.length>0&&(await et(t,i),u=!0)}return{root:i,projectName:t,template:n.id,packageManager:a,installedDependencies:l,installedSkills:u,initializedGit:c,warnings:[],nextSteps:St(s,l,u||e.skipSkillsInstall)}}async function _t(e){if(e.projectName)return e.projectName;if(e.yes||!process.stdin.isTTY)return`mcbe-addon`;let t=await Re({message:`Project name`,placeholder:`my-addon`,defaultValue:`my-addon`,validate(e){if(!e?.trim())return`Project name is required.`}});if(j(t))throw t;return String(t)}async function vt(e){if(e.template){let t=Q.find(t=>t.id===e.template);if(!t)throw Error(`Unknown template "${e.template}". Available: ${Q.map(e=>e.id).join(`, `)}`);return t}if(e.yes||!process.stdin.isTTY)return Q[0];let t=await W({message:`Select a template`,options:Q.map(e=>({value:e.id,label:e.title,hint:e.description}))});if(j(t))throw t;return Q.find(e=>e.id===String(t))}async function yt(e,t){if(t.workflow!==`bepack`)return!1;if(e.installBepack!==void 0)return e.installBepack;if(e.yes||!process.stdin.isTTY)return!0;let n=await Pe({message:`Install BEPack in this project?`,initialValue:!0});if(j(n))throw n;return!!n}function bt(e){if(!e.trim()||e===`.`||e===`..`||o.isAbsolute(e))throw Error(`Project name must be a non-empty relative child directory, not . or an absolute path.`);let t=o.normalize(e);if(t===`..`||t.startsWith(`..${o.sep}`))throw Error(`Project name cannot escape the working directory.`)}async function xt(e){if(!await J(e.root)){await s.mkdir(e.root,{recursive:!0});return}if(await Ke(e.root))return;if(e.cli.force){await qe(e.root);return}if(e.cli.yes||!process.stdin.isTTY)throw Error(`Target directory is not empty: ${e.root}. Use --force to overwrite.`);let t=await W({message:`Target directory ${e.projectName} is not empty`,options:[{value:`cancel`,label:`Cancel`},{value:`overwrite`,label:`Overwrite`}]});if(j(t)||t===`cancel`)throw Error(`Cancelled.`);await qe(e.root)}function St(e,t,n){let r=[`cd ${o.relative(process.cwd(),e.root)||`.`}`];if(e.template.workflow===`bepack`&&(e.installBepack&&!t?(r.push(`${e.packageManager} install`),r.push(Qe(e.packageManager,`bepack:install`))):e.installBepack||r.push(`bepack install`),r.push(Qe(e.packageManager,`build`))),!n){let t=Ct(e.template.skills);t.length>0&&r.push(tt(t))}return r}function Ct(e){return(Array.isArray(e)?e:e?[e]:[]).map(e=>e.trim()).filter(Boolean)}async function wt(e,t,n){return e===`npm`?Y(`npm`,[`run`,t],n):e===`pnpm`?Y(`pnpm`,[t],n):e===`yarn`?Y(`yarn`,[t],n):Y(`bun`,[`run`,t],n)}async function Tt(e){let t=o.join(e,`package.json`),n=JSON.parse(await s.readFile(t,`utf8`));n.devDependencies&&delete n.devDependencies[`@bepack/cli`],n.scripts&&delete n.scripts[`bepack:install`],await s.writeFile(t,`${JSON.stringify(n,null,2)}\n`,`utf8`)}var Et=/* @__PURE__ */ y((/* @__PURE__ */ _(((e,t)=>{function n(e){return e==null?[]:Array.isArray(e)?e:[e]}function r(e,t,n,r){var i,a=e[t],o=~r.string.indexOf(t)?n==null||n===!0?``:String(n):typeof n==`boolean`?n:~r.boolean.indexOf(t)?n===`false`?!1:n===`true`||(e._.push((i=+n,i*0==0?i:n)),!!n):(i=+n,i*0==0?i:n);e[t]=a==null?o:Array.isArray(a)?a.concat(o):[a,o]}t.exports=function(e,t){e||=[],t||={};var i,a,o,s,c,l={_:[]},u=0,d=0,f=0,p=e.length;let m=t.alias!==void 0,h=t.unknown!==void 0,g=t.default!==void 0;if(t.alias=t.alias||{},t.string=n(t.string),t.boolean=n(t.boolean),m)for(i in t.alias)for(a=t.alias[i]=n(t.alias[i]),u=0;u<a.length;u++)(t.alias[a[u]]=a.concat(i)).splice(u,1);for(u=t.boolean.length;u-->0;)for(a=t.alias[t.boolean[u]]||[],d=a.length;d-->0;)t.boolean.push(a[d]);for(u=t.string.length;u-->0;)for(a=t.alias[t.string[u]]||[],d=a.length;d-->0;)t.string.push(a[d]);if(g){for(i in t.default)if(s=typeof t.default[i],a=t.alias[i]=t.alias[i]||[],t[s]!==void 0)for(t[s].push(i),u=0;u<a.length;u++)t[s].push(a[u])}let _=h?Object.keys(t.alias):[];for(u=0;u<p;u++){if(o=e[u],o===`--`){l._=l._.concat(e.slice(++u));break}for(d=0;d<o.length&&o.charCodeAt(d)===45;d++);if(d===0)l._.push(o);else if(o.substring(d,d+3)===`no-`){if(s=o.substring(d+3),h&&!~_.indexOf(s))return t.unknown(o);l[s]=!1}else{for(f=d+1;f<o.length&&o.charCodeAt(f)!==61;f++);for(s=o.substring(d,f),c=o.substring(++f)||u+1===p||(``+e[u+1]).charCodeAt(0)===45||e[++u],a=d===2?[s]:s,f=0;f<a.length;f++){if(s=a[f],h&&!~_.indexOf(s))return t.unknown(`-`.repeat(d)+s);r(l,s,f+1<a.length||c,t)}}}if(g)for(i in t.default)l[i]===void 0&&(l[i]=t.default[i]);if(m)for(i in l)for(a=t.alias[i]||[];a.length>0;)l[a.shift()]=l[i];return l}})))(),1);const Dt=/* @__PURE__ */ new Set([`npm`,`pnpm`,`yarn`,`bun`]);function Ot(e=[]){let t=(0,Et.default)(e,{alias:{h:`help`,v:`version`,t:`template`},boolean:[`help`,`version`,`yes`,`force`,`install`,`skip-skills-install`,`install-bepack`,`skip-bepack-install`,`git`,`json`,`list-templates`],string:[`template`,`pm`,`cwd`],default:{install:!1,git:!1}}),n=String(t.pm||Xe());if(!Dt.has(n))throw Error(`Unknown package manager: ${n}`);if(t[`install-bepack`]&&t[`skip-bepack-install`])throw Error(`--install-bepack and --skip-bepack-install cannot be used together.`);let r=Array.isArray(t._)?t._.find(Boolean):void 0;return{cwd:o.resolve(String(t.cwd||process.cwd())),projectName:r===void 0?void 0:String(r),template:t.template?String(t.template):void 0,packageManager:n,yes:!!t.yes,force:!!t.force,install:!!t.install,skipSkillsInstall:!!t[`skip-skills-install`],installBepack:t[`skip-bepack-install`]?!1:t[`install-bepack`]?!0:void 0,git:!!t.git,json:!!t.json,listTemplates:!!t[`list-templates`],help:!!t.help,version:!!t.version}}const $=e(import.meta.url)(`../package.json`);async function kt(e=process.argv.slice(2)){let t;try{if(t=Ot(e),t.help)return console.log(jt());if(t.version)return console.log($.version);if(t.listTemplates)return console.log(Q.map(e=>`${Ge(e.id.padEnd(18))} ${e.description}`).join(`
51
- `));let n=await gt(t);if(t.json)return console.log(JSON.stringify({ok:!0,result:n},null,2));At(n)}catch(n){let r=n instanceof Error?n.message:String(n),i=j(n);t?.json||e.includes(`--json`)?console.log(JSON.stringify({ok:!1,error:i?`cancelled`:r},null,2)):i?Fe(`Cancelled.`):console.error(Ue(`Error: ${r}`)),process.exitCode=1}}function At(e){Ie(`${We(`Created`)} ${Ve(e.projectName)}`),console.log(He(`\nTemplate: ${e.template}`)),console.log(`
52
- Next steps:`);for(let t of e.nextSteps)console.log(` ${t}`)}function jt(){return`\n${[`${Ve(`create-mcbe`)} ${He(`v${$.version}`)}`,``,`Usage:`,` npm create mcbe@latest [project-name] -- [options]`,``,`Options:`,` --template <id> Template id`,` --pm <npm|pnpm|yarn|bun>`,` --yes Use defaults`,` --force Overwrite a non-empty target directory`,` --install Install dependencies after creation`,` --skip-skills-install Skip template skills installation`,` --install-bepack Install BEPack in the project`,` --skip-bepack-install Use global BEPack instead`,` --git Initialize git`,` --cwd <dir> Working directory`,` --json Machine-readable output`,` --list-templates List templates`,` -h, --help Show help`,` -v, --version Show version`,``,`Templates:`,...Q.map(e=>` ${e.id.padEnd(18)} ${e.description}`)].join(`
53
- `)}\n`}await kt();export{};
49
+ `}}}).prompt();let G=!0;const K=typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};let ze=0;if(K.process&&K.process.env&&K.process.stdout){let{FORCE_COLOR:e,NODE_DISABLE_COLORS:t,NO_COLOR:n,TERM:r,COLORTERM:i}=K.process.env;G=t||n||e===`0`?!1:e===`1`||e===`2`||e===`3`?!0:r===`dumb`?!1:`CI`in K.process.env&&[`TRAVIS`,`CIRCLECI`,`APPVEYOR`,`GITLAB_CI`,`GITHUB_ACTIONS`,`BUILDKITE`,`DRONE`].some(e=>e in K.process.env)?!0:process.stdout.isTTY,G&&(ze=process.platform===`win32`||i&&(i===`truecolor`||i===`24bit`)?3:r&&(r.endsWith(`-256color`)||r.endsWith(`256`))?2:1)}let Be={enabled:G,supportLevel:ze};function q(e,t,n=1){let r=`\x1b[${e}m`,i=`\x1b[${t}m`,a=RegExp(`\\x1b\\[${t}m`,`g`);return e=>Be.enabled&&Be.supportLevel>=n?r+(``+e).replace(a,r)+i:``+e}q(0,0);const Ve=q(1,22),He=q(2,22);q(3,23),q(4,24),q(7,27),q(8,28),q(9,29),q(30,39);const Ue=q(31,39),We=q(32,39);q(33,39),q(34,39),q(35,39);const Ge=q(36,39);q(97,39),q(90,39),q(37,39),q(91,39),q(92,39),q(93,39),q(94,39),q(95,39),q(96,39),q(40,49),q(41,49),q(42,49),q(43,49),q(44,49),q(45,49),q(46,49),q(107,49),q(100,49),q(101,49),q(102,49),q(103,49),q(104,49),q(105,49),q(106,49),q(47,49);async function J(e){try{return await s.access(e),!0}catch{return!1}}async function Ke(e){if(!await J(e))return!0;let t=await s.readdir(e);return t.length===0||t.every(e=>e===`.git`)}async function qe(e){await s.mkdir(e,{recursive:!0});let t=await s.readdir(e);await Promise.all(t.map(async t=>{t!==`.git`&&await s.rm(o.join(e,t),{recursive:!0,force:!0})}))}async function Je(e,t){await s.mkdir(t,{recursive:!0});let n=await s.readdir(e,{withFileTypes:!0});for(let r of n){if(r.name===`.DS_Store`)continue;let n=o.join(e,r.name),i=o.join(t,Ye(r.name));if(r.isDirectory())await Je(n,i);else if(r.isFile())await s.mkdir(o.dirname(i),{recursive:!0}),await s.copyFile(n,i);else if(r.isSymbolicLink()){let e=await s.readlink(n);await s.symlink(e,i)}}}function Ye(e){return e===`_gitignore`?`.gitignore`:e===`_npmrc`?`.npmrc`:e}function Xe(){let e=process.env.npm_config_user_agent||``;return e.startsWith(`pnpm`)?`pnpm`:e.startsWith(`yarn`)?`yarn`:e.startsWith(`bun`)?`bun`:`npm`}function Ze(e){return{npm:`npm@11`,pnpm:`pnpm@9`,yarn:`yarn@1.22`,bun:`bun@1`}[e]}function Qe(e,t){return e===`npm`?`npm run ${t}`:e===`yarn`?`yarn ${t}`:e===`bun`?`bun run ${t}`:`pnpm ${t}`}async function $e(e,t){await Y(e,e===`yarn`?[]:[`install`],t)}async function et(e,t){for(let n of e)await Y(`npx`,[`--yes`,`skills@latest`,`add`,n,`--copy`,`--yes`],t)}function tt(e){return e.map(e=>`npx --yes skills@latest add ${e} --copy --yes`).join(` && `)}async function nt(e){await Y(`git`,[`init`],e)}function Y(e,t,n){return new Promise((r,i)=>{let a=c(e,t,{cwd:n,stdio:`ignore`,shell:process.platform===`win32`});a.on(`error`,i),a.on(`close`,n=>{n===0?r():i(/* @__PURE__ */ Error(`${e} ${t.join(` `)} failed with code ${n}`))})})}function rt(e){return e.trim().replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/\s+/g,`-`).replace(/_/g,`-`).toLowerCase().replace(/[^a-z0-9@/.-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)||`mcbe-addon`}function it(e){let t=e.trim(),n=t.toLowerCase().replace(/([a-z])([A-Z])/g,`$1_$2`).replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`mcbe_${at(t)}`;return`${/^[a-z]/.test(n)?n:`mcbe_${n}`}_${l.randomBytes(3).toString(`hex`)}`}function at(e){return l.createHash(`sha1`).update(e,`utf8`).digest(`hex`).slice(0,8)}async function ot(e){let t=await s.readFile(e,`utf8`);return JSON.parse(t)}async function st(e,t){await s.writeFile(e,`${JSON.stringify(t,null,2)}\n`,`utf8`)}async function ct(e,t){let n=await ot(e);return await t(n),await st(e,n),n}function lt(e){return o.join(e,`package.json`)}async function ut(e,t){return ct(lt(e),t)}async function dt(e,t){return ut(e,e=>{e.name=t.name,t.packageManager&&(e.packageManager=Ze(t.packageManager))})}async function X(e){let t=[[o.join(e.root,`bp`,`manifest.json`),`BP`],[o.join(e.root,`rp`,`manifest.json`),`RP`],[o.join(e.root,`manifest.json`),e.template.id===`resource-pack`?`RP`:`BP`]];for(let[n,r]of t)await J(n)&&await ct(n,t=>{t.header.name=`${e.projectName} ${r}`,t.header.description=`${e.projectName} ${r.toLowerCase()}`,t.header.uuid=l.randomUUID();for(let e of t.modules??[])e.uuid=l.randomUUID()})}function ft(e=process.platform){return e===`win32`?`win`:void 0}async function pt(e,t){await X(e);let n=JSON.parse(await s.readFile(o.join(e.root,t.bpRoot,`manifest.json`),`utf8`)),r=t.rpRoot?JSON.parse(await s.readFile(o.join(e.root,t.rpRoot,`manifest.json`),`utf8`)):void 0,i=n.modules?.find(e=>e.type===`script`);t.namespace&&await ht(e,it(e.projectName));let a=ft(),c={name:e.packageName,version:`1.0.0`,description:`${e.projectName} Bedrock add-on`,target:`latest`,packs:{bp:{root:t.bpRoot,uuid:n.header.uuid,...i?.uuid?{moduleUuid:i.uuid}:{},compile:{entry:`src/main.ts`},dependencies:t.dependencies??{"@minecraft/server":`stable`}},...r?{rp:{root:t.rpRoot,uuid:r.header.uuid,moduleUuid:r.modules?.[0]?.uuid}}:{}},pack:{outDir:`dist`},...a?{copy:{defaultTarget:a}}:{},...t.replaceBuiltins?{replace:{builtins:{NAME:!0,DESCRIPTION:!0,VERSION:!0,UUID:!0}}}:{}};await s.writeFile(o.join(e.root,`bepack.config.ts`),gt(c,t.plugin,e.installBepack),`utf8`),a||await mt(e.root)}async function mt(e){await J(o.join(e,`package.json`))&&await ut(e,e=>{let t=e.scripts?.dev;if(!t)return;let n=t.replace(/\s*--copy\b/,``).trim();n&&n!==t&&(e.scripts.dev=n)})}async function ht(e,t){let n=o.join(e.root,`src`,`main.ts`);if(!await J(n))return;let r=await s.readFile(n,`utf8`);await s.writeFile(n,r.replaceAll(`**NAMESPACE**`,t),`utf8`)}function gt(e,t,n){let r=JSON.stringify(e,null,2).replace(/\n( +)"([a-zA-Z_$][a-zA-Z0-9_$]*)": /g,`
50
+ $1$2: `),i=t?r.replace(/^\{\n/,n?`{\n plugins: [${t.call}],\n`:`{\n plugins: ['${t.name}'],\n`):r,a=n&&t?`import { defineConfig, ${t.importName} } from '@bepack/cli';`:n?`import { defineConfig } from '@bepack/cli';`:``,o=n?`defineConfig(${i})`:i;return`${a?`${a}\n\n`:``}export default ${o};\n`}function Z(e){let{id:t,title:n,description:r,templateDir:i,skills:a,...o}=e;return{id:t,title:n,description:r,templateDir:i,defaultPackageManager:`npm`,skills:a,workflow:`bepack`,prepare:e=>pt(e,o)}}const Q=[Z({id:`sapi-pro`,title:`SAPI-Pro + BEPack`,description:`SAPI-Pro behavior pack managed and packed by BEPack.`,templateDir:`sapi-pro`,bpRoot:`.`,dependencies:{"@minecraft/server":`stable`,"@minecraft/server-ui":`stable`,"@minecraft/vanilla-data":`stable`,"sapi-pro":`stable`},plugin:{name:`sapi-pro`,importName:`sapiPro`,call:`sapiPro()`},replaceBuiltins:!0,namespace:!0}),Z({id:`bepack-behavior`,title:`BEPack Behavior Pack`,description:`TypeScript Script API behavior pack built and packed by BEPack.`,templateDir:`bepack-behavior`,bpRoot:`.`}),Z({id:`bepack-addon`,title:`BEPack Add-on (BP + RP)`,description:`TypeScript behavior pack plus resource pack, managed by BEPack.`,templateDir:`bepack-addon`,bpRoot:`bp`,rpRoot:`rp`}),Z({id:`begame`,title:`BEGame (BP + RP)`,description:`Gameplay-ready TypeScript add-on with behavior and resource packs, managed by BEPack.`,templateDir:`begame`,bpRoot:`bp`,rpRoot:`rp`}),{id:`behavior-pack`,title:`Behavior Pack`,description:`Simple behavior pack without scripts or build tools.`,templateDir:`behavior-pack`,prepare:X},{id:`resource-pack`,title:`Resource Pack`,description:`Simple resource pack without scripts or build tools.`,templateDir:`resource-pack`,prepare:X}],_t=o.resolve(o.dirname(u(import.meta.url)),`..`);async function vt(e){let t=await yt(e);St(t);let n=await bt(e),r=await xt(e,n),i=o.resolve(e.cwd,t),a=e.packageManager||n.defaultPackageManager||`npm`,s={cli:e,cwd:e.cwd,root:i,projectName:t,packageName:rt(t),template:n,packageManager:a,installBepack:r,templateOptions:n.defaultOptions??{}};await Ct(s),await Je(o.resolve(_t,`templates`,n.templateDir),i),await J(o.join(i,`package.json`))&&(await dt(i,{name:s.packageName,packageManager:a}),n.workflow===`bepack`&&!r&&await Dt(i)),await n.prepare?.(s);let c=!1;e.git&&(await nt(i),c=!0);let l=!1,u=!1;if(e.install){await J(o.join(i,`package.json`))&&(n.workflow===`bepack`&&r?(await $e(a,i),await Et(a,`bepack:install`,i)):n.workflow===`bepack`?await Y(`bepack`,[`install`],i):await $e(a,i),l=!0);let t=Tt(n.skills);!e.skipSkillsInstall&&t.length>0&&(await et(t,i),u=!0)}return{root:i,projectName:t,template:n.id,packageManager:a,installedDependencies:l,installedSkills:u,initializedGit:c,warnings:[],nextSteps:wt(s,l,u||e.skipSkillsInstall)}}async function yt(e){if(e.projectName)return e.projectName;if(e.yes||!process.stdin.isTTY)return`mcbe-addon`;let t=await Re({message:`Project name`,placeholder:`my-addon`,defaultValue:`my-addon`,validate(e){if(!e?.trim())return`Project name is required.`}});if(j(t))throw t;return String(t)}async function bt(e){if(e.template){let t=Q.find(t=>t.id===e.template);if(!t)throw Error(`Unknown template "${e.template}". Available: ${Q.map(e=>e.id).join(`, `)}`);return t}if(e.yes||!process.stdin.isTTY)return Q[0];let t=await W({message:`Select a template`,options:Q.map(e=>({value:e.id,label:e.title,hint:e.description}))});if(j(t))throw t;return Q.find(e=>e.id===String(t))}async function xt(e,t){if(t.workflow!==`bepack`)return!1;if(e.installBepack!==void 0)return e.installBepack;if(e.yes||!process.stdin.isTTY)return!0;let n=await Pe({message:`Install BEPack in this project?`,initialValue:!0});if(j(n))throw n;return!!n}function St(e){if(!e.trim()||e===`.`||e===`..`||o.isAbsolute(e))throw Error(`Project name must be a non-empty relative child directory, not . or an absolute path.`);let t=o.normalize(e);if(t===`..`||t.startsWith(`..${o.sep}`))throw Error(`Project name cannot escape the working directory.`)}async function Ct(e){if(!await J(e.root)){await s.mkdir(e.root,{recursive:!0});return}if(await Ke(e.root))return;if(e.cli.force){await qe(e.root);return}if(e.cli.yes||!process.stdin.isTTY)throw Error(`Target directory is not empty: ${e.root}. Use --force to overwrite.`);let t=await W({message:`Target directory ${e.projectName} is not empty`,options:[{value:`cancel`,label:`Cancel`},{value:`overwrite`,label:`Overwrite`}]});if(j(t)||t===`cancel`)throw Error(`Cancelled.`);await qe(e.root)}function wt(e,t,n){let r=[`cd ${o.relative(process.cwd(),e.root)||`.`}`];if(e.template.workflow===`bepack`&&(e.installBepack&&!t?(r.push(`${e.packageManager} install`),r.push(Qe(e.packageManager,`bepack:install`))):e.installBepack||r.push(`bepack install`),r.push(Qe(e.packageManager,`build`))),!n){let t=Tt(e.template.skills);t.length>0&&r.push(tt(t))}return r}function Tt(e){return(Array.isArray(e)?e:e?[e]:[]).map(e=>e.trim()).filter(Boolean)}async function Et(e,t,n){return e===`npm`?Y(`npm`,[`run`,t],n):e===`pnpm`?Y(`pnpm`,[t],n):e===`yarn`?Y(`yarn`,[t],n):Y(`bun`,[`run`,t],n)}async function Dt(e){let t=o.join(e,`package.json`),n=JSON.parse(await s.readFile(t,`utf8`));n.devDependencies&&delete n.devDependencies[`@bepack/cli`],n.scripts&&delete n.scripts[`bepack:install`],await s.writeFile(t,`${JSON.stringify(n,null,2)}\n`,`utf8`)}var Ot=/* @__PURE__ */ y((/* @__PURE__ */ _(((e,t)=>{function n(e){return e==null?[]:Array.isArray(e)?e:[e]}function r(e,t,n,r){var i,a=e[t],o=~r.string.indexOf(t)?n==null||n===!0?``:String(n):typeof n==`boolean`?n:~r.boolean.indexOf(t)?n===`false`?!1:n===`true`||(e._.push((i=+n,i*0==0?i:n)),!!n):(i=+n,i*0==0?i:n);e[t]=a==null?o:Array.isArray(a)?a.concat(o):[a,o]}t.exports=function(e,t){e||=[],t||={};var i,a,o,s,c,l={_:[]},u=0,d=0,f=0,p=e.length;let m=t.alias!==void 0,h=t.unknown!==void 0,g=t.default!==void 0;if(t.alias=t.alias||{},t.string=n(t.string),t.boolean=n(t.boolean),m)for(i in t.alias)for(a=t.alias[i]=n(t.alias[i]),u=0;u<a.length;u++)(t.alias[a[u]]=a.concat(i)).splice(u,1);for(u=t.boolean.length;u-->0;)for(a=t.alias[t.boolean[u]]||[],d=a.length;d-->0;)t.boolean.push(a[d]);for(u=t.string.length;u-->0;)for(a=t.alias[t.string[u]]||[],d=a.length;d-->0;)t.string.push(a[d]);if(g){for(i in t.default)if(s=typeof t.default[i],a=t.alias[i]=t.alias[i]||[],t[s]!==void 0)for(t[s].push(i),u=0;u<a.length;u++)t[s].push(a[u])}let _=h?Object.keys(t.alias):[];for(u=0;u<p;u++){if(o=e[u],o===`--`){l._=l._.concat(e.slice(++u));break}for(d=0;d<o.length&&o.charCodeAt(d)===45;d++);if(d===0)l._.push(o);else if(o.substring(d,d+3)===`no-`){if(s=o.substring(d+3),h&&!~_.indexOf(s))return t.unknown(o);l[s]=!1}else{for(f=d+1;f<o.length&&o.charCodeAt(f)!==61;f++);for(s=o.substring(d,f),c=o.substring(++f)||u+1===p||(``+e[u+1]).charCodeAt(0)===45||e[++u],a=d===2?[s]:s,f=0;f<a.length;f++){if(s=a[f],h&&!~_.indexOf(s))return t.unknown(`-`.repeat(d)+s);r(l,s,f+1<a.length||c,t)}}}if(g)for(i in t.default)l[i]===void 0&&(l[i]=t.default[i]);if(m)for(i in l)for(a=t.alias[i]||[];a.length>0;)l[a.shift()]=l[i];return l}})))(),1);const kt=/* @__PURE__ */ new Set([`npm`,`pnpm`,`yarn`,`bun`]);function At(e=[]){let t=(0,Ot.default)(e,{alias:{h:`help`,v:`version`,t:`template`},boolean:[`help`,`version`,`yes`,`force`,`install`,`skip-skills-install`,`install-bepack`,`skip-bepack-install`,`git`,`json`,`list-templates`],string:[`template`,`pm`,`cwd`],default:{install:!1,git:!1}}),n=String(t.pm||Xe());if(!kt.has(n))throw Error(`Unknown package manager: ${n}`);if(t[`install-bepack`]&&t[`skip-bepack-install`])throw Error(`--install-bepack and --skip-bepack-install cannot be used together.`);let r=Array.isArray(t._)?t._.find(Boolean):void 0;return{cwd:o.resolve(String(t.cwd||process.cwd())),projectName:r===void 0?void 0:String(r),template:t.template?String(t.template):void 0,packageManager:n,yes:!!t.yes,force:!!t.force,install:!!t.install,skipSkillsInstall:!!t[`skip-skills-install`],installBepack:t[`skip-bepack-install`]?!1:t[`install-bepack`]?!0:void 0,git:!!t.git,json:!!t.json,listTemplates:!!t[`list-templates`],help:!!t.help,version:!!t.version}}const $=e(import.meta.url)(`../package.json`);async function jt(e=process.argv.slice(2)){let t;try{if(t=At(e),t.help)return console.log(Nt());if(t.version)return console.log($.version);if(t.listTemplates)return console.log(Q.map(e=>`${Ge(e.id.padEnd(18))} ${e.description}`).join(`
51
+ `));let n=await vt(t);if(t.json)return console.log(JSON.stringify({ok:!0,result:n},null,2));Mt(n)}catch(n){let r=n instanceof Error?n.message:String(n),i=j(n);t?.json||e.includes(`--json`)?console.log(JSON.stringify({ok:!1,error:i?`cancelled`:r},null,2)):i?Fe(`Cancelled.`):console.error(Ue(`Error: ${r}`)),process.exitCode=1}}function Mt(e){Ie(`${We(`Created`)} ${Ve(e.projectName)}`),console.log(He(`\nTemplate: ${e.template}`)),console.log(`
52
+ Next steps:`);for(let t of e.nextSteps)console.log(` ${t}`)}function Nt(){return`\n${[`${Ve(`create-mcbe`)} ${He(`v${$.version}`)}`,``,`Usage:`,` npm create mcbe@latest [project-name] -- [options]`,``,`Options:`,` --template <id> Template id`,` --pm <npm|pnpm|yarn|bun>`,` --yes Use defaults`,` --force Overwrite a non-empty target directory`,` --install Install dependencies after creation`,` --skip-skills-install Skip template skills installation`,` --install-bepack Install BEPack in the project`,` --skip-bepack-install Use global BEPack instead`,` --git Initialize git`,` --cwd <dir> Working directory`,` --json Machine-readable output`,` --list-templates List templates`,` -h, --help Show help`,` -v, --version Show version`,``,`Templates:`,...Q.map(e=>` ${e.id.padEnd(18)} ${e.description}`)].join(`
53
+ `)}\n`}await jt();export{};
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "create-mcbe",
3
- "version": "0.1.0-beta.4",
3
+ "version": "0.1.0-beta.5",
4
4
  "description": "A small, extensible scaffolder for Minecraft Bedrock Edition projects.",
5
5
  "author": "XiaoYangx666",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/XiaoYangx666/BEPack.git",
9
+ "url": "git+https://github.com/XiaoYangx666/BEPack.git",
10
10
  "directory": "packages/create-mcbe"
11
11
  },
12
12
  "homepage": "https://github.com/XiaoYangx666/BEPack/tree/main/packages/create-mcbe#readme",
13
13
  "type": "module",
14
14
  "bin": {
15
- "create-mcbe": "./dist/index.js"
15
+ "create-mcbe": "dist/index.js"
16
16
  },
17
17
  "files": [
18
18
  "dist",
@@ -0,0 +1,5 @@
1
+ # BEGame starter
2
+
3
+ This project contains a BEPack-managed behavior pack and resource pack. The behavior pack includes a small `@minecraft/server` example that welcomes players on their first spawn.
4
+
5
+ Run `npm run build` to build the packs, or `npm run dev` to copy them into the Minecraft development folder on Windows. On macOS and Linux, configure a copy target in `bepack.config.ts` before using `bepack dev --copy`.
@@ -0,0 +1,5 @@
1
+ node_modules
2
+ dist
3
+ bp/scripts
4
+ *.mcpack
5
+ *.mcaddon
@@ -0,0 +1,19 @@
1
+ {
2
+ "format_version": 2,
3
+ "header": {
4
+ "name": "Behavior Pack",
5
+ "description": "BEGame behavior pack",
6
+ "uuid": "00000000-0000-4000-0000-000000000001",
7
+ "version": [1, 0, 0],
8
+ "min_engine_version": [1, 21, 0]
9
+ },
10
+ "modules": [
11
+ {
12
+ "type": "script",
13
+ "language": "javascript",
14
+ "uuid": "00000000-0000-4000-8000-000000000002",
15
+ "version": [1, 0, 0],
16
+ "entry": "scripts/main.js"
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "mcbe-begame",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "bepack:install": "bepack install",
8
+ "dev": "bepack dev --copy",
9
+ "build": "bepack build",
10
+ "pack": "bepack pack",
11
+ "release": "bepack build --install --pack"
12
+ },
13
+ "devDependencies": {
14
+ "@bepack/cli": "^0.1.0-beta.4",
15
+ "typescript": "7.0.2"
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "format_version": 2,
3
+ "header": {
4
+ "name": "Resource Pack",
5
+ "description": "BEGame resource pack",
6
+ "uuid": "00000000-0000-4000-0000-000000000003",
7
+ "version": [1, 0, 0],
8
+ "min_engine_version": [1, 21, 0]
9
+ },
10
+ "modules": [
11
+ {
12
+ "type": "resources",
13
+ "uuid": "00000000-0000-4000-8000-000000000004",
14
+ "version": [1, 0, 0]
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,2 @@
1
+ pack.name=BEGame Resource Pack
2
+ pack.description=Created by create-mcbe
@@ -0,0 +1,7 @@
1
+ import { world } from '@minecraft/server';
2
+
3
+ world.afterEvents.playerSpawn.subscribe(({ player, initialSpawn }) => {
4
+ if (!initialSpawn) return;
5
+
6
+ player.sendMessage('Welcome to your new BEGame world!');
7
+ });
@@ -0,0 +1,10 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ES2022",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "skipLibCheck": true
8
+ },
9
+ "include": ["src"]
10
+ }