import { join, relative } from "@std/path"; import { ensureDir } from "@std/fs/ensure-dir"; import { walk } from "@std/fs/walk"; export type DeployOptions = { srcDir: string; destParentDir: string; /** Final folder name under destParentDir (defaults to basename of srcDir) */ folderName?: string; dryRun: boolean; }; export async function deployCampaignFolder( options: DeployOptions, ): Promise<{ destDir: string; files: number }> { const src = options.srcDir.replace(/\/+$/, ""); const baseName = options.folderName ?? src.split("/").pop() ?? "campaign"; const destDir = join(options.destParentDir, baseName); let count = 0; if (options.dryRun) { for await ( const entry of walk(src, { includeFiles: true, includeDirs: false }) ) { if (entry.isFile) count++; } return { destDir, files: count }; } await ensureDir(options.destParentDir); for await ( const entry of walk(src, { includeFiles: true, includeDirs: false }) ) { if (!entry.isFile) continue; const rel = relative(src, entry.path); const target = join(destDir, rel); await ensureDir(join(target, "..")); await Deno.copyFile(entry.path, target); count++; } return { destDir, files: count }; }