import type { AgeRatingDeclarationProps, AppClipAction, PreviewType, ScreenshotDisplayType } from '@expo/apple-utils'; export type AppleLocale = string; /** Screenshot display type enum values from App Store Connect API */ export type AppleScreenshotDisplayType = `${ScreenshotDisplayType}`; /** Preview display type enum values from App Store Connect API */ export type ApplePreviewType = `${PreviewType}`; /** * Screenshots organized by display type. * Key is the display type (e.g., 'APP_IPHONE_67'), value is array of file paths. * @example { "APP_IPHONE_67": ["./screenshots/home.png", "./screenshots/profile.png"] } */ export type AppleScreenshots = Partial>; /** * Video preview configuration - either a simple path string or an object with options. * @example "./previews/demo.mp4" * @example { path: "./previews/demo.mp4", previewFrameTimeCode: "00:05:00" } */ export type ApplePreviewConfig = string | { /** Video file path (relative to project root) */ path: string; /** Optional preview frame time code (e.g., '00:05:00' for 5 seconds) */ previewFrameTimeCode?: string; }; /** * Video previews organized by display type. * Key is the display type (e.g., 'IPHONE_67'), value is the preview config. * @example { "IPHONE_67": "./previews/demo.mp4" } * @example { "IPHONE_67": { path: "./previews/demo.mp4", previewFrameTimeCode: "00:05:00" } } */ export type ApplePreviews = Partial>; export interface AppleMetadata { version?: string; copyright?: string; info?: Record; categories?: AppleCategory; release?: AppleRelease; advisory?: AppleAdvisory; /** @deprecated Use screenshots/previews in AppleInfo instead */ preview?: Record; review?: AppleReview; /** App Clip metadata. Only applies to apps that ship an App Clip target. */ appClip?: AppleAppClip; } /** App Clip action enum values from App Store Connect API */ export type AppleAppClipAction = `${AppClipAction}`; export interface AppleAppClip { /** The default experience for this App Clip. There is exactly one per app. */ defaultExperience?: AppleAppClipDefaultExperience; } export interface AppleAppClipDefaultExperience { /** Action button shown in the App Clip card. Defaults to OPEN if unset. */ action?: AppleAppClipAction; /** Whether to release this default experience alongside the next App Store version. */ releaseWithAppStoreVersion?: boolean; /** App Store review invocation URLs (used by App Review to launch the clip). */ reviewDetail?: AppleAppClipReviewDetail; /** Per-locale subtitle and header image. */ info?: Record; } export interface AppleAppClipReviewDetail { invocationUrls: string[]; } export interface AppleAppClipLocalizedInfo { /** Subtitle shown in the App Clip card. Apple limits this to 43 characters. */ subtitle?: string; /** Relative path (from project root) to the App Clip header image PNG. */ headerImage?: string; } export type AppleAdvisory = Omit, 'seventeenPlus' | 'gamblingAndContests'>; /** Apps can define up to two categories, or categories with up to two subcategories */ export type AppleCategory = (string | string[])[]; export interface AppleRelease { automaticRelease?: boolean | string; phasedRelease?: boolean; } export interface AppleInfo { title: string; subtitle?: string; /** Does not effect ASO https://developer-mdn.apple.com/app-store/product-page/ */ promoText?: string; description?: string; keywords?: string[]; releaseNotes?: string; marketingUrl?: string; privacyPolicyUrl?: string; privacyPolicyText?: string; privacyChoicesUrl?: string; supportUrl?: string; /** Screenshots for this locale, organized by display type */ screenshots?: AppleScreenshots; /** Video previews for this locale, organized by display type */ previews?: ApplePreviews; } export interface AppleReview { firstName: string; lastName: string; phone: string; email: string; demoUsername?: string; demoPassword?: string; demoRequired?: boolean; notes?: string; }