@bepack/cli 0.1.0-beta.2 → 0.1.0-beta.4
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 +12 -3
- package/README.zh-CN.md +12 -3
- package/dist/cli.js +3 -3
- package/dist/index.d.ts +46 -9
- package/dist/index.js +1 -1
- package/package.json +3 -2
- package/reference.md +120 -11
package/dist/index.d.ts
CHANGED
|
@@ -108,6 +108,8 @@ type HookContext = {
|
|
|
108
108
|
cwd: string;
|
|
109
109
|
mode?: string;
|
|
110
110
|
target: string;
|
|
111
|
+
/** Whether the running command was started with `--dry-run` (no files are written). */
|
|
112
|
+
dryRun: boolean;
|
|
111
113
|
config: ResolvedConfig;
|
|
112
114
|
/** Convenience resolved paths. Only includes paths for packs that are configured. */
|
|
113
115
|
paths: {
|
|
@@ -196,8 +198,12 @@ type PackManifestOptions = {
|
|
|
196
198
|
* (e.g. dual-config projects) so another config's residue never survives.
|
|
197
199
|
*/
|
|
198
200
|
merge?: "preserve" | "clean";
|
|
199
|
-
/** `header.min_engine_version`
|
|
200
|
-
* converted to `[n, n, n]` for format 2 manifests.
|
|
201
|
+
/** `header.min_engine_version` written to the manifest. Accepts a SemVer string
|
|
202
|
+
* (e.g. `"1.21.0"`), converted to `[n, n, n]` for format 2 manifests.
|
|
203
|
+
*
|
|
204
|
+
* When set it is authoritative in both merge modes: `preserve` overrides the
|
|
205
|
+
* value already stored in the manifest, `clean` uses it as the generated value.
|
|
206
|
+
* When omitted, `preserve` keeps the existing value and `clean` uses the default. */
|
|
201
207
|
minEngineVersion?: string;
|
|
202
208
|
/** Dependencies appended verbatim to manifest `dependencies` in clean mode. */
|
|
203
209
|
extraDependencies?: Record<string, unknown>[];
|
|
@@ -368,6 +374,8 @@ type BpConfig = PackConfig & {
|
|
|
368
374
|
compile?: BpCompileOptions;
|
|
369
375
|
/** Script API dependencies managed in both package.json and bp/manifest.json. */
|
|
370
376
|
dependencies?: Record<string, DependencySpecifier>;
|
|
377
|
+
/** Adds achievement-compatible metadata when every Script API dependency is stable. */
|
|
378
|
+
achievement?: boolean;
|
|
371
379
|
/** Additional files/folders to include when copying/packing the behavior pack,
|
|
372
380
|
* on top of built-in defaults (scripts/, manifest.json, animations/, etc.). */
|
|
373
381
|
include?: string[];
|
|
@@ -563,6 +571,7 @@ type ResolvedConfig = {
|
|
|
563
571
|
compile?: BpCompileResolved;
|
|
564
572
|
manifest: PackManifestResolved;
|
|
565
573
|
dependencies: Record<string, DependencySpecifier>;
|
|
574
|
+
achievement?: boolean;
|
|
566
575
|
include: string[];
|
|
567
576
|
};
|
|
568
577
|
rp?: {
|
|
@@ -644,14 +653,42 @@ declare function loadConfig(options: LoadConfigOptions): Promise<{
|
|
|
644
653
|
cwd: string;
|
|
645
654
|
}>;
|
|
646
655
|
//#endregion
|
|
656
|
+
//#region src/manifest/ManifestDepManager.d.ts
|
|
657
|
+
/** 依赖版本来自哪一层,用于诊断输出。 */
|
|
658
|
+
type DependencyVersionSource = "config" | "install" | "manifest";
|
|
659
|
+
//#endregion
|
|
647
660
|
//#region src/manifest/patchManifest.d.ts
|
|
648
661
|
type PatchManifestOptions = {
|
|
649
662
|
cwd: string;
|
|
650
663
|
config: ResolvedConfig;
|
|
651
664
|
dryRun?: boolean;
|
|
665
|
+
/** Concrete versions resolved by `bepack install` / `build --install` (channel specifiers only). */
|
|
652
666
|
resolvedDeps?: Record<string, string>;
|
|
653
667
|
logger?: LoggerLike;
|
|
654
668
|
};
|
|
669
|
+
/** One managed dependency as written to `manifest.json`. */
|
|
670
|
+
type PatchedManifestDependency = {
|
|
671
|
+
module_name: string;
|
|
672
|
+
/** Specifier from `packs.bp.dependencies` (e.g. `"stable"` or `"2.10.0"`). */
|
|
673
|
+
specifier: string;
|
|
674
|
+
/** Version actually written. */
|
|
675
|
+
version: string;
|
|
676
|
+
/** Where the version came from: the config, a fresh install, or the existing manifest. */
|
|
677
|
+
source: DependencyVersionSource;
|
|
678
|
+
/** Version the manifest held before this patch, when it had one. */
|
|
679
|
+
previous?: string;
|
|
680
|
+
};
|
|
681
|
+
type PatchedManifestFile = {
|
|
682
|
+
path: string;
|
|
683
|
+
updated: boolean;
|
|
684
|
+
existed: boolean;
|
|
685
|
+
/** Only present for the BP manifest: the managed dependencies that were written. */
|
|
686
|
+
dependencies?: PatchedManifestDependency[];
|
|
687
|
+
};
|
|
688
|
+
type PatchManifestResult = {
|
|
689
|
+
bpManifest?: PatchedManifestFile;
|
|
690
|
+
rpManifest?: PatchedManifestFile;
|
|
691
|
+
};
|
|
655
692
|
/**
|
|
656
693
|
* 修补 BP 和/或 RP manifest 文件。
|
|
657
694
|
*
|
|
@@ -660,12 +697,12 @@ type PatchManifestOptions = {
|
|
|
660
697
|
* - 如果 manifest 不存在,根据配置完整生成。
|
|
661
698
|
* - dryRun 时返回结果但不写入文件。
|
|
662
699
|
* - 只修补已配置的 Pack(至少一个必须存在)。
|
|
700
|
+
*
|
|
701
|
+
* 受管依赖的版本优先级:config 中的具体版本 > `resolvedDeps`(install 解析)>
|
|
702
|
+
* 现有 manifest 中的版本。版本发生变化或复用了旧值时都会打印说明,避免
|
|
703
|
+
* 「build 悄悄写回旧版本」这种情况无从排查。
|
|
663
704
|
*/
|
|
664
|
-
declare function patchManifest(options: PatchManifestOptions): Promise<
|
|
665
|
-
path: string;
|
|
666
|
-
updated: boolean;
|
|
667
|
-
existed: boolean;
|
|
668
|
-
}>>;
|
|
705
|
+
declare function patchManifest(options: PatchManifestOptions): Promise<PatchManifestResult>;
|
|
669
706
|
//#endregion
|
|
670
707
|
//#region src/constants/dependencyCatalog.d.ts
|
|
671
708
|
/** Built-in managed dependency catalog. Maps package names to resolver + manifest behavior. */
|
|
@@ -777,7 +814,7 @@ declare function sapiPro(): BePackPlugin;
|
|
|
777
814
|
declare const BUILTIN_PLUGINS: Record<string, () => BePackPlugin>;
|
|
778
815
|
//#endregion
|
|
779
816
|
//#region src/errors/codes.d.ts
|
|
780
|
-
declare const ERROR_CODES: readonly ["CONFIG_NOT_FOUND", "CONFIG_INVALID", "TARGET_INVALID", "TARGET_NOT_SUPPORTED", "UNSUPPORTED_DEPENDENCY", "DEPENDENCY_VERSION_INVALID", "DEPENDENCY_REQUIRES_INSTALL", "SAPI_VERSION_NOT_FOUND", "PACKAGE_JSON_NOT_FOUND", "PACKAGE_MANAGER_NOT_FOUND", "PACKAGE_MANAGER_FAILED", "MANIFEST_INVALID", "MANIFEST_GENERATE_FAILED", "MANIFEST_PATCH_FAILED", "VERSION_INVALID", "TYPECHECK_FAILED", "BUILD_FAILED", "COPY_TARGET_NOT_FOUND", "COPY_FAILED", "PACK_FAILED", "HOOK_FAILED", "PLUGIN_FAILED", "CLI_ARGUMENT_CONFLICT", "UNKNOWN_COMMAND"];
|
|
817
|
+
declare const ERROR_CODES: readonly ["CONFIG_NOT_FOUND", "CONFIG_INVALID", "TARGET_INVALID", "TARGET_NOT_SUPPORTED", "UNSUPPORTED_DEPENDENCY", "DEPENDENCY_VERSION_INVALID", "DEPENDENCY_REQUIRES_INSTALL", "SAPI_VERSION_NOT_FOUND", "ACHIEVEMENT_REQUIRES_STABLE_API", "PACKAGE_JSON_NOT_FOUND", "PACKAGE_MANAGER_NOT_FOUND", "PACKAGE_MANAGER_FAILED", "MANIFEST_INVALID", "MANIFEST_GENERATE_FAILED", "MANIFEST_PATCH_FAILED", "VERSION_INVALID", "TYPECHECK_FAILED", "BUILD_FAILED", "DEV_NO_WATCH_TARGETS", "COPY_TARGET_NOT_FOUND", "COPY_FAILED", "PACK_FAILED", "HOOK_FAILED", "PLUGIN_FAILED", "CLI_ARGUMENT_CONFLICT", "UNKNOWN_COMMAND"];
|
|
781
818
|
type ErrorCode = (typeof ERROR_CODES)[number];
|
|
782
819
|
//#endregion
|
|
783
820
|
//#region src/errors/BePackError.d.ts
|
|
@@ -791,4 +828,4 @@ declare class BePackError extends Error {
|
|
|
791
828
|
});
|
|
792
829
|
}
|
|
793
830
|
//#endregion
|
|
794
|
-
export { BUILTIN_DEPENDENCY_CATALOG, BUILTIN_DEPENDENCY_RESOLVERS, BUILTIN_PLUGINS, BePackError, type BePackPlugin, type BpCompileOptions, type BpCompileResolved, type BpConfig, type ConfigResolvedHookContext, type DependencyCatalogEntry, type DependencyResolveHookContext, type DependencyResolvedHookContext, type DependencyResolverContext, DependencyResolverRegistry, type DependencyResolverResult, type DependencyResolverRule, DependencyService, type HookContext, MinecraftPackageResolver, type NpmPackageMetadata, type NpmPackageVersionMetadata, NpmRegistryClient, type PackInfo, type PackOptimizeOptions, type PackOptimizeResolved, type PackScope, type PackType, type PluginDependencyHooks, type ReplaceBuiltins, type ReplaceOptions, type ReplaceValue, type ResolvedConfig, type RolldownCustomizeContext, type RolldownCustomizeFunction, type RolldownOverrides, type RpConfig, type UserConfig, createDependencyCatalog, defineConfig, exactVersionResolver, getConfiguredPacks, loadConfig, minecraftScriptApiBpResolver, minecraftScriptApiResolver, minecraftVanillaDataResolver, packageVersionForSpecifier, patchManifest, resolveDependencies, sapiPro, satisfiesSemver, satisfiesSemverRange };
|
|
831
|
+
export { BUILTIN_DEPENDENCY_CATALOG, BUILTIN_DEPENDENCY_RESOLVERS, BUILTIN_PLUGINS, BePackError, type BePackPlugin, type BpCompileOptions, type BpCompileResolved, type BpConfig, type ConfigResolvedHookContext, type DependencyCatalogEntry, type DependencyResolveHookContext, type DependencyResolvedHookContext, type DependencyResolverContext, DependencyResolverRegistry, type DependencyResolverResult, type DependencyResolverRule, DependencyService, type HookContext, MinecraftPackageResolver, type NpmPackageMetadata, type NpmPackageVersionMetadata, NpmRegistryClient, type PackInfo, type PackOptimizeOptions, type PackOptimizeResolved, type PackScope, type PackType, type PatchManifestOptions, type PatchManifestResult, type PatchedManifestDependency, type PatchedManifestFile, type PluginDependencyHooks, type ReplaceBuiltins, type ReplaceOptions, type ReplaceValue, type ResolvedConfig, type RolldownCustomizeContext, type RolldownCustomizeFunction, type RolldownOverrides, type RpConfig, type UserConfig, createDependencyCatalog, defineConfig, exactVersionResolver, getConfiguredPacks, loadConfig, minecraftScriptApiBpResolver, minecraftScriptApiResolver, minecraftVanillaDataResolver, packageVersionForSpecifier, patchManifest, resolveDependencies, sapiPro, satisfiesSemver, satisfiesSemverRange };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{pathToFileURL as e}from"node:url";import t from"node:path";import{promises as n}from"node:fs";import{platform as r}from"node:os";import"rolldown/plugins";const i={root:`.`,configured:{root:!1,packOutDir:!1},name:`minecraft-addon`,version:`1.0.0`,description:``,replace:{values:{},builtins:{VERSION:!1,NAME:!1,UUID:!1,DESCRIPTION:!1}},target:`latest`,plugins:[],install:{registry:`https://registry.npmjs.org/`,saveTo:`dependencies`,packageManager:`auto`,runPackageManager:!0,updatePackageJson:!0,updateManifest:!0,dependencyCatalog:{},dependencyResolvers:[]},build:{copy:!1,timing:!1},dev:{copy:!1},copy:{defaultTarget:``,targets:{}},pack:{name:`{name}-{version}`,outDir:`dist`},hooks:{}},a={dev:!0,build:!1,file:`node_modules/.cache/bepack/tsconfig.tsbuildinfo`},o={keepLooseFiles:!1,keepLoose:[],exclude:[],minifyJson:!0,packOptimizationVersion:`0.1.0`,allowUnsupportedTarget:!1},s={entry:`src/main.ts`,define:{},tsconfig:`tsconfig.json`,typecheck:!0,preserveModules:!0,external:[/^@minecraft\/server.*/],useNpx:!1,minify:!1,cache:a,scriptOutputDir:`scripts`};function c(e){return e}const l=[`bepack.config.ts`,`bepack.config.mjs`,`bepack.config.js`];var u=class extends Error{code;details;suggestions;constructor(e,t,n={}){super(t),this.name=`BePackError`,this.code=e,this.details=n.details,this.suggestions=n.suggestions}};const d=[`world`,`global`,`any`];function f(e){let t=[];return e.packs.bp&&t.push({type:`bp`,root:e.packs.bp.root,uuid:e.packs.bp.uuid,...e.packs.bp.moduleUuid===void 0?{}:{moduleUuid:e.packs.bp.moduleUuid},name:e.packs.bp.name,include:e.packs.bp.include}),e.packs.rp&&t.push({type:`rp`,root:e.packs.rp.root,uuid:e.packs.rp.uuid,moduleUuid:e.packs.rp.moduleUuid,name:e.packs.rp.name,include:e.packs.rp.include}),t}function p(e,n){return t.isAbsolute(n)?n:t.join(e,n)}function m(e){return e.replace(/\\/g,`/`)}function h(e,t){return p(e,t.root)}function g(e,t,n){return n===`bp`?t.packs.bp?p(e,t.packs.bp.root):void 0:t.packs.rp?p(e,t.packs.rp.root):void 0}function _(e,t){let n=g(h(e,t),t,`bp`);if(!n)throw Error(`packs.bp is not configured`);return n}function v(e,t){let n=g(h(e,t),t,`rp`);if(!n)throw Error(`packs.rp is not configured`);return n}function y(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..${t.sep}`)&&r!==`..`&&!t.isAbsolute(r)}function b(e,n,r){if(!n||n===`.`)throw new u(`CONFIG_INVALID`,`compile.scriptOutputDir must be a non-empty relative path strictly inside the BP root. Got: "${n}". This directory will be emptied during build.`);let i=n.replace(/\\/g,`/`);if(t.posix.isAbsolute(i)||t.win32.isAbsolute(i))throw new u(`CONFIG_INVALID`,`compile.scriptOutputDir must be a relative path, not absolute. Got: "${n}". This directory will be emptied during build.`);let a=t.posix.normalize(i);if(a.split(`/`).includes(`..`))throw new u(`CONFIG_INVALID`,`compile.scriptOutputDir must not contain ".." (path escape). Got: "${n}" resolves outside the BP root. This directory will be emptied during build.`);let o=t.resolve(e,a),s=t.relative(e,o);if(!s||s.startsWith(`..`)||t.isAbsolute(s))throw new u(`CONFIG_INVALID`,`compile.scriptOutputDir must be a directory strictly inside the BP root. Value: "${n}", resolved: "${o}". This directory will be emptied during build and must not be the BP root or a path outside it.`);if(r&&y(o,r))throw new u(`CONFIG_INVALID`,`compile.scriptOutputDir "${n}" dangerously overlaps with the source entry directory. The output directory will be emptied during build and would delete source files.`);return m(s)}function x(e,n){if(n.packs.bp)return t.join(_(e,n),`manifest.json`)}function S(e,n){if(n.packs.rp)return t.join(v(e,n),`manifest.json`)}r();function ee(e){return{values:e?.values??{},builtins:{VERSION:e?.builtins?.VERSION??!1,NAME:e?.builtins?.NAME??!1,UUID:e?.builtins?.UUID??!1,DESCRIPTION:e?.builtins?.DESCRIPTION??!1}}}function te(e){let t={...e??{}};for(let[e,n]of Object.entries(t))try{Function(`return (${n});`)}catch{throw new u(`CONFIG_INVALID`,`packs.bp.compile.define["${e}"] is not a valid JavaScript expression: ${n}. Define values must be expression strings, e.g. JSON.stringify("server") or "true".`,{details:{defineKey:e,defineValue:n}})}return t}function C(e){let t=/^(\d+)\.(\d+)\.(\d+)$/.exec(e);if(!t)throw new u(`VERSION_INVALID`,`Manifest version requires x.y.z.`,{details:{version:e}});return[Number(t[1]),Number(t[2]),Number(t[3])]}function w(e){return/^\d+\.\d+\.\d+(?:[-.][0-9A-Za-z.-]+)?$/.test(e)}function T(e,t){let n=e.split(/[^0-9A-Za-z]+/),r=t.split(/[^0-9A-Za-z]+/),i=Math.max(n.length,r.length);for(let e=0;e<i;e+=1){let t=n[e]??``,i=r[e]??``,a=/^\d+$/.test(t)?Number(t):NaN,o=/^\d+$/.test(i)?Number(i):NaN,s=Number.isNaN(a)||Number.isNaN(o)?t.localeCompare(i):a-o;if(s!==0)return s}return 0}function E(e){return e===`latest`||T(e,`1.21.120`)>=0}function ne(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(e.trim());if(!t)return;let n=/(?:^|[.-])(\d+)\.(\d+)\.(\d+)(?:[.-]|$)/.exec(t[4]??``);return{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),...n?{minecraftTarget:[Number(n[1]),Number(n[2]),Number(n[3])]}:{}}}function re(e,t){for(let n of[`major`,`minor`,`patch`])if(e[n]!==t[n])return e[n]-t[n];return 0}function D(e,t){let n=ne(e);return n?t.split(`||`).some(e=>{let t=/(?:\^|~|>=|<=|>|<|=)?\s*(v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)/.exec(e.trim()),r=t?ne(t[1]):void 0;return!r||n.major!==r.major||re(n,r)<0?!1:r.minecraftTarget?n.minecraftTarget?T(n.minecraftTarget.join(`.`),r.minecraftTarget.join(`.`))>=0:!1:!0}):!1}const ie=D;function ae(e){if(e===`stable`||e===`beta`||e===`preview`)throw new u(`DEPENDENCY_VERSION_INVALID`,`${e} must be resolved from npm registry before writing package.json.`,{details:{specifier:e}});if(w(e))return e;throw new u(`DEPENDENCY_VERSION_INVALID`,`Unsupported dependency version: ${e}`,{details:{specifier:e}})}function oe(e){return e.filter(e=>/^\d+\.\d+\.\d+$/.test(e)).sort(T)}function se(e){return e.filter(e=>/(?:^|[-.])beta(?:[-.]|$)/i.test(e)).sort(T)}var O=class{npm;logger;constructor(e,t){this.npm=e,this.logger=t}latestStable(e,t){let n=this.npm.distTag(t,`latest`);if(n&&/^\d+\.\d+\.\d+$/.test(n))return this.logger?.verbose(`Resolved ${e}@stable -> ${n}`),n;let r=oe(this.npm.versions(t)).at(-1);if(!r)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest stable version for ${e}.`,{details:{package:e}});return this.logger?.verbose(`Resolved ${e}@stable -> ${r}`),r}latestBeta(e,t){let n=this.npm.distTag(t,`beta`);if(n)return this.logger?.verbose(`Resolved ${e}@beta -> ${n}`),n;let r=se(this.npm.versions(t)).at(-1);if(!r)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest beta version for ${e}.`,{details:{package:e}});return this.logger?.verbose(`Resolved ${e}@beta -> ${r}`),r}betaForTarget(e,t,n){let r=t.replace(/\./g,`\\.`),i=RegExp(`beta[-.]${r}-stable`),a=this.npm.versions(n).filter(e=>i.test(e)).sort(T).at(-1);if(!a)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e}@beta for target ${t}.`,{details:{package:e,specifier:`beta`,target:t},suggestions:[`Use target: "latest"`,`Specify an exact version`,`Update BePack`,`Manually edit package.json and manifest.json`]});return this.logger?.verbose(`Resolved ${e}@beta for target ${t} -> ${a}`),a}inferStableFromBeta(e,t,n,r){let i=/^(\d+)\.(\d+)\.(\d+)-beta[.-]/.exec(n);if(!i)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot infer stable version from ${e}@${n}.`,{details:{package:e,beta:n,target:t}});let a=Number(i[1]),o=Number(i[2])-1,s=`${a}.${o}.${Number(i[3])}`;if(o<0||!r.versions?.[s])throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot confirm inferred stable version ${s} for ${e}.`,{details:{package:e,target:t,beta:n,inferredStable:s}});return s}};function k(e,t){return t===`latest`||E(t)?`beta`:/^(\d+\.\d+\.\d+-beta)/i.exec(e)?.[1]??e}function A(e,t,n){let r=se(t).filter(e=>/^\d+\.\d+\.\d+-beta\.\d+\.\d+\.\d+/.test(e)).filter(e=>!/(?:rc|beta)\.\d+\.\d+\.\d+-preview\.\d+$/i.test(e)).at(-1);if(!r)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest beta version for ${e}.`,{details:{package:e}});return n?.verbose(`Resolved ${e}@beta -> ${r}`),r}function ce(e){return e.filter(e=>/(?:rc|beta)\.\d+\.\d+\.\d+-preview\.\d+$/i.test(e)).sort(T)}function le(e,t,n){let r=ce(t).at(-1);if(!r)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest preview version for ${e}.`,{details:{package:e}});return n?.verbose(`Resolved ${e}@preview -> ${r}`),r}function ue(e,t,n,r){let i=n.replace(/\./g,`\\.`),a=RegExp(`(?:rc|beta)\\.${i}-preview\\.\\d+$`),o=t.filter(e=>a.test(e)).sort(T).at(-1);if(!o)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e}@preview for target ${n}.`,{details:{package:e,specifier:`preview`,target:n},suggestions:[`Use target: "latest"`,`Specify an exact version`]});return r?.verbose(`Resolved ${e}@preview for target ${n} -> ${o}`),o}const j={name:`minecraft-script-api`,resolver:`minecraft-script-api`,match:e=>e.specifier===`stable`||e.specifier===`beta`||e.specifier===`preview`,async resolve(e){let t=await e.npm.metadata(e.packageName),n=new O(e.npm,e.logger);if(e.specifier===`stable`){e.logger?.verbose(`Resolving ${e.packageName}@stable for target ${e.target}`);let r=e.target===`latest`?n.latestStable(e.packageName,t):n.inferStableFromBeta(e.packageName,e.target,n.betaForTarget(e.packageName,e.target,t),t);return{packageVersion:r,manifestVersion:r}}if(e.specifier===`beta`){e.logger?.verbose(`Resolving ${e.packageName}@beta for target ${e.target}`);let r=e.target===`latest`?A(e.packageName,e.npm.versions(t),e.logger):n.betaForTarget(e.packageName,e.target,t);return{packageVersion:r,manifestVersion:k(r,e.target)}}e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`);let r=e.target===`latest`?le(e.packageName,e.npm.versions(t),e.logger):ue(e.packageName,e.npm.versions(t),e.target,e.logger);return{packageVersion:r,manifestVersion:r}}},M={name:`minecraft-script-api-bp`,resolver:`minecraft-script-api-bp`,match:e=>e.specifier===`beta`||e.specifier===`preview`,async resolve(e){let t=await e.npm.metadata(e.packageName),n=new O(e.npm,e.logger);if(e.specifier===`beta`){e.logger?.verbose(`Resolving ${e.packageName}@beta for target ${e.target}`);let r=e.target===`latest`?A(e.packageName,e.npm.versions(t),e.logger):n.betaForTarget(e.packageName,e.target,t);return{packageVersion:r,manifestVersion:k(r,e.target)}}e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`);let r=e.target===`latest`?le(e.packageName,e.npm.versions(t),e.logger):ue(e.packageName,e.npm.versions(t),e.target,e.logger);return{packageVersion:r,manifestVersion:r}}},de=/^\d+\.\d+\.\d+$/,fe=/^\d+\.\d+\.\d+-preview\.\d+$/,N={name:`minecraft-vanilla-data`,resolver:`minecraft-vanilla-data`,match:e=>e.specifier===`stable`||e.specifier===`preview`,async resolve(e){let t=await e.npm.metadata(e.packageName);return e.specifier===`stable`?pe(e,t):me(e,t)}};function pe(e,t){if(e.logger?.verbose(`Resolving ${e.packageName}@stable for target ${e.target}`),e.target===`latest`){let n=e.npm.distTag(t,`latest`);if(n&&de.test(n))return e.logger?.verbose(`Resolved ${e.packageName}@stable -> ${n}`),{packageVersion:n};let r=e.npm.versions(t).filter(e=>de.test(e)).sort(T).at(-1);if(!r)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest stable version for ${e.packageName}.`,{details:{package:e.packageName}});return e.logger?.verbose(`Resolved ${e.packageName}@stable -> ${r}`),{packageVersion:r}}if(t.versions?.[e.target])return e.logger?.verbose(`Resolved ${e.packageName}@stable for target ${e.target} -> ${e.target}`),{packageVersion:e.target};throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e.packageName}@stable for target ${e.target}. The target version does not exist in the registry.`,{details:{package:e.packageName,specifier:`stable`,target:e.target},suggestions:[`Use target: "latest"`,`Specify an exact version`]})}function me(e,t){if(e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`),e.target===`latest`){let n=e.npm.versions(t).filter(e=>fe.test(e)).sort(T).at(-1);if(!n)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest preview version for ${e.packageName}.`,{details:{package:e.packageName}});return e.logger?.verbose(`Resolved ${e.packageName}@preview -> ${n}`),{packageVersion:n}}let n=e.target.replace(/\./g,`\\.`),r=RegExp(`^${n}-preview\\.\\d+$`),i=e.npm.versions(t).filter(e=>r.test(e)).sort(T).at(-1);if(!i)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e.packageName}@preview for target ${e.target}. No matching preview version found.`,{details:{package:e.packageName,specifier:`preview`,target:e.target},suggestions:[`Use target: "latest"`,`Specify an exact preview version`]});return e.logger?.verbose(`Resolved ${e.packageName}@preview for target ${e.target} -> ${i}`),{packageVersion:i}}const P={"@minecraft/common":{resolver:j,manifest:!0},"@minecraft/server":{resolver:j,manifest:!0},"@minecraft/server-ui":{resolver:j,manifest:!0},"@minecraft/server-net":{resolver:M,manifest:!0},"@minecraft/server-admin":{resolver:M,manifest:!0},"@minecraft/server-gametest":{resolver:M,manifest:!0},"@minecraft/debug-utilities":{resolver:M,manifest:!0},"@minecraft/diagnostics":{resolver:M,manifest:!0},"@minecraft/server-graphics":{resolver:M,manifest:!0},"@minecraft/server-editor":{resolver:M,manifest:!0},"@minecraft/vanilla-data":{resolver:N,manifest:!1}},F={name:`exact-version`,match:e=>w(e.specifier),resolve(e){return e.logger?.verbose(`Using exact ${e.packageName}@${e.specifier}`),{packageVersion:ae(e.specifier),manifestVersion:e.specifier}}},I=[j,M,N,F];var L=class e{resolvers;pluginNames=/* @__PURE__ */ new Map;constructor(e,t=[]){this.resolvers=e;for(let e of t)for(let t of e.install?.dependencyResolvers??[])this.pluginNames.set(t,e.name)}static fromConfig(t,n=[]){return new e([...t,...I],n)}resolverMatchesCatalog(e,t){let n=e.entry.resolver;if(!n)return!0;let r=typeof n==`string`?n:n.name;return t.resolver===void 0||t.resolver===r}find(e){let t;for(let n of this.resolvers)if(this.resolverMatchesCatalog(e,n))try{if(n.match(e)){t=n;break}}catch(e){let t=this.pluginNames.get(n);throw t?new u(`PLUGIN_FAILED`,`Plugin ${t} resolver ${n.name} match failed: ${e instanceof Error?e.message:String(e)}`):e}if(!t)throw new u(`DEPENDENCY_VERSION_INVALID`,`${e.packageName} dependency version is invalid: ${e.specifier}`,{details:{package:e.packageName,specifier:e.specifier,resolver:e.entry.resolver}});return e.logger?.verbose(`Resolving ${e.packageName}@${e.specifier} with ${t.name}`),t}async resolve(e){let t=this.find(e);try{return await t.resolve(e)}catch(e){let n=this.pluginNames.get(t);throw n?new u(`PLUGIN_FAILED`,`Plugin ${n} resolver ${t.name} failed: ${e instanceof Error?e.message:String(e)}`):e}}};const R=`sapi-pro`,z=[`@minecraft/server`,`@minecraft/server-ui`];function B(e){return/(?:beta|preview|alpha|rc)/i.test(e)}function he(e){return B(e)?`beta`:`stable`}function ge(e){let t=/^(\d+)\.(\d+)\./.exec(e);return!!t&&(Number(t[1])>0||Number(t[2])>=4)}function V(e){return{...e.dependencies??{},...e.peerDependencies??{}}}async function _e(e,t,n,r){let i=e.config.packs.bp?.dependencies??{},a={...P,...e.config.install.dependencyCatalog},o=L.fromConfig(e.config.install.dependencyResolvers.filter(e=>e!==H),e.config.plugins);for(let[s,c]of Object.entries(t)){if(!s.startsWith(`@minecraft/`))continue;let t=i[s],l=a[s];if(!t||!l)return r.add(s),!1;let u;if(n.has(s)?u=n.get(s):(u=await o.resolve({packageName:s,specifier:t,target:e.target,entry:l,config:e.config,npm:e.npm,...e.logger?{logger:e.logger}:{}}),n.set(s,u)),!u||z.includes(s)&&B(c)!==B(u.packageVersion)||!D(u.packageVersion,c))return!1}return!0}function ve(e,t){if(t!==`stable`&&t!==`beta`){let n=e[t];return n?[[t,n]]:[]}return Object.entries(e).filter(([e,n])=>{if(!ge(e))return!1;let r=V(n);return Object.keys(r).length===0?!1:t===`stable`?/-stable(?:\.\d+)?$/i.test(e):/^\d+\.\d+\.\d+$/.test(e)}).sort(([e],[t])=>T(e,t)).reverse()}const H={name:`sapi-pro`,resolver:`sapi-pro`,match:e=>e.specifier===`stable`||e.specifier===`beta`||/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(e.specifier),async resolve(e){let t=await e.npm.metadata(R),n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Set;for(let[i,a]of ve(t.versions??{},e.specifier))if(await _e(e,V(a),n,r))return/^0\.3\./.test(i)&&e.logger?.warn(`sapi-pro@${i} uses legacy metadata; compatibility is best-effort only.`),{packageVersion:i,manifestVersion:null};throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot find a compatible ${R}@${e.specifier} for target ${e.target}.${r.size>0?` Missing explicit dependencies: ${[...r].join(`, `)}.`:``}`,{details:{package:R,specifier:e.specifier,target:e.target},suggestions:[`Explicitly declare the @minecraft packages required by sapi-pro.`,`Use a compatible target or specify an exact sapi-pro version.`]})}};function U(){return{name:`sapi-pro`,apiVersion:1,description:`Resolve sapi-pro versions compatible with BePack Script API dependencies.`,configResolved:({config:e})=>{let t=e.packs.bp?.dependencies??{},n=t[R];if(!n)return;let r=z.filter(e=>!t[e]);if(r.length>0)throw Error(`sapi-pro requires explicit dependencies: ${r.join(`, `)}.`);if(n===`stable`||n===`beta`)for(let e of z){let r=t[e];if(he(r)!==n)throw Error(`sapi-pro ${n} requires ${e} to use ${n}, received ${r}.`)}},install:{dependencyCatalog:{[R]:{resolver:`sapi-pro`,manifest:!1}},dependencyResolvers:[H]}}}const W={"sapi-pro":U};function G(e){return e?Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0)):{}}function K(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e==`function`?`function`:typeof e==`object`?`object`:typeof e==`string`?JSON.stringify(e):String(e)}function ye(e,t){let n={};(e.packs?.bp||t.packs?.bp)&&(n.bp={...e.packs?.bp??{},...G(t.packs?.bp)}),(e.packs?.rp||t.packs?.rp)&&(n.rp={...e.packs?.rp??{},...G(t.packs?.rp)});let r={...e.copy?.targets??{},...G(t.copy?.targets)},i=G(t);return{...e,...i,...t.plugins!==void 0||e.plugins!==void 0?{plugins:t.plugins??e.plugins}:{},packs:n,install:{...e.install,...G(t.install)},build:{...e.build,...G(t.build)},dev:{...e.dev,...G(t.dev)},copy:{...e.copy,...G(t.copy),targets:r},pack:{...e.pack,...G(t.pack)},hooks:{...e.hooks,...G(t.hooks)}}}function be(e){let t=(e??[]).map(e=>{if(typeof e!=`string`)return e;let t=W[e];if(!t)throw new u(`CONFIG_INVALID`,`Unknown built-in plugin: ${e}.`);return t()}),n=/* @__PURE__ */ new Set;for(let e of t){if(!e?.name||e.name.trim()===``)throw new u(`CONFIG_INVALID`,`Every plugin must have a non-empty name.`);if(n.has(e.name))throw new u(`CONFIG_INVALID`,`Plugin name is duplicated: ${e.name}.`);if(e.apiVersion!==void 0&&e.apiVersion!==1)throw new u(`CONFIG_INVALID`,`Plugin ${e.name} requires unsupported BePack plugin API version ${e.apiVersion}.`);if(e.priority!==void 0&&!Number.isFinite(e.priority))throw new u(`CONFIG_INVALID`,`Plugin ${e.name} priority must be a finite number.`);n.add(e.name)}return t.sort((e,t)=>(t.priority??0)-(e.priority??0))}function xe(e,t){let n=/* @__PURE__ */ new Set;for(let r of[...e.map(e=>e.hooks),t])for(let e of Object.keys(r??{}))n.add(e);return Object.fromEntries([...n].map(n=>{let r=[...e.map(e=>({plugin:e,hook:e.hooks?.[n]})).filter(e=>e.hook!==void 0),...t?.[n]?[{hook:t[n]}]:[]];return[n,async(...e)=>{let t;for(let i of r)try{t=await i.hook(...e)}catch(e){let t=`plugin`in i?i.plugin:void 0;throw t?new u(`PLUGIN_FAILED`,`Plugin ${t.name} ${String(n)} hook failed: ${e instanceof Error?e.message:String(e)}`):e}return t}]}))}function Se(e,t){let n={},r=/* @__PURE__ */ new Map,i=[];for(let t of e)for(let[e,a]of Object.entries(t.install?.dependencyCatalog??{})){let o=r.get(e);if(o){i.push(`dependency catalog ${e}: plugin ${o} takes precedence over plugin ${t.name}`);continue}n[e]=a,r.set(e,t.name)}for(let[e,a]of Object.entries(t)){let t=r.get(e);t&&i.push(`dependency catalog ${e}: project config overrides plugin ${t}`),n[e]=a}return{catalog:n,diagnostics:i}}function Ce(e,n,r){let i=s,o=e?.scriptOutputDir??i.scriptOutputDir,c=t.resolve(r,e?.entry??i.entry),l=b(n,o,t.dirname(c));return{entry:e?.entry??i.entry,define:te(e?.define),tsconfig:e?.tsconfig??i.tsconfig,typecheck:e?.typecheck??i.typecheck,preserveModules:e?.preserveModules??i.preserveModules,external:e?.external??i.external,useNpx:e?.useNpx??i.useNpx,minify:e?.minify??i.minify,cache:p(e?.cache),scriptOutputDir:l,...e?.rolldown===void 0?{}:{rolldown:d(e.rolldown)},...e?.rolldownConfig===void 0?{}:{rolldownConfig:f(e.rolldownConfig)}};function d(e){if(typeof e==`function`||e&&typeof e==`object`&&!Array.isArray(e))return e;throw new u(`CONFIG_INVALID`,`packs.bp.compile.rolldown must be a rolldown options object or a function (options, context) => options, got: ${K(e)}.`)}function f(e){if(typeof e!=`string`||e.trim()===``)throw new u(`CONFIG_INVALID`,`packs.bp.compile.rolldownConfig must be a non-empty path string, got: ${K(e)}.`);return e}function p(e){let t=a;return{dev:e?.dev??t.dev,build:e?.build??t.build,file:e?.file??t.file}}}function q(e){if(e===void 0||e===!1)return;let t=e===!0?{}:e;if(typeof t!=`object`||!t||Array.isArray(t))throw new u(`CONFIG_INVALID`,`pack.optimize must be a boolean or an options object, got: ${K(e)}.`);let n=t.packOptimizationVersion;if(n!==void 0&&(typeof n!=`string`||n.trim()===``))throw new u(`CONFIG_INVALID`,`pack.optimize.packOptimizationVersion must be a non-empty string, got: ${K(n)}.`);return{keepLooseFiles:t.keepLooseFiles??o.keepLooseFiles,keepLoose:t.keepLoose!==!1&&(t.keepLoose??[]).map(we),exclude:(t.exclude??[]).map(we),minifyJson:t.minifyJson??o.minifyJson,packOptimizationVersion:n??o.packOptimizationVersion,allowUnsupportedTarget:t.allowUnsupportedTarget??o.allowUnsupportedTarget}}function we(e){let n=String(e).replace(/\\/g,`/`).replace(/^\.\//,``).replace(/\/+$/,``);if(!n||n.includes(`/`)||n.includes(`..`)||t.posix.isAbsolute(n))throw new u(`CONFIG_INVALID`,`pack.optimize.exclude entries must be top-level folder names (no path separators, no ".."), got: ${K(e)}.`);return n}function Te(e){let t=e?.merge??`preserve`;if(t!==`preserve`&&t!==`clean`)throw new u(`CONFIG_INVALID`,`manifest.merge must be "preserve" or "clean", got: ${String(e?.merge)}.`);let n=e?.minEngineVersion;if(n!==void 0&&!/^\d+\.\d+\.\d+$/.test(n))throw new u(`CONFIG_INVALID`,`manifest.minEngineVersion must be a SemVer string like "1.21.0", got: ${n}.`);return{merge:t,...n===void 0?{}:{minEngineVersion:n},extraDependencies:e?.extraDependencies??[],extraModules:e?.extraModules??[],extraHeader:e?.extraHeader??{}}}function Ee(e,n={},r=process.cwd()){let a=ye(e,n),o=be(a.plugins),s=a.target??i.target;if(s===`stable`||s===`beta`)throw new u(`TARGET_INVALID`,`target must be a Minecraft game version or latest, not a Script API channel.`,{details:{target:s}});let c=!!a.packs?.bp,l=!!a.packs?.rp;if(!c&&!l)throw new u(`CONFIG_INVALID`,`At least one pack (packs.bp or packs.rp) is required.`);if(!a.name||a.name.trim()===``)throw new u(`CONFIG_INVALID`,`name is required.`);let f=a.name,p=a.version??i.version,m=a.description,h=a.packs,g=h.bp?.compile,_=h.bp,v=h.rp;if(_){if(!_.uuid)throw new u(`CONFIG_INVALID`,`packs.bp.uuid is required.`);if(_.compile&&!_.moduleUuid)throw new u(`CONFIG_INVALID`,`packs.bp.moduleUuid is required when packs.bp.compile is configured.`);if(_.root===void 0)throw new u(`CONFIG_INVALID`,`packs.bp.root is required. Set the behavior pack directory in bepack.config.ts.`);if(g?.define){let e=Object.keys(a.replace?.values??{}),t=Object.keys(g.define),n=e.filter(e=>t.includes(e));if(n.length>0)throw new u(`CONFIG_INVALID`,`Config conflict: ${n.map(e=>`"${e}"`).join(`, `)} is configured in both replace.values and packs.bp.compile.define. Use only one mechanism per key.`,{details:{overlap:n}})}}let y=t.resolve(r,a.root??`.`),b=_?t.resolve(y,_.root):void 0;if(v){if(!v.uuid||!v.moduleUuid)throw new u(`CONFIG_INVALID`,`packs.rp.uuid and packs.rp.moduleUuid are required.`);if(v.root===void 0)throw new u(`CONFIG_INVALID`,`packs.rp.root is required when packs.rp is configured.`);if(v.packScope!==void 0&&!d.includes(v.packScope))throw new u(`CONFIG_INVALID`,`packs.rp.packScope must be one of ${d.map(e=>`"${e}"`).join(`, `)}.`,{details:{packScope:v.packScope}})}let x=_?.description??m,S=v?.description??m,{catalog:te,diagnostics:C}=Se(o,a.install?.dependencyCatalog??{}),w=o.flatMap(e=>e.install?.dependencyResolvers??[]),T=q(a.pack?.optimize),E=q(a.copy?.optimize);return{root:a.root??i.root,configured:{root:a.root!==void 0,packOutDir:a.pack?.outDir!==void 0},name:f,version:p,...m===void 0?{}:{description:m},replace:ee(a.replace),target:s,plugins:o,...C.length>0?{pluginDiagnostics:C}:{},...a.manifestFormat===void 0?{}:{manifestFormat:a.manifestFormat},packs:{..._?{bp:{root:_.root,uuid:_.uuid,..._.moduleUuid===void 0?{}:{moduleUuid:_.moduleUuid},name:_.name??f,...x===void 0?{}:{description:x},...g&&b?{compile:Ce(g,b,y)}:{},manifest:Te(_.manifest),dependencies:_.dependencies??{},include:_.include??[]}}:{},...v?{rp:{root:v.root,uuid:v.uuid,moduleUuid:v.moduleUuid,name:v.name??f,...S===void 0?{}:{description:S},manifest:Te(v.manifest),...v.pbr===void 0?{}:{pbr:v.pbr},...v.packScope===void 0?{}:{packScope:v.packScope},include:v.include??[]}}:{}},install:{registry:a.install?.registry??i.install.registry,saveTo:a.install?.saveTo??i.install.saveTo,packageManager:a.install?.packageManager??i.install.packageManager,runPackageManager:a.install?.runPackageManager??i.install.runPackageManager,updatePackageJson:a.install?.updatePackageJson??i.install.updatePackageJson,updateManifest:a.install?.updateManifest??i.install.updateManifest,dependencyCatalog:te,dependencyResolvers:[...w,...a.install?.dependencyResolvers??[]]},build:{copy:a.build?.copy??i.build.copy,timing:a.build?.timing??i.build.timing},dev:{copy:a.dev?.copy??i.dev.copy,...a.dev?.watch?{watch:a.dev.watch}:{}},copy:{defaultTarget:a.copy?.defaultTarget??i.copy.defaultTarget,...a.copy?.name?{name:a.copy.name}:{},...a.copy?.include?{include:a.copy.include}:{},targets:a.copy?.targets??{},...E?{optimize:E}:{}},pack:{name:a.pack?.name??i.pack.name,outDir:a.pack?.outDir??i.pack.outDir,...T?{optimize:T}:{}},hooks:xe(o,a.hooks)}}async function De(e,r){if(r){let t=p(e,r);return await n.access(t).catch(()=>{throw new u(`CONFIG_NOT_FOUND`,`Config not found: ${r}`,{details:{configPath:r}})}),t}for(let r of l){let i=t.join(e,r);try{return await n.access(i),i}catch{}}throw new u(`CONFIG_NOT_FOUND`,`No bepack.config.ts, bepack.config.mjs, or bepack.config.js found.`,{details:{cwd:e}})}async function Oe(t){try{if(t.endsWith(`.ts`))try{return await import(`${e(t).href}?t=${Date.now()}`)}catch{let e=ke(await n.readFile(t,`utf8`));return await import(`data:text/javascript;base64,${Buffer.from(e,`utf8`).toString(`base64`)}`)}return await import(`${e(t).href}?t=${Date.now()}`)}catch(e){throw new u(`CONFIG_INVALID`,`Failed to load config: ${e instanceof Error?e.message:String(e)}`,{details:{file:t},suggestions:[`Use bepack.config.mjs/js for complex config logic.`,`Keep bepack.config.ts free of TypeScript-only runtime syntax.`]})}}function ke(e){return e.replace(/^\s*import\s+type\s+[^;]+;\s*$/gm,``).replace(/\s+satisfies\s+[A-Za-z_$][\w$<>,\s.[\]|&{}]*/g,``).replace(/\((\s*[A-Za-z_$][\w$]*)\s*:\s*[^)=]+?\)\s*=>/g,`($1) =>`)}async function Ae(e,t){for(let n of e.plugins??[])if(n.configResolved)try{await n.configResolved({cwd:t,config:e})}catch(e){throw new u(`PLUGIN_FAILED`,`Plugin ${n.name} configResolved hook failed: ${e instanceof Error?e.message:String(e)}`)}}async function je(e){let n=t.resolve(e.cwd),r=await De(n,e.configPath),i=await Oe(r);if(i.default===void 0)throw new u(`CONFIG_INVALID`,`Config must use default export.`,{details:{file:r}});let a=Ee(i.default,e.overrides,n);return await Ae(a,n),{config:a,path:r,cwd:n}}function J(e){return{...P,...e.install.dependencyCatalog}}function Me(e,t){let n=e[t];if(!n)throw new u(`UNSUPPORTED_DEPENDENCY`,`${t} is not a managed dependency. Add it to install.dependencyCatalog or remove it from packs.bp.dependencies.`,{details:{package:t}});return n}function Ne(e){return`${JSON.stringify(e,null,4)}\n`}async function Pe(e){try{return await n.access(e),!0}catch{return!1}}async function Fe(e){await n.mkdir(e,{recursive:!0})}async function Ie(e,r){await Fe(t.dirname(e)),await n.writeFile(e,Ne(r),`utf8`)}function Le(e){return Array.isArray(e)&&e.length===3&&typeof e[0]==`number`&&typeof e[1]==`number`&&typeof e[2]==`number`}function Re(e){return typeof e==`string`&&/^\d+\.\d+\.\d+$/.test(e)}function Y(e){return e===3?Re:Le}function X(e,t){return e===3?`${t} must be SemVer string like "x.y.z" (format 3)`:`${t} must be [number, number, number] (format 2)`}const ze=[e=>e.format_version===void 0?`format_version is required`:null,e=>e.header?null:`header is required`,e=>e.header&&!e.header.name?`header.name is required`:null,e=>e.header&&!e.header.uuid?`header.uuid is required`:null,e=>e.header?Y(e.format_version)(e.header.version)?null:X(e.format_version,`header.version`):null,e=>e.header?Y(e.format_version)(e.header.min_engine_version)?null:X(e.format_version,`header.min_engine_version`):null,e=>e.modules!==void 0&&!Array.isArray(e.modules)?`modules must be an array`:null,(e,t)=>{if(!Array.isArray(e.modules))return null;let n=e.modules.some(e=>e?.type===`resources`),r=[];return t===`rp`&&!n&&r.push(`RP manifest must have a resources module`),r.length>0?r:null},e=>{if(!Array.isArray(e.modules))return null;let t=Y(e.format_version),n=[];for(let r=0;r<e.modules.length;r++){let i=e.modules[r];i&&i.version!==void 0&&i.version!==null&&!t(i.version)&&n.push(`modules[${r}] (uuid: ${i.uuid??`unknown`}): ${X(e.format_version,`version`)}`)}return n.length>0?n:null},e=>e.dependencies!==void 0&&!Array.isArray(e.dependencies)?`dependencies must be an array`:null,e=>{if(!Array.isArray(e.dependencies))return null;let t=Y(e.format_version),n=[];for(let r=0;r<e.dependencies.length;r++){let i=e.dependencies[r];if(!i){n.push(`dependencies[${r}] is invalid`);continue}`uuid`in i&&i.uuid&&!t(i.version)&&n.push(`dependencies[${r}] (uuid: ${i.uuid}): ${X(e.format_version,`version`)}`),`module_name`in i&&i.module_name&&typeof i.version!=`string`&&n.push(`dependencies[${r}] (module_name: ${i.module_name}): version must be a string`)}return n.length>0?n:null},e=>e.capabilities===void 0?null:Array.isArray(e.capabilities)?e.capabilities.every(e=>typeof e==`string`)?null:`capabilities must be an array of strings`:`capabilities must be an array`,e=>e.metadata!==void 0&&(typeof e.metadata!=`object`||e.metadata===null)?`metadata must be an object`:null];function Be(e,t){let n=[];for(let r of ze){let i=r(e,t);i!==null&&(Array.isArray(i)?n.push(...i):n.push(i))}if(n.length>0)throw new u(`MANIFEST_INVALID`,`Manifest validation failed: ${n.join(`; `)}`)}function Z(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:{...e}}function Q(e){return Array.isArray(e)?e:[]}var $=class{static async read(e){if(!await Pe(e))return;let t=await n.readFile(e,`utf8`);try{return Z(JSON.parse(t))}catch{throw new u(`MANIFEST_INVALID`,`Invalid JSON in manifest: ${e}`)}}static async write(e,t,n){Be(t,n),await Ie(e,t)}};const Ve=[1,21,0],He=[1,0,0];var Ue=class{config;version;versionStr;depManager;constructor(e,t){this.config=e,this.version=C(e.version),this.versionStr=e.version,this.depManager=t}buildBp(e){let t=this.requireBp(),n=Z(e);this.depManager.validateBpDependencies();let r=this.getWriteFormatVersion(n);return t.manifest.merge===`clean`?this.buildCleanBp(t,r):this.buildPreserveBp(n,t,r)}buildRp(e){let t=this.requireRp(),n=Z(e),r=this.getWriteFormatVersion(n),i=t.manifest.merge===`clean`?this.buildCleanRp(t,r):this.buildPreserveRp(n,t,r);return this.applyPbrCapability(i,t),i}buildPreserveBp(e,t,n){return{...e,format_version:n,header:this.buildBpHeader(e,t,n),...t.moduleUuid?{modules:this.replaceManagedBpModules(e.modules,t,n)}:e.modules?{modules:e.modules}:{},dependencies:this.depManager.replaceBpDependencies(e.dependencies,this.config.packs.rp?.uuid,n)}}buildPreserveRp(e,t,n){return{...e,format_version:n,header:this.buildRpHeader(e,t,n),modules:this.replaceManagedRpModules(e.modules,t,n),dependencies:this.depManager.replaceRpDependencies(e.dependencies,this.config.packs.bp?.uuid,n)}}buildCleanBp(e,t){return{format_version:t,header:this.buildBpHeaderClean(e,t),...e.moduleUuid?{modules:this.buildCleanBpModules(e,t)}:{},dependencies:this.depManager.buildBpDependenciesClean(t,this.config.packs.rp?.uuid,e.manifest.extraDependencies)}}buildCleanRp(e,t){return{format_version:t,header:this.buildRpHeaderClean(e,t),modules:this.buildCleanRpModules(e,t),dependencies:this.depManager.buildRpDependenciesClean(t,this.config.packs.bp?.uuid,e.manifest.extraDependencies)}}buildBpHeaderClean(e,t){return{...e.manifest.extraHeader,name:e.name,...e.description===void 0?{}:{description:e.description},uuid:e.uuid,version:this.getVersionFor(t),min_engine_version:this.cleanMinEngineVersion(e.manifest.minEngineVersion,t)}}buildRpHeaderClean(e,t){return{...e.manifest.extraHeader,name:e.name,...e.description===void 0?{}:{description:e.description},uuid:e.uuid,...e.packScope===void 0?{}:{pack_scope:e.packScope},version:this.getVersionFor(t),min_engine_version:this.cleanMinEngineVersion(e.manifest.minEngineVersion,t)}}buildCleanBpModules(e,t){return[...e.moduleUuid?[this.createScriptModule(e,t)]:[],...e.manifest.extraModules]}buildCleanRpModules(e,t){return[this.createResourcesModule(e,t),...e.manifest.extraModules]}buildBpHeader(e,t,n){return{...e.header??{},name:t.name,...t.description===void 0?{}:{description:t.description},uuid:t.uuid,version:this.getVersionFor(n),min_engine_version:this.normalizeMinEngineVersion(e.header?.min_engine_version,n)}}buildRpHeader(e,t,n){return{...e.header??{},name:t.name,...t.description===void 0?{}:{description:t.description},uuid:t.uuid,...t.packScope===void 0?{}:{pack_scope:t.packScope},version:this.getVersionFor(n),min_engine_version:this.normalizeMinEngineVersion(e.header?.min_engine_version,n)}}getScriptEntry(){let e=this.config.packs.bp?.compile;return e?`${e.scriptOutputDir}/${t.basename(e.entry,t.extname(e.entry))}.js`:`scripts/main.js`}isManagedBpModule(e,t){if(e.type!==`script`||e.language!==`javascript`)return!1;let n=this.getScriptEntry();return e.uuid===t.moduleUuid||e.entry===n}isManagedRpModule(e,t){return e.type===`resources`&&e.uuid===t.moduleUuid}createScriptModule(e,t){return{type:`script`,language:`javascript`,uuid:e.moduleUuid,version:this.getModuleVersion(t),entry:this.getScriptEntry()}}createResourcesModule(e,t){return{type:`resources`,uuid:e.moduleUuid,version:this.getModuleVersion(t)}}replaceManagedBpModules(e,t,n){return[...Q(e).filter(e=>!this.isManagedBpModule(e,t)),this.createScriptModule(t,n)]}replaceManagedRpModules(e,t,n){return[...Q(e).filter(e=>!this.isManagedRpModule(e,t)),this.createResourcesModule(t,n)]}applyPbrCapability(e,t){if(t.pbr===!0){let t=Q(e.capabilities);e.capabilities=t.includes(`pbr`)?t:[...t,`pbr`]}else if(t.pbr===!1){let t=Q(e.capabilities).filter(e=>e!==`pbr`);t.length>0?e.capabilities=t:delete e.capabilities}}getVersionFor(e){return e===3?this.versionStr:this.version}getModuleVersion(e){return e===3?`1.0.0`:He}getWriteFormatVersion(e){return this.config.manifestFormat===void 0?e.format_version??2:this.config.manifestFormat}normalizeMinEngineVersion(e,t){if(e==null)return this.defaultMinEngineVersion(t);if(Array.isArray(e))return t===3?e.join(`.`):e;if(typeof e==`string`){if(t===2){let t=this.stringToVersionTuple(e);if(t)return t}return e}return this.defaultMinEngineVersion(t)}cleanMinEngineVersion(e,t){return e===void 0?this.defaultMinEngineVersion(t):t===3?e:this.stringToVersionTuple(e)??this.defaultMinEngineVersion(t)}defaultMinEngineVersion(e){return e===3?`1.21.0`:Ve}stringToVersionTuple(e){let t=e.split(`.`).map(Number);if(t.length===3&&t.every(e=>!Number.isNaN(e)))return t}requireBp(){if(!this.config.packs.bp)throw new u(`CONFIG_INVALID`,`packs.bp is required to build the BP manifest.`);return this.config.packs.bp}requireRp(){if(!this.config.packs.rp)throw new u(`CONFIG_INVALID`,`packs.rp is required to build the RP manifest.`);return this.config.packs.rp}},We=class e{config;catalog;resolvedDeps;version;versionStr;constructor(e,t,n){this.config=e,this.catalog=t,this.resolvedDeps=n??{},this.version=C(e.version),this.versionStr=e.version}static isAllowedSpecifier(e){return e===`stable`||e===`beta`||e===`preview`||/^\d+\.\d+\.\d+(?:[-.][0-9A-Za-z.-]+)?$/.test(e)}static resolveVersion(e){let{specifier:t,target:n,resolvedVersion:r}=e;if(t===`stable`){if(r)return r;throw new u(`DEPENDENCY_REQUIRES_INSTALL`,"Run `bepack install` to resolve stable manifest dependencies.",{details:{specifier:t,target:n}})}if(t===`beta`){if(E(n))return`beta`;if(r)return r;throw new u(`DEPENDENCY_REQUIRES_INSTALL`,`Run \`bepack install\` to resolve manifest dependencies for target ${n}.`,{details:{target:n}})}if(t===`preview`){if(r)return r;throw new u(`DEPENDENCY_REQUIRES_INSTALL`,`Run \`bepack install\` to resolve preview manifest dependencies for target ${n}.`,{details:{specifier:t,target:n}})}return t}validateBpDependencies(){if(this.config.packs.bp)for(let[t,n]of Object.entries(this.config.packs.bp.dependencies)){if(!this.catalog[t]){let e=Object.keys(this.catalog),n=e.length>0?[`Managed packages: ${e.join(`, `)}.`,`Add a missing package to install.dependencyCatalog, or remove it from packs.bp.dependencies.`]:[`No managed packages are available. Extend install.dependencyCatalog to add one.`];throw new u(`UNSUPPORTED_DEPENDENCY`,`${t} is not a managed dependency.`,{details:{package:t},suggestions:n})}if(!e.isAllowedSpecifier(n))throw new u(`DEPENDENCY_VERSION_INVALID`,`${t} dependency version is invalid: ${n}`,{details:{package:t,specifier:n}})}}isManagedBpDependency(e){return!!(`module_name`in e&&typeof e.module_name==`string`&&this.catalog[e.module_name]?.manifest||`uuid`in e&&typeof e.uuid==`string`&&this.config.packs.rp?.uuid===e.uuid)}isManagedRpDependency(e,t){return t!==void 0&&`uuid`in e&&typeof e.uuid==`string`&&e.uuid===t}buildManagedDependencies(){if(!this.config.packs.bp)return[];let t=[];for(let[n,r]of Object.entries(this.config.packs.bp.dependencies))this.catalog[n]?.manifest&&t.push({module_name:n,version:e.resolveVersion({specifier:r,target:this.config.target,resolvedVersion:this.resolvedDeps[n]})});return t}getFormatAwareVersion(e){return(e??this.config.manifestFormat??2)===3?this.versionStr:this.version}replaceBpDependencies(e,t,n){let r=Q(e).filter(e=>!this.isManagedBpDependency(e)),i=this.buildManagedDependencies();return t&&i.push({uuid:t,version:this.getFormatAwareVersion(n)}),[...r,...i]}replaceRpDependencies(e,t,n){let r=Q(e).filter(e=>!this.isManagedRpDependency(e,t));return t?[...r,{uuid:t,version:this.getFormatAwareVersion(n)}]:r}buildBpDependenciesClean(e,t,n){let r=this.buildManagedDependencies();return t&&r.push({uuid:t,version:this.getFormatAwareVersion(e)}),[...r,...n]}buildRpDependenciesClean(e,t,n){let r=[];return t&&r.push({uuid:t,version:this.getFormatAwareVersion(e)}),[...r,...n]}};async function Ge(e){let n=J(e.config),r=e.config.packs.bp?x(e.cwd,e.config):void 0,i=r?await $.read(r):void 0,a=Ke(i,n),o=new We(e.config,n,e.resolvedDeps?{...a,...e.resolvedDeps}:a),s=new Ue(e.config,o),c={};if(e.config.packs.bp){let n=i!==void 0;e.config.manifestFormat===2&&i?.format_version===3&&(e.logger?.warn??console.warn)(`Warning: config manifestFormat is 2, but existing manifest uses format_version 3. format_version 2 does not support string versions; any string versions in the existing manifest will be preserved as-is.`);let a=s.buildBp(i);e.dryRun||await $.write(r,a,`bp`),c.bpManifest={path:m(t.relative(e.cwd,r)),updated:!0,existed:n}}if(e.config.packs.rp){let n=S(e.cwd,e.config),r=await $.read(n),i=r!==void 0,a=s.buildRp(r);e.dryRun||await $.write(n,a,`rp`),c.rpManifest={path:m(t.relative(e.cwd,n)),updated:!0,existed:i}}return c}function Ke(e,t){let n={};for(let r of e?.dependencies??[])`module_name`in r&&typeof r.module_name==`string`&&typeof r.version==`string`&&t[r.module_name]?.manifest&&r.version!==`stable`&&(n[r.module_name]=r.version);return n}function qe(e,t){e?.install?e.install(t):e?.info(`[Install] ${t}`)}var Je=class{registry;logger;cache=/* @__PURE__ */ new Map;constructor(e,t){this.registry=e,this.logger=t}async metadata(e){let t=this.packageUrl(e),n=this.cache.get(t);if(n)return this.logger?.verbose(`Using cached metadata for ${e}`),n;qe(this.logger,`fetching ${e} metadata from ${this.registry}`);let r=await fetch(t);if(!r.ok)throw new u(`SAPI_VERSION_NOT_FOUND`,`Cannot fetch ${e} versions from registry.`,{details:{package:e,registry:this.registry,status:r.status}});let i=await r.json();return this.cache.set(t,i),this.logger?.verbose(`Fetched ${e} metadata (${Object.keys(i.versions??{}).length} versions)`),i}versions(e){return Object.keys(e.versions??{})}async versionsOf(e){return this.versions(await this.metadata(e))}distTag(e,t){let n=e[`dist-tags`]?.[t];return n&&e.versions?.[n]?n:void 0}packageUrl(e){return`${this.registry.replace(/\/$/,``)}/${encodeURIComponent(e).replace(/^%40/,`@`)}`}};function Ye(e){return t=>{e?.install?e.install(t):e?.info(`[Install] ${t}`)}}var Xe=class{config;logger;npm;catalog;pkgResolver;log;constructor(e,t){this.config=e,this.logger=t,this.npm=new Je(e.install.registry,t),this.catalog=J(e),this.pkgResolver=new O(this.npm,t),this.log=Ye(t)}async resolveAll(){let e={},t=this.config.packs.bp?.dependencies;if(!t||Object.keys(t).length===0)return this.log(`no BP dependencies to resolve`),e;this.log(`resolving dependencies for target ${this.config.target}`);for(let[n,r]of Object.entries(t)){let t=Me(this.catalog,n),i=await this.resolveOne(n,r,t),a=t.manifest??!1;e[n]={specifier:r,packageVersion:i.packageVersion,manifestVersion:a?i.manifestVersion??i.packageVersion:null,manifest:a,external:a,resolver:typeof t.resolver==`string`?t.resolver:t.resolver.name},this.log(`${n}: ${r} -> package ${e[n].packageVersion}, manifest ${e[n].manifestVersion}`)}return this.logger?.verbose(`Dependency resolution complete`),e}async resolveOne(e,t,n){let r={packageName:e,specifier:t,target:this.config.target,entry:n,config:this.config};await this.runDependencyHooks(`beforeResolveDependency`,r);let i=await L.fromConfig(this.config.install.dependencyResolvers,this.config.plugins??[]).resolve({packageName:e,specifier:t,target:this.config.target,entry:n,config:this.config,npm:this.npm,...this.logger?{logger:this.logger}:{}});return await this.runDependencyHooks(`afterResolveDependency`,{...r,result:i}),i}async runDependencyHooks(e,t){for(let n of this.config.plugins??[]){let r=n.install?.hooks?.[e];if(r)try{await r(t)}catch(t){throw new u(`PLUGIN_FAILED`,`Plugin ${n.name} ${e} hook failed: ${t instanceof Error?t.message:String(t)}`)}}}};async function Ze(e,t){return new Xe(e,t).resolveAll()}export{P as BUILTIN_DEPENDENCY_CATALOG,I as BUILTIN_DEPENDENCY_RESOLVERS,W as BUILTIN_PLUGINS,u as BePackError,L as DependencyResolverRegistry,Xe as DependencyService,O as MinecraftPackageResolver,Je as NpmRegistryClient,J as createDependencyCatalog,c as defineConfig,F as exactVersionResolver,f as getConfiguredPacks,je as loadConfig,M as minecraftScriptApiBpResolver,j as minecraftScriptApiResolver,N as minecraftVanillaDataResolver,ae as packageVersionForSpecifier,Ge as patchManifest,Ze as resolveDependencies,U as sapiPro,D as satisfiesSemver,ie as satisfiesSemverRange};
|
|
1
|
+
import{pathToFileURL as e}from"node:url";import t from"node:path";import{promises as n}from"node:fs";import{platform as r}from"node:os";import"rolldown/plugins";var i=Object.create,a=Object.defineProperty,o=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,c=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty,u=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=s(t),c=0,u=i.length,d;c<u;c++)d=i[c],!l.call(e,d)&&d!==n&&a(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=o(t,d))||r.enumerable});return e},f=(e,t,n)=>(n=e==null?{}:i(c(e)),d(t||!e||!e.__esModule||!l.call(e,`default`)?a(n,`default`,{value:e,enumerable:!0}):n,e));const p={root:`.`,configured:{root:!1,packOutDir:!1},name:`minecraft-addon`,version:`1.0.0`,description:``,replace:{values:{},builtins:{VERSION:!1,NAME:!1,UUID:!1,DESCRIPTION:!1}},target:`latest`,plugins:[],install:{registry:`https://registry.npmjs.org/`,saveTo:`dependencies`,packageManager:`auto`,runPackageManager:!0,updatePackageJson:!0,updateManifest:!0,dependencyCatalog:{},dependencyResolvers:[]},build:{copy:!1,timing:!1},dev:{copy:!1},copy:{defaultTarget:``,targets:{}},pack:{name:`{name}-{version}`,outDir:`dist`},hooks:{}},m={dev:!0,build:!1,file:`node_modules/.cache/bepack/tsconfig.tsbuildinfo`},h={keepLooseFiles:!1,keepLoose:[],exclude:[],minifyJson:!0,packOptimizationVersion:`0.1.0`,allowUnsupportedTarget:!1},g={entry:`src/main.ts`,define:{},tsconfig:`tsconfig.json`,typecheck:!0,preserveModules:!0,external:[/^@minecraft\/server.*/],useNpx:!1,minify:!1,cache:m,scriptOutputDir:`scripts`};function _(e){return e}const v=[`bepack.config.ts`,`bepack.config.mjs`,`bepack.config.js`];var y=class extends Error{code;details;suggestions;constructor(e,t,n={}){super(t),this.name=`BePackError`,this.code=e,this.details=n.details,this.suggestions=n.suggestions}};const b=[`world`,`global`,`any`];function x(e){let t=[];return e.packs.bp&&t.push({type:`bp`,root:e.packs.bp.root,uuid:e.packs.bp.uuid,...e.packs.bp.moduleUuid===void 0?{}:{moduleUuid:e.packs.bp.moduleUuid},name:e.packs.bp.name,include:e.packs.bp.include}),e.packs.rp&&t.push({type:`rp`,root:e.packs.rp.root,uuid:e.packs.rp.uuid,moduleUuid:e.packs.rp.moduleUuid,name:e.packs.rp.name,include:e.packs.rp.include}),t}function S(e,n){return t.isAbsolute(n)?n:t.join(e,n)}function C(e){return e.replace(/\\/g,`/`)}function w(e,t){return S(e,t.root)}function T(e,t,n){return n===`bp`?t.packs.bp?S(e,t.packs.bp.root):void 0:t.packs.rp?S(e,t.packs.rp.root):void 0}function E(e,t){let n=T(w(e,t),t,`bp`);if(!n)throw Error(`packs.bp is not configured`);return n}function D(e,t){let n=T(w(e,t),t,`rp`);if(!n)throw Error(`packs.rp is not configured`);return n}function ee(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..${t.sep}`)&&r!==`..`&&!t.isAbsolute(r)}function te(e,n,r){if(!n||n===`.`)throw new y(`CONFIG_INVALID`,`compile.scriptOutputDir must be a non-empty relative path strictly inside the BP root. Got: "${n}". This directory will be emptied during build.`);let i=n.replace(/\\/g,`/`);if(t.posix.isAbsolute(i)||t.win32.isAbsolute(i))throw new y(`CONFIG_INVALID`,`compile.scriptOutputDir must be a relative path, not absolute. Got: "${n}". This directory will be emptied during build.`);let a=t.posix.normalize(i);if(a.split(`/`).includes(`..`))throw new y(`CONFIG_INVALID`,`compile.scriptOutputDir must not contain ".." (path escape). Got: "${n}" resolves outside the BP root. This directory will be emptied during build.`);let o=t.resolve(e,a),s=t.relative(e,o);if(!s||s.startsWith(`..`)||t.isAbsolute(s))throw new y(`CONFIG_INVALID`,`compile.scriptOutputDir must be a directory strictly inside the BP root. Value: "${n}", resolved: "${o}". This directory will be emptied during build and must not be the BP root or a path outside it.`);if(r&&ee(o,r))throw new y(`CONFIG_INVALID`,`compile.scriptOutputDir "${n}" dangerously overlaps with the source entry directory. The output directory will be emptied during build and would delete source files.`);return C(s)}function ne(e,n){if(n.packs.bp)return t.join(E(e,n),`manifest.json`)}function re(e,n){if(n.packs.rp)return t.join(D(e,n),`manifest.json`)}r();function ie(e){return{values:e?.values??{},builtins:{VERSION:e?.builtins?.VERSION??!1,NAME:e?.builtins?.NAME??!1,UUID:e?.builtins?.UUID??!1,DESCRIPTION:e?.builtins?.DESCRIPTION??!1}}}function ae(e){let t={...e??{}};for(let[e,n]of Object.entries(t))try{Function(`return (${n});`)}catch{throw new y(`CONFIG_INVALID`,`packs.bp.compile.define["${e}"] is not a valid JavaScript expression: ${n}. Define values must be expression strings, e.g. JSON.stringify("server") or "true".`,{details:{defineKey:e,defineValue:n}})}return t}function oe(e){let t=/^(\d+)\.(\d+)\.(\d+)$/.exec(e);if(!t)throw new y(`VERSION_INVALID`,`Manifest version requires x.y.z.`,{details:{version:e}});return[Number(t[1]),Number(t[2]),Number(t[3])]}function se(e){return/^\d+\.\d+\.\d+(?:[-.][0-9A-Za-z.-]+)?$/.test(e)}function O(e,t){let n=e.split(/[^0-9A-Za-z]+/),r=t.split(/[^0-9A-Za-z]+/),i=Math.max(n.length,r.length);for(let e=0;e<i;e+=1){let t=n[e]??``,i=r[e]??``,a=/^\d+$/.test(t)?Number(t):NaN,o=/^\d+$/.test(i)?Number(i):NaN,s=Number.isNaN(a)||Number.isNaN(o)?t.localeCompare(i):a-o;if(s!==0)return s}return 0}function ce(e){return e===`latest`||O(e,`1.21.120`)>=0}function le(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(e.trim());if(!t)return;let n=/(?:^|[.-])(\d+)\.(\d+)\.(\d+)(?:[.-]|$)/.exec(t[4]??``);return{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),...n?{minecraftTarget:[Number(n[1]),Number(n[2]),Number(n[3])]}:{}}}function ue(e,t){for(let n of[`major`,`minor`,`patch`])if(e[n]!==t[n])return e[n]-t[n];return 0}function k(e,t){let n=le(e);return n?t.split(`||`).some(e=>{let t=/(?:\^|~|>=|<=|>|<|=)?\s*(v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)/.exec(e.trim()),r=t?le(t[1]):void 0;return!r||n.major!==r.major||ue(n,r)<0?!1:r.minecraftTarget?n.minecraftTarget?O(n.minecraftTarget.join(`.`),r.minecraftTarget.join(`.`))>=0:!1:!0}):!1}const de=k;function fe(e){if(e===`stable`||e===`beta`||e===`preview`)throw new y(`DEPENDENCY_VERSION_INVALID`,`${e} must be resolved from npm registry before writing package.json.`,{details:{specifier:e}});if(se(e))return e;throw new y(`DEPENDENCY_VERSION_INVALID`,`Unsupported dependency version: ${e}`,{details:{specifier:e}})}function pe(e){return e.filter(e=>/^\d+\.\d+\.\d+$/.test(e)).sort(O)}function me(e){return e.filter(e=>/(?:^|[-.])beta(?:[-.]|$)/i.test(e)).sort(O)}var A=class{npm;logger;constructor(e,t){this.npm=e,this.logger=t}latestStable(e,t){let n=this.npm.distTag(t,`latest`);if(n&&/^\d+\.\d+\.\d+$/.test(n))return this.logger?.verbose(`Resolved ${e}@stable -> ${n}`),n;let r=pe(this.npm.versions(t)).at(-1);if(!r)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest stable version for ${e}.`,{details:{package:e}});return this.logger?.verbose(`Resolved ${e}@stable -> ${r}`),r}latestBeta(e,t){let n=this.npm.distTag(t,`beta`);if(n)return this.logger?.verbose(`Resolved ${e}@beta -> ${n}`),n;let r=me(this.npm.versions(t)).at(-1);if(!r)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest beta version for ${e}.`,{details:{package:e}});return this.logger?.verbose(`Resolved ${e}@beta -> ${r}`),r}betaForTarget(e,t,n){let r=t.replace(/\./g,`\\.`),i=RegExp(`beta[-.]${r}-stable`),a=this.npm.versions(n).filter(e=>i.test(e)).sort(O).at(-1);if(!a)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e}@beta for target ${t}.`,{details:{package:e,specifier:`beta`,target:t},suggestions:[`Use target: "latest"`,`Specify an exact version`,`Update BePack`,`Manually edit package.json and manifest.json`]});return this.logger?.verbose(`Resolved ${e}@beta for target ${t} -> ${a}`),a}inferStableFromBeta(e,t,n,r){let i=/^(\d+)\.(\d+)\.(\d+)-beta[.-]/.exec(n);if(!i)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot infer stable version from ${e}@${n}.`,{details:{package:e,beta:n,target:t}});let a=Number(i[1]),o=Number(i[2])-1,s=`${a}.${o}.${Number(i[3])}`;if(o<0||!r.versions?.[s])throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot confirm inferred stable version ${s} for ${e}.`,{details:{package:e,target:t,beta:n,inferredStable:s}});return s}};function he(e,t){return t===`latest`||ce(t)?`beta`:/^(\d+\.\d+\.\d+-beta)/i.exec(e)?.[1]??e}function ge(e,t,n){let r=me(t).filter(e=>/^\d+\.\d+\.\d+-beta\.\d+\.\d+\.\d+/.test(e)).filter(e=>!/(?:rc|beta)\.\d+\.\d+\.\d+-preview\.\d+$/i.test(e)).at(-1);if(!r)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest beta version for ${e}.`,{details:{package:e}});return n?.verbose(`Resolved ${e}@beta -> ${r}`),r}function _e(e){return e.filter(e=>/(?:rc|beta)\.\d+\.\d+\.\d+-preview\.\d+$/i.test(e)).sort(O)}function j(e,t,n){let r=_e(t).at(-1);if(!r)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest preview version for ${e}.`,{details:{package:e}});return n?.verbose(`Resolved ${e}@preview -> ${r}`),r}function M(e,t,n,r){let i=n.replace(/\./g,`\\.`),a=RegExp(`(?:rc|beta)\\.${i}-preview\\.\\d+$`),o=t.filter(e=>a.test(e)).sort(O).at(-1);if(!o)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e}@preview for target ${n}.`,{details:{package:e,specifier:`preview`,target:n},suggestions:[`Use target: "latest"`,`Specify an exact version`]});return r?.verbose(`Resolved ${e}@preview for target ${n} -> ${o}`),o}const N={name:`minecraft-script-api`,resolver:`minecraft-script-api`,match:e=>e.specifier===`stable`||e.specifier===`beta`||e.specifier===`preview`,async resolve(e){let t=await e.npm.metadata(e.packageName),n=new A(e.npm,e.logger);if(e.specifier===`stable`){e.logger?.verbose(`Resolving ${e.packageName}@stable for target ${e.target}`);let r=e.target===`latest`?n.latestStable(e.packageName,t):n.inferStableFromBeta(e.packageName,e.target,n.betaForTarget(e.packageName,e.target,t),t);return{packageVersion:r,manifestVersion:r}}if(e.specifier===`beta`){e.logger?.verbose(`Resolving ${e.packageName}@beta for target ${e.target}`);let r=e.target===`latest`?ge(e.packageName,e.npm.versions(t),e.logger):n.betaForTarget(e.packageName,e.target,t);return{packageVersion:r,manifestVersion:he(r,e.target)}}e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`);let r=e.target===`latest`?j(e.packageName,e.npm.versions(t),e.logger):M(e.packageName,e.npm.versions(t),e.target,e.logger);return{packageVersion:r,manifestVersion:r}}},P={name:`minecraft-script-api-bp`,resolver:`minecraft-script-api-bp`,match:e=>e.specifier===`beta`||e.specifier===`preview`,async resolve(e){let t=await e.npm.metadata(e.packageName),n=new A(e.npm,e.logger);if(e.specifier===`beta`){e.logger?.verbose(`Resolving ${e.packageName}@beta for target ${e.target}`);let r=e.target===`latest`?ge(e.packageName,e.npm.versions(t),e.logger):n.betaForTarget(e.packageName,e.target,t);return{packageVersion:r,manifestVersion:he(r,e.target)}}e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`);let r=e.target===`latest`?j(e.packageName,e.npm.versions(t),e.logger):M(e.packageName,e.npm.versions(t),e.target,e.logger);return{packageVersion:r,manifestVersion:r}}},F=/^\d+\.\d+\.\d+$/,ve=/^\d+\.\d+\.\d+-preview\.\d+$/,I={name:`minecraft-vanilla-data`,resolver:`minecraft-vanilla-data`,match:e=>e.specifier===`stable`||e.specifier===`preview`,async resolve(e){let t=await e.npm.metadata(e.packageName);return e.specifier===`stable`?ye(e,t):be(e,t)}};function ye(e,t){if(e.logger?.verbose(`Resolving ${e.packageName}@stable for target ${e.target}`),e.target===`latest`){let n=e.npm.distTag(t,`latest`);if(n&&F.test(n))return e.logger?.verbose(`Resolved ${e.packageName}@stable -> ${n}`),{packageVersion:n};let r=e.npm.versions(t).filter(e=>F.test(e)).sort(O).at(-1);if(!r)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest stable version for ${e.packageName}.`,{details:{package:e.packageName}});return e.logger?.verbose(`Resolved ${e.packageName}@stable -> ${r}`),{packageVersion:r}}if(t.versions?.[e.target])return e.logger?.verbose(`Resolved ${e.packageName}@stable for target ${e.target} -> ${e.target}`),{packageVersion:e.target};throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e.packageName}@stable for target ${e.target}. The target version does not exist in the registry.`,{details:{package:e.packageName,specifier:`stable`,target:e.target},suggestions:[`Use target: "latest"`,`Specify an exact version`]})}function be(e,t){if(e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`),e.target===`latest`){let n=e.npm.versions(t).filter(e=>ve.test(e)).sort(O).at(-1);if(!n)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest preview version for ${e.packageName}.`,{details:{package:e.packageName}});return e.logger?.verbose(`Resolved ${e.packageName}@preview -> ${n}`),{packageVersion:n}}let n=e.target.replace(/\./g,`\\.`),r=RegExp(`^${n}-preview\\.\\d+$`),i=e.npm.versions(t).filter(e=>r.test(e)).sort(O).at(-1);if(!i)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve ${e.packageName}@preview for target ${e.target}. No matching preview version found.`,{details:{package:e.packageName,specifier:`preview`,target:e.target},suggestions:[`Use target: "latest"`,`Specify an exact preview version`]});return e.logger?.verbose(`Resolved ${e.packageName}@preview for target ${e.target} -> ${i}`),{packageVersion:i}}const L={"@minecraft/common":{resolver:N,manifest:!0},"@minecraft/server":{resolver:N,manifest:!0},"@minecraft/server-ui":{resolver:N,manifest:!0},"@minecraft/server-net":{resolver:P,manifest:!0},"@minecraft/server-admin":{resolver:P,manifest:!0},"@minecraft/server-gametest":{resolver:P,manifest:!0},"@minecraft/debug-utilities":{resolver:P,manifest:!0},"@minecraft/diagnostics":{resolver:P,manifest:!0},"@minecraft/server-graphics":{resolver:P,manifest:!0},"@minecraft/server-editor":{resolver:P,manifest:!0},"@minecraft/vanilla-data":{resolver:I,manifest:!1}},R={name:`exact-version`,match:e=>se(e.specifier),resolve(e){return e.logger?.verbose(`Using exact ${e.packageName}@${e.specifier}`),{packageVersion:fe(e.specifier),manifestVersion:e.specifier}}},z=[N,P,I,R];var B=class e{resolvers;pluginNames=/* @__PURE__ */ new Map;constructor(e,t=[]){this.resolvers=e;for(let e of t)for(let t of e.install?.dependencyResolvers??[])this.pluginNames.set(t,e.name)}static fromConfig(t,n=[]){return new e([...t,...z],n)}resolverMatchesCatalog(e,t){let n=e.entry.resolver;if(!n)return!0;let r=typeof n==`string`?n:n.name;return t.resolver===void 0||t.resolver===r}find(e){let t;for(let n of this.resolvers)if(this.resolverMatchesCatalog(e,n))try{if(n.match(e)){t=n;break}}catch(e){let t=this.pluginNames.get(n);throw t?new y(`PLUGIN_FAILED`,`Plugin ${t} resolver ${n.name} match failed: ${e instanceof Error?e.message:String(e)}`):e}if(!t)throw new y(`DEPENDENCY_VERSION_INVALID`,`${e.packageName} dependency version is invalid: ${e.specifier}`,{details:{package:e.packageName,specifier:e.specifier,resolver:e.entry.resolver}});return e.logger?.verbose(`Resolving ${e.packageName}@${e.specifier} with ${t.name}`),t}async resolve(e){let t=this.find(e);try{return await t.resolve(e)}catch(e){let n=this.pluginNames.get(t);throw n?new y(`PLUGIN_FAILED`,`Plugin ${n} resolver ${t.name} failed: ${e instanceof Error?e.message:String(e)}`):e}}};const V=`sapi-pro`,H=[`@minecraft/server`,`@minecraft/server-ui`];function U(e){return/(?:beta|preview|alpha|rc)/i.test(e)}function xe(e){return U(e)?`beta`:`stable`}function Se(e){let t=/^(\d+)\.(\d+)\./.exec(e);return!!t&&(Number(t[1])>0||Number(t[2])>=4)}function Ce(e){return{...e.dependencies??{},...e.peerDependencies??{}}}async function we(e,t,n,r){let i=e.config.packs.bp?.dependencies??{},a={...L,...e.config.install.dependencyCatalog},o=B.fromConfig(e.config.install.dependencyResolvers.filter(e=>e!==W),e.config.plugins);for(let[s,c]of Object.entries(t)){if(!s.startsWith(`@minecraft/`))continue;let t=i[s],l=a[s];if(!t||!l)return r.add(s),!1;let u;if(n.has(s)?u=n.get(s):(u=await o.resolve({packageName:s,specifier:t,target:e.target,entry:l,config:e.config,npm:e.npm,...e.logger?{logger:e.logger}:{}}),n.set(s,u)),!u||H.includes(s)&&U(c)!==U(u.packageVersion)||!k(u.packageVersion,c))return!1}return!0}function Te(e,t){if(t!==`stable`&&t!==`beta`){let n=e[t];return n?[[t,n]]:[]}return Object.entries(e).filter(([e,n])=>{if(!Se(e))return!1;let r=Ce(n);return Object.keys(r).length===0?!1:t===`stable`?/-stable(?:\.\d+)?$/i.test(e):/^\d+\.\d+\.\d+$/.test(e)}).sort(([e],[t])=>O(e,t)).reverse()}const W={name:`sapi-pro`,resolver:`sapi-pro`,match:e=>e.specifier===`stable`||e.specifier===`beta`||/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(e.specifier),async resolve(e){let t=await e.npm.metadata(V),n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Set;for(let[i,a]of Te(t.versions??{},e.specifier))if(await we(e,Ce(a),n,r))return/^0\.3\./.test(i)&&e.logger?.warn(`sapi-pro@${i} uses legacy metadata; compatibility is best-effort only.`),{packageVersion:i,manifestVersion:null};throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot find a compatible ${V}@${e.specifier} for target ${e.target}.${r.size>0?` Missing explicit dependencies: ${[...r].join(`, `)}.`:``}`,{details:{package:V,specifier:e.specifier,target:e.target},suggestions:[`Explicitly declare the @minecraft packages required by sapi-pro.`,`Use a compatible target or specify an exact sapi-pro version.`]})}};function Ee(){return{name:`sapi-pro`,apiVersion:1,description:`Resolve sapi-pro versions compatible with BePack Script API dependencies.`,configResolved:({config:e})=>{let t=e.packs.bp?.dependencies??{},n=t[V];if(!n)return;let r=H.filter(e=>!t[e]);if(r.length>0)throw Error(`sapi-pro requires explicit dependencies: ${r.join(`, `)}.`);if(n===`stable`||n===`beta`)for(let e of H){let r=t[e];if(xe(r)!==n)throw Error(`sapi-pro ${n} requires ${e} to use ${n}, received ${r}.`)}},install:{dependencyCatalog:{[V]:{resolver:`sapi-pro`,manifest:!1}},dependencyResolvers:[W]}}}const De={"sapi-pro":Ee};function G(e){return e?Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0)):{}}function K(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e==`function`?`function`:typeof e==`object`?`object`:typeof e==`string`?JSON.stringify(e):String(e)}function Oe(e,t){let n={};(e.packs?.bp||t.packs?.bp)&&(n.bp={...e.packs?.bp??{},...G(t.packs?.bp)}),(e.packs?.rp||t.packs?.rp)&&(n.rp={...e.packs?.rp??{},...G(t.packs?.rp)});let r={...e.copy?.targets??{},...G(t.copy?.targets)},i=G(t);return{...e,...i,...t.plugins!==void 0||e.plugins!==void 0?{plugins:t.plugins??e.plugins}:{},packs:n,install:{...e.install,...G(t.install)},build:{...e.build,...G(t.build)},dev:{...e.dev,...G(t.dev)},copy:{...e.copy,...G(t.copy),targets:r},pack:{...e.pack,...G(t.pack)},hooks:{...e.hooks,...G(t.hooks)}}}function ke(e){let t=(e??[]).map(e=>{if(typeof e!=`string`)return e;let t=De[e];if(!t)throw new y(`CONFIG_INVALID`,`Unknown built-in plugin: ${e}.`);return t()}),n=/* @__PURE__ */ new Set;for(let e of t){if(!e?.name||e.name.trim()===``)throw new y(`CONFIG_INVALID`,`Every plugin must have a non-empty name.`);if(n.has(e.name))throw new y(`CONFIG_INVALID`,`Plugin name is duplicated: ${e.name}.`);if(e.apiVersion!==void 0&&e.apiVersion!==1)throw new y(`CONFIG_INVALID`,`Plugin ${e.name} requires unsupported BePack plugin API version ${e.apiVersion}.`);if(e.priority!==void 0&&!Number.isFinite(e.priority))throw new y(`CONFIG_INVALID`,`Plugin ${e.name} priority must be a finite number.`);n.add(e.name)}return t.sort((e,t)=>(t.priority??0)-(e.priority??0))}function Ae(e,t){let n=/* @__PURE__ */ new Set;for(let r of[...e.map(e=>e.hooks),t])for(let e of Object.keys(r??{}))n.add(e);return Object.fromEntries([...n].map(n=>{let r=[...e.map(e=>({plugin:e,hook:e.hooks?.[n]})).filter(e=>e.hook!==void 0),...t?.[n]?[{hook:t[n]}]:[]];return[n,async(...e)=>{let t;for(let i of r)try{t=await i.hook(...e)}catch(e){let t=`plugin`in i?i.plugin:void 0;throw t?new y(`PLUGIN_FAILED`,`Plugin ${t.name} ${String(n)} hook failed: ${e instanceof Error?e.message:String(e)}`):e}return t}]}))}function je(e,t){let n={},r=/* @__PURE__ */ new Map,i=[];for(let t of e)for(let[e,a]of Object.entries(t.install?.dependencyCatalog??{})){let o=r.get(e);if(o){i.push(`dependency catalog ${e}: plugin ${o} takes precedence over plugin ${t.name}`);continue}n[e]=a,r.set(e,t.name)}for(let[e,a]of Object.entries(t)){let t=r.get(e);t&&i.push(`dependency catalog ${e}: project config overrides plugin ${t}`),n[e]=a}return{catalog:n,diagnostics:i}}function Me(e,n,r){let i=g,a=e?.scriptOutputDir??i.scriptOutputDir,o=t.resolve(r,e?.entry??i.entry),s=te(n,a,t.dirname(o));return{entry:e?.entry??i.entry,define:ae(e?.define),tsconfig:e?.tsconfig??i.tsconfig,typecheck:e?.typecheck??i.typecheck,preserveModules:e?.preserveModules??i.preserveModules,external:e?.external??i.external,useNpx:e?.useNpx??i.useNpx,minify:e?.minify??i.minify,cache:u(e?.cache),scriptOutputDir:s,...e?.rolldown===void 0?{}:{rolldown:c(e.rolldown)},...e?.rolldownConfig===void 0?{}:{rolldownConfig:l(e.rolldownConfig)}};function c(e){if(typeof e==`function`||e&&typeof e==`object`&&!Array.isArray(e))return e;throw new y(`CONFIG_INVALID`,`packs.bp.compile.rolldown must be a rolldown options object or a function (options, context) => options, got: ${K(e)}.`)}function l(e){if(typeof e!=`string`||e.trim()===``)throw new y(`CONFIG_INVALID`,`packs.bp.compile.rolldownConfig must be a non-empty path string, got: ${K(e)}.`);return e}function u(e){let t=m;return{dev:e?.dev??t.dev,build:e?.build??t.build,file:e?.file??t.file}}}function Ne(e){if(e===void 0||e===!1)return;let t=e===!0?{}:e;if(typeof t!=`object`||!t||Array.isArray(t))throw new y(`CONFIG_INVALID`,`pack.optimize must be a boolean or an options object, got: ${K(e)}.`);let n=t.packOptimizationVersion;if(n!==void 0&&(typeof n!=`string`||n.trim()===``))throw new y(`CONFIG_INVALID`,`pack.optimize.packOptimizationVersion must be a non-empty string, got: ${K(n)}.`);return{keepLooseFiles:t.keepLooseFiles??h.keepLooseFiles,keepLoose:t.keepLoose!==!1&&(t.keepLoose??[]).map(Pe),exclude:(t.exclude??[]).map(Pe),minifyJson:t.minifyJson??h.minifyJson,packOptimizationVersion:n??h.packOptimizationVersion,allowUnsupportedTarget:t.allowUnsupportedTarget??h.allowUnsupportedTarget}}function Pe(e){let n=String(e).replace(/\\/g,`/`).replace(/^\.\//,``).replace(/\/+$/,``);if(!n||n.includes(`/`)||n.includes(`..`)||t.posix.isAbsolute(n))throw new y(`CONFIG_INVALID`,`pack.optimize.exclude entries must be top-level folder names (no path separators, no ".."), got: ${K(e)}.`);return n}function Fe(e){let t=e?.merge??`preserve`;if(t!==`preserve`&&t!==`clean`)throw new y(`CONFIG_INVALID`,`manifest.merge must be "preserve" or "clean", got: ${String(e?.merge)}.`);let n=e?.minEngineVersion;if(n!==void 0&&!/^\d+\.\d+\.\d+$/.test(n))throw new y(`CONFIG_INVALID`,`manifest.minEngineVersion must be a SemVer string like "1.21.0", got: ${n}.`);return{merge:t,...n===void 0?{}:{minEngineVersion:n},extraDependencies:e?.extraDependencies??[],extraModules:e?.extraModules??[],extraHeader:e?.extraHeader??{}}}function Ie(e,n={},r=process.cwd()){let i=Oe(e,n),a=ke(i.plugins),o=i.target??p.target;if(o===`stable`||o===`beta`)throw new y(`TARGET_INVALID`,`target must be a Minecraft game version or latest, not a Script API channel.`,{details:{target:o}});let s=!!i.packs?.bp,c=!!i.packs?.rp;if(!s&&!c)throw new y(`CONFIG_INVALID`,`At least one pack (packs.bp or packs.rp) is required.`);if(!i.name||i.name.trim()===``)throw new y(`CONFIG_INVALID`,`name is required.`);let l=i.name,u=i.version??p.version,d=i.description,f=i.packs,m=f.bp?.compile,h=f.bp,g=f.rp;if(h){if(!h.uuid)throw new y(`CONFIG_INVALID`,`packs.bp.uuid is required.`);if(h.compile&&!h.moduleUuid)throw new y(`CONFIG_INVALID`,`packs.bp.moduleUuid is required when packs.bp.compile is configured.`);if(h.root===void 0)throw new y(`CONFIG_INVALID`,`packs.bp.root is required. Set the behavior pack directory in bepack.config.ts.`);if(m?.define){let e=Object.keys(i.replace?.values??{}),t=Object.keys(m.define),n=e.filter(e=>t.includes(e));if(n.length>0)throw new y(`CONFIG_INVALID`,`Config conflict: ${n.map(e=>`"${e}"`).join(`, `)} is configured in both replace.values and packs.bp.compile.define. Use only one mechanism per key.`,{details:{overlap:n}})}}let _=t.resolve(r,i.root??`.`),v=h?t.resolve(_,h.root):void 0;if(g){if(!g.uuid||!g.moduleUuid)throw new y(`CONFIG_INVALID`,`packs.rp.uuid and packs.rp.moduleUuid are required.`);if(g.root===void 0)throw new y(`CONFIG_INVALID`,`packs.rp.root is required when packs.rp is configured.`);if(g.packScope!==void 0&&!b.includes(g.packScope))throw new y(`CONFIG_INVALID`,`packs.rp.packScope must be one of ${b.map(e=>`"${e}"`).join(`, `)}.`,{details:{packScope:g.packScope}})}let x=h?.description??d,S=g?.description??d,{catalog:C,diagnostics:w}=je(a,i.install?.dependencyCatalog??{}),T=a.flatMap(e=>e.install?.dependencyResolvers??[]),E=Ne(i.pack?.optimize),D=Ne(i.copy?.optimize);return{root:i.root??p.root,configured:{root:i.root!==void 0,packOutDir:i.pack?.outDir!==void 0},name:l,version:u,...d===void 0?{}:{description:d},replace:ie(i.replace),target:o,plugins:a,...w.length>0?{pluginDiagnostics:w}:{},...i.manifestFormat===void 0?{}:{manifestFormat:i.manifestFormat},packs:{...h?{bp:{root:h.root,uuid:h.uuid,...h.moduleUuid===void 0?{}:{moduleUuid:h.moduleUuid},name:h.name??l,...x===void 0?{}:{description:x},...m&&v?{compile:Me(m,v,_)}:{},manifest:Fe(h.manifest),dependencies:h.dependencies??{},...h.achievement===void 0?{}:{achievement:h.achievement},include:h.include??[]}}:{},...g?{rp:{root:g.root,uuid:g.uuid,moduleUuid:g.moduleUuid,name:g.name??l,...S===void 0?{}:{description:S},manifest:Fe(g.manifest),...g.pbr===void 0?{}:{pbr:g.pbr},...g.packScope===void 0?{}:{packScope:g.packScope},include:g.include??[]}}:{}},install:{registry:i.install?.registry??p.install.registry,saveTo:i.install?.saveTo??p.install.saveTo,packageManager:i.install?.packageManager??p.install.packageManager,runPackageManager:i.install?.runPackageManager??p.install.runPackageManager,updatePackageJson:i.install?.updatePackageJson??p.install.updatePackageJson,updateManifest:i.install?.updateManifest??p.install.updateManifest,dependencyCatalog:C,dependencyResolvers:[...T,...i.install?.dependencyResolvers??[]]},build:{copy:i.build?.copy??p.build.copy,timing:i.build?.timing??p.build.timing},dev:{copy:i.dev?.copy??p.dev.copy,...i.dev?.watch?{watch:i.dev.watch}:{}},copy:{defaultTarget:i.copy?.defaultTarget??p.copy.defaultTarget,...i.copy?.name?{name:i.copy.name}:{},...i.copy?.include?{include:i.copy.include}:{},targets:i.copy?.targets??{},...D?{optimize:D}:{}},pack:{name:i.pack?.name??p.pack.name,outDir:i.pack?.outDir??p.pack.outDir,...E?{optimize:E}:{}},hooks:Ae(a,i.hooks)}}async function Le(e,r){if(r){let t=S(e,r);return await n.access(t).catch(()=>{throw new y(`CONFIG_NOT_FOUND`,`Config not found: ${r}`,{details:{configPath:r}})}),t}for(let r of v){let i=t.join(e,r);try{return await n.access(i),i}catch{}}throw new y(`CONFIG_NOT_FOUND`,`No bepack.config.ts, bepack.config.mjs, or bepack.config.js found.`,{details:{cwd:e}})}async function Re(t){try{if(t.endsWith(`.ts`))try{return await import(`${e(t).href}?t=${Date.now()}`)}catch{let e=ze(await n.readFile(t,`utf8`));return await import(`data:text/javascript;base64,${Buffer.from(e,`utf8`).toString(`base64`)}`)}return await import(`${e(t).href}?t=${Date.now()}`)}catch(e){throw new y(`CONFIG_INVALID`,`Failed to load config: ${e instanceof Error?e.message:String(e)}`,{details:{file:t},suggestions:[`Use bepack.config.mjs/js for complex config logic.`,`Keep bepack.config.ts free of TypeScript-only runtime syntax.`]})}}function ze(e){return e.replace(/^\s*import\s+type\s+[^;]+;\s*$/gm,``).replace(/\s+satisfies\s+[A-Za-z_$][\w$<>,\s.[\]|&{}]*/g,``).replace(/\((\s*[A-Za-z_$][\w$]*)\s*:\s*[^)=]+?\)\s*=>/g,`($1) =>`)}async function Be(e,t){for(let n of e.plugins??[])if(n.configResolved)try{await n.configResolved({cwd:t,config:e})}catch(e){throw new y(`PLUGIN_FAILED`,`Plugin ${n.name} configResolved hook failed: ${e instanceof Error?e.message:String(e)}`)}}async function Ve(e){let n=t.resolve(e.cwd),r=await Le(n,e.configPath),i=await Re(r);if(i.default===void 0)throw new y(`CONFIG_INVALID`,`Config must use default export.`,{details:{file:r}});let a=Ie(i.default,e.overrides,n);return await Be(a,n),{config:a,path:r,cwd:n}}var He=/* @__PURE__ */ f((/* @__PURE__ */ u(((e,t)=>{let n=process||{},r=n.argv||[],i=n.env||{},a=!(i.NO_COLOR||r.includes(`--no-color`))&&(!!i.FORCE_COLOR||r.includes(`--color`)||n.platform===`win32`||(n.stdout||{}).isTTY&&i.TERM!==`dumb`||!!i.CI),o=(e,t,n=e)=>r=>{let i=``+r,a=i.indexOf(t,e.length);return~a?e+s(i,t,n,a)+t:e+i+t},s=(e,t,n,r)=>{let i=``,a=0;do i+=e.substring(a,r)+n,a=r+t.length,r=e.indexOf(t,a);while(~r);return i+e.substring(a)},c=(e=a)=>{let t=e?o:()=>String;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,`\x1B[39m`),red:t(`\x1B[31m`,`\x1B[39m`),green:t(`\x1B[32m`,`\x1B[39m`),yellow:t(`\x1B[33m`,`\x1B[39m`),blue:t(`\x1B[34m`,`\x1B[39m`),magenta:t(`\x1B[35m`,`\x1B[39m`),cyan:t(`\x1B[36m`,`\x1B[39m`),white:t(`\x1B[37m`,`\x1B[39m`),gray:t(`\x1B[90m`,`\x1B[39m`),bgBlack:t(`\x1B[40m`,`\x1B[49m`),bgRed:t(`\x1B[41m`,`\x1B[49m`),bgGreen:t(`\x1B[42m`,`\x1B[49m`),bgYellow:t(`\x1B[43m`,`\x1B[49m`),bgBlue:t(`\x1B[44m`,`\x1B[49m`),bgMagenta:t(`\x1B[45m`,`\x1B[49m`),bgCyan:t(`\x1B[46m`,`\x1B[49m`),bgWhite:t(`\x1B[47m`,`\x1B[49m`),blackBright:t(`\x1B[90m`,`\x1B[39m`),redBright:t(`\x1B[91m`,`\x1B[39m`),greenBright:t(`\x1B[92m`,`\x1B[39m`),yellowBright:t(`\x1B[93m`,`\x1B[39m`),blueBright:t(`\x1B[94m`,`\x1B[39m`),magentaBright:t(`\x1B[95m`,`\x1B[39m`),cyanBright:t(`\x1B[96m`,`\x1B[39m`),whiteBright:t(`\x1B[97m`,`\x1B[39m`),bgBlackBright:t(`\x1B[100m`,`\x1B[49m`),bgRedBright:t(`\x1B[101m`,`\x1B[49m`),bgGreenBright:t(`\x1B[102m`,`\x1B[49m`),bgYellowBright:t(`\x1B[103m`,`\x1B[49m`),bgBlueBright:t(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:t(`\x1B[105m`,`\x1B[49m`),bgCyanBright:t(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:t(`\x1B[107m`,`\x1B[49m`)}};t.exports=c(),t.exports.createColors=c})))(),1);function q(e){return{...L,...e.install.dependencyCatalog}}function Ue(e,t){let n=e[t];if(!n)throw new y(`UNSUPPORTED_DEPENDENCY`,`${t} is not a managed dependency. Add it to install.dependencyCatalog or remove it from packs.bp.dependencies.`,{details:{package:t}});return n}function We(e){return`${JSON.stringify(e,null,4)}\n`}async function Ge(e){try{return await n.access(e),!0}catch{return!1}}async function Ke(e){await n.mkdir(e,{recursive:!0})}async function qe(e,r){await Ke(t.dirname(e)),await n.writeFile(e,We(r),`utf8`)}function Je(e){return Array.isArray(e)&&e.length===3&&typeof e[0]==`number`&&typeof e[1]==`number`&&typeof e[2]==`number`}function Ye(e){return typeof e==`string`&&/^\d+\.\d+\.\d+$/.test(e)}function J(e){return e===3?Ye:Je}function Y(e,t){return e===3?`${t} must be SemVer string like "x.y.z" (format 3)`:`${t} must be [number, number, number] (format 2)`}const Xe=[e=>e.format_version===void 0?`format_version is required`:null,e=>e.header?null:`header is required`,e=>e.header&&!e.header.name?`header.name is required`:null,e=>e.header&&!e.header.uuid?`header.uuid is required`:null,e=>e.header?J(e.format_version)(e.header.version)?null:Y(e.format_version,`header.version`):null,e=>e.header?J(e.format_version)(e.header.min_engine_version)?null:Y(e.format_version,`header.min_engine_version`):null,e=>e.modules!==void 0&&!Array.isArray(e.modules)?`modules must be an array`:null,(e,t)=>{if(!Array.isArray(e.modules))return null;let n=e.modules.some(e=>e?.type===`resources`),r=[];return t===`rp`&&!n&&r.push(`RP manifest must have a resources module`),r.length>0?r:null},e=>{if(!Array.isArray(e.modules))return null;let t=J(e.format_version),n=[];for(let r=0;r<e.modules.length;r++){let i=e.modules[r];i&&i.version!==void 0&&i.version!==null&&!t(i.version)&&n.push(`modules[${r}] (uuid: ${i.uuid??`unknown`}): ${Y(e.format_version,`version`)}`)}return n.length>0?n:null},e=>e.dependencies!==void 0&&!Array.isArray(e.dependencies)?`dependencies must be an array`:null,e=>{if(!Array.isArray(e.dependencies))return null;let t=J(e.format_version),n=[];for(let r=0;r<e.dependencies.length;r++){let i=e.dependencies[r];if(!i){n.push(`dependencies[${r}] is invalid`);continue}`uuid`in i&&i.uuid&&!t(i.version)&&n.push(`dependencies[${r}] (uuid: ${i.uuid}): ${Y(e.format_version,`version`)}`),`module_name`in i&&i.module_name&&typeof i.version!=`string`&&n.push(`dependencies[${r}] (module_name: ${i.module_name}): version must be a string`)}return n.length>0?n:null},e=>e.capabilities===void 0?null:Array.isArray(e.capabilities)?e.capabilities.every(e=>typeof e==`string`)?null:`capabilities must be an array of strings`:`capabilities must be an array`,e=>e.metadata!==void 0&&(typeof e.metadata!=`object`||e.metadata===null)?`metadata must be an object`:null];function Ze(e,t){let n=[];for(let r of Xe){let i=r(e,t);i!==null&&(Array.isArray(i)?n.push(...i):n.push(i))}if(n.length>0)throw new y(`MANIFEST_INVALID`,`Manifest validation failed: ${n.join(`; `)}`)}function X(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:{...e}}function Z(e){return Array.isArray(e)?e:[]}function Qe(e){if(!(e&&Object.keys(e).length===0))return e}var Q=class{static async read(e){if(!await Ge(e))return;let t=await n.readFile(e,`utf8`);try{return X(JSON.parse(t))}catch{throw new y(`MANIFEST_INVALID`,`Invalid JSON in manifest: ${e}`)}}static async write(e,t,n){Ze(t,n),await qe(e,t)}};const $e=[1,21,0],et=[1,0,0];var tt=class{config;version;versionStr;depManager;constructor(e,t){this.config=e,this.version=oe(e.version),this.versionStr=e.version,this.depManager=t}buildBp(e){let t=this.requireBp(),n=X(e);this.depManager.validateBpDependencies();let r=this.getWriteFormatVersion(n),i=t.manifest.merge===`clean`?this.buildCleanBp(t,r):this.buildPreserveBp(n,t,r);return this.applyAchievementMetadata(i,t),i}buildRp(e){let t=this.requireRp(),n=X(e),r=this.getWriteFormatVersion(n),i=t.manifest.merge===`clean`?this.buildCleanRp(t,r):this.buildPreserveRp(n,t,r);return this.applyPbrCapability(i,t),i}buildPreserveBp(e,t,n){return{...e,format_version:n,header:this.buildBpHeader(e,t,n),...t.moduleUuid?{modules:this.replaceManagedBpModules(e.modules,t,n)}:e.modules?{modules:e.modules}:{},dependencies:this.depManager.replaceBpDependencies(e.dependencies,this.config.packs.rp?.uuid,n)}}buildPreserveRp(e,t,n){return{...e,format_version:n,header:this.buildRpHeader(e,t,n),modules:this.replaceManagedRpModules(e.modules,t,n),dependencies:this.depManager.replaceRpDependencies(e.dependencies,this.config.packs.bp?.uuid,n)}}buildCleanBp(e,t){return{format_version:t,header:this.buildBpHeaderClean(e,t),...e.moduleUuid?{modules:this.buildCleanBpModules(e,t)}:{},dependencies:this.depManager.buildBpDependenciesClean(t,this.config.packs.rp?.uuid,e.manifest.extraDependencies)}}buildCleanRp(e,t){return{format_version:t,header:this.buildRpHeaderClean(e,t),modules:this.buildCleanRpModules(e,t),dependencies:this.depManager.buildRpDependenciesClean(t,this.config.packs.bp?.uuid,e.manifest.extraDependencies)}}buildBpHeaderClean(e,t){return{...e.manifest.extraHeader,name:e.name,...e.description===void 0?{}:{description:e.description},uuid:e.uuid,version:this.getVersionFor(t),min_engine_version:e.manifest.minEngineVersion===void 0?this.defaultMinEngineVersion(t):this.configMinEngineVersion(e.manifest.minEngineVersion,t)}}buildRpHeaderClean(e,t){return{...e.manifest.extraHeader,name:e.name,...e.description===void 0?{}:{description:e.description},uuid:e.uuid,...e.packScope===void 0?{}:{pack_scope:e.packScope},version:this.getVersionFor(t),min_engine_version:e.manifest.minEngineVersion===void 0?this.defaultMinEngineVersion(t):this.configMinEngineVersion(e.manifest.minEngineVersion,t)}}buildCleanBpModules(e,t){return[...e.moduleUuid?[this.createScriptModule(e,t)]:[],...e.manifest.extraModules]}buildCleanRpModules(e,t){return[this.createResourcesModule(e,t),...e.manifest.extraModules]}buildBpHeader(e,t,n){return{...e.header??{},name:t.name,...t.description===void 0?{}:{description:t.description},uuid:t.uuid,version:this.getVersionFor(n),min_engine_version:this.normalizeMinEngineVersion(e.header?.min_engine_version,n,t.manifest.minEngineVersion)}}buildRpHeader(e,t,n){return{...e.header??{},name:t.name,...t.description===void 0?{}:{description:t.description},uuid:t.uuid,...t.packScope===void 0?{}:{pack_scope:t.packScope},version:this.getVersionFor(n),min_engine_version:this.normalizeMinEngineVersion(e.header?.min_engine_version,n,t.manifest.minEngineVersion)}}getScriptEntry(){let e=this.config.packs.bp?.compile;return e?`${e.scriptOutputDir}/${t.basename(e.entry,t.extname(e.entry))}.js`:`scripts/main.js`}isManagedBpModule(e,t){if(e.type!==`script`||e.language!==`javascript`)return!1;let n=this.getScriptEntry();return e.uuid===t.moduleUuid||e.entry===n}isManagedRpModule(e,t){return e.type===`resources`&&e.uuid===t.moduleUuid}createScriptModule(e,t){return{type:`script`,language:`javascript`,uuid:e.moduleUuid,version:this.getModuleVersion(t),entry:this.getScriptEntry()}}createResourcesModule(e,t){return{type:`resources`,uuid:e.moduleUuid,version:this.getModuleVersion(t)}}replaceManagedBpModules(e,t,n){return[...Z(e).filter(e=>!this.isManagedBpModule(e,t)),this.createScriptModule(t,n)]}replaceManagedRpModules(e,t,n){return[...Z(e).filter(e=>!this.isManagedRpModule(e,t)),this.createResourcesModule(t,n)]}applyAchievementMetadata(e,t){if(t.achievement===!0)e.metadata={...e.metadata??{},product_type:`addon`};else if(t.achievement===!1&&e.metadata){let t={...e.metadata};delete t.product_type;let n=Qe(t);n?e.metadata=n:delete e.metadata}}applyPbrCapability(e,t){if(t.pbr===!0){let t=Z(e.capabilities);e.capabilities=t.includes(`pbr`)?t:[...t,`pbr`]}else if(t.pbr===!1){let t=Z(e.capabilities).filter(e=>e!==`pbr`);t.length>0?e.capabilities=t:delete e.capabilities}}getVersionFor(e){return e===3?this.versionStr:this.version}getModuleVersion(e){return e===3?`1.0.0`:et}getWriteFormatVersion(e){return this.config.manifestFormat===void 0?e.format_version??2:this.config.manifestFormat}normalizeMinEngineVersion(e,t,n){if(n!==void 0)return this.configMinEngineVersion(n,t);if(e==null)return this.defaultMinEngineVersion(t);if(Array.isArray(e))return t===3?e.join(`.`):e;if(typeof e==`string`){if(t===2){let t=this.stringToVersionTuple(e);if(t)return t}return e}return this.defaultMinEngineVersion(t)}configMinEngineVersion(e,t){return t===3?e:this.stringToVersionTuple(e)??this.defaultMinEngineVersion(t)}defaultMinEngineVersion(e){return e===3?`1.21.0`:$e}stringToVersionTuple(e){let t=e.split(`.`).map(Number);if(t.length===3&&t.every(e=>!Number.isNaN(e)))return t}requireBp(){if(!this.config.packs.bp)throw new y(`CONFIG_INVALID`,`packs.bp is required to build the BP manifest.`);return this.config.packs.bp}requireRp(){if(!this.config.packs.rp)throw new y(`CONFIG_INVALID`,`packs.rp is required to build the RP manifest.`);return this.config.packs.rp}},nt=class e{config;catalog;installVersions;manifestVersions;version;versionStr;dependencyDiagnostics=[];constructor(e,t,n={}){this.config=e,this.catalog=t,this.installVersions=n.install??{},this.manifestVersions=n.manifest??{},this.version=oe(e.version),this.versionStr=e.version}static isAllowedSpecifier(e){return e===`stable`||e===`beta`||e===`preview`||/^\d+\.\d+\.\d+(?:[-.][0-9A-Za-z.-]+)?$/.test(e)}static resolveVersion(t){return e.resolveVersionDetail(t).version}static resolveVersionDetail(e){let{specifier:t,target:n,resolvedVersion:r,manifestVersion:i}=e;if(t===`stable`){if(r)return{version:r,source:`install`};if(i)return{version:i,source:`manifest`};throw new y(`DEPENDENCY_REQUIRES_INSTALL`,"Run `bepack install` to resolve stable manifest dependencies.",{details:{specifier:t,target:n}})}if(t===`beta`){if(ce(n))return{version:`beta`,source:`config`};if(r)return{version:r,source:`install`};if(i)return{version:i,source:`manifest`};throw new y(`DEPENDENCY_REQUIRES_INSTALL`,`Run \`bepack install\` to resolve manifest dependencies for target ${n}.`,{details:{target:n}})}if(t===`preview`){if(r)return{version:r,source:`install`};if(i)return{version:i,source:`manifest`};throw new y(`DEPENDENCY_REQUIRES_INSTALL`,`Run \`bepack install\` to resolve preview manifest dependencies for target ${n}.`,{details:{specifier:t,target:n}})}return{version:t,source:`config`}}static isAchievementCompatible(e){return e!==`beta`&&e!==`preview`}validateBpDependencies(){if(this.config.packs.bp){for(let[t,n]of Object.entries(this.config.packs.bp.dependencies)){if(!this.catalog[t]){let e=Object.keys(this.catalog),n=e.length>0?[`Managed packages: ${e.join(`, `)}.`,`Add a missing package to install.dependencyCatalog, or remove it from packs.bp.dependencies.`]:[`No managed packages are available. Extend install.dependencyCatalog to add one.`];throw new y(`UNSUPPORTED_DEPENDENCY`,`${t} is not a managed dependency.`,{details:{package:t},suggestions:n})}if(!e.isAllowedSpecifier(n))throw new y(`DEPENDENCY_VERSION_INVALID`,`${t} dependency version is invalid: ${n}`,{details:{package:t,specifier:n}})}if(this.config.packs.bp.achievement){for(let[t,n]of Object.entries(this.config.packs.bp.dependencies))if(!e.isAchievementCompatible(n))throw new y(`ACHIEVEMENT_REQUIRES_STABLE_API`,`${t}: achievement requires stable Script API dependencies (${n} is not allowed).`)}}}isManagedBpDependency(e){return!!(`module_name`in e&&typeof e.module_name==`string`&&this.catalog[e.module_name]?.manifest||`uuid`in e&&typeof e.uuid==`string`&&this.config.packs.rp?.uuid===e.uuid)}isManagedRpDependency(e,t){return t!==void 0&&`uuid`in e&&typeof e.uuid==`string`&&e.uuid===t}buildManagedDependencies(){if(this.dependencyDiagnostics.length=0,!this.config.packs.bp)return[];let t=[];for(let[n,r]of Object.entries(this.config.packs.bp.dependencies)){if(!this.catalog[n]?.manifest)continue;let i=e.resolveVersionDetail({specifier:r,target:this.config.target,resolvedVersion:this.installVersions[n],manifestVersion:this.manifestVersions[n]});t.push({module_name:n,version:i.version}),this.dependencyDiagnostics.push({name:n,specifier:r,version:i.version,source:i.source})}return t}getDependencyDiagnostics(){return this.dependencyDiagnostics}getFormatAwareVersion(e){return(e??this.config.manifestFormat??2)===3?this.versionStr:this.version}replaceBpDependencies(e,t,n){let r=Z(e).filter(e=>!this.isManagedBpDependency(e)),i=this.buildManagedDependencies();return t&&i.push({uuid:t,version:this.getFormatAwareVersion(n)}),[...r,...i]}replaceRpDependencies(e,t,n){let r=Z(e).filter(e=>!this.isManagedRpDependency(e,t));return t?[...r,{uuid:t,version:this.getFormatAwareVersion(n)}]:r}buildBpDependenciesClean(e,t,n){let r=this.buildManagedDependencies();return t&&r.push({uuid:t,version:this.getFormatAwareVersion(e)}),[...r,...n]}buildRpDependenciesClean(e,t,n){let r=[];return t&&r.push({uuid:t,version:this.getFormatAwareVersion(e)}),[...r,...n]}};const $=He.default.createColors(process.env.NO_COLOR===void 0&&process.env.FORCE_COLOR!==`0`);async function rt(e){let n=q(e.config),r=e.config.packs.bp?ne(e.cwd,e.config):void 0,i=r?await Q.read(r):void 0,a=at(i,n),o=new nt(e.config,n,{...e.resolvedDeps?{install:e.resolvedDeps}:{},manifest:a}),s=new tt(e.config,o),c={};if(e.config.packs.bp){let n=i!==void 0;e.config.manifestFormat===2&&i?.format_version===3&&(e.logger?.warn??console.warn)(`Warning: config manifestFormat is 2, but existing manifest uses format_version 3. format_version 2 does not support string versions; any string versions in the existing manifest will be preserved as-is.`);let l=s.buildBp(i),u=o.getDependencyDiagnostics().map(e=>({module_name:e.name,specifier:e.specifier,version:e.version,source:e.source,...a[e.name]===void 0?{}:{previous:a[e.name]}}));e.dryRun||await Q.write(r,l,`bp`),it(u,e.logger),c.bpManifest={path:C(t.relative(e.cwd,r)),updated:!0,existed:n,dependencies:u}}if(e.config.packs.rp){let n=re(e.cwd,e.config),r=await Q.read(n),i=r!==void 0,a=s.buildRp(r);e.dryRun||await Q.write(n,a,`rp`),c.rpManifest={path:C(t.relative(e.cwd,n)),updated:!0,existed:i}}return c}function it(e,t){if(t)for(let n of e){let e=$.cyan(n.module_name);n.previous!==void 0&&n.previous!==n.version?t.info(`manifest ${e}: ${n.previous} ${$.dim(`->`)} ${n.version} (specifier ${JSON.stringify(n.specifier)}, ${n.source})`):n.source===`manifest`?t.info(`manifest ${e} ${n.version} ${$.dim(`kept from manifest`)} (specifier ${JSON.stringify(n.specifier)}) — run \`bepack install\` to refresh`):t.verbose(`manifest ${e} ${n.version} (specifier ${JSON.stringify(n.specifier)}, ${n.source})`)}}function at(e,t){let n={};for(let r of e?.dependencies??[])`module_name`in r&&typeof r.module_name==`string`&&typeof r.version==`string`&&t[r.module_name]?.manifest&&r.version!==`stable`&&(n[r.module_name]=r.version);return n}function ot(e,t){e?.install?e.install(t):e?.info(`[Install] ${t}`)}var st=class{registry;logger;cache=/* @__PURE__ */ new Map;constructor(e,t){this.registry=e,this.logger=t}async metadata(e){let t=this.packageUrl(e),n=this.cache.get(t);if(n)return this.logger?.verbose(`Using cached metadata for ${e}`),n;ot(this.logger,`fetching ${e} metadata from ${this.registry}`);let r=await fetch(t);if(!r.ok)throw new y(`SAPI_VERSION_NOT_FOUND`,`Cannot fetch ${e} versions from registry.`,{details:{package:e,registry:this.registry,status:r.status}});let i=await r.json();return this.cache.set(t,i),this.logger?.verbose(`Fetched ${e} metadata (${Object.keys(i.versions??{}).length} versions)`),i}versions(e){return Object.keys(e.versions??{})}async versionsOf(e){return this.versions(await this.metadata(e))}distTag(e,t){let n=e[`dist-tags`]?.[t];return n&&e.versions?.[n]?n:void 0}packageUrl(e){return`${this.registry.replace(/\/$/,``)}/${encodeURIComponent(e).replace(/^%40/,`@`)}`}};function ct(e){return t=>{e?.install?e.install(t):e?.info(`[Install] ${t}`)}}var lt=class{config;logger;npm;catalog;pkgResolver;log;constructor(e,t){this.config=e,this.logger=t,this.npm=new st(e.install.registry,t),this.catalog=q(e),this.pkgResolver=new A(this.npm,t),this.log=ct(t)}async resolveAll(){let e={},t=this.config.packs.bp?.dependencies;if(!t||Object.keys(t).length===0)return this.log(`no BP dependencies to resolve`),e;this.log(`resolving dependencies for target ${this.config.target}`);for(let[n,r]of Object.entries(t)){let t=Ue(this.catalog,n),i=await this.resolveOne(n,r,t),a=t.manifest??!1;e[n]={specifier:r,packageVersion:i.packageVersion,manifestVersion:a?i.manifestVersion??i.packageVersion:null,manifest:a,external:a,resolver:typeof t.resolver==`string`?t.resolver:t.resolver.name},this.log(`${n}: ${r} -> package ${e[n].packageVersion}, manifest ${e[n].manifestVersion}`)}return this.logger?.verbose(`Dependency resolution complete`),e}async resolveOne(e,t,n){let r={packageName:e,specifier:t,target:this.config.target,entry:n,config:this.config};await this.runDependencyHooks(`beforeResolveDependency`,r);let i=await B.fromConfig(this.config.install.dependencyResolvers,this.config.plugins??[]).resolve({packageName:e,specifier:t,target:this.config.target,entry:n,config:this.config,npm:this.npm,...this.logger?{logger:this.logger}:{}});return await this.runDependencyHooks(`afterResolveDependency`,{...r,result:i}),i}async runDependencyHooks(e,t){for(let n of this.config.plugins??[]){let r=n.install?.hooks?.[e];if(r)try{await r(t)}catch(t){throw new y(`PLUGIN_FAILED`,`Plugin ${n.name} ${e} hook failed: ${t instanceof Error?t.message:String(t)}`)}}}};async function ut(e,t){return new lt(e,t).resolveAll()}export{L as BUILTIN_DEPENDENCY_CATALOG,z as BUILTIN_DEPENDENCY_RESOLVERS,De as BUILTIN_PLUGINS,y as BePackError,B as DependencyResolverRegistry,lt as DependencyService,A as MinecraftPackageResolver,st as NpmRegistryClient,q as createDependencyCatalog,_ as defineConfig,R as exactVersionResolver,x as getConfiguredPacks,Ve as loadConfig,P as minecraftScriptApiBpResolver,N as minecraftScriptApiResolver,I as minecraftVanillaDataResolver,fe as packageVersionForSpecifier,rt as patchManifest,ut as resolveDependencies,Ee as sapiPro,k as satisfiesSemver,de as satisfiesSemverRange};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bepack/cli",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.4",
|
|
4
4
|
"description": "A modern pack builder for Minecraft Bedrock Edition.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"minecraft",
|
|
@@ -56,7 +56,8 @@
|
|
|
56
56
|
"check:create-mcbe": "npm run typecheck --workspace=create-mcbe",
|
|
57
57
|
"test:create-mcbe": "npm test --workspace=create-mcbe",
|
|
58
58
|
"format": "prettier ./src --write",
|
|
59
|
-
"format:check": "prettier ./src --check"
|
|
59
|
+
"format:check": "prettier ./src --check",
|
|
60
|
+
"prepublishOnly": "npm run check && npm run test && npm run build"
|
|
60
61
|
},
|
|
61
62
|
"dependencies": {
|
|
62
63
|
"cac": "^7.0.0",
|
package/reference.md
CHANGED
|
@@ -162,6 +162,8 @@ type UserConfig = {
|
|
|
162
162
|
};
|
|
163
163
|
/** 所有 BP 依赖都在此声明——包括清单依赖和纯代码依赖。 */
|
|
164
164
|
dependencies?: Record<string, "stable" | "beta" | "preview" | string>;
|
|
165
|
+
/** 写入 `metadata.product_type = "addon"` 的成就元数据开关。默认不干预。 */
|
|
166
|
+
achievement?: boolean;
|
|
165
167
|
/**
|
|
166
168
|
* manifest 生成策略。
|
|
167
169
|
* - `merge: "preserve"`(默认):增量合并,保留用户手写字段。
|
|
@@ -232,7 +234,6 @@ type UserConfig = {
|
|
|
232
234
|
copy?: false | true | string;
|
|
233
235
|
watch?: {
|
|
234
236
|
include?: string[];
|
|
235
|
-
include?: string[];
|
|
236
237
|
};
|
|
237
238
|
};
|
|
238
239
|
|
|
@@ -366,6 +367,25 @@ dependencies: {
|
|
|
366
367
|
|
|
367
368
|
当清单依赖中使用 `preview` 或 `beta` 说明符而未先运行 `bepack install` 时,BePack 会抛出 `DEPENDENCY_REQUIRES_INSTALL`。这与 `stable` 的行为相同——说明符本身永远不会直接写入 `manifest.json`。
|
|
368
369
|
|
|
370
|
+
### manifest 依赖版本的权威来源与日志
|
|
371
|
+
|
|
372
|
+
写入 `manifest.json` 的受管依赖版本按以下优先级决定(高 → 低):
|
|
373
|
+
|
|
374
|
+
1. **配置里的精确版本**:`packs.bp.dependencies` 写成 `"2.10.0"` 时,它就是最终值。`bepack install` 的结果(包括注册表解析结果)与现有 manifest 里的旧值都**不会**覆盖它。
|
|
375
|
+
2. **`bepack install` / `build --install` 解析出的版本**:仅用于 `stable` / `beta` / `preview` 这类频道说明符。
|
|
376
|
+
3. **现有 manifest 中已写入的版本**:`bepack build` / `bepack manifest` / `bepack dev` **不访问网络**,频道说明符在离线时会复用 manifest 里已有的具体版本。
|
|
377
|
+
|
|
378
|
+
第 3 条曾经是最大的排查陷阱:`build` 会静默沿用旧版本,看起来像是"版本被写死"。现在每条受管依赖的最终版本都会打印出来:
|
|
379
|
+
|
|
380
|
+
```txt
|
|
381
|
+
manifest @minecraft/server: 2.0.0 -> 2.10.0 (specifier "stable", install)
|
|
382
|
+
manifest @minecraft/server-ui 2.0.0 kept from manifest (specifier "stable") — run `bepack install` to refresh
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
`bepack manifest --json` / `bepack build --json` 的 `files.bpManifest.dependencies` 也会返回 `{ module_name, specifier, version, source, previous }`,其中 `source` 是 `"config"`、`"install"` 或 `"manifest"`,可直接用于判断版本是谁写的。
|
|
386
|
+
|
|
387
|
+
所以:**要刷新频道依赖的具体版本,必须联网执行 `bepack install`(或 `bepack build --install`)**;只想固定某个版本,就在配置里写精确版本号。
|
|
388
|
+
|
|
369
389
|
### 安装日志
|
|
370
390
|
|
|
371
391
|
常规安装日志显示简洁的进度:
|
|
@@ -378,6 +398,19 @@ dependencies: {
|
|
|
378
398
|
|
|
379
399
|
使用 `--verbose` 可查看更底层的详细信息,如缓存命中、版本数量和推断过程。
|
|
380
400
|
|
|
401
|
+
### npm 12 与 `--allow-scripts`
|
|
402
|
+
|
|
403
|
+
npm 12 会把 `--allow-scripts` 当作 CLI 层策略,并**拒绝在项目级安装中使用**:
|
|
404
|
+
|
|
405
|
+
```txt
|
|
406
|
+
npm error code EALLOWSCRIPTS
|
|
407
|
+
npm error --allow-scripts is not allowed in project-scoped installs.
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
`npm run <script>` 会把解析出的 npm 配置导出成 `npm_config_*` 环境变量,所以只要用户级/全局 `.npmrc` 里写了 `allow-scripts=...`,这个值就会泄漏到 `bepack install` 子进程里,让它调用的 `npm install` 直接失败。BePack 在启动包管理器前会剔除继承来的 `npm_config_allow_scripts` 并打印一条提示;允许列表本身仍然通过 `.npmrc` 或 `package.json` 的 `allowScripts` 字段生效(这正是 npm 报错里建议的做法)。其它 npm 配置(registry、认证等)不受影响,仍会传给子进程。
|
|
411
|
+
|
|
412
|
+
需要完全跳过包管理器时用 `install.runPackageManager: false`,或 CLI `bepack install --skip-pm`。
|
|
413
|
+
|
|
381
414
|
### 依赖目录与解析器扩展点
|
|
382
415
|
|
|
383
416
|
安装解析分为依赖目录和解析器注册表两部分。
|
|
@@ -483,6 +516,7 @@ BP 清单受控字段:
|
|
|
483
516
|
- 脚本模块
|
|
484
517
|
- BePack 管理的 `@minecraft/*` 依赖
|
|
485
518
|
- BP/RP 相互依赖
|
|
519
|
+
- `metadata.product_type`(仅在 `achievement: true` 时)
|
|
486
520
|
|
|
487
521
|
RP 清单受控字段:
|
|
488
522
|
|
|
@@ -501,6 +535,13 @@ RP 清单受控字段:
|
|
|
501
535
|
|
|
502
536
|
当同时配置了 BP 和 RP 时,BePack 会维护它们 header UUID 之间的相互依赖。
|
|
503
537
|
|
|
538
|
+
成就元数据:
|
|
539
|
+
|
|
540
|
+
- `packs.bp.achievement: true` 添加 `metadata.product_type = "addon"`。
|
|
541
|
+
- 每个受管理的 Script API 依赖必须使用 `stable` 说明符。
|
|
542
|
+
- 如果在启用成就时使用了 `beta` 或 `preview` 依赖,BePack 会抛出 `ACHIEVEMENT_REQUIRES_STABLE_API`。
|
|
543
|
+
- 三态语义与 `pbr` 一致:未配置时不干预已有 `metadata`;`true` 写入/覆盖;`false` 删除 `product_type`(`metadata` 变空时整个删除)。
|
|
544
|
+
|
|
504
545
|
### manifest 生成策略
|
|
505
546
|
|
|
506
547
|
`packs.bp.manifest` / `packs.rp.manifest` 控制清单如何与已有文件合并:
|
|
@@ -508,14 +549,16 @@ RP 清单受控字段:
|
|
|
508
549
|
| 条目来源 | `merge: "preserve"`(默认) | `merge: "clean"` |
|
|
509
550
|
| -------- | --------------------------- | ---------------- |
|
|
510
551
|
| `header.name` / `description` / `uuid` / `version` | config | config |
|
|
511
|
-
| `header.min_engine_version` |
|
|
552
|
+
| `header.min_engine_version` | 保留旧文件值;配置了 `minEngineVersion` 时以配置为准 | config(缺省用默认值,可用 `minEngineVersion` 显式指定) |
|
|
512
553
|
| managed 依赖 / module | 重建 | 重建 |
|
|
513
554
|
| 非 managed 条目(手写依赖、额外 module、capabilities 等) | **保留** | **丢弃**,改用 `extra*` 字段显式声明 |
|
|
514
555
|
| 其他 config 的残留(双配置交替构建) | 保留 → 污染 | **清除** |
|
|
515
556
|
|
|
557
|
+
`minEngineVersion` 在两种模式下都生效:`preserve` 下它覆盖 manifest 里已有的值(不改配置就继续保留旧值),`clean` 下它就是生成值。
|
|
558
|
+
|
|
516
559
|
`clean` 模式下可用的补充字段:
|
|
517
560
|
|
|
518
|
-
- `minEngineVersion`:写 `header.min_engine_version`。SemVer 字符串(如 `"1.21.80"`),format 2 自动转 `[1, 21, 80]
|
|
561
|
+
- `minEngineVersion`:写 `header.min_engine_version`。SemVer 字符串(如 `"1.21.80"`),format 2 自动转 `[1, 21, 80]`。两种 merge 模式都可用。
|
|
519
562
|
- `extraDependencies`:原样追加到 `dependencies`(非 catalog 依赖)。
|
|
520
563
|
- `extraModules`:原样追加到 `modules`(如自定义 script 模块)。
|
|
521
564
|
- `extraHeader`:合并进 `header`(如 `pack_scope`)。
|
|
@@ -541,13 +584,13 @@ client 侧保持默认 `preserve`(尊重手写 manifest),server 侧 `clean
|
|
|
541
584
|
`bepack build` 执行以下步骤:
|
|
542
585
|
|
|
543
586
|
```txt
|
|
544
|
-
|
|
587
|
+
清单修补(hooks.beforeManifest / afterManifest)
|
|
545
588
|
hooks.beforeBuild
|
|
546
589
|
类型检查(tsc --noEmit,默认开启)
|
|
547
590
|
Rolldown 构建
|
|
548
591
|
hooks.afterBuild
|
|
549
|
-
|
|
550
|
-
|
|
592
|
+
可选复制(hooks.beforeCopy / afterCopy)
|
|
593
|
+
可选打包(hooks.beforePack / afterPack)
|
|
551
594
|
```
|
|
552
595
|
|
|
553
596
|
> **默认会运行 TypeScript 类型检查。** 只要配置了 `packs.bp.compile`,`bepack build` 与 `bepack dev` 都会在 Rolldown 打包**之前**执行 `tsc --noEmit`;检查失败会以 `TYPECHECK_FAILED` 终止本次构建,不会产出残缺脚本。跳过方式:CLI `--skip-typecheck`,或 `packs.bp.compile.typecheck: false`。注意类型检查与打包是两件独立的事——自定义 Rolldown 选项、替换 `rolldown` 配置都不会关闭它,要关只能显式配置。
|
|
@@ -788,6 +831,8 @@ BePack 默认 `preserveModules: true`,Rolldown 仍会做 tree-shaking:
|
|
|
788
831
|
- 每次更改时清空终端输出,显示每次更新的耗时。
|
|
789
832
|
- 构建锁:构建过程中来的其他文件变化会排队,构建结束后统一处理一次,不会并发构建。
|
|
790
833
|
- src 文件变化触发重建 + 复制,非 src 文件变化只触发复制。不涉及的文件不触发任何操作。
|
|
834
|
+
- 自动复制同样会触发 `beforeCopy` / `afterCopy`,重建会触发 `beforeManifest` / `afterManifest` / `beforeBuild` / `afterBuild`(`ctx.command === "dev"`)。
|
|
835
|
+
- 如果最终没有任何可监听路径(没配 compile、复制关闭、`dev.watch.include` 为空),`bepack dev` 会直接以 `DEV_NO_WATCH_TARGETS` 报错,而不是打印一行空的 "watching" 后静默退出。
|
|
791
836
|
|
|
792
837
|
BP 的监听范围精确匹配 copy 的 include 规则,编辑不会被复制的文件不会触发重构建。
|
|
793
838
|
可通过 `dev.watch.include` 添加额外监听路径:
|
|
@@ -906,10 +951,10 @@ copy: {
|
|
|
906
951
|
|
|
907
952
|
复制 BP 时,默认只复制以下文件/文件夹:
|
|
908
953
|
|
|
909
|
-
```
|
|
954
|
+
```txt
|
|
910
955
|
scripts manifest.json animation_controllers animations biomes
|
|
911
|
-
blocks entities functions items loot_tables
|
|
912
|
-
recipes shapes spawn_rules structures texts trading
|
|
956
|
+
blocks cameras dialogue entities functions items loot_tables
|
|
957
|
+
pack_icon.png recipes shapes spawn_rules structures texts trading
|
|
913
958
|
feature_rules features worldgen
|
|
914
959
|
```
|
|
915
960
|
|
|
@@ -937,6 +982,15 @@ packs: {
|
|
|
937
982
|
|
|
938
983
|
复制项不存在时会被静默跳过,不会报错。
|
|
939
984
|
|
|
985
|
+
**不在 include 列表里的顶层条目会被跳过,并且现在会打印警告**(复制和打包都会):
|
|
986
|
+
|
|
987
|
+
```txt
|
|
988
|
+
behavior pack pack only includes 20 configured item(s); 2 entries in "bp" are skipped:
|
|
989
|
+
README_中文.md, custom_data. Add them to packs.bp.include to include them.
|
|
990
|
+
```
|
|
991
|
+
|
|
992
|
+
BP 与 RP 的默认行为不对称(BP 是白名单收,RP 默认整目录),但只要有条目被跳过就会有上面这条警告,不会再无声丢文件。隐藏条目(`.` 开头)和 `node_modules` 不计入警告,避免噪音。
|
|
993
|
+
|
|
940
994
|
Dev 模式使用相同的 include 规则来决定监听哪些文件,详见「开发模式」章节。
|
|
941
995
|
|
|
942
996
|
### 复制与构建/开发联动
|
|
@@ -983,10 +1037,33 @@ bepack dev --optimize # dev 的每次自动复制也生成归档
|
|
|
983
1037
|
- 仅配置 BP 时创建 `.mcpack`。
|
|
984
1038
|
- 同时配置 BP 和 RP 时创建 `.mcaddon`。
|
|
985
1039
|
|
|
1040
|
+
**`bepack pack` 默认先构建再打包**:打包只是把磁盘上的文件收进压缩包,不重新编译,所以单独执行 `pack` 曾经可能把旧的 `scripts/*.js` 打进产物。现在它会先跑一次完整的构建(manifest 修补、类型检查、Rolldown),再打包,因此下面两条命令等价:
|
|
1041
|
+
|
|
1042
|
+
```bash
|
|
1043
|
+
bepack pack
|
|
1044
|
+
bepack build --pack
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
需要"只压缩当前目录、不要构建"时用 `--no-build`(或 `--skip-build`):
|
|
1048
|
+
|
|
1049
|
+
```bash
|
|
1050
|
+
bepack pack --no-build
|
|
1051
|
+
```
|
|
1052
|
+
|
|
1053
|
+
因为多了一次构建,`pack` 也会触发构建与清单钩子:`beforeManifest` / `afterManifest` / `beforeBuild` / `afterBuild`(`ctx.command === "build"`),随后是 `beforePack` / `afterPack`(`ctx.command === "pack"`)。`--no-build` 时只触发打包钩子。
|
|
1054
|
+
|
|
1055
|
+
`--dry-run` 只汇报将要产出的文件,不写盘:
|
|
1056
|
+
|
|
1057
|
+
```txt
|
|
1058
|
+
√ pack dry-run: would pack dist/my-addon-1.0.0.mcpack (no file written)
|
|
1059
|
+
```
|
|
1060
|
+
|
|
986
1061
|
**BP 始终使用选择性打包**:只打包默认 include 列表(`scripts`、`manifest.json`、`animation_controllers` 等)和 `packs.bp.include` 中配置的额外文件。即使 `bp.root = "."`(项目根目录即行为包),也不会将整个项目打包进去。
|
|
987
1062
|
|
|
988
1063
|
RP 默认打包整个目录;如果配置了 `packs.rp.include`,则改用选择性打包。
|
|
989
1064
|
|
|
1065
|
+
两种模式下被跳过的顶层条目都会打印警告,详见「选择性复制」一节。
|
|
1066
|
+
|
|
990
1067
|
输出文件名默认为:
|
|
991
1068
|
|
|
992
1069
|
```txt
|
|
@@ -1088,14 +1165,40 @@ hooks: {
|
|
|
1088
1165
|
}
|
|
1089
1166
|
```
|
|
1090
1167
|
|
|
1168
|
+
### 每个命令实际触发哪些钩子
|
|
1169
|
+
|
|
1170
|
+
钩子不是"配置了就一定会在每条命令里跑",而是挂在具体的步骤上。当前实现(`ctx.command` 标明是谁触发的):
|
|
1171
|
+
|
|
1172
|
+
| 命令 | 触发的钩子(按顺序) |
|
|
1173
|
+
| --- | --- |
|
|
1174
|
+
| `manifest` | beforeManifest, afterManifest |
|
|
1175
|
+
| `install` | beforeInstall, afterInstall;`install.updateManifest` 为真时中间还有 beforeManifest, afterManifest |
|
|
1176
|
+
| `copy` | beforeCopy, afterCopy |
|
|
1177
|
+
| `pack` | beforeManifest, afterManifest, beforeBuild, afterBuild(来自先构建的步骤)→ beforePack, afterPack |
|
|
1178
|
+
| `pack --no-build` | beforePack, afterPack |
|
|
1179
|
+
| `build` | beforeManifest, afterManifest, beforeBuild, afterBuild |
|
|
1180
|
+
| `build --copy` | 上面 4 个 + beforeCopy, afterCopy |
|
|
1181
|
+
| `build --pack` | 上面 4 个 + beforePack, afterPack |
|
|
1182
|
+
| `build --copy --pack` | 上面 4 个 + beforeCopy, afterCopy + beforePack, afterPack |
|
|
1183
|
+
| `build --install` | beforeInstall, afterInstall(含 manifest 钩子)→ 再走 build 的完整流程 |
|
|
1184
|
+
| `dev`(首次构建、src 变化重建) | beforeManifest, afterManifest, beforeBuild, afterBuild;自动复制时还有 beforeCopy, afterCopy |
|
|
1185
|
+
| `dev`(非 src 变化,仅刷新包) | beforeManifest, afterManifest;自动复制时还有 beforeCopy, afterCopy |
|
|
1186
|
+
|
|
1187
|
+
规则总结:
|
|
1188
|
+
|
|
1189
|
+
- **任何会改写 `manifest.json` 的命令都会触发 `beforeManifest` / `afterManifest`**,包括 `build`、`dev`、`install` 和先构建的 `pack`——不再是只有 `manifest` 命令。
|
|
1190
|
+
- **`build --copy` 与 `dev` 的自动复制都会触发 `beforeCopy` / `afterCopy`**,因此"复制前改文件"的钩子对所有复制路径都有效。
|
|
1191
|
+
- 打包钩子只由 `runPack` 触发,所以 `build --pack`、`pack` 都会走。
|
|
1192
|
+
|
|
1091
1193
|
钩子上下文类型:
|
|
1092
1194
|
|
|
1093
1195
|
```ts
|
|
1094
1196
|
type HookContext = {
|
|
1095
|
-
command: CommandName; // "build" | "dev" | "install" | ...
|
|
1197
|
+
command: CommandName; // "build" | "dev" | "install" | "pack" | ...
|
|
1096
1198
|
cwd: string;
|
|
1097
1199
|
mode?: string; // 通过 --mode <value> 传入的执行模式
|
|
1098
1200
|
target: string;
|
|
1201
|
+
dryRun: boolean; // 本次命令是否 --dry-run(此时不会写任何文件)
|
|
1099
1202
|
config: ResolvedConfig;
|
|
1100
1203
|
paths: {
|
|
1101
1204
|
dist: string;
|
|
@@ -1111,6 +1214,8 @@ type HookContext = {
|
|
|
1111
1214
|
};
|
|
1112
1215
|
```
|
|
1113
1216
|
|
|
1217
|
+
`dryRun` 由命令的 `--dry-run` 决定,钩子内可直接 `if (ctx.dryRun) return;`,不必再读 `process.argv`。
|
|
1218
|
+
|
|
1114
1219
|
钩子可以是同步或异步的。在钩子中抛出异常会导致命令失败,返回 `HOOK_FAILED`。
|
|
1115
1220
|
|
|
1116
1221
|
`mode` 来自 CLI `--mode <value>` 选项(目前 `build` 和 `dev` 命令支持),BEPack 不做语义判断,由用户在钩子内自行决定是否执行特定逻辑:
|
|
@@ -1167,8 +1272,10 @@ UNSUPPORTED_DEPENDENCY
|
|
|
1167
1272
|
DEPENDENCY_VERSION_INVALID
|
|
1168
1273
|
DEPENDENCY_REQUIRES_INSTALL
|
|
1169
1274
|
SAPI_VERSION_NOT_FOUND
|
|
1275
|
+
ACHIEVEMENT_REQUIRES_STABLE_API
|
|
1170
1276
|
TYPECHECK_FAILED
|
|
1171
1277
|
BUILD_FAILED
|
|
1278
|
+
DEV_NO_WATCH_TARGETS
|
|
1172
1279
|
COPY_TARGET_NOT_FOUND
|
|
1173
1280
|
COPY_FAILED
|
|
1174
1281
|
PACK_FAILED
|
|
@@ -1213,9 +1320,11 @@ bepack init --from-bp ./bp/manifest.json --from-rp ./rp/manifest.json
|
|
|
1213
1320
|
| UUID | 直接读取 manifest 中的值,不重新生成 |
|
|
1214
1321
|
| 版本 | 从 manifest header 读取(支持数组 `[1,0,0]` 和字符串 `"1.0.0"`)。两个包版本不同时取最高者,并给出警告 |
|
|
1215
1322
|
| 依赖 | manifest 中的 `module_name` 依赖如果在 BePack 内置 catalog 中,自动写入配置 |
|
|
1216
|
-
| 编译脚本 |
|
|
1323
|
+
| 编译脚本 | 只有在磁盘上确实存在匹配源文件(`src/<入口>.ts` / `.mts` / `.js` / `.mjs`)时才开启 compile,并根据模块 `entry` 推断输出目录:`"scripts/main.js"` → `entry: "src/main.ts"`, `scriptOutputDir: "scripts"`;`"custom/app.js"` → `entry: "src/app.ts"`, `scriptOutputDir: "custom"`。源文件存在但没有 `tsconfig.json` 时生成 `typecheck: false` 并警告;脚本已在包内且没有源文件时不生成 `compile`(包内 `scripts/` 原样复制/打包),避免生成首次构建就失败的配置 |
|
|
1217
1324
|
| Windows | 自动添加 `copy: { defaultTarget: "win" }" |
|
|
1218
1325
|
|
|
1219
1326
|
manifest 路径必须在当前目录内,否则报错。
|
|
1220
1327
|
|
|
1221
1328
|
如果配置文件已存在,init 会报错提示使用 `--force` 覆盖。
|
|
1329
|
+
|
|
1330
|
+
`--dry-run` 只打印将要创建的文件(`init dry-run: would create …`),既不写文件也不创建目录。
|