import { type MobileOrientation } from '../project/platform-declaration.js'; /** What `.bitmagic/ios.json` may hold. Every field optional — absent means "derive". */ export interface IosConfigFile { bundleId?: string; displayName?: string; version?: string; teamId?: string; } export interface IosAppConfig { /** Reverse-DNS id, `ai.bitmagic.game.` unless overridden. */ bundleId: string; /** What the home screen shows — any unicode, from game.json's gameName. */ displayName: string; /** PRODUCT_NAME / the .app filename — sanitized ASCII (Steam export §4 rules). */ productName: string; /** CFBundleShortVersionString. */ version: string; /** CFBundleVersion — a UTC yyyyMMddHHmm stamp, so store uploads always increase. */ buildNumber: string; /** Apple Developer team, required only for the device/store lane. */ teamId?: string; /** From the project's own declaration; decides the Info.plist orientation mask. */ orientation?: MobileOrientation; } /** * The default bundle id. Game ids are uppercase alphanumerics; lowercased they are valid * reverse-DNS segments. Anything else (a hand-edited id) is filtered to the characters Apple * accepts rather than rejected — the id only has to be stable and valid, not pretty. */ export declare function deriveBundleId(gameId: string): string; /** * PRODUCT_NAME under the Steam export's filename rules: ASCII letters, digits, space, dash; * whitespace collapsed; max 40 chars. The pretty, unsanitized name still ships as * CFBundleDisplayName — this only names the executable and the .app on disk. */ export declare function sanitizeProductName(name: string, gameId: string): string; /** The moment's UTC yyyyMMddHHmm — monotonic across builds, which App Store uploads require. */ export declare function buildNumberNow(now?: Date): string; export interface ResolveAppConfigOptions { root: string; gameId: string; configPath: string; /** `--name` for this build only — never persisted, mirroring publish's override semantics. */ nameOverride?: string; /** `--team` — persisted to ios.json so the device lane needs it only once. */ teamOverride?: string; now?: Date; } /** * Resolve the app identity, persisting `--team` (the one flag worth remembering) back to * `.bitmagic/ios.json`. Everything else derives fresh each build so the wrapper follows the * project: rename the game in game.json and the next build renames the app. */ export declare function resolveAppConfig(options: ResolveAppConfigOptions): IosAppConfig;