import { getApiKeyAsync, type CredentialArgs, } from '@quenty/nevermore-cli-helpers'; import { type DeployTarget } from '@quenty/nevermore-deploy'; import { OpenCloudClient } from '../open-cloud/open-cloud-client.js'; import { reportRateLimitWait } from '../open-cloud/rate-limiter.js'; import { type BuiltPlace } from './build.js'; import { type Reporter } from '@quenty/cli-output-helpers/reporting'; export interface UploadPlaceOptions { builtPlace: BuiltPlace; args: CredentialArgs & { publish?: boolean }; client: OpenCloudClient; reporter?: Reporter; packageName?: string; } export interface UploadPlaceResult { client: OpenCloudClient; apiKey: string; target: DeployTarget; version: number; } /** * Upload a previously-built .rbxl file to Roblox via Open Cloud. * Creates an OpenCloudClient if one is not provided. */ export async function uploadPlaceAsync( options: UploadPlaceOptions ): Promise { const { builtPlace, args, reporter, packageName } = options; let { client } = options; const { rbxlPath, target } = builtPlace; const apiKey = await getApiKeyAsync(args); reporter?.onPackagePhaseChange(packageName ?? '', 'uploading'); const onProgress = reporter && packageName ? (transferred: number, total: number) => { reporter.onPackageProgressUpdate(packageName, { kind: 'bytes', transferredBytes: transferred, totalBytes: total, }); } : undefined; const version = await client.uploadPlaceAsync( target.universeId, target.placeId, rbxlPath, args.publish, onProgress, reporter && packageName ? reportRateLimitWait(reporter, packageName) : undefined ); return { client, apiKey, target, version }; }