{"version":3,"sources":["../../src/xcode/platform.ts","../../src/gym/detect.ts","../../src/gym/export-options.ts","../../src/gym/index.ts"],"names":["readdir","join","spawn","resolve","basename","plist","writeFile","mkdir","tmpdir","randomUUID","stat","rm"],"mappings":"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","file":"index.cjs","sourcesContent":["export function requireMacOS(feature: string): void {\n  if (process.platform !== \"darwin\") {\n    throw new Error(\n      `${feature} requires macOS. This operation uses Xcode command-line tools ` +\n      `which are not available on ${process.platform}.`\n    );\n  }\n}\n\nexport function isMacOS(): boolean {\n  return process.platform === \"darwin\";\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, resolve, basename } from \"node:path\";\nimport { spawn } from \"node:child_process\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface DetectedValues {\n  workspace: string | null;\n  project: string | null;\n  scheme: string;\n  configuration: string;\n  schemes: string[];\n  configurations: string[];\n  targets: string[];\n}\n\nexport interface XcodeBuildListOutput {\n  project?: {\n    name: string;\n    schemes: string[];\n    configurations: string[];\n    targets: string[];\n  };\n  workspace?: {\n    name: string;\n    schemes: string[];\n  };\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Find the first file in `dir` matching the given extension.\n */\nasync function findFirst(dir: string, ext: string): Promise<string | null> {\n  const entries = await readdir(dir, { withFileTypes: true });\n  for (const entry of entries) {\n    if (entry.name.endsWith(ext) && !entry.name.startsWith(\".\")) {\n      return join(dir, entry.name);\n    }\n  }\n  return null;\n}\n\n/**\n * Run `xcodebuild -list -json` and return parsed JSON.\n */\nasync function xcodebuildList(args: string[]): Promise<XcodeBuildListOutput> {\n  return new Promise<XcodeBuildListOutput>((res, rej) => {\n    const proc = spawn(\"xcodebuild\", [\"-list\", \"-json\", ...args], {\n      stdio: [\"ignore\", \"pipe\", \"pipe\"],\n    });\n    const chunks: Buffer[] = [];\n    const errChunks: Buffer[] = [];\n    proc.stdout.on(\"data\", (d: Buffer) => chunks.push(d));\n    proc.stderr.on(\"data\", (d: Buffer) => errChunks.push(d));\n    proc.on(\"error\", rej);\n    proc.on(\"close\", (code) => {\n      if (code !== 0) {\n        const stderr = Buffer.concat(errChunks).toString(\"utf-8\").trim();\n        rej(new Error(\"xcodebuild -list failed (exit \" + code + \"):\\n\" + stderr));\n        return;\n      }\n      const raw = Buffer.concat(chunks).toString(\"utf-8\").trim();\n      try {\n        res(JSON.parse(raw) as XcodeBuildListOutput);\n      } catch {\n        rej(new Error(\"Failed to parse xcodebuild -list JSON:\\n\" + raw));\n      }\n    });\n  });\n}\n\n// ── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Auto-detect the Xcode workspace/project, scheme, and configuration.\n *\n * Workspace/project resolution:\n *  1. Explicit option\n *  2. First `.xcworkspace` in searchDir\n *  3. First `.xcodeproj` in searchDir\n *\n * Scheme resolution:\n *  1. Explicit option\n *  2. Sole scheme -> auto-select\n *  3. Scheme matching workspace/project name\n *  4. Error\n */\nexport async function detectValues(options: {\n  workspace?: string;\n  project?: string;\n  scheme?: string;\n  configuration?: string;\n  searchDir?: string;\n}): Promise<DetectedValues> {\n  const searchDir = resolve(options.searchDir ?? process.cwd());\n\n  // ── Resolve workspace / project ───────────────────────────────────────\n\n  let workspace = options.workspace ?? null;\n  let project = options.project ?? null;\n\n  if (!workspace && !project) {\n    workspace = await findFirst(searchDir, \".xcworkspace\");\n  }\n  if (!workspace && !project) {\n    project = await findFirst(searchDir, \".xcodeproj\");\n  }\n  if (!workspace && !project) {\n    throw new Error(\n      \"Could not find .xcworkspace or .xcodeproj in \" + searchDir +\n        \". Pass workspace or project explicitly.\",\n    );\n  }\n\n  // ── Run xcodebuild -list ──────────────────────────────────────────────\n\n  const listArgs: string[] = [];\n  if (workspace) listArgs.push(\"-workspace\", workspace);\n  else if (project) listArgs.push(\"-project\", project);\n\n  const listOutput = await xcodebuildList(listArgs);\n\n  const schemes: string[] =\n    listOutput.workspace?.schemes ?? listOutput.project?.schemes ?? [];\n  const configurations: string[] =\n    listOutput.project?.configurations ?? [];\n  const targets: string[] = listOutput.project?.targets ?? [];\n\n  // ── Resolve scheme ────────────────────────────────────────────────────\n\n  let scheme = options.scheme ?? null;\n\n  if (!scheme) {\n    if (schemes.length === 1) {\n      scheme = schemes[0];\n    } else if (schemes.length > 1) {\n      const refName =\n        (workspace ? basename(workspace, \".xcworkspace\") : null) ??\n        (project ? basename(project, \".xcodeproj\") : null);\n      if (refName) {\n        const m = schemes.find((s) => s === refName);\n        if (m) scheme = m;\n      }\n      if (!scheme) {\n        throw new Error(\n          \"Multiple schemes found: \" + schemes.join(\", \") +\n            \". Pass scheme explicitly.\",\n        );\n      }\n    } else {\n      throw new Error(\n        \"No schemes found in the Xcode project. Make sure the scheme is shared.\",\n      );\n    }\n  }\n\n  const configuration = options.configuration ?? \"Release\";\n\n  return {\n    workspace,\n    project,\n    scheme,\n    configuration,\n    schemes,\n    configurations,\n    targets,\n  };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport plist from \"plist\";\nimport type { ExportMethod } from \"../types/index.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ExportOptionsPlistConfig {\n  /** The export method: app-store, ad-hoc, development, enterprise, etc. */\n  exportMethod: ExportMethod;\n  /** Apple Developer team ID */\n  teamId?: string;\n  /**\n   * Map of bundle identifier to provisioning profile name.\n   * e.g. { \"com.example.app\": \"MyApp Distribution\" }\n   */\n  provisioningProfiles?: Record<string, string>;\n  /** Whether to include bitcode (deprecated in Xcode 14+, defaults to false) */\n  includeBitcode?: boolean;\n  /** Whether to include symbols in the export (defaults to true) */\n  includeSymbols?: boolean;\n  /** Code signing identity, e.g. \"Apple Distribution: Company (TEAM_ID)\" */\n  signingCertificate?: string;\n  /** Signing style: \"manual\" or \"automatic\" */\n  signingStyle?: \"manual\" | \"automatic\";\n  /** Destination for export: \"export\" or \"upload\" */\n  destination?: \"export\" | \"upload\";\n  /** Whether to generate an app thinning report */\n  thinning?: string;\n  /** Catalyst platform: \"macos\" or \"ios\" */\n  catalystPlatform?: string;\n  /** Additional arbitrary keys to merge into the plist */\n  additionalOptions?: Record<string, unknown>;\n}\n\n// ── Signing Style Inference ────────────────────────────────────────────────\n\nfunction inferSigningStyle(\n  config: ExportOptionsPlistConfig,\n): \"manual\" | \"automatic\" {\n  if (config.signingStyle) return config.signingStyle;\n  // If provisioning profiles are specified, use manual signing\n  if (\n    config.provisioningProfiles &&\n    Object.keys(config.provisioningProfiles).length > 0\n  ) {\n    return \"manual\";\n  }\n  return \"automatic\";\n}\n\n// ── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Build the exportOptions plist dictionary. Returns a plain object that can be\n * serialized to XML plist via the `plist` package.\n */\nexport function buildExportOptions(\n  config: ExportOptionsPlistConfig,\n): Record<string, unknown> {\n  const opts: Record<string, unknown> = {\n    method: config.exportMethod,\n  };\n\n  const signingStyle = inferSigningStyle(config);\n  opts.signingStyle = signingStyle;\n\n  if (config.teamId) {\n    opts.teamID = config.teamId;\n  }\n\n  if (signingStyle === \"manual\" && config.provisioningProfiles) {\n    opts.provisioningProfiles = config.provisioningProfiles;\n  }\n\n  if (config.signingCertificate) {\n    opts.signingCertificate = config.signingCertificate;\n  }\n\n  // Bitcode (default false for modern Xcode)\n  opts.uploadBitcode = config.includeBitcode ?? false;\n  opts.compileBitcode = config.includeBitcode ?? false;\n\n  // Symbols (default true)\n  opts.uploadSymbols = config.includeSymbols ?? true;\n\n  if (config.destination) {\n    opts.destination = config.destination;\n  }\n\n  if (config.thinning) {\n    opts.thinning = config.thinning;\n  }\n\n  if (config.catalystPlatform) {\n    // Apple expects \"macos\" or \"ios\"\n    opts.distributionBundleIdentifier = undefined;\n  }\n\n  // Merge additional options last so they can override anything\n  if (config.additionalOptions) {\n    Object.assign(opts, config.additionalOptions);\n  }\n\n  return opts;\n}\n\n/**\n * Generate an exportOptions plist XML string from the given config.\n */\nexport function generateExportOptionsPlistXml(\n  config: ExportOptionsPlistConfig,\n): string {\n  const opts = buildExportOptions(config);\n  return plist.build(opts as plist.PlistObject);\n}\n\n/**\n * Write an exportOptions.plist file to disk and return its path.\n *\n * @param dir   - Directory to write the file into\n * @param config - Export options configuration\n * @returns The absolute path to the written plist file\n */\nexport async function writeExportOptionsPlist(\n  dir: string,\n  config: ExportOptionsPlistConfig,\n): Promise<string> {\n  const xml = generateExportOptionsPlistXml(config);\n  const plistPath = join(dir, \"exportOptions.plist\");\n  await writeFile(plistPath, xml, \"utf-8\");\n  return plistPath;\n}\n","import { spawn } from \"node:child_process\";\nimport { mkdir, readdir, rm, stat } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { requireMacOS } from \"../xcode/platform.js\";\nimport { detectValues } from \"./detect.js\";\nimport { writeExportOptionsPlist } from \"./export-options.js\";\nimport type { ExportMethod } from \"../types/index.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport { detectValues } from \"./detect.js\";\nexport type { DetectedValues, XcodeBuildListOutput } from \"./detect.js\";\nexport {\n  buildExportOptions,\n  generateExportOptionsPlistXml,\n  writeExportOptionsPlist,\n} from \"./export-options.js\";\nexport type { ExportOptionsPlistConfig } from \"./export-options.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface GymOptions {\n  scheme: string;\n  workspace?: string;\n  project?: string;\n  configuration?: string;\n  exportMethod: ExportMethod;\n  teamId?: string;\n  provisioningProfiles?: Record<string, string>;\n  codeSignIdentity?: string;\n  outputDirectory?: string;\n  outputName?: string;\n  clean?: boolean;\n  archivePath?: string;\n  derivedDataPath?: string;\n  xcargs?: string;\n  buildPath?: string;\n  includeBitcode?: boolean;\n  includeSymbols?: boolean;\n  exportOptions?: Record<string, unknown>;\n  sdk?: string;\n  destination?: string;\n  catalystPlatform?: string;\n  disableXcpretty?: boolean;\n  onOutput?: (chunk: string) => void;\n}\n\nexport interface GymResult {\n  success: boolean;\n  exitCode: number;\n  ipaPath: string | null;\n  pkgPath: string | null;\n  dsymPath: string | null;\n  archivePath: string;\n  output: string;\n}\n\n// ── Internal helpers ───────────────────────────────────────────────────────\n\n/**\n * Spawn xcodebuild with the given args, streaming stdout/stderr to the\n * optional `onOutput` callback and collecting full output.\n */\nfunction runXcodebuild(\n  args: string[],\n  onOutput?: (chunk: string) => void,\n): Promise<{ exitCode: number; output: string }> {\n  return new Promise((res, rej) => {\n    const proc = spawn(\"xcodebuild\", args, {\n      stdio: [\"ignore\", \"pipe\", \"pipe\"],\n    });\n\n    const chunks: string[] = [];\n\n    const handleData = (data: Buffer) => {\n      const text = data.toString(\"utf-8\");\n      chunks.push(text);\n      if (onOutput) onOutput(text);\n    };\n\n    proc.stdout.on(\"data\", handleData);\n    proc.stderr.on(\"data\", handleData);\n    proc.on(\"error\", rej);\n    proc.on(\"close\", (code) => {\n      res({ exitCode: code ?? 1, output: chunks.join(\"\") });\n    });\n  });\n}\n\n/**\n * Recursively find the first file matching `ext` inside `dir`.\n */\nasync function findFileWithExtension(\n  dir: string,\n  ext: string,\n): Promise<string | null> {\n  let entries;\n  try {\n    entries = await readdir(dir, { withFileTypes: true });\n  } catch {\n    return null;\n  }\n  for (const entry of entries) {\n    const full = join(dir, entry.name);\n    if (entry.name.endsWith(ext) && !entry.isDirectory()) {\n      return full;\n    }\n    if (entry.isDirectory()) {\n      const found = await findFileWithExtension(full, ext);\n      if (found) return found;\n    }\n  }\n  return null;\n}\n\n/**\n * Compress a directory to a .tar.gz file and return its path.\n */\nasync function compressDsyms(\n  dsymDir: string,\n  outputPath: string,\n): Promise<string> {\n  return new Promise((res, rej) => {\n    const proc = spawn(\"tar\", [\"-czf\", outputPath, \"-C\", dsymDir, \".\"], {\n      stdio: [\"ignore\", \"pipe\", \"pipe\"],\n    });\n    proc.on(\"error\", rej);\n    proc.on(\"close\", (code) => {\n      if (code !== 0) rej(new Error(\"tar failed with exit code \" + code));\n      else res(outputPath);\n    });\n  });\n}\n\n// ── Main entry point ───────────────────────────────────────────────────────\n\n/**\n * Build an iOS/macOS app using xcodebuild archive + exportArchive.\n * This is the TypeScript equivalent of Fastlane's `gym` (alias `build_app`).\n *\n * Steps:\n *  1. requireMacOS(\"gym\")\n *  2. Detect values (workspace/project/scheme/config)\n *  3. Clean if requested\n *  4. Archive via `xcodebuild archive`\n *  5. Generate exportOptionsPlist\n *  6. Export via `xcodebuild -exportArchive`\n *  7. Find IPA/PKG, compress dSYMs\n *  8. Return GymResult\n */\nexport async function buildApp(options: GymOptions): Promise<GymResult> {\n  requireMacOS(\"gym\");\n\n  // ── 1. Detect values ──────────────────────────────────────────────────\n\n  const detected = await detectValues({\n    workspace: options.workspace,\n    project: options.project,\n    scheme: options.scheme,\n    configuration: options.configuration,\n  });\n\n  const { workspace, project, scheme, configuration } = detected;\n\n  // ── 2. Prepare paths ─────────────────────────────────────────────────\n\n  const outputDir = resolve(\n    options.outputDirectory ?? join(process.cwd(), \"output\"),\n  );\n  await mkdir(outputDir, { recursive: true });\n\n  const archiveName = options.outputName ?? scheme;\n  const archivePath =\n    options.archivePath ?? join(outputDir, archiveName + \".xcarchive\");\n  const exportPath = join(outputDir, \"export\");\n  await mkdir(exportPath, { recursive: true });\n\n  // Temp directory for the export options plist\n  const tmpDir = join(tmpdir(), \"fastnode-gym-\" + randomUUID());\n  await mkdir(tmpDir, { recursive: true });\n\n  const fullOutput: string[] = [];\n  const onOutput = (chunk: string) => {\n    fullOutput.push(chunk);\n    if (options.onOutput) options.onOutput(chunk);\n  };\n\n  try {\n    // ── 3. Clean if requested ─────────────────────────────────────────\n\n    if (options.clean) {\n      const cleanArgs = [\"clean\"];\n      if (workspace) cleanArgs.push(\"-workspace\", workspace);\n      else if (project) cleanArgs.push(\"-project\", project);\n      cleanArgs.push(\"-scheme\", scheme, \"-configuration\", configuration);\n      if (options.xcargs) cleanArgs.push(...options.xcargs.split(/\\s+/));\n\n      const cleanResult = await runXcodebuild(cleanArgs, onOutput);\n      if (cleanResult.exitCode !== 0) {\n        return {\n          success: false,\n          exitCode: cleanResult.exitCode,\n          ipaPath: null,\n          pkgPath: null,\n          dsymPath: null,\n          archivePath,\n          output: fullOutput.join(\"\"),\n        };\n      }\n    }\n\n    // ── 4. Archive ────────────────────────────────────────────────────\n\n    const archiveArgs: string[] = [\"archive\"];\n\n    if (workspace) archiveArgs.push(\"-workspace\", workspace);\n    else if (project) archiveArgs.push(\"-project\", project);\n\n    archiveArgs.push(\"-scheme\", scheme);\n    archiveArgs.push(\"-archivePath\", archivePath);\n    archiveArgs.push(\"-configuration\", configuration);\n\n    if (options.sdk) {\n      archiveArgs.push(\"-sdk\", options.sdk);\n    }\n    if (options.destination) {\n      archiveArgs.push(\"-destination\", options.destination);\n    }\n    if (options.derivedDataPath) {\n      archiveArgs.push(\"-derivedDataPath\", options.derivedDataPath);\n    }\n    if (options.xcargs) {\n      archiveArgs.push(...options.xcargs.split(/\\s+/));\n    }\n\n    const archiveResult = await runXcodebuild(archiveArgs, onOutput);\n    if (archiveResult.exitCode !== 0) {\n      return {\n        success: false,\n        exitCode: archiveResult.exitCode,\n        ipaPath: null,\n        pkgPath: null,\n        dsymPath: null,\n        archivePath,\n        output: fullOutput.join(\"\"),\n      };\n    }\n\n    // ── 5. Generate exportOptionsPlist ────────────────────────────────\n\n    const exportOptionsPlistPath = await writeExportOptionsPlist(tmpDir, {\n      exportMethod: options.exportMethod,\n      teamId: options.teamId,\n      provisioningProfiles: options.provisioningProfiles,\n      signingCertificate: options.codeSignIdentity,\n      includeBitcode: options.includeBitcode,\n      includeSymbols: options.includeSymbols,\n      additionalOptions: options.exportOptions,\n    });\n\n    // ── 6. Export archive ─────────────────────────────────────────────\n\n    const exportArgs: string[] = [\n      \"-exportArchive\",\n      \"-archivePath\",\n      archivePath,\n      \"-exportOptionsPlist\",\n      exportOptionsPlistPath,\n      \"-exportPath\",\n      exportPath,\n    ];\n\n    if (options.xcargs) {\n      exportArgs.push(...options.xcargs.split(/\\s+/));\n    }\n\n    const exportResult = await runXcodebuild(exportArgs, onOutput);\n    if (exportResult.exitCode !== 0) {\n      return {\n        success: false,\n        exitCode: exportResult.exitCode,\n        ipaPath: null,\n        pkgPath: null,\n        dsymPath: null,\n        archivePath,\n        output: fullOutput.join(\"\"),\n      };\n    }\n\n    // ── 7. Find outputs ───────────────────────────────────────────────\n\n    // Find IPA\n    let ipaPath = await findFileWithExtension(exportPath, \".ipa\");\n\n    // Find PKG (macOS installer)\n    let pkgPath = await findFileWithExtension(exportPath, \".pkg\");\n\n    // Compress dSYMs\n    let dsymPath: string | null = null;\n    const dsymsDir = join(archivePath, \"dSYMs\");\n    try {\n      const dsymStat = await stat(dsymsDir);\n      if (dsymStat.isDirectory()) {\n        const dsymEntries = await readdir(dsymsDir);\n        if (dsymEntries.length > 0) {\n          dsymPath = join(outputDir, archiveName + \".app.dSYM.zip\");\n          await compressDsyms(dsymsDir, dsymPath);\n        }\n      }\n    } catch {\n      // No dSYMs directory — that's OK\n    }\n\n    return {\n      success: true,\n      exitCode: 0,\n      ipaPath,\n      pkgPath,\n      dsymPath,\n      archivePath,\n      output: fullOutput.join(\"\"),\n    };\n  } finally {\n    // Clean up temp directory\n    await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n  }\n}\n"]}