@bepack/cli 0.1.0-beta.4 → 0.1.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -315,6 +315,23 @@ type RolldownCustomizeContext = {
315
315
  type RolldownCustomizeFunction = (options: RolldownOptions, context: RolldownCustomizeContext) => RolldownOptions | undefined | void | Promise<RolldownOptions | undefined | void>;
316
316
  /** User-supplied rolldown customization: an options object or a function. */
317
317
  type RolldownOverrides = RolldownOptions | RolldownCustomizeFunction;
318
+ /**
319
+ * A typecheck command line, e.g. `"bun check"`, `"tsc-rs --noEmit"` or
320
+ * `'node "./tools/my checker.mjs"'`.
321
+ *
322
+ * Tokenized quote-aware and spawned with an argument array, so the quotes are never
323
+ * interpreted twice. Backslash escapes only a quote, so Windows paths survive as written.
324
+ */
325
+ type TypecheckCommandSetting = string;
326
+ /** Object form of `packs.bp.compile.typecheck`: the enable switch plus the checker. */
327
+ type TypecheckConfig = {
328
+ /** Whether type checking runs. Default: `true`. */
329
+ enabled?: boolean;
330
+ /** Full command line to run. Default: `"tsc --noEmit"`. */
331
+ command?: TypecheckCommandSetting;
332
+ /** Additional arguments appended to `command`. */
333
+ args?: string[];
334
+ };
318
335
  /** BP compile configuration. Only available on behavior packs. */
319
336
  type BpCompileOptions = {
320
337
  /** Script entry file, relative to project root. Default: "src/main.ts". */
@@ -328,15 +345,38 @@ type BpCompileOptions = {
328
345
  * Prefer this over `replace` for feature flags and conditional compilation.
329
346
  */
330
347
  define?: Record<string, string>;
331
- /** Path to tsconfig.json relative to project root. Default: "tsconfig.json". */
348
+ /**
349
+ * Path to tsconfig.json relative to project root. Default: "tsconfig.json".
350
+ *
351
+ * Used by the default `tsc` checker and deprecated `useNpx` compatibility mode,
352
+ * which receive `--project <tsconfig>`. A custom `typecheck.command` receives exactly
353
+ * the arguments you write, nothing more.
354
+ */
332
355
  tsconfig?: string;
333
- /** Whether to run `tsc --noEmit` before rolldown. Default: true. */
334
- typecheck?: boolean;
356
+ /**
357
+ * Type checking before Rolldown. Default: true.
358
+ *
359
+ * - `false` / `true`: toggle the checker.
360
+ * - object: `{ enabled?, command?, args? }` — the switch plus the checker in one place.
361
+ *
362
+ * The checker itself is any command line: `{ command: "bun check" }`,
363
+ * `{ command: "tsc-rs", args: ["--noEmit", "--project", "tsconfig.json"] }`.
364
+ * Defaults to `"tsc --noEmit"`.
365
+ */
366
+ typecheck?: boolean | TypecheckConfig;
367
+ /**
368
+ * Full typecheck command line, e.g. `"bun check"` or
369
+ * `'node "./tools/my checker.mjs"'`. Used as a fallback when
370
+ * `typecheck.command` is unset. Default: `"tsc --noEmit"`.
371
+ */
372
+ typecheckCommand?: TypecheckCommandSetting;
373
+ /** Additional arguments appended to the typecheck command line. */
374
+ typecheckArgs?: string[];
335
375
  /** Whether rolldown should preserve module files. Default: true. */
336
376
  preserveModules?: boolean;
337
377
  /** Additional packages/modules that Rolldown should not bundle. */
338
378
  external?: BuildExternal[];
339
- /** Use `npx tsc --noEmit` instead of system `tsc --noEmit`. Default: false. */
379
+ /** @deprecated Use `typecheckCommand: "npx tsc --noEmit"` instead. */
340
380
  useNpx?: boolean;
341
381
  /** Minify output via rolldown. Default: false. */
342
382
  minify?: boolean;
@@ -532,6 +572,10 @@ type BpCompileResolved = {
532
572
  define: Record<string, string>;
533
573
  tsconfig: string;
534
574
  typecheck: boolean;
575
+ /** Full typecheck command line; `undefined` means the built-in `tsc --noEmit`. */
576
+ typecheckCommand?: TypecheckCommandSetting;
577
+ /** Additional arguments appended to the typecheck command line. */
578
+ typecheckArgs: string[];
535
579
  preserveModules: boolean;
536
580
  external: BuildExternal[];
537
581
  useNpx: boolean;
@@ -814,7 +858,7 @@ declare function sapiPro(): BePackPlugin;
814
858
  declare const BUILTIN_PLUGINS: Record<string, () => BePackPlugin>;
815
859
  //#endregion
816
860
  //#region src/errors/codes.d.ts
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"];
861
+ 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_INVALID", "CLI_ARGUMENT_CONFLICT", "PROFILE_INVALID", "PROFILE_READ_FAILED", "UNKNOWN_COMMAND"];
818
862
  type ErrorCode = (typeof ERROR_CODES)[number];
819
863
  //#endregion
820
864
  //#region src/errors/BePackError.d.ts
@@ -828,4 +872,161 @@ declare class BePackError extends Error {
828
872
  });
829
873
  }
830
874
  //#endregion
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 };
875
+ //#region src/profile/types.d.ts
876
+ interface CallFrame {
877
+ functionName: string;
878
+ scriptId: string;
879
+ url: string;
880
+ lineNumber: number;
881
+ columnNumber: number;
882
+ }
883
+ interface CpuProfileNode {
884
+ id: number;
885
+ callFrame: CallFrame;
886
+ hitCount?: number;
887
+ children?: number[];
888
+ locationId?: number;
889
+ }
890
+ /**
891
+ * The parts of a V8 `.cpuprofile` used by BePack's analysis.
892
+ *
893
+ * Bedrock's profiler writes a standard V8 profile, but it does not emit idle
894
+ * samples. The time between script ticks therefore arrives as a large
895
+ * `timeDeltas` value on the first sample of the next tick.
896
+ */
897
+ interface CpuProfile {
898
+ nodes: CpuProfileNode[];
899
+ samples: number[];
900
+ timeDeltas: number[];
901
+ startTime?: number;
902
+ endTime?: number;
903
+ }
904
+ interface ProfileSample {
905
+ index: number;
906
+ timeMs: number;
907
+ deltaMs: number;
908
+ active: boolean;
909
+ node: CpuProfileNode;
910
+ stack: CpuProfileNode[];
911
+ }
912
+ interface Burst {
913
+ startMs: number;
914
+ endMs: number;
915
+ spanMs: number;
916
+ busyMs: number;
917
+ samples: number;
918
+ run: ProfileSample[];
919
+ }
920
+ interface CpuProfileAnalysis {
921
+ file: string;
922
+ raw: CpuProfile;
923
+ samples: ProfileSample[];
924
+ activeSamples: ProfileSample[];
925
+ gapSamples: ProfileSample[];
926
+ busyMs: number;
927
+ idleMs: number;
928
+ durationMs: number;
929
+ gapMs: number;
930
+ minSamples: number;
931
+ bursts: Burst[];
932
+ }
933
+ interface CpuProfileOptions {
934
+ gapMs?: number;
935
+ minSamples?: number;
936
+ }
937
+ //#endregion
938
+ //#region src/profile/analyze.d.ts
939
+ /** Analyze an already-parsed profile object. */
940
+ declare function analyzeCpuProfile(value: unknown, options?: CpuProfileOptions): CpuProfileAnalysis;
941
+ /** Read and analyze a `.cpuprofile` file. */
942
+ declare function loadCpuProfile(file: string, options?: CpuProfileOptions): Promise<CpuProfileAnalysis>;
943
+ //#endregion
944
+ //#region src/build/typecheckers.d.ts
945
+ /**
946
+ * The default checker, used when the user configures none.
947
+ *
948
+ * BePack has no preset table: any checker other than this one is a plain command line
949
+ * supplied through `packs.bp.compile.typecheck.command`. That keeps the feature honest —
950
+ * the exact command line is always visible in the config, the `--json` output and the
951
+ * error messages, and BePack never has to guess how a third-party tool spells its flags.
952
+ */
953
+ declare const DEFAULT_TYPECHECK_COMMAND = "tsc --noEmit";
954
+ /** A fully-resolved typecheck step: the executable plus its arguments. */
955
+ type ResolvedTypecheck = {
956
+ /** Executable to spawn. */
957
+ command: string;
958
+ /** Arguments passed to the executable. */
959
+ args: string[];
960
+ /** Human-readable label for logs, `--json` output and suggestions. */
961
+ label: string;
962
+ /** True when this is the built-in default rather than a user-supplied command. */
963
+ isDefault: boolean;
964
+ };
965
+ /**
966
+ * Tokenize a command line with quote awareness.
967
+ *
968
+ * Used for the `typecheck.command` string, e.g. `'bun check'` or
969
+ * `'node "./tools/my checker.mjs"'`. The result is spawned with an argument array, so the
970
+ * quotes are never interpreted twice.
971
+ *
972
+ * Backslash escapes **only the surrounding quote character**. It is deliberately not a
973
+ * general escape character: Windows paths are full of backslashes, and any broader rule
974
+ * silently rewrites them (`C:\tools\check.mjs` → `C:toolscheck.mjs`).
975
+ */
976
+ declare function tokenizeCommandLine(input: string): string[];
977
+ /**
978
+ * Resolve the checker to run.
979
+ *
980
+ * A user-supplied command replaces the default entirely; `args` are appended last so they
981
+ * can extend or override it. BePack adds nothing of its own to a custom command — include
982
+ * the tsconfig flag in `args` yourself when the tool needs one.
983
+ */
984
+ declare function resolveTypecheck(command: TypecheckCommandSetting | undefined, args?: string[], options?: {
985
+ tsconfigPath?: string;
986
+ incremental?: boolean;
987
+ tsBuildInfoFile?: string;
988
+ /** Preserve the legacy `useNpx` behavior while keeping default flags. */
989
+ useNpx?: boolean;
990
+ }): ResolvedTypecheck;
991
+ /** Render the command line for logs, `--json` output and error details. */
992
+ declare function formatTypecheckCommand(typecheck: {
993
+ command: string;
994
+ args: string[];
995
+ }): string;
996
+ //#endregion
997
+ //#region src/build/runTypecheck.d.ts
998
+ type TypecheckOptions = {
999
+ quiet?: boolean;
1000
+ /**
1001
+ * Command line to run. Defaults to `"tsc --noEmit"`; this default and deprecated
1002
+ * `useNpx` compatibility mode receive BePack's tsconfig/cache flags. A custom command
1003
+ * is run exactly as configured.
1004
+ */
1005
+ command?: TypecheckCommandSetting;
1006
+ /** Additional arguments appended to `command`. */
1007
+ args?: string[];
1008
+ /** @deprecated Use `command: "npx tsc --noEmit"`. */
1009
+ useNpx?: boolean;
1010
+ /**
1011
+ * Path to tsconfig, relative to cwd unless absolute. Applied to the default checker
1012
+ * and deprecated `useNpx` compatibility mode; a custom command must pass its own
1013
+ * tsconfig flag through `args`.
1014
+ */
1015
+ tsconfigPath?: string;
1016
+ incremental?: boolean;
1017
+ tsBuildInfoFile?: string;
1018
+ /** Logger used for the non-fatal "no tsconfig" notice. */
1019
+ warn?: (message: string) => void;
1020
+ };
1021
+ /**
1022
+ * Run the configured type checker before Rolldown.
1023
+ *
1024
+ * Returns the resolved checker so the caller can report it. A missing tsconfig is fatal
1025
+ * for the default `tsc` and a warning for everything else: a custom command may not need
1026
+ * one at all (a formatter-style checker, a wrapper script, a tool with its own defaults).
1027
+ */
1028
+ declare function runTypecheck(cwd: string, options?: TypecheckOptions): Promise<ResolvedTypecheck & {
1029
+ commandLine: string;
1030
+ }>;
1031
+ //#endregion
1032
+ export { BUILTIN_DEPENDENCY_CATALOG, BUILTIN_DEPENDENCY_RESOLVERS, BUILTIN_PLUGINS, BePackError, type BePackPlugin, type BpCompileOptions, type BpCompileResolved, type BpConfig, type Burst, type ConfigResolvedHookContext, type CpuProfile, type CpuProfileAnalysis, type CpuProfileOptions, DEFAULT_TYPECHECK_COMMAND, 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 ProfileSample, type ReplaceBuiltins, type ReplaceOptions, type ReplaceValue, type ResolvedConfig, type ResolvedTypecheck, type RolldownCustomizeContext, type RolldownCustomizeFunction, type RolldownOverrides, type RpConfig, type TypecheckCommandSetting, type TypecheckConfig, type TypecheckOptions, type UserConfig, analyzeCpuProfile, createDependencyCatalog, defineConfig, exactVersionResolver, formatTypecheckCommand, getConfiguredPacks, loadConfig, loadCpuProfile, minecraftScriptApiBpResolver, minecraftScriptApiResolver, minecraftVanillaDataResolver, packageVersionForSpecifier, patchManifest, resolveDependencies, resolveTypecheck, runTypecheck, sapiPro, satisfiesSemver, satisfiesSemverRange, tokenizeCommandLine };
package/dist/index.js CHANGED
@@ -1 +1,2 @@
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};
1
+ import{pathToFileURL as e}from"node:url";import t from"node:path";import{constants as n,promises as r}from"node:fs";import{platform as i}from"node:os";import"rolldown/plugins";import{access as a,mkdir as o,readFile as s}from"node:fs/promises";import{spawn as c}from"node:child_process";var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e},_=(e,t,n)=>(n=e==null?{}:l(p(e)),g(t||!e||!e.__esModule||!m.call(e,`default`)?u(n,`default`,{value:e,enumerable:!0}):n,e));const v={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:{}},y={dev:!0,build:!1,file:`node_modules/.cache/bepack/tsconfig.tsbuildinfo`},b={keepLooseFiles:!1,keepLoose:[],exclude:[],minifyJson:!0,packOptimizationVersion:`0.1.0`,allowUnsupportedTarget:!1},ee={entry:`src/main.ts`,define:{},tsconfig:`tsconfig.json`,typecheck:!0,typecheckArgs:[],preserveModules:!0,external:[/^@minecraft\/server.*/],useNpx:!1,minify:!1,cache:y,scriptOutputDir:`scripts`};function x(e){return e}const te=[`bepack.config.ts`,`bepack.config.mjs`,`bepack.config.js`];var S=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 ne=[`world`,`global`,`any`];function C(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 w(e,n){return t.isAbsolute(n)?n:t.join(e,n)}function T(e){return e.replace(/\\/g,`/`)}function re(e,t){return w(e,t.root)}function ie(e,t,n){return n===`bp`?t.packs.bp?w(e,t.packs.bp.root):void 0:t.packs.rp?w(e,t.packs.rp.root):void 0}function ae(e,t){let n=ie(re(e,t),t,`bp`);if(!n)throw Error(`packs.bp is not configured`);return n}function oe(e,t){let n=ie(re(e,t),t,`rp`);if(!n)throw Error(`packs.rp is not configured`);return n}function se(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..${t.sep}`)&&r!==`..`&&!t.isAbsolute(r)}function ce(e,n,r){if(!n||n===`.`)throw new S(`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 S(`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 S(`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 S(`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&&se(o,r))throw new S(`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 T(s)}function le(e,n){if(n.packs.bp)return t.join(ae(e,n),`manifest.json`)}function ue(e,n){if(n.packs.rp)return t.join(oe(e,n),`manifest.json`)}i();function de(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 fe(e){let t={...e??{}};for(let[e,n]of Object.entries(t))try{Function(`return (${n});`)}catch{throw new S(`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}const E=`tsc --noEmit`;function D(e){let t=[],n=``,r,i=!1;for(let a=0;a<e.length;a+=1){let o=e[a];if(r){o===r?r=void 0:o===`\\`&&e[a+1]===r?(a+=1,n+=r):n+=o;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(o===`\\`&&(e[a+1]===`"`||e[a+1]===`'`)){a+=1,n+=e[a],i=!0;continue}if(/\s/.test(o)){i&&=(t.push(n),n=``,!1);continue}n+=o,i=!0}if(r)throw new S(`CONFIG_INVALID`,`Unterminated ${r===`"`?`double`:`single`} quote in typecheck command: ${e}`);return i&&t.push(n),t}function pe(e,t=[],n={}){let r=typeof e==`string`?e.trim():``;if(r===``){let e=[...D(E)],r=e.shift(),i=[...me(e,n),...t];return n.useNpx?{command:`npx`,args:[r,...i],label:`npx tsc --noEmit`,isDefault:!0}:{command:r,args:i,label:E,isDefault:!0}}let i=D(r),a=i[0];if(!a)throw new S(`CONFIG_INVALID`,`packs.bp.compile.typecheck.command must be a non-empty command line, got: ${JSON.stringify(e)}`);return{command:a,args:[...i.slice(1),...t],label:r,isDefault:!1}}function me(e,t){let n=[...e];return t.tsconfigPath&&n.push(`--project`,t.tsconfigPath),t.incremental&&t.tsBuildInfoFile&&n.push(`--incremental`,`--tsBuildInfoFile`,t.tsBuildInfoFile),n}function he(e){return[e.command,...e.args].map(e=>/\s/.test(e)?JSON.stringify(e):e).join(` `)}function ge(e,t){if(e===void 0||typeof e==`boolean`)return{typecheck:e??t.typecheck,...t.typecheckCommand===void 0?{}:{typecheckCommand:t.typecheckCommand},typecheckArgs:t.typecheckArgs??[]};if(typeof e!=`object`||!e||Array.isArray(e))throw new S(`CONFIG_INVALID`,`packs.bp.compile.typecheck must be a boolean or an object { enabled?, command?, args? }, got: ${O(e)}.`);ye(e);let{enabled:n,command:r,args:i}=e;if(n!==void 0&&typeof n!=`boolean`)throw new S(`CONFIG_INVALID`,`packs.bp.compile.typecheck.enabled must be a boolean, got: ${O(n)}.`);if(r!==void 0&&typeof r!=`string`)throw new S(`CONFIG_INVALID`,`packs.bp.compile.typecheck.command must be a string, got: ${O(r)}.`);if(typeof r==`string`&&r.trim()===``)throw new S(`CONFIG_INVALID`,`packs.bp.compile.typecheck.command must be a non-empty command line, got: ${O(r)}.`);let a=_e(i,`packs.bp.compile.typecheck.args`);return{typecheck:n??t.typecheck,...r===void 0?t.typecheckCommand===void 0?{}:{typecheckCommand:t.typecheckCommand}:{typecheckCommand:r},typecheckArgs:a??t.typecheckArgs??[]}}function _e(e,t){if(e!==void 0){if(!Array.isArray(e))throw new S(`CONFIG_INVALID`,`${t} must be an array of strings, got: ${O(e)}.`);return e.map(e=>{if(typeof e!=`string`)throw new S(`CONFIG_INVALID`,`${t} entries must be strings, got: ${O(e)}.`);return e})}}function ve(e,t){if(e!==void 0){if(typeof e!=`string`||e.trim()===``)throw new S(`CONFIG_INVALID`,`${t} must be a non-empty command line string, got: ${O(e)}.`);return e.trim()}}function ye(e){let t=e;if(t.typechecker!==void 0)throw new S(`CONFIG_INVALID`,`packs.bp.compile.typecheck.typechecker was replaced by packs.bp.compile.typecheck.command: write the full command line instead, e.g. { command: "bun check" }, got: ${O(t.typechecker)}.`)}function O(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e==`object`?`object`:typeof e==`string`?JSON.stringify(e):String(e)}function be(e){let t=/^(\d+)\.(\d+)\.(\d+)$/.exec(e);if(!t)throw new S(`VERSION_INVALID`,`Manifest version requires x.y.z.`,{details:{version:e}});return[Number(t[1]),Number(t[2]),Number(t[3])]}function xe(e){return/^\d+\.\d+\.\d+(?:[-.][0-9A-Za-z.-]+)?$/.test(e)}function k(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 Se(e){return e===`latest`||k(e,`1.21.120`)>=0}function Ce(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 we(e,t){for(let n of[`major`,`minor`,`patch`])if(e[n]!==t[n])return e[n]-t[n];return 0}function A(e,t){let n=Ce(e);return n?t.split(`||`).some(e=>{let t=/(?:\^|~|>=|<=|>|<|=)?\s*(v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)/.exec(e.trim()),r=t?Ce(t[1]):void 0;return!r||n.major!==r.major||we(n,r)<0?!1:r.minecraftTarget?n.minecraftTarget?k(n.minecraftTarget.join(`.`),r.minecraftTarget.join(`.`))>=0:!1:!0}):!1}const Te=A;function Ee(e){if(e===`stable`||e===`beta`||e===`preview`)throw new S(`DEPENDENCY_VERSION_INVALID`,`${e} must be resolved from npm registry before writing package.json.`,{details:{specifier:e}});if(xe(e))return e;throw new S(`DEPENDENCY_VERSION_INVALID`,`Unsupported dependency version: ${e}`,{details:{specifier:e}})}function De(e){return e.filter(e=>/^\d+\.\d+\.\d+$/.test(e)).sort(k)}function Oe(e){return e.filter(e=>/(?:^|[-.])beta(?:[-.]|$)/i.test(e)).sort(k)}var j=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=De(this.npm.versions(t)).at(-1);if(!r)throw new S(`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=Oe(this.npm.versions(t)).at(-1);if(!r)throw new S(`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(k).at(-1);if(!a)throw new S(`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 S(`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 S(`SAPI_VERSION_NOT_FOUND`,`Cannot confirm inferred stable version ${s} for ${e}.`,{details:{package:e,target:t,beta:n,inferredStable:s}});return s}};function ke(e,t){return t===`latest`||Se(t)?`beta`:/^(\d+\.\d+\.\d+-beta)/i.exec(e)?.[1]??e}function Ae(e,t,n){let r=Oe(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 S(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest beta version for ${e}.`,{details:{package:e}});return n?.verbose(`Resolved ${e}@beta -> ${r}`),r}function je(e){return e.filter(e=>/(?:rc|beta)\.\d+\.\d+\.\d+-preview\.\d+$/i.test(e)).sort(k)}function Me(e,t,n){let r=je(t).at(-1);if(!r)throw new S(`SAPI_VERSION_NOT_FOUND`,`Cannot resolve latest preview version for ${e}.`,{details:{package:e}});return n?.verbose(`Resolved ${e}@preview -> ${r}`),r}function Ne(e,t,n,r){let i=n.replace(/\./g,`\\.`),a=RegExp(`(?:rc|beta)\\.${i}-preview\\.\\d+$`),o=t.filter(e=>a.test(e)).sort(k).at(-1);if(!o)throw new S(`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 M={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 j(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`?Ae(e.packageName,e.npm.versions(t),e.logger):n.betaForTarget(e.packageName,e.target,t);return{packageVersion:r,manifestVersion:ke(r,e.target)}}e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`);let r=e.target===`latest`?Me(e.packageName,e.npm.versions(t),e.logger):Ne(e.packageName,e.npm.versions(t),e.target,e.logger);return{packageVersion:r,manifestVersion:r}}},N={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 j(e.npm,e.logger);if(e.specifier===`beta`){e.logger?.verbose(`Resolving ${e.packageName}@beta for target ${e.target}`);let r=e.target===`latest`?Ae(e.packageName,e.npm.versions(t),e.logger):n.betaForTarget(e.packageName,e.target,t);return{packageVersion:r,manifestVersion:ke(r,e.target)}}e.logger?.verbose(`Resolving ${e.packageName}@preview for target ${e.target}`);let r=e.target===`latest`?Me(e.packageName,e.npm.versions(t),e.logger):Ne(e.packageName,e.npm.versions(t),e.target,e.logger);return{packageVersion:r,manifestVersion:r}}},Pe=/^\d+\.\d+\.\d+$/,Fe=/^\d+\.\d+\.\d+-preview\.\d+$/,P={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`?Ie(e,t):Le(e,t)}};function Ie(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&&Pe.test(n))return e.logger?.verbose(`Resolved ${e.packageName}@stable -> ${n}`),{packageVersion:n};let r=e.npm.versions(t).filter(e=>Pe.test(e)).sort(k).at(-1);if(!r)throw new S(`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 S(`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 Le(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(k).at(-1);if(!n)throw new S(`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(k).at(-1);if(!i)throw new S(`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 F={"@minecraft/common":{resolver:M,manifest:!0},"@minecraft/server":{resolver:M,manifest:!0},"@minecraft/server-ui":{resolver:M,manifest:!0},"@minecraft/server-net":{resolver:N,manifest:!0},"@minecraft/server-admin":{resolver:N,manifest:!0},"@minecraft/server-gametest":{resolver:N,manifest:!0},"@minecraft/debug-utilities":{resolver:N,manifest:!0},"@minecraft/diagnostics":{resolver:N,manifest:!0},"@minecraft/server-graphics":{resolver:N,manifest:!0},"@minecraft/server-editor":{resolver:N,manifest:!0},"@minecraft/vanilla-data":{resolver:P,manifest:!1}},Re={name:`exact-version`,match:e=>xe(e.specifier),resolve(e){return e.logger?.verbose(`Using exact ${e.packageName}@${e.specifier}`),{packageVersion:Ee(e.specifier),manifestVersion:e.specifier}}},ze=[M,N,P,Re];var I=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,...ze],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 S(`PLUGIN_FAILED`,`Plugin ${t} resolver ${n.name} match failed: ${e instanceof Error?e.message:String(e)}`):e}if(!t)throw new S(`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 S(`PLUGIN_FAILED`,`Plugin ${n} resolver ${t.name} failed: ${e instanceof Error?e.message:String(e)}`):e}}};const L=`sapi-pro`,R=[`@minecraft/server`,`@minecraft/server-ui`];function z(e){return/(?:beta|preview|alpha|rc)/i.test(e)}function Be(e){return z(e)?`beta`:`stable`}function Ve(e){let t=/^(\d+)\.(\d+)\./.exec(e);return!!t&&(Number(t[1])>0||Number(t[2])>=4)}function He(e){return{...e.dependencies??{},...e.peerDependencies??{}}}async function Ue(e,t,n,r){let i=e.config.packs.bp?.dependencies??{},a={...F,...e.config.install.dependencyCatalog},o=I.fromConfig(e.config.install.dependencyResolvers.filter(e=>e!==Ge),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||R.includes(s)&&z(c)!==z(u.packageVersion)||!A(u.packageVersion,c))return!1}return!0}function We(e,t){if(t!==`stable`&&t!==`beta`){let n=e[t];return n?[[t,n]]:[]}return Object.entries(e).filter(([e,n])=>{if(!Ve(e))return!1;let r=He(n);return Object.keys(r).length===0?!1:t===`stable`?/-stable(?:\.\d+)?$/i.test(e):/^\d+\.\d+\.\d+$/.test(e)}).sort(([e],[t])=>k(e,t)).reverse()}const Ge={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(L),n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Set;for(let[i,a]of We(t.versions??{},e.specifier))if(await Ue(e,He(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 S(`SAPI_VERSION_NOT_FOUND`,`Cannot find a compatible ${L}@${e.specifier} for target ${e.target}.${r.size>0?` Missing explicit dependencies: ${[...r].join(`, `)}.`:``}`,{details:{package:L,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 Ke(){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[L];if(!n)return;let r=R.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 R){let r=t[e];if(Be(r)!==n)throw Error(`sapi-pro ${n} requires ${e} to use ${n}, received ${r}.`)}},install:{dependencyCatalog:{[L]:{resolver:`sapi-pro`,manifest:!1}},dependencyResolvers:[Ge]}}}const qe={"sapi-pro":Ke};function B(e){return e?Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0)):{}}function V(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 Je(e,t){let n={};(e.packs?.bp||t.packs?.bp)&&(n.bp={...e.packs?.bp??{},...B(t.packs?.bp)}),(e.packs?.rp||t.packs?.rp)&&(n.rp={...e.packs?.rp??{},...B(t.packs?.rp)});let r={...e.copy?.targets??{},...B(t.copy?.targets)},i=B(t);return{...e,...i,...t.plugins!==void 0||e.plugins!==void 0?{plugins:t.plugins??e.plugins}:{},packs:n,install:{...e.install,...B(t.install)},build:{...e.build,...B(t.build)},dev:{...e.dev,...B(t.dev)},copy:{...e.copy,...B(t.copy),targets:r},pack:{...e.pack,...B(t.pack)},hooks:{...e.hooks,...B(t.hooks)}}}function Ye(e){let t=(e??[]).map(e=>{if(typeof e!=`string`)return e;let t=qe[e];if(!t)throw new S(`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 S(`CONFIG_INVALID`,`Every plugin must have a non-empty name.`);if(n.has(e.name))throw new S(`CONFIG_INVALID`,`Plugin name is duplicated: ${e.name}.`);if(e.apiVersion!==void 0&&e.apiVersion!==1)throw new S(`CONFIG_INVALID`,`Plugin ${e.name} requires unsupported BePack plugin API version ${e.apiVersion}.`);if(e.priority!==void 0&&!Number.isFinite(e.priority))throw new S(`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 S(`PLUGIN_FAILED`,`Plugin ${t.name} ${String(n)} hook failed: ${e instanceof Error?e.message:String(e)}`):e}return t}]}))}function Ze(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 Qe(e,n,r){let i=ee,a=e?.scriptOutputDir??i.scriptOutputDir,o=t.resolve(r,e?.entry??i.entry),s=ce(n,a,t.dirname(o)),c=ve(e?.typecheckCommand,`packs.bp.compile.typecheckCommand`)??i.typecheckCommand,l=_e(e?.typecheckArgs,`packs.bp.compile.typecheckArgs`),u=ge(e?.typecheck,{typecheck:i.typecheck,...c===void 0?{}:{typecheckCommand:c},...l===void 0?{}:{typecheckArgs:l}});return{entry:e?.entry??i.entry,define:fe(e?.define),tsconfig:e?.tsconfig??i.tsconfig,typecheck:u.typecheck,typecheckArgs:u.typecheckArgs,...u.typecheckCommand===void 0?{}:{typecheckCommand:u.typecheckCommand},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:s,...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 S(`CONFIG_INVALID`,`packs.bp.compile.rolldown must be a rolldown options object or a function (options, context) => options, got: ${V(e)}.`)}function f(e){if(typeof e!=`string`||e.trim()===``)throw new S(`CONFIG_INVALID`,`packs.bp.compile.rolldownConfig must be a non-empty path string, got: ${V(e)}.`);return e}function p(e){let t=y;return{dev:e?.dev??t.dev,build:e?.build??t.build,file:e?.file??t.file}}}function $e(e){if(e===void 0||e===!1)return;let t=e===!0?{}:e;if(typeof t!=`object`||!t||Array.isArray(t))throw new S(`CONFIG_INVALID`,`pack.optimize must be a boolean or an options object, got: ${V(e)}.`);let n=t.packOptimizationVersion;if(n!==void 0&&(typeof n!=`string`||n.trim()===``))throw new S(`CONFIG_INVALID`,`pack.optimize.packOptimizationVersion must be a non-empty string, got: ${V(n)}.`);return{keepLooseFiles:t.keepLooseFiles??b.keepLooseFiles,keepLoose:t.keepLoose!==!1&&(t.keepLoose??[]).map(et),exclude:(t.exclude??[]).map(et),minifyJson:t.minifyJson??b.minifyJson,packOptimizationVersion:n??b.packOptimizationVersion,allowUnsupportedTarget:t.allowUnsupportedTarget??b.allowUnsupportedTarget}}function et(e){let n=String(e).replace(/\\/g,`/`).replace(/^\.\//,``).replace(/\/+$/,``);if(!n||n.includes(`/`)||n.includes(`..`)||t.posix.isAbsolute(n))throw new S(`CONFIG_INVALID`,`pack.optimize.exclude entries must be top-level folder names (no path separators, no ".."), got: ${V(e)}.`);return n}function tt(e){let t=e?.merge??`preserve`;if(t!==`preserve`&&t!==`clean`)throw new S(`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 S(`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 nt(e,n={},r=process.cwd()){let i=Je(e,n),a=Ye(i.plugins),o=i.target??v.target;if(o===`stable`||o===`beta`)throw new S(`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 S(`CONFIG_INVALID`,`At least one pack (packs.bp or packs.rp) is required.`);if(!i.name||i.name.trim()===``)throw new S(`CONFIG_INVALID`,`name is required.`);let l=i.name,u=i.version??v.version,d=i.description,f=i.packs,p=f.bp?.compile,m=f.bp,h=f.rp;if(m){if(!m.uuid)throw new S(`CONFIG_INVALID`,`packs.bp.uuid is required.`);if(m.compile&&!m.moduleUuid)throw new S(`CONFIG_INVALID`,`packs.bp.moduleUuid is required when packs.bp.compile is configured.`);if(m.root===void 0)throw new S(`CONFIG_INVALID`,`packs.bp.root is required. Set the behavior pack directory in bepack.config.ts.`);if(p?.define){let e=Object.keys(i.replace?.values??{}),t=Object.keys(p.define),n=e.filter(e=>t.includes(e));if(n.length>0)throw new S(`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 g=t.resolve(r,i.root??`.`),_=m?t.resolve(g,m.root):void 0;if(h){if(!h.uuid||!h.moduleUuid)throw new S(`CONFIG_INVALID`,`packs.rp.uuid and packs.rp.moduleUuid are required.`);if(h.root===void 0)throw new S(`CONFIG_INVALID`,`packs.rp.root is required when packs.rp is configured.`);if(h.packScope!==void 0&&!ne.includes(h.packScope))throw new S(`CONFIG_INVALID`,`packs.rp.packScope must be one of ${ne.map(e=>`"${e}"`).join(`, `)}.`,{details:{packScope:h.packScope}})}let y=m?.description??d,b=h?.description??d,{catalog:ee,diagnostics:x}=Ze(a,i.install?.dependencyCatalog??{}),te=a.flatMap(e=>e.install?.dependencyResolvers??[]),C=$e(i.pack?.optimize),w=$e(i.copy?.optimize);return{root:i.root??v.root,configured:{root:i.root!==void 0,packOutDir:i.pack?.outDir!==void 0},name:l,version:u,...d===void 0?{}:{description:d},replace:de(i.replace),target:o,plugins:a,...x.length>0?{pluginDiagnostics:x}:{},...i.manifestFormat===void 0?{}:{manifestFormat:i.manifestFormat},packs:{...m?{bp:{root:m.root,uuid:m.uuid,...m.moduleUuid===void 0?{}:{moduleUuid:m.moduleUuid},name:m.name??l,...y===void 0?{}:{description:y},...p&&_?{compile:Qe(p,_,g)}:{},manifest:tt(m.manifest),dependencies:m.dependencies??{},...m.achievement===void 0?{}:{achievement:m.achievement},include:m.include??[]}}:{},...h?{rp:{root:h.root,uuid:h.uuid,moduleUuid:h.moduleUuid,name:h.name??l,...b===void 0?{}:{description:b},manifest:tt(h.manifest),...h.pbr===void 0?{}:{pbr:h.pbr},...h.packScope===void 0?{}:{packScope:h.packScope},include:h.include??[]}}:{}},install:{registry:i.install?.registry??v.install.registry,saveTo:i.install?.saveTo??v.install.saveTo,packageManager:i.install?.packageManager??v.install.packageManager,runPackageManager:i.install?.runPackageManager??v.install.runPackageManager,updatePackageJson:i.install?.updatePackageJson??v.install.updatePackageJson,updateManifest:i.install?.updateManifest??v.install.updateManifest,dependencyCatalog:ee,dependencyResolvers:[...te,...i.install?.dependencyResolvers??[]]},build:{copy:i.build?.copy??v.build.copy,timing:i.build?.timing??v.build.timing},dev:{copy:i.dev?.copy??v.dev.copy,...i.dev?.watch?{watch:i.dev.watch}:{}},copy:{defaultTarget:i.copy?.defaultTarget??v.copy.defaultTarget,...i.copy?.name?{name:i.copy.name}:{},...i.copy?.include?{include:i.copy.include}:{},targets:i.copy?.targets??{},...w?{optimize:w}:{}},pack:{name:i.pack?.name??v.pack.name,outDir:i.pack?.outDir??v.pack.outDir,...C?{optimize:C}:{}},hooks:Xe(a,i.hooks)}}async function rt(e,n){if(n){let t=w(e,n);return await r.access(t).catch(()=>{throw new S(`CONFIG_NOT_FOUND`,`Config not found: ${n}`,{details:{configPath:n}})}),t}for(let n of te){let i=t.join(e,n);try{return await r.access(i),i}catch{}}throw new S(`CONFIG_NOT_FOUND`,`No bepack.config.ts, bepack.config.mjs, or bepack.config.js found.`,{details:{cwd:e}})}async function it(t){try{if(t.endsWith(`.ts`))try{return await import(`${e(t).href}?t=${Date.now()}`)}catch{let e=at(await r.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 S(`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 at(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 ot(e,t){for(let n of e.plugins??[])if(n.configResolved)try{await n.configResolved({cwd:t,config:e})}catch(e){throw new S(`PLUGIN_FAILED`,`Plugin ${n.name} configResolved hook failed: ${e instanceof Error?e.message:String(e)}`)}}async function st(e){let n=t.resolve(e.cwd),r=await rt(n,e.configPath),i=await it(r);if(i.default===void 0)throw new S(`CONFIG_INVALID`,`Config must use default export.`,{details:{file:r}});let a=nt(i.default,e.overrides,n);return await ot(a,n),{config:a,path:r,cwd:n}}var ct=/* @__PURE__ */ _((/* @__PURE__ */ h(((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 H(e){return{...F,...e.install.dependencyCatalog}}function lt(e,t){let n=e[t];if(!n)throw new S(`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 ut(e){return`${JSON.stringify(e,null,4)}\n`}async function dt(e){try{return await r.access(e),!0}catch{return!1}}async function ft(e){await r.mkdir(e,{recursive:!0})}async function pt(e,n){await ft(t.dirname(e)),await r.writeFile(e,ut(n),`utf8`)}function mt(e){return Array.isArray(e)&&e.length===3&&typeof e[0]==`number`&&typeof e[1]==`number`&&typeof e[2]==`number`}function ht(e){return typeof e==`string`&&/^\d+\.\d+\.\d+$/.test(e)}function U(e){return e===3?ht:mt}function W(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 gt=[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?U(e.format_version)(e.header.version)?null:W(e.format_version,`header.version`):null,e=>e.header?U(e.format_version)(e.header.min_engine_version)?null:W(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=U(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`}): ${W(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=U(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}): ${W(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 _t(e,t){let n=[];for(let r of gt){let i=r(e,t);i!==null&&(Array.isArray(i)?n.push(...i):n.push(i))}if(n.length>0)throw new S(`MANIFEST_INVALID`,`Manifest validation failed: ${n.join(`; `)}`)}function G(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:{...e}}function K(e){return Array.isArray(e)?e:[]}function vt(e){if(!(e&&Object.keys(e).length===0))return e}var q=class{static async read(e){if(!await dt(e))return;let t=await r.readFile(e,`utf8`);try{return G(JSON.parse(t))}catch{throw new S(`MANIFEST_INVALID`,`Invalid JSON in manifest: ${e}`)}}static async write(e,t,n){_t(t,n),await pt(e,t)}};const yt=[1,21,0],bt=[1,0,0];var xt=class{config;version;versionStr;depManager;constructor(e,t){this.config=e,this.version=be(e.version),this.versionStr=e.version,this.depManager=t}buildBp(e){let t=this.requireBp(),n=G(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=G(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[...K(e).filter(e=>!this.isManagedBpModule(e,t)),this.createScriptModule(t,n)]}replaceManagedRpModules(e,t,n){return[...K(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=vt(t);n?e.metadata=n:delete e.metadata}}applyPbrCapability(e,t){if(t.pbr===!0){let t=K(e.capabilities);e.capabilities=t.includes(`pbr`)?t:[...t,`pbr`]}else if(t.pbr===!1){let t=K(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`:bt}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`:yt}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 S(`CONFIG_INVALID`,`packs.bp is required to build the BP manifest.`);return this.config.packs.bp}requireRp(){if(!this.config.packs.rp)throw new S(`CONFIG_INVALID`,`packs.rp is required to build the RP manifest.`);return this.config.packs.rp}},St=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=be(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 S(`DEPENDENCY_REQUIRES_INSTALL`,"Run `bepack install` to resolve stable manifest dependencies.",{details:{specifier:t,target:n}})}if(t===`beta`){if(Se(n))return{version:`beta`,source:`config`};if(r)return{version:r,source:`install`};if(i)return{version:i,source:`manifest`};throw new S(`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 S(`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 S(`UNSUPPORTED_DEPENDENCY`,`${t} is not a managed dependency.`,{details:{package:t},suggestions:n})}if(!e.isAllowedSpecifier(n))throw new S(`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 S(`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=K(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=K(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 J=ct.default.createColors(process.env.NO_COLOR===void 0&&process.env.FORCE_COLOR!==`0`);async function Ct(e){let n=H(e.config),r=e.config.packs.bp?le(e.cwd,e.config):void 0,i=r?await q.read(r):void 0,a=Tt(i,n),o=new St(e.config,n,{...e.resolvedDeps?{install:e.resolvedDeps}:{},manifest:a}),s=new xt(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`),wt(u,e.logger),c.bpManifest={path:T(t.relative(e.cwd,r)),updated:!0,existed:n,dependencies:u}}if(e.config.packs.rp){let n=ue(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:T(t.relative(e.cwd,n)),updated:!0,existed:i}}return c}function wt(e,t){if(t)for(let n of e){let e=J.cyan(n.module_name);n.previous!==void 0&&n.previous!==n.version?t.info(`manifest ${e}: ${n.previous} ${J.dim(`->`)} ${n.version} (specifier ${JSON.stringify(n.specifier)}, ${n.source})`):n.source===`manifest`?t.info(`manifest ${e} ${n.version} ${J.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 Tt(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 Et(e,t){e?.install?e.install(t):e?.info(`[Install] ${t}`)}var Dt=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;Et(this.logger,`fetching ${e} metadata from ${this.registry}`);let r=await fetch(t);if(!r.ok)throw new S(`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 Ot(e){return t=>{e?.install?e.install(t):e?.info(`[Install] ${t}`)}}var kt=class{config;logger;npm;catalog;pkgResolver;log;constructor(e,t){this.config=e,this.logger=t,this.npm=new Dt(e.install.registry,t),this.catalog=H(e),this.pkgResolver=new j(this.npm,t),this.log=Ot(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=lt(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 I.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 S(`PLUGIN_FAILED`,`Plugin ${n.name} ${e} hook failed: ${t instanceof Error?t.message:String(t)}`)}}}};async function At(e,t){return new kt(e,t).resolveAll()}const jt=`<profile>`;function Y(e,t,n){throw new S(`PROFILE_INVALID`,`${e}: ${t}`,{...n===void 0?{}:{details:n},suggestions:[`Check that the file was produced by a V8 profiler and is valid JSON.`]})}function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(e,t,n){return(typeof e!=`number`||!Number.isFinite(e))&&Y(n,`${t} must be a finite number`),e}function Q(e,t,n){let r=Z(e,t,n);return Number.isInteger(r)||Y(n,`${t} must be an integer`),r}function Mt(e,t,n,r){let i=e[t];if(i!==void 0)return Z(i,`${n}.${t}`,r)}function Nt(e,t,n,r){let i=e[t];if(i!==void 0)return Q(i,`${n}.${t}`,r)}function Pt(e,t,n){X(e)||Y(n,`${t} must be an object`);let r=e.functionName??``;typeof r!=`string`&&Y(n,`${t}.functionName must be a string`);let i=e.url??``;typeof i!=`string`&&Y(n,`${t}.url must be a string`);let a=e.scriptId,o;a===void 0?o=`0`:typeof a==`number`&&Number.isFinite(a)?o=String(a):typeof a==`string`?o=a:Y(n,`${t}.scriptId must be a string`);let s=e.lineNumber??-1;(typeof s!=`number`||!Number.isFinite(s))&&Y(n,`${t}.lineNumber must be a finite number`);let c=e.columnNumber??-1;return(typeof c!=`number`||!Number.isFinite(c))&&Y(n,`${t}.columnNumber must be a finite number`),{functionName:r,scriptId:o,url:i,lineNumber:s,columnNumber:c}}function Ft(e,t,n){let r=`nodes[${t}]`;X(e)||Y(n,`${r} must be an object`);let i=Q(e.id,`${r}.id`,n),a=Pt(e.callFrame,`${r}.callFrame`,n),o=Nt(e,`hitCount`,r,n),s=Nt(e,`locationId`,r,n),c;return e.children!==void 0&&(Array.isArray(e.children)||Y(n,`${r}.children must be an array`),c=e.children.map((e,t)=>Q(e,`${r}.children[${t}]`,n))),{id:i,callFrame:a,...o===void 0?{}:{hitCount:o},...c===void 0?{}:{children:c},...s===void 0?{}:{locationId:s}}}function It(e,t=jt){X(e)||Y(t,`profile root must be a JSON object`),Array.isArray(e.nodes)||Y(t,`missing nodes array`),Array.isArray(e.samples)||Y(t,`missing samples array`),Array.isArray(e.timeDeltas)||Y(t,`missing timeDeltas array`);let n=e.nodes.map((e,n)=>Ft(e,n,t)),r=/* @__PURE__ */ new Set;for(let e of n)r.has(e.id)&&Y(t,`duplicate node id ${e.id}`),r.add(e.id);for(let e of n)for(let n of e.children??[])r.has(n)||Y(t,`node ${e.id} references unknown child node ${n}`);e.timeDeltas.length!==e.samples.length&&Y(t,`samples and timeDeltas must have the same length (${e.samples.length} != ${e.timeDeltas.length})`);let i=e.samples.map((e,n)=>{let i=Q(e,`samples[${n}]`,t);return r.has(i)||Y(t,`samples[${n}] references unknown node ${i}`),i}),a=e.timeDeltas.map((e,n)=>{let r=Z(e,`timeDeltas[${n}]`,t);return r<0&&Y(t,`timeDeltas[${n}] must not be negative`),r}),o=Mt(e,`startTime`,`profile`,t),s=Mt(e,`endTime`,`profile`,t);return{nodes:n,samples:i,timeDeltas:a,...o===void 0?{}:{startTime:o},...s===void 0?{}:{endTime:s}}}function Lt(e,t,n){let r=[],i=/* @__PURE__ */ new Set,a=e.id;for(;a!==void 0&&!i.has(a);){i.add(a);let e=n.get(a);if(!e)break;r.push(e),a=t.get(a)}return r}function Rt(e){let t=e[0],n=e[e.length-1];if(!t||!n)throw Error(`cannot create a burst from an empty sample run`);let r=e.reduce((e,t)=>e+t.deltaMs,0);return{startMs:t.timeMs,endMs:n.timeMs,spanMs:n.timeMs-t.timeMs,busyMs:r,samples:e.length,run:e}}function zt(e,t){let n=[],r=[];for(let i of e){if(i.active){r.push(i);continue}r.length>0&&r.length>=t&&n.push(Rt(r)),r=[]}return r.length>0&&r.length>=t&&n.push(Rt(r)),n}function Bt(e,t,n){let r=It(e,t),i=n.gapMs??5,a=n.minSamples??20,o=new Map(r.nodes.map(e=>[e.id,e])),s=/* @__PURE__ */ new Map;for(let e of r.nodes)for(let t of e.children??[])s.set(t,e.id);let c=i*1e3,l=0,u=[];for(let e=0;e<r.samples.length;e++){let t=r.timeDeltas[e]??0;l+=t;let n=o.get(r.samples[e]??-1);n&&u.push({index:e,timeMs:l/1e3,deltaMs:t/1e3,active:t<=c,node:n,stack:Lt(n,s,o)})}let d=u.filter(e=>e.active),f=u.filter(e=>!e.active);return{file:t,raw:r,samples:u,activeSamples:d,gapSamples:f,busyMs:d.reduce((e,t)=>e+t.deltaMs,0),idleMs:f.reduce((e,t)=>e+t.deltaMs,0),durationMs:l/1e3,gapMs:i,minSamples:a,bursts:zt(u,a)}}function Vt(e,t={}){return Bt(e,jt,t)}async function Ht(e,t={}){let n;try{n=await s(e,`utf8`)}catch(t){throw new S(`PROFILE_READ_FAILED`,`Cannot read profile ${e}: ${t instanceof Error?t.message:String(t)}`,{details:{file:e},suggestions:[`Check the path and that the file is readable.`]})}let r;try{r=JSON.parse(n)}catch(t){Y(e,`not valid JSON: ${t instanceof Error?t.message:String(t)}`)}return Bt(r,e,t)}const Ut=10485760;async function Wt(e,n={}){let r=Zt(n.command),i=n.tsconfigPath??`tsconfig.json`,a=t.resolve(e,i),s=await dt(a),l=pe(n.command,n.args??[],r?{tsconfigPath:a,incremental:!!n.incremental,useNpx:!!n.useNpx,...n.tsBuildInfoFile?{tsBuildInfoFile:n.tsBuildInfoFile}:{}}:{});if(!s){if(r)throw new S(`TYPECHECK_FAILED`,`TypeScript config not found: ${i}. Create it or run build with --skip-typecheck.`,{details:{path:i,command:l.label}});n.warn?.(`TypeScript config not found: ${i} — running \`${l.label}\` anyway.`)}n.incremental&&n.tsBuildInfoFile&&r&&await o(t.dirname(n.tsBuildInfoFile),{recursive:!0});let u=he(l),d=await Yt(l.command,e);if(!d)throw new S(`TYPECHECK_FAILED`,`Cannot find ${l.command}.`,{details:{command:u,label:l.label},suggestions:$(l)});let f=process.platform===`win32`&&/\.(cmd|bat)$/i.test(d),p=f?Gt(d,l.args):d,m=f?[]:l.args,h;try{h=c(p,m,{cwd:e,windowsHide:!0,shell:f,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw new S(`TYPECHECK_FAILED`,`Cannot start ${u}.`,{details:{command:u,label:l.label,cause:e instanceof Error?e.message:String(e)},suggestions:$(l)})}return await new Promise((e,t)=>{let r=``,i=``,a=0,o=e=>{let t=Buffer.isBuffer(e)?e:Buffer.from(String(e)),n=Ut-a;return n<=0?``:t.length<=n?(a+=t.length,t.toString(`utf8`)):(a=Ut,t.subarray(0,n).toString(`utf8`))};h.stdout?.on(`data`,e=>{r+=o(e),n.quiet||process.stdout.write(e)}),h.stderr?.on(`data`,e=>{i+=o(e),n.quiet||process.stderr.write(e)}),h.on(`error`,e=>{t(new S(`TYPECHECK_FAILED`,`Cannot start ${u}.`,{details:{command:u,label:l.label,cause:e.message},suggestions:$(l)}))}),h.on(`close`,n=>{if(n===0){e();return}let a=[r.trim(),i.trim()].filter(Boolean).join(`
2
+ `),o=Jt(a);t(new S(`TYPECHECK_FAILED`,o?`Cannot find ${l.command}.`:`${u} failed.`,{details:{command:u,label:l.label,exitCode:typeof n==`number`?n:null,...a?{diagnostics:a}:{}},...o?{suggestions:$(l)}:{}}))})}),{...l,commandLine:u}}function Gt(e,t){let n=process.platform===`win32`?Kt:qt;return[e,...t].map(n).join(` `)}function Kt(e){if(e===``)return`""`;if(!/[\s"&|<>^()!,;=]/.test(e))return e.replace(/%/g,`^%`);let t=`"`,n=0;for(let r of e){if(r===`\\`){n+=1;continue}if(r===`%`){t+=`\\`.repeat(n*2)+`"^%"`,n=0;continue}if(r===`"`){t+=`\\`.repeat(n*2+1)+`"`,n=0;continue}t+=`\\`.repeat(n)+r,n=0}return t+=`\\`.repeat(n*2)+`"`,t}function qt(e){return e===``?`''`:/[\s"'\\$`!*?[\]{}();&|<>~#]/.test(e)?`'${e.replace(/'/g,`'\\''`)}'`:e}function Jt(e){return e.includes(`ENOENT`)||e.includes(`is not recognized`)||e.includes(`不是内部或外部命令`)||e.includes(`command not found`)}async function Yt(e,n){let r=e.includes(`/`)||e.includes(`\\`);if(t.isAbsolute(e)||r){let r=t.resolve(n,e);return await Xt(r)?r:void 0}let i=process.env.PATH??``,a=process.platform===`win32`?(process.env.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`).filter(Boolean):[``];for(let r of i.split(t.delimiter)){let i=r?t.resolve(n,r):n,o=t.join(i,e);if(await Xt(o))return o;for(let n of a){if(n&&t.extname(e))continue;let r=t.join(i,e+n);if(await Xt(r))return r}}}async function Xt(e){try{return await a(e,n.X_OK),!0}catch{return!1}}function $(e){return[`Install the checker so \`${e.command}\` is available, or point packs.bp.compile.typecheck.command at a command you do have (for example "bun check", "tsc-rs --noEmit", "npx tsc --noEmit").`,`Run with --skip-typecheck to build without checking (the bundle is still produced).`]}function Zt(e){return typeof e!=`string`||e.trim()===``}export{F as BUILTIN_DEPENDENCY_CATALOG,ze as BUILTIN_DEPENDENCY_RESOLVERS,qe as BUILTIN_PLUGINS,S as BePackError,E as DEFAULT_TYPECHECK_COMMAND,I as DependencyResolverRegistry,kt as DependencyService,j as MinecraftPackageResolver,Dt as NpmRegistryClient,Vt as analyzeCpuProfile,H as createDependencyCatalog,x as defineConfig,Re as exactVersionResolver,he as formatTypecheckCommand,C as getConfiguredPacks,st as loadConfig,Ht as loadCpuProfile,N as minecraftScriptApiBpResolver,M as minecraftScriptApiResolver,P as minecraftVanillaDataResolver,Ee as packageVersionForSpecifier,Ct as patchManifest,At as resolveDependencies,pe as resolveTypecheck,Wt as runTypecheck,Ke as sapiPro,A as satisfiesSemver,Te as satisfiesSemverRange,D as tokenizeCommandLine};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bepack/cli",
3
- "version": "0.1.0-beta.4",
3
+ "version": "0.1.0-beta.5",
4
4
  "description": "A modern pack builder for Minecraft Bedrock Edition.",
5
5
  "keywords": [
6
6
  "minecraft",
@@ -15,7 +15,7 @@
15
15
  "author": "XiaoYangx666",
16
16
  "repository": {
17
17
  "type": "git",
18
- "url": "https://github.com/XiaoYangx666/BEPack.git"
18
+ "url": "git+https://github.com/XiaoYangx666/BEPack.git"
19
19
  },
20
20
  "homepage": "https://github.com/XiaoYangx666/BEPack#readme",
21
21
  "type": "module",