{"version":3,"sources":["../../src/sigh/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { writeFile, mkdir, copyFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { AppStoreConnectClient } from \"../client/index.js\";\nimport type { Profile, ProfileType, CertificateType, Platform } from \"../types/index.js\";\n\nexport interface SighOptions {\n  client: AppStoreConnectClient;\n  bundleIdentifier: string;\n  profileType?: ProfileType;\n  profileName?: string;\n  certificateIds?: string[];\n  deviceIds?: string[];\n  force?: boolean;\n  outputDir?: string;\n  platform?: \"ios\" | \"macos\" | \"tvos\" | \"catalyst\";\n  development?: boolean;\n  adhoc?: boolean;\n  inHouse?: boolean;\n  readonly?: boolean;\n  skipInstall?: boolean;\n  skipCertificateVerification?: boolean;\n  includeAllCertificates?: boolean;\n}\n\nexport interface SighResult {\n  profile: Profile;\n  profileContent: Buffer;\n  uuid: string;\n  name: string;\n  filePath?: string;\n}\n\nfunction resolveProfileType(options: SighOptions): ProfileType {\n  if (options.profileType) return options.profileType;\n\n  const platform = options.platform ?? \"ios\";\n  const isDev = options.development ?? false;\n  const isAdhoc = options.adhoc ?? false;\n  const isInHouse = options.inHouse ?? false;\n\n  switch (platform) {\n    case \"macos\":\n      if (isDev) return \"MAC_APP_DEVELOPMENT\";\n      if (isInHouse) return \"MAC_APP_INHOUSE\";\n      return \"MAC_APP_STORE\";\n    case \"tvos\":\n      if (isDev) return \"TVOS_APP_DEVELOPMENT\";\n      if (isAdhoc) return \"TVOS_APP_ADHOC\";\n      if (isInHouse) return \"TVOS_APP_INHOUSE\";\n      return \"TVOS_APP_STORE\";\n    case \"catalyst\":\n      if (isDev) return \"MAC_CATALYST_APP_DEVELOPMENT\";\n      if (isInHouse) return \"MAC_CATALYST_APP_INHOUSE\";\n      return \"MAC_CATALYST_APP_STORE\";\n    default:\n      if (isDev) return \"IOS_APP_DEVELOPMENT\";\n      if (isAdhoc) return \"IOS_APP_ADHOC\";\n      if (isInHouse) return \"IOS_APP_INHOUSE\";\n      return \"IOS_APP_STORE\";\n  }\n}\n\nfunction certificateTypesForProfile(\n  profileType: ProfileType\n): CertificateType[] {\n  switch (profileType) {\n    case \"IOS_APP_DEVELOPMENT\":\n    case \"TVOS_APP_DEVELOPMENT\":\n    case \"MAC_CATALYST_APP_DEVELOPMENT\":\n      return [\"IOS_DEVELOPMENT\"];\n    case \"MAC_APP_DEVELOPMENT\":\n      return [\"MAC_APP_DEVELOPMENT\"];\n    case \"IOS_APP_STORE\":\n    case \"IOS_APP_ADHOC\":\n    case \"TVOS_APP_STORE\":\n    case \"TVOS_APP_ADHOC\":\n    case \"MAC_CATALYST_APP_STORE\":\n      return [\"IOS_DISTRIBUTION\"];\n    case \"IOS_APP_INHOUSE\":\n    case \"TVOS_APP_INHOUSE\":\n    case \"MAC_CATALYST_APP_INHOUSE\":\n      return [\"IOS_DISTRIBUTION\"];\n    case \"MAC_APP_STORE\":\n    case \"MAC_APP_INHOUSE\":\n      return [\"MAC_APP_DISTRIBUTION\"];\n    case \"MAC_APP_DIRECT\":\n      return [\"DEVELOPER_ID_APPLICATION\"];\n    default:\n      return [\"IOS_DISTRIBUTION\"];\n  }\n}\n\nfunction needsDevices(profileType: ProfileType): boolean {\n  return (\n    profileType.includes(\"DEVELOPMENT\") || profileType.includes(\"ADHOC\")\n  );\n}\n\nfunction profileExtension(profileType: ProfileType): string {\n  return profileType.startsWith(\"MAC_\") && !profileType.includes(\"CATALYST\")\n    ? \".provisionprofile\"\n    : \".mobileprovision\";\n}\n\nexport async function findMatchingProfile(\n  options: Omit<SighOptions, \"force\">\n): Promise<Profile | null> {\n  const profileType = resolveProfileType(options as SighOptions);\n  const profiles = await options.client.profiles.list({\n    filter: { profileType },\n    include: \"bundleId\",\n    limit: 200,\n  });\n\n  const now = new Date();\n  for (const profile of profiles) {\n    // Check bundle ID match\n    const bundleIdRel = profile.relationships?.bundleId?.data;\n    if (bundleIdRel) {\n      const bundleId = await options.client.bundleIds.get(bundleIdRel.id);\n      if (bundleId.attributes.identifier !== options.bundleIdentifier) continue;\n    }\n\n    // Check state and expiration\n    if (profile.attributes.profileState !== \"ACTIVE\") continue;\n    if (new Date(profile.attributes.expirationDate) <= now) continue;\n\n    // Check name if specified\n    if (\n      options.profileName &&\n      profile.attributes.name !== options.profileName\n    ) {\n      continue;\n    }\n\n    return profile;\n  }\n\n  return null;\n}\n\nexport async function createProfile(\n  options: SighOptions\n): Promise<SighResult> {\n  const profileType = resolveProfileType(options);\n\n  // If force, delete existing first\n  if (options.force) {\n    const existing = await findMatchingProfile(options);\n    if (existing) {\n      await options.client.profiles.delete(existing.id);\n    }\n  } else {\n    // Check for existing\n    const existing = await findMatchingProfile(options);\n    if (existing) {\n      return downloadAndReturn(options, existing);\n    }\n  }\n\n  // Find or verify bundle ID\n  let bundleId = await options.client.bundleIds.find(options.bundleIdentifier);\n  if (!bundleId) {\n    throw new Error(\n      `Bundle ID '${options.bundleIdentifier}' not found. Register it first with produce.registerBundleId().`\n    );\n  }\n\n  // Get certificates\n  const certTypes = certificateTypesForProfile(profileType);\n  let certificateIds = options.certificateIds;\n  if (!certificateIds || certificateIds.length === 0) {\n    const certs = await options.client.certificates.list({\n      filter: { certificateType: certTypes },\n    });\n    const now = new Date();\n    const validCerts = certs.filter(\n      (c) => new Date(c.attributes.expirationDate) > now\n    );\n    if (validCerts.length === 0) {\n      throw new Error(\n        `No valid certificates found of type ${certTypes.join(\", \")}. Create one first with cert.createCertificate().`\n      );\n    }\n    certificateIds = options.includeAllCertificates\n      ? validCerts.map((c) => c.id)\n      : [validCerts[0].id];\n  }\n\n  // Get devices if needed\n  let deviceIds = options.deviceIds;\n  if (needsDevices(profileType) && (!deviceIds || deviceIds.length === 0)) {\n    const platform: Platform =\n      options.platform === \"macos\"\n        ? \"MAC_OS\"\n        : options.platform === \"tvos\"\n          ? \"TVOS\"\n          : \"IOS\";\n    const devices = await options.client.devices.list({\n      filter: { platform, status: \"ENABLED\" },\n    });\n    deviceIds = devices.map((d) => d.id);\n  }\n\n  // Generate profile name\n  const profileName =\n    options.profileName ??\n    `${profileType} ${options.bundleIdentifier} ${Date.now()}`;\n\n  // Create profile\n  const profile = await options.client.profiles.create({\n    name: profileName,\n    profileType,\n    bundleIdId: bundleId.id,\n    certificateIds,\n    deviceIds,\n  });\n\n  return downloadAndReturn(options, profile);\n}\n\nasync function downloadAndReturn(\n  options: SighOptions,\n  profile: Profile\n): Promise<SighResult> {\n  const content = Buffer.from(profile.attributes.profileContent, \"base64\");\n  const profileType = resolveProfileType(options);\n  const ext = profileExtension(profileType);\n\n  const result: SighResult = {\n    profile,\n    profileContent: content,\n    uuid: profile.attributes.uuid,\n    name: profile.attributes.name,\n  };\n\n  if (options.outputDir) {\n    await mkdir(options.outputDir, { recursive: true });\n    const filename = `${profileType}_${options.bundleIdentifier}${ext}`;\n    const filePath = join(options.outputDir, filename);\n    await writeFile(filePath, content);\n    result.filePath = filePath;\n  }\n\n  // Install on macOS\n  if (!options.skipInstall && process.platform === \"darwin\") {\n    await installProfile(content, profile.attributes.uuid);\n  }\n\n  return result;\n}\n\nexport async function downloadProfile(\n  client: AppStoreConnectClient,\n  id: string\n): Promise<Buffer> {\n  const profile = await client.profiles.get(id);\n  return Buffer.from(profile.attributes.profileContent, \"base64\");\n}\n\n/**\n * Install a provisioning profile to both the legacy MobileDevice directory\n * (Xcode ≤ 15) and the new Xcode 16+ location. Xcode 16 moved the default\n * profiles directory to `~/Library/Developer/Xcode/UserData/Provisioning\n * Profiles/`; writing to both keeps old and new Xcodes happy without needing\n * to detect the installed Xcode version.\n *\n * Returns the legacy path as the primary install location.\n */\nexport async function installProfile(\n  profileContent: Buffer,\n  uuid: string\n): Promise<string> {\n  const legacyDir = join(\n    homedir(),\n    \"Library\",\n    \"MobileDevice\",\n    \"Provisioning Profiles\"\n  );\n  const xcode16Dir = join(\n    homedir(),\n    \"Library\",\n    \"Developer\",\n    \"Xcode\",\n    \"UserData\",\n    \"Provisioning Profiles\"\n  );\n  const filename = `${uuid}.mobileprovision`;\n\n  await mkdir(legacyDir, { recursive: true });\n  const legacyPath = join(legacyDir, filename);\n  await writeFile(legacyPath, profileContent);\n\n  // Also install into the Xcode 16+ location. Non-fatal if it fails\n  // (e.g. sandboxed environments).\n  try {\n    await mkdir(xcode16Dir, { recursive: true });\n    await writeFile(join(xcode16Dir, filename), profileContent);\n  } catch {\n    // Ignore — legacy path install is the authoritative one.\n  }\n\n  return legacyPath;\n}\n"]}