{"version":3,"file":"native-CYj1OOIY.mjs","names":[],"sources":["../src/native.ts"],"sourcesContent":["import type { ViteDevServer } from 'vite'\n\nimport process from 'node:process'\n\nimport { basename, extname, relative, resolve, sep } from 'node:path'\n\nimport { x } from 'tinyexec'\n\nexport type CapacitorPlatform = 'android' | 'ios'\n\ninterface CapacitorTarget {\n  id?: string\n}\n\ntype ListCapacitorTargets = (platform: CapacitorPlatform) => Promise<readonly CapacitorTarget[]>\n\nconst nativeExtensionsByPlatform: Record<CapacitorPlatform, Set<string>> = {\n  ios: new Set([\n    '.entitlements',\n    '.h',\n    '.hpp',\n    '.m',\n    '.mm',\n    '.pbxproj',\n    '.plist',\n    '.storyboard',\n    '.strings',\n    '.swift',\n    '.xcodeproj',\n    '.xcconfig',\n    '.xcscheme',\n    '.xib',\n  ]),\n  android: new Set([\n    '.gradle',\n    '.java',\n    '.json',\n    '.kts',\n    '.kt',\n    '.properties',\n    '.xml',\n  ]),\n}\n\nconst nativeNamesByPlatform: Record<CapacitorPlatform, Set<string>> = {\n  ios: new Set([\n    'Podfile',\n    'Podfile.lock',\n    'project.pbxproj',\n  ]),\n  android: new Set([\n    'AndroidManifest.xml',\n    'build.gradle',\n    'build.gradle.kts',\n    'gradle.properties',\n    'settings.gradle',\n    'settings.gradle.kts',\n  ]),\n}\n\nconst ignoredNames = new Set([\n  'capacitor.config.json',\n])\n\nconst ignoredPathSegments = new Set([\n  '.gradle',\n  'DerivedData',\n  'Pods',\n  'build',\n  'xcuserdata',\n])\n\nconst ignoredPathPrefixesByPlatform: Record<CapacitorPlatform, string[][]> = {\n  ios: [\n    ['App', 'CapApp-SPM'],\n  ],\n  android: [\n    ['app', 'src', 'main', 'assets', 'public'],\n    ['app', 'src', 'main', 'assets', 'capacitor.plugins.json'],\n    ['app', 'src', 'main', 'res', 'xml', 'config.xml'],\n    ['app', 'capacitor.build.gradle'],\n    ['capacitor-cordova-android-plugins'],\n    ['capacitor.settings.gradle'],\n  ],\n}\n\nexport function parseCapacitorPlatform(value: string | undefined): CapacitorPlatform | null {\n  return value === 'android' || value === 'ios' ? value : null\n}\n\nexport function hasCapacitorTargetArg(capArgs: string[]): boolean {\n  return capArgs.some((arg, index) => arg === '--target' || (index > 0 && arg.startsWith('--target=')))\n}\n\nfunction parseCapacitorTargetList(value: string): CapacitorTarget[] {\n  const parsed = JSON.parse(value)\n  if (!Array.isArray(parsed)) {\n    throw new TypeError('Expected `cap run --list --json` to return a JSON array.')\n  }\n\n  return parsed\n    .filter((target): target is CapacitorTarget => typeof target === 'object' && target !== null && typeof (target as CapacitorTarget).id === 'string')\n}\n\nasync function listCapacitorTargets(platform: CapacitorPlatform): Promise<CapacitorTarget[]> {\n  const output = await x('cap', ['run', platform, '--list', '--json'])\n\n  return parseCapacitorTargetList(output.stdout)\n}\n\n/**\n * Resolves Capacitor run arguments by applying target defaults.\n *\n * Use when:\n * - `cap-vite` is about to run `cap run`\n * - Callers want env-based device IDs before falling back to the first available target\n *\n * Expects:\n * - `capArgs[0]` is already validated as `ios` or `android` by the CLI boundary\n * - Explicit `--target` arguments must stay untouched so Capacitor can validate them\n *\n * Returns:\n * - The original args when a target is explicit\n * - Args with `--target` injected from env or the first listed Capacitor target\n */\nexport async function resolveCapRunArgs(\n  capArgs: string[],\n  env: NodeJS.ProcessEnv = process.env,\n  listTargets: ListCapacitorTargets = listCapacitorTargets,\n): Promise<string[]> {\n  if (capArgs.length === 0 || hasCapacitorTargetArg(capArgs)) {\n    return capArgs\n  }\n\n  const [platformArg, ...rest] = capArgs\n  const platform = parseCapacitorPlatform(platformArg)\n  let target: string | undefined\n  if (platform === 'ios') {\n    target = env.CAPACITOR_DEVICE_ID_IOS\n  }\n  else if (platform === 'android') {\n    target = env.CAPACITOR_DEVICE_ID_ANDROID\n  }\n\n  if (!target) {\n    if (!platform) {\n      return capArgs\n    }\n\n    const targets = await listTargets(platform)\n    target = targets.find(device => device.id)?.id\n  }\n\n  if (!target) {\n    throw new Error(`No ${platform} devices or simulators found. Connect a device, start a simulator or emulator, or pass --target explicitly.`)\n  }\n\n  return [platformArg, '--target', target, ...rest]\n}\n\nexport function pickServerUrl(server: Pick<ViteDevServer, 'resolvedUrls'>): URL {\n  const url = server.resolvedUrls?.network?.[0] ?? server.resolvedUrls?.local?.[0]\n\n  if (!url) {\n    throw new Error('Vite did not expose a reachable dev server URL.')\n  }\n\n  return new URL(url)\n}\n\nexport function shouldRestartForNativeChange(file: string, platform: CapacitorPlatform, cwd: string): boolean {\n  const absoluteFile = resolve(cwd, file)\n  const platformRoot = resolve(cwd, platform)\n\n  if (!absoluteFile.startsWith(`${platformRoot}${sep}`) && absoluteFile !== platformRoot) {\n    return false\n  }\n\n  const fileName = basename(absoluteFile)\n\n  if (ignoredNames.has(fileName)) {\n    return false\n  }\n\n  const segments = absoluteFile.split(sep)\n  if (segments.some(segment => ignoredPathSegments.has(segment))) {\n    return false\n  }\n\n  const relativeFile = relative(platformRoot, absoluteFile)\n  const relativeSegments = relativeFile.split(sep).filter(Boolean)\n\n  if (ignoredPathPrefixesByPlatform[platform].some(prefix =>\n    prefix.every((segment, index) => relativeSegments[index] === segment),\n  )) {\n    // NOTICE: Capacitor regenerates ios/App/CapApp-SPM/Package.swift during `cap run`.\n    // It also rewrites several generated Android files and plugin trees during `cap update`.\n    // Treating those generated outputs as native source changes causes an infinite restart loop.\n    return false\n  }\n\n  if (nativeNamesByPlatform[platform].has(fileName)) {\n    return true\n  }\n\n  return nativeExtensionsByPlatform[platform].has(extname(fileName).toLowerCase())\n}\n"],"mappings":"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"}