import { BuildContext } from '@quenty/nevermore-template-helpers'; import { type DeployTarget } from '@quenty/nevermore-deploy'; import { type BatchTarget } from '../../batch/changed-packages-utils.js'; /** * Budget for one combined place, as uploaded (recompressed). Under the upload * limit (`PLACE_UPLOAD_MAX_BYTES`), and under the 100 MB Roblox documents as * supported, since split places run in parallel and cost little. */ export declare const DEFAULT_MAX_CHUNK_BYTES: number; /** One combined place: the packages that are uploaded and executed together. */ export interface CombinedPlaceChunk { /** Absolute path to this chunk's combined .rbxl file. */ rbxlPath: string; /** batchTarget.name → ServerScriptService slug, for this chunk's packages only. */ slugMap: Map; /** Size on disk — recompressed whenever the batch has a size budget. */ sizeBytes: number; } export interface CombinedProjectResult { /** * The combined places, in package order. Usually one; more when even * recompressed the packages together exceed the per-upload budget. */ chunks: CombinedPlaceChunk[]; /** batchTarget.name → ServerScriptService slug mapping, across every chunk. */ slugMap: Map; /** First batch target's deploy target (provides placeId/universeId for upload). */ primaryTarget: DeployTarget; /** Owns the temp directory — caller must clean up via buildContext.cleanupAsync(). */ buildContext: BuildContext; } import { type StepProgress } from '@quenty/cli-output-helpers/reporting'; /** Progress callbacks for granular phase reporting during combined builds. */ export interface CombinedBuildProgress { onPackageBuildStart?(packageName: string): void; onPackageBuildComplete?(packageName: string): void; onCombineStart?(): void; onStepProgress?(progress: StepProgress): void; } /** * Build combined .rbxl files containing all testable packages. * * Two-phase approach to avoid rojo's symlink deduplication: * Phase 1: Build each package's .rbxl individually via rojo * Phase 2: Use Lune to merge the individual builds into one place, split * into more only if it measures over `maxChunkBytes` */ export declare function generateCombinedProjectAsync(options: { batchTargets: BatchTarget[]; repoRoot: string; batchPlaceId?: number; batchUniverseId?: number; maxChunkBytes?: number; progress?: CombinedBuildProgress; }): Promise; /** * Split items, in order, into consecutive groups whose summed size stays within * `maxBytes`. An item larger than the budget on its own gets a group to itself * rather than being dropped — the upload is what reports it as too big. */ export declare function partitionBySize(items: T[], sizeOf: (item: T) => number, maxBytes: number): T[][]; /** In Roblox's MB, which are 1024 * 1024 bytes. */ export declare function formatMegabytes(bytes: number): string; //# sourceMappingURL=combined-project-generator.d.ts.map