{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type { Output } from 'tinyexec'\n\nimport process from 'node:process'\n\nimport { extname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { x } from 'tinyexec'\n\nimport { parseCapacitorPlatform } from './native'\n\nexport type { CapacitorPlatform } from './native'\n\nexport interface RunCapViteOptions {\n  cwd?: string\n}\n\ninterface PreparedViteLaunch {\n  baseConfigFile?: string\n  configLoader?: 'bundle' | 'native' | 'runner'\n  projectRoot: string\n  viteArgs: string[]\n  wrapperConfigFile: string\n}\n\ninterface ParsedViteArg {\n  baseConfigFile?: string\n  configLoader?: 'bundle' | 'native' | 'runner'\n  consumedArgs: number\n  forwardedArgs: string[]\n}\n\nfunction resolveWrapperConfigFile(): string {\n  const currentModulePath = fileURLToPath(import.meta.url)\n  const wrapperExtension = extname(currentModulePath) === '.ts' ? '.ts' : '.mjs'\n  return fileURLToPath(new URL(`./vite-wrapper-config${wrapperExtension}`, import.meta.url))\n}\n\nfunction parseViteConfigLoader(value: string | undefined): 'bundle' | 'native' | 'runner' | undefined {\n  if (value === 'bundle' || value === 'native' || value === 'runner') {\n    return value\n  }\n\n  return undefined\n}\n\nfunction resolveConfigPath(cwd: string, value: string): string {\n  return resolve(cwd, value)\n}\n\nfunction readRequiredOptionValue(viteArgs: string[], index: number, optionName: string): string {\n  const value = viteArgs[index + 1]\n  if (!value) {\n    throw new Error(`Missing value for \\`${optionName}\\`.`)\n  }\n\n  return value\n}\n\nfunction parseConfigArg(viteArgs: string[], index: number, cwd: string): ParsedViteArg | null {\n  const arg = viteArgs[index]\n\n  // NOTICE: Vite only accepts one `--config` entrypoint. cap-vite consumes that slot\n  // for its wrapper config, then loads the user config from inside the wrapper.\n  if (arg === '--config' || arg === '-c') {\n    return {\n      baseConfigFile: resolveConfigPath(cwd, readRequiredOptionValue(viteArgs, index, '--config')),\n      consumedArgs: 2,\n      forwardedArgs: [],\n    }\n  }\n\n  if (arg.startsWith('--config=')) {\n    return {\n      baseConfigFile: resolveConfigPath(cwd, arg.slice('--config='.length)),\n      consumedArgs: 1,\n      forwardedArgs: [],\n    }\n  }\n\n  return null\n}\n\nfunction parseConfigLoaderArg(viteArgs: string[], index: number): ParsedViteArg | null {\n  const arg = viteArgs[index]\n\n  if (arg === '--configLoader') {\n    const value = readRequiredOptionValue(viteArgs, index, '--configLoader')\n\n    return {\n      configLoader: parseViteConfigLoader(value),\n      consumedArgs: 2,\n      forwardedArgs: [arg, value],\n    }\n  }\n\n  if (arg.startsWith('--configLoader=')) {\n    return {\n      configLoader: parseViteConfigLoader(arg.slice('--configLoader='.length)),\n      consumedArgs: 1,\n      forwardedArgs: [arg],\n    }\n  }\n\n  return null\n}\n\nfunction parseViteArg(viteArgs: string[], index: number, cwd: string): ParsedViteArg {\n  return parseConfigArg(viteArgs, index, cwd)\n    ?? parseConfigLoaderArg(viteArgs, index)\n    ?? {\n      consumedArgs: 1,\n      forwardedArgs: [viteArgs[index]],\n    }\n}\n\nfunction resolveProjectRoot(viteArgs: string[], cwd: string): string {\n  const firstArg = viteArgs[0]\n\n  return firstArg && !firstArg.startsWith('-')\n    ? resolve(cwd, firstArg)\n    : cwd\n}\n\nexport function prepareCapViteLaunch(viteArgs: string[], cwd: string = process.cwd()): PreparedViteLaunch {\n  const resolvedCwd = resolve(cwd)\n  const projectRoot = resolveProjectRoot(viteArgs, resolvedCwd)\n\n  let baseConfigFile: string | undefined\n  let configLoader: 'bundle' | 'native' | 'runner' | undefined\n  const forwardedViteArgs: string[] = []\n\n  for (let index = 0; index < viteArgs.length;) {\n    const parsedArg = parseViteArg(viteArgs, index, resolvedCwd)\n\n    baseConfigFile = parsedArg.baseConfigFile ?? baseConfigFile\n    configLoader = parsedArg.configLoader ?? configLoader\n    forwardedViteArgs.push(...parsedArg.forwardedArgs)\n    index += parsedArg.consumedArgs\n  }\n\n  return {\n    baseConfigFile,\n    configLoader,\n    projectRoot,\n    viteArgs: forwardedViteArgs,\n    wrapperConfigFile: resolveWrapperConfigFile(),\n  }\n}\n\nexport async function runCapVite(\n  viteArgs: string[],\n  capArgs: string[],\n  options: RunCapViteOptions = {},\n): Promise<Output> {\n  if (!parseCapacitorPlatform(capArgs[0])) {\n    throw new Error('The first `cap run` argument must be `ios` or `android`.')\n  }\n\n  const cwd = resolve(options.cwd ?? process.cwd())\n  const prepared = prepareCapViteLaunch(viteArgs, cwd)\n\n  return await x('vite', ['--config', prepared.wrapperConfigFile, ...prepared.viteArgs], {\n    throwOnError: false,\n    nodeOptions: {\n      cwd,\n      env: {\n        CAP_VITE_BASE_CONFIG: prepared.baseConfigFile ?? '',\n        CAP_VITE_CAP_ARGS_JSON: JSON.stringify(capArgs),\n        CAP_VITE_CONFIG_LOADER: prepared.configLoader ?? '',\n        CAP_VITE_ROOT: prepared.projectRoot,\n      },\n      stdio: 'inherit',\n    },\n  })\n}\n"],"mappings":"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"}