{"version":3,"sources":["../../src/produce/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { AppStoreConnectClient } from \"../client/index.js\";\nimport type { BundleId, App, BundleIdPlatform, CapabilityType } from \"../types/index.js\";\nimport type { CapabilitySettingInput } from \"../types/capability.js\";\n\nexport interface ProduceOptions {\n  client: AppStoreConnectClient;\n  bundleIdentifier: string;\n  appName: string;\n  platform?: BundleIdPlatform;\n  sku?: string;\n  primaryLocale?: string;\n  companyName?: string;\n  enableServices?: CapabilityType[];\n}\n\n/**\n * Map from Fastlane's `produce` service name → App Store Connect\n * `capabilityType`. Ported 1:1 from `produce/lib/produce/service.rb`'s\n * `valid_services_for` list and `update` method, covering every service\n * that Fastlane supports.\n */\nexport const SERVICE_NAME_TO_CAPABILITY: Record<string, CapabilityType> = {\n  access_wifi: \"ACCESS_WIFI_INFORMATION\",\n  app_attest: \"APP_ATTEST\",\n  // Fastlane uses singular `app_group` — see service.rb line 59 & 105.\n  app_group: \"APP_GROUPS\",\n  apple_pay: \"APPLE_PAY\",\n  associated_domains: \"ASSOCIATED_DOMAINS\",\n  auto_fill_credential: \"AUTOFILL_CREDENTIAL_PROVIDER\",\n  car_play_audio_app: \"CARPLAY_PLAYABLE_CONTENT\",\n  car_play_messaging_app: \"CARPLAY_MESSAGING\",\n  car_play_navigation_app: \"CARPLAY_NAVIGATION\",\n  car_play_voip_calling_app: \"CARPLAY_VOIP\",\n  class_kit: \"CLASSKIT\",\n  declared_age_range: \"DECLARED_AGE_RANGE\",\n  icloud: \"ICLOUD\",\n  critical_alerts: \"CRITICAL_ALERTS\",\n  custom_network_protocol: \"NETWORK_CUSTOM_PROTOCOL\",\n  data_protection: \"DATA_PROTECTION\",\n  extended_virtual_address_space: \"EXTENDED_VIRTUAL_ADDRESSING\",\n  file_provider_testing_mode: \"FILEPROVIDER_TESTINGMODE\",\n  family_controls: \"FAMILY_CONTROLS\",\n  fonts: \"FONT_INSTALLATION\",\n  game_center: \"GAME_CENTER\",\n  health_kit: \"HEALTHKIT\",\n  hls_interstitial_preview: \"HLS_INTERSTITIAL_PREVIEW\",\n  home_kit: \"HOMEKIT\",\n  hotspot: \"HOT_SPOT\",\n  hotspot_helper: \"HOTSPOT_HELPER_MANAGED\",\n  in_app_purchase: \"IN_APP_PURCHASE\",\n  inter_app_audio: \"INTER_APP_AUDIO\",\n  low_latency_hls: \"COREMEDIA_HLS_LOW_LATENCY\",\n  managed_associated_domains: \"MDM_MANAGED_ASSOCIATED_DOMAINS\",\n  maps: \"MAPS\",\n  multipath: \"MULTIPATH\",\n  network_extension: \"NETWORK_EXTENSIONS\",\n  nfc_tag_reading: \"NFC_TAG_READING\",\n  personal_vpn: \"PERSONAL_VPN\",\n  push_notification: \"PUSH_NOTIFICATIONS\",\n  sign_in_with_apple: \"APPLE_ID_AUTH\",\n  siri_kit: \"SIRIKIT\",\n  system_extension: \"SYSTEM_EXTENSION_INSTALL\",\n  user_management: \"USER_MANAGEMENT\",\n  wallet: \"WALLET\",\n  wireless_accessory: \"WIRELESS_ACCESSORY_CONFIGURATION\",\n  driver_kit: \"DRIVERKIT\",\n  driver_kit_endpoint_security: \"DRIVERKIT_ENDPOINT_SECURITY\",\n  driver_kit_family_hid_device: \"DRIVERKIT_HID_DEVICE\",\n  driver_kit_family_networking: \"DRIVERKIT_NETWORKING\",\n  driver_kit_family_serial: \"DRIVERKIT_SERIAL\",\n  driver_kit_hid_event_service: \"DRIVERKIT_HID_EVENT_SERVICE\",\n  driver_kit_transport_hid: \"DRIVERKIT_HID\",\n  multitasking_camera_access: \"IPAD_CAMERA_MULTITASKING\",\n  sf_universal_link_api: \"SFUNIVERSALLINK_API\",\n  vp9_decoder: \"VP9_DECODER\",\n  music_kit: \"MUSIC_KIT\",\n  shazam_kit: \"SHAZAM_KIT\",\n  communication_notifications: \"USERNOTIFICATIONS_COMMUNICATION\",\n  group_activities: \"GROUP_ACTIVITIES\",\n  health_kit_estimate_recalibration: \"HEALTHKIT_RECALIBRATE_ESTIMATES\",\n  time_sensitive_notifications: \"USERNOTIFICATIONS_TIMESENSITIVE\",\n};\n\n/**\n * Build the `settings` payload for a capability whose service value is\n * more than a plain boolean. Mirrors Fastlane's\n * `Produce::Service#build_settings_for` applied per-service.\n *\n * Returns `undefined` when the service doesn't carry settings or the\n * value is just `true`/`false`.\n */\nexport function buildCapabilitySettings(\n  serviceName: string,\n  value: string | boolean\n): CapabilitySettingInput[] | undefined {\n  if (value === true || value === false) return undefined;\n\n  const wrap = (\n    key: string,\n    optionKey: string\n  ): CapabilitySettingInput[] => [{ key, options: [{ key: optionKey }] }];\n\n  switch (serviceName) {\n    case \"data_protection\":\n      switch (value) {\n        case \"complete\":\n          return wrap(\"DATA_PROTECTION_PERMISSION_LEVEL\", \"COMPLETE_PROTECTION\");\n        case \"unlessopen\":\n          return wrap(\"DATA_PROTECTION_PERMISSION_LEVEL\", \"PROTECTED_UNLESS_OPEN\");\n        case \"untilfirstauth\":\n          return wrap(\n            \"DATA_PROTECTION_PERMISSION_LEVEL\",\n            \"PROTECTED_UNTIL_FIRST_USER_AUTH\"\n          );\n        default:\n          throw new Error(\n            `Unknown value for data_protection: '${value}'. Valid values: 'complete', 'unlessopen', 'untilfirstauth'`\n          );\n      }\n    case \"icloud\":\n      switch (value) {\n        case \"xcode6_compatible\":\n          return wrap(\"ICLOUD_VERSION\", \"XCODE_6\");\n        case \"xcode5_compatible\":\n          return wrap(\"ICLOUD_VERSION\", \"XCODE_5\");\n        default:\n          throw new Error(\n            `Unknown value for icloud: '${value}'. Valid values: 'xcode6_compatible', 'xcode5_compatible'`\n          );\n      }\n    case \"game_center\":\n      switch (value) {\n        case \"mac\":\n          return wrap(\"GAME_CENTER_SETTING\", \"GAME_CENTER_MAC\");\n        case \"ios\":\n          return wrap(\"GAME_CENTER_SETTING\", \"GAME_CENTER_IOS\");\n        default:\n          throw new Error(\n            `Unknown value for game_center: '${value}'. Valid values: 'ios', 'mac'`\n          );\n      }\n    case \"sign_in_with_apple\":\n      return wrap(\"APPLE_ID_AUTH_APP_CONSENT\", \"PRIMARY_APP_CONSENT\");\n    default:\n      return undefined;\n  }\n}\n\nexport async function registerBundleId(options: {\n  client: AppStoreConnectClient;\n  identifier: string;\n  name: string;\n  platform?: BundleIdPlatform;\n}): Promise<BundleId> {\n  // Check if already exists (idempotent)\n  const existing = await options.client.bundleIds.find(options.identifier);\n  if (existing) return existing;\n\n  return options.client.bundleIds.create({\n    identifier: options.identifier,\n    name: options.name,\n    platform: options.platform ?? \"IOS\",\n  });\n}\n\nexport async function addCapability(options: {\n  client: AppStoreConnectClient;\n  bundleIdId: string;\n  capabilityType: CapabilityType;\n  settings?: CapabilitySettingInput[];\n}): Promise<void> {\n  await options.client.capabilities.enable({\n    bundleIdId: options.bundleIdId,\n    capabilityType: options.capabilityType,\n    settings: options.settings,\n  });\n}\n\nexport async function removeCapability(options: {\n  client: AppStoreConnectClient;\n  capabilityId: string;\n}): Promise<void> {\n  await options.client.capabilities.disable(options.capabilityId);\n}\n\nexport async function listCapabilities(options: {\n  client: AppStoreConnectClient;\n  bundleIdId: string;\n}) {\n  return options.client.capabilities.listForBundleId(options.bundleIdId);\n}\n\nexport async function enableServices(options: {\n  client: AppStoreConnectClient;\n  bundleIdId: string;\n  /**\n   * Service names (Fastlane style, e.g. `data_protection`, `icloud`).\n   * Pass either a plain list of names or a record of name → value, where\n   * the value either is `true` or one of the per-service variants handled\n   * by `buildCapabilitySettings`.\n   */\n  services: string[] | Record<string, string | boolean>;\n}): Promise<void> {\n  const entries: Array<[string, string | boolean]> = Array.isArray(\n    options.services\n  )\n    ? options.services.map((s) => [s, true])\n    : Object.entries(options.services);\n\n  for (const [service, value] of entries) {\n    if (value === false) continue;\n    const capType = SERVICE_NAME_TO_CAPABILITY[service];\n    if (!capType) continue;\n    const settings = buildCapabilitySettings(service, value);\n    await addCapability({\n      client: options.client,\n      bundleIdId: options.bundleIdId,\n      capabilityType: capType,\n      settings,\n    });\n  }\n}\n\nexport async function createApp(options: ProduceOptions): Promise<App> {\n  // Check if app already exists\n  const existing = await options.client.apps.findByBundleId(options.bundleIdentifier);\n  if (existing) return existing;\n\n  // Register bundle ID\n  const bundleId = await registerBundleId({\n    client: options.client,\n    identifier: options.bundleIdentifier,\n    name: options.appName,\n    platform: options.platform,\n  });\n\n  // Enable services\n  if (options.enableServices) {\n    for (const service of options.enableServices) {\n      await addCapability({\n        client: options.client,\n        bundleIdId: bundleId.id,\n        capabilityType: service,\n      });\n    }\n  }\n\n  // Create app on App Store Connect\n  return options.client.apps.create({\n    bundleIdentifier: options.bundleIdentifier,\n    bundleIdId: bundleId.id,\n    appName: options.appName,\n    sku: options.sku ?? `${options.bundleIdentifier}.${Date.now()}`,\n    primaryLocale: options.primaryLocale,\n  });\n}\n"]}