solana-mobile 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/cli.cjs +800 -122
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +802 -124
- package/dist/cli.mjs.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":["packageJson","InvalidArgumentError","execFile","runExecutable","homedir","defaultReadTextFile","constants","homedir","text","homedir","select","multiselect","homedir","homedir","select","Command","InvalidArgumentError"],"sources":["../package.json","../src/core/util/read-package-string.ts","../src/core/data-access/package-metadata.ts","../src/create/create-feature-index.ts","../src/doctor/data-access/check-adb-version.ts","../src/doctor/data-access/check-node-version.ts","../src/doctor/ui/doctor-ui-report.ts","../src/doctor/doctor-feature-index.ts","../src/emulator/data-access/resolve-android-sdk-root.ts","../src/emulator/data-access/avd-config.ts","../src/emulator/data-access/run-executable.ts","../src/emulator/data-access/create-avd.ts","../src/emulator/data-access/list-installed-avds.ts","../src/emulator/data-access/start-emulator.ts","../src/emulator/ui/emulator-ui-prompt-types.ts","../src/emulator/ui/emulator-ui-prompt-emulator-name.ts","../src/emulator/emulator-feature-create.ts","../src/emulator/data-access/delete-installed-avds.ts","../src/emulator/ui/emulator-ui-select-installed-emulator-name.ts","../src/emulator/ui/emulator-ui-select-installed-emulator-names.ts","../src/emulator/emulator-feature-delete.ts","../src/emulator/ui/emulator-ui-render-installed-emulators.ts","../src/emulator/emulator-feature-list.ts","../src/emulator/emulator-feature-start.ts","../src/emulator/data-access/list-running-emulators.ts","../src/emulator/data-access/list-emulator-statuses.ts","../src/emulator/ui/emulator-ui-render-emulator-statuses.ts","../src/emulator/emulator-feature-status.ts","../src/emulator/data-access/stop-emulator.ts","../src/emulator/ui/emulator-ui-select-running-emulator-serial.ts","../src/emulator/emulator-feature-stop.ts","../src/app.ts","../src/cli.ts"],"sourcesContent":["","export function readPackageString<TPackageKey extends string>(\n packageJson: Partial<Record<TPackageKey, unknown>>,\n key: TPackageKey,\n) {\n const value = packageJson[key]\n\n if (typeof value !== 'string') {\n throw new Error(`package.json ${key} must be a string`)\n }\n\n return value\n}\n","import packageJson from '../../../package.json' with { type: 'json' }\nimport { readPackageString } from '../util/read-package-string.ts'\n\nexport type PackageMetadata = {\n description: string\n name: string\n version: string\n}\n\nexport function readPackageMetadata(): PackageMetadata {\n return {\n description: readPackageString(packageJson, 'description'),\n name: readPackageString(packageJson, 'name'),\n version: readPackageString(packageJson, 'version'),\n }\n}\n","import { resolve } from 'node:path'\nimport { cancel, intro, isCancel, log, note, outro, select, text } from '@clack/prompts'\nimport { InvalidArgumentError } from 'commander'\nimport {\n type CreateAppArgs,\n createApp,\n detectInvokedPackageManager,\n fetchTemplateData,\n finalNote,\n getAppInfo,\n listTemplateIds,\n listTemplates,\n listVersions,\n type MenuConfig,\n type PackageManager,\n type Template,\n type TemplateJsonTemplate,\n validateProjectName,\n} from 'create-solana-dapp'\n\nexport const CUSTOM_TEMPLATES_URL = 'https://raw.githubusercontent.com/solana-mobile/templates/main/templates.json'\n\nconst SOLANA_MOBILE_MENU_CONFIG: MenuConfig = [\n {\n description: 'Solana Mobile templates',\n groups: ['mobile'],\n id: 'solana-mobile',\n keywords: [],\n name: 'Solana Mobile',\n },\n]\n\ntype CreateOptions = {\n dryRun?: boolean\n listTemplateIds?: boolean\n listTemplates?: boolean\n listVersions?: boolean\n minimal?: boolean\n packageManager?: PackageManager\n projectName?: string\n skipGit?: boolean\n skipInit?: boolean\n skipInstall?: boolean\n template?: string\n verbose?: boolean\n}\nexport type CreateCommandOptions = CreateOptions\n\nexport type CreateSolanaDappApi = {\n createApp: typeof createApp\n detectInvokedPackageManager: typeof detectInvokedPackageManager\n fetchTemplateData: typeof fetchTemplateData\n finalNote: typeof finalNote\n getAppInfo: typeof getAppInfo\n listTemplateIds: typeof listTemplateIds\n listTemplates: typeof listTemplates\n listVersions: typeof listVersions\n validateProjectName: typeof validateProjectName\n}\n\ntype RunCreateOptions = {\n createSolanaDapp?: CreateSolanaDappApi\n promptProjectName?: (createSolanaDapp: CreateSolanaDappApi) => Promise<string | undefined>\n selectTemplate?: (templates: TemplateJsonTemplate[]) => Promise<Template | undefined>\n}\n\nconst createSolanaDappApi = {\n createApp,\n detectInvokedPackageManager,\n fetchTemplateData,\n finalNote,\n getAppInfo,\n listTemplateIds,\n listTemplates,\n listVersions,\n validateProjectName,\n} satisfies CreateSolanaDappApi\n\nexport async function runCreate(\n options: CreateCommandOptions,\n {\n createSolanaDapp: injectedCreateSolanaDapp,\n promptProjectName: promptProjectNameInput = promptProjectName,\n selectTemplate = selectCustomTemplate,\n }: RunCreateOptions = {},\n) {\n try {\n const createSolanaDapp = injectedCreateSolanaDapp ?? createSolanaDappApi\n const packageManager = options.packageManager ?? createSolanaDapp.detectInvokedPackageManager()\n\n if (options.listVersions) {\n createSolanaDapp.listVersions()\n return\n }\n\n const { templates } = await createSolanaDapp.fetchTemplateData({\n config: SOLANA_MOBILE_MENU_CONFIG,\n url: CUSTOM_TEMPLATES_URL,\n verbose: options.verbose ?? false,\n })\n\n if (options.listTemplates) {\n createSolanaDapp.listTemplates({ templates })\n return\n }\n\n if (options.listTemplateIds) {\n console.log(JSON.stringify(createSolanaDapp.listTemplateIds({ templates })))\n return\n }\n\n intro('solana-mobile create')\n\n const projectName = options.projectName ?? (await promptProjectNameInput(createSolanaDapp))\n\n if (!projectName) {\n process.exitCode = 1\n return\n }\n\n const template = options.template ? resolveTemplate(options.template, templates) : await selectTemplate(templates)\n\n if (!template) {\n process.exitCode = 1\n return\n }\n\n const targetDirectory = resolve(process.cwd(), projectName)\n const createArgs: CreateAppArgs = {\n app: createSolanaDapp.getAppInfo(),\n dryRun: options.dryRun ?? false,\n name: projectName,\n packageManager,\n skipGit: options.skipGit ?? false,\n skipInit: options.skipInit ?? false,\n skipInstall: options.skipInstall ?? false,\n targetDirectory,\n template,\n verbose: options.verbose ?? false,\n }\n\n if (options.dryRun) {\n note(JSON.stringify(createArgs, undefined, 2), 'Arguments')\n outro('Dry run was used, no changes were made')\n return\n }\n\n if (options.verbose) {\n log.warn('Verbose output enabled')\n console.warn(createArgs)\n }\n\n const instructions = await createSolanaDapp.createApp(createArgs)\n\n note(\n createSolanaDapp.finalNote({\n ...createArgs,\n instructions,\n target: createArgs.targetDirectory.replace(process.cwd(), '.'),\n }),\n 'Installation successful',\n )\n\n outro('Good luck with your project!')\n } catch (error) {\n cancel(`${error}`)\n process.exitCode = 1\n }\n}\n\nexport function parsePackageManagerOption(next: string): PackageManager {\n if (!next || !isPackageManager(next)) {\n throw new InvalidArgumentError(`Invalid package manager: ${next}`)\n }\n\n return next\n}\n\nfunction isPackageManager(value: string): value is PackageManager {\n return value === 'bun' || value === 'npm' || value === 'pnpm' || value === 'yarn'\n}\n\nasync function promptProjectName(createSolanaDapp: CreateSolanaDappApi) {\n const projectName = await text({\n message: 'Enter project name',\n validate: (value) => createSolanaDapp.validateProjectName(value ?? '') ?? undefined,\n })\n\n if (isCancel(projectName)) {\n cancel('Operation cancelled.')\n return undefined\n }\n\n return projectName\n}\n\nasync function selectCustomTemplate(templates: TemplateJsonTemplate[]) {\n const template = await select<TemplateJsonTemplate>({\n message: 'Select a template',\n options: templates.map((template) => ({\n hint: template.description,\n label: template.name,\n value: template,\n })),\n })\n\n if (isCancel(template)) {\n cancel('Operation cancelled.')\n return undefined\n }\n\n return template\n}\n\nfunction resolveTemplate(templateName: string, templates: TemplateJsonTemplate[]): Template {\n const template = templates.find(\n (template) =>\n template.name === templateName ||\n template.path === templateName ||\n template.id === templateName ||\n template.id.endsWith(`/${templateName}`),\n )\n\n if (template) {\n return template\n }\n\n return {\n description: `${templateName} (external)`,\n id: templateName.includes(':') ? templateName : `gh:${templateName}`,\n name: templateName,\n }\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type { DoctorCheckResult } from './doctor-check-result.ts'\n\nconst execFileAsync = promisify(execFile)\nconst minimumAdbMajorVersion = 33\n\ntype CommandRunner = (command: string, args: string[]) => Promise<string>\n\nexport async function checkAdbVersion(runCommand: CommandRunner = runExecutable): Promise<DoctorCheckResult> {\n try {\n const output = await runCommand('adb', ['version'])\n const version = parseAdbVersion(output)\n const majorVersion = version ? Number.parseInt(version, 10) : Number.NaN\n\n if (!version || Number.isNaN(majorVersion)) {\n return {\n actual: 'unknown',\n message: 'Unable to detect adb platform-tools version.',\n name: 'adb',\n ok: false,\n recommendation: 'Install Android SDK Platform Tools 33 or higher.',\n required: '33 or higher',\n }\n }\n\n return {\n actual: version,\n message: `Detected adb ${version}.`,\n name: 'adb',\n ok: majorVersion >= minimumAdbMajorVersion,\n recommendation:\n majorVersion >= minimumAdbMajorVersion\n ? undefined\n : 'Update Android SDK Platform Tools to version 33 or higher.',\n required: '33 or higher',\n }\n } catch {\n return {\n actual: 'not found',\n message: 'adb is not available on PATH.',\n name: 'adb',\n ok: false,\n recommendation: 'Install Android SDK Platform Tools 33 or higher and make sure adb is on PATH.',\n required: '33 or higher',\n }\n }\n}\n\nexport function parseAdbVersion(output: string) {\n return output.match(/^Version\\s+(\\d+(?:\\.\\d+)*)/im)?.[1]\n}\n\nasync function runExecutable(command: string, args: string[]) {\n const { stdout } = await execFileAsync(command, args)\n return stdout\n}\n","import type { DoctorCheckResult } from './doctor-check-result.ts'\n\nconst minimumNodeMajorVersion = 22\n\nexport function checkNodeVersion(version = process.version): DoctorCheckResult {\n const normalizedVersion = normalizeNodeVersion(version)\n const majorVersion = normalizedVersion ? Number.parseInt(normalizedVersion, 10) : Number.NaN\n\n if (!normalizedVersion || Number.isNaN(majorVersion)) {\n return {\n actual: 'unknown',\n message: 'Unable to detect Node.js version.',\n name: 'node',\n ok: false,\n recommendation: 'Install Node.js 22 or higher.',\n required: '22 or higher',\n }\n }\n\n return {\n actual: normalizedVersion,\n message: `Detected Node.js ${normalizedVersion}.`,\n name: 'node',\n ok: majorVersion >= minimumNodeMajorVersion,\n recommendation: majorVersion >= minimumNodeMajorVersion ? undefined : 'Install Node.js 22 or higher.',\n required: '22 or higher',\n }\n}\n\nexport function normalizeNodeVersion(version: string) {\n return version.trim().replace(/^v/i, '')\n}\n","import { log, outro } from '@clack/prompts'\nimport type { DoctorCheckResult } from '../data-access/doctor-check-result.ts'\n\nexport function renderDoctorReport(results: DoctorCheckResult[]) {\n for (const result of results) {\n const message = `${result.name}: ${result.actual} (requires ${result.required})`\n\n if (result.ok) {\n log.success(message)\n } else {\n log.error(message)\n }\n }\n\n const recommendations = results\n .filter((result) => !result.ok && result.recommendation)\n .map((result) => result.recommendation as string)\n\n if (recommendations.length === 0) {\n outro('Your system is ready.')\n return\n }\n\n log.warn('Recommendations')\n\n for (const recommendation of recommendations) {\n log.message(`- ${recommendation}`)\n }\n\n outro('Run doctor again after applying the recommendations.')\n}\n","import { checkAdbVersion } from './data-access/check-adb-version.ts'\nimport { checkNodeVersion } from './data-access/check-node-version.ts'\nimport { renderDoctorReport } from './ui/doctor-ui-report.ts'\n\nexport async function runDoctor() {\n const results = [await checkAdbVersion(), checkNodeVersion()]\n\n renderDoctorReport(results)\n\n return results.every((result) => result.ok) ? 0 : 1\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport function resolveAndroidSdkRoot(environment: NodeJS.ProcessEnv = process.env, homeDirectory: string = homedir()) {\n return environment.ANDROID_SDK_ROOT ?? environment.ANDROID_HOME ?? join(homeDirectory, 'Library', 'Android', 'sdk')\n}\n","import { join } from 'node:path'\nimport type { EmulatorCreateCommandOptions, ParsedSystemImagePackage, ResolvedCreateOptions } from './emulator-types.ts'\nimport { resolveAndroidSdkRoot } from './resolve-android-sdk-root.ts'\n\nexport const DEFAULT_PROFILE_NAME = 'solana-mobile'\n\nexport const DEFAULT_PROFILE = {\n dataSize: '32G',\n device: 'pixel_9_pro_xl',\n name: 'solana-mobile',\n ramMb: 8192,\n sdcardSize: '512M',\n systemImage: 'system-images;android-36;google_apis_playstore;arm64-v8a',\n vmHeapMb: 576,\n} as const\n\nexport function createAvdConfigValues(options: ResolvedCreateOptions): Record<string, string> {\n const { abi, platform, tagId } = parseSystemImagePackage(options.systemImage)\n\n return {\n 'abi.type': abi,\n 'avd.ini.displayname': options.name.replaceAll('_', ' '),\n 'disk.dataPartition.size': options.dataSize,\n 'fastboot.forceChosenSnapshotBoot': 'no',\n 'fastboot.forceColdBoot': 'no',\n 'fastboot.forceFastBoot': 'yes',\n 'hw.audioInput': 'yes',\n 'hw.camera.back': 'virtualscene',\n 'hw.camera.front': 'emulated',\n 'hw.cpu.arch': getCpuArchitecture(abi),\n 'hw.cpu.ncore': '4',\n 'hw.device.name': options.device,\n 'hw.gpu.enabled': 'yes',\n 'hw.gpu.mode': 'auto',\n 'hw.keyboard': 'yes',\n 'hw.ramSize': String(options.ramMb),\n 'hw.sdCard': 'yes',\n 'image.sysdir.1': `${systemImagePackageToRelativeDirectory(options.systemImage)}/`,\n 'PlayStore.enabled': String(tagId.includes('play')),\n 'runtime.network.latency': 'none',\n 'runtime.network.speed': 'full',\n 'sdcard.size': options.sdcardSize,\n showDeviceFrame: 'yes',\n 'skin.dynamic': 'yes',\n 'tag.display': getTagDisplay(tagId),\n 'tag.id': tagId,\n target: platform,\n 'userdata.useQcow2': 'no',\n 'vm.heapSize': String(options.vmHeapMb),\n }\n}\n\nexport function getToolPaths(sdkRoot: string) {\n return {\n avdmanager: join(sdkRoot, 'cmdline-tools', 'latest', 'bin', 'avdmanager'),\n emulator: join(sdkRoot, 'emulator', 'emulator'),\n sdkmanager: join(sdkRoot, 'cmdline-tools', 'latest', 'bin', 'sdkmanager'),\n }\n}\n\nexport function parseAvdConfig(contents: string): Record<string, string> {\n const values: Record<string, string> = {}\n\n for (const line of contents\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .filter(Boolean)) {\n const separatorIndex = line.indexOf('=')\n\n if (separatorIndex === -1) {\n continue\n }\n\n const key = line.slice(0, separatorIndex)\n const value = line.slice(separatorIndex + 1)\n\n if (key) {\n values[key] = value\n }\n }\n\n return Object.fromEntries(Object.entries(values).sort(([left], [right]) => left.localeCompare(right)))\n}\n\nexport function parseSystemImagePackage(systemImage: string): ParsedSystemImagePackage {\n const [category, platform, tagId, abi] = systemImage.split(';')\n\n if (category !== 'system-images' || !platform || !tagId || !abi) {\n throw new Error(`Invalid system image package: ${systemImage}`)\n }\n\n return {\n abi,\n platform,\n tagId,\n }\n}\n\nexport function resolveCreateOptions(options: EmulatorCreateCommandOptions): ResolvedCreateOptions {\n const profile = resolveEmulatorProfile(options.profile)\n\n return {\n dataSize: options.dataSize ?? profile.dataSize,\n device: options.device ?? profile.device,\n name: options.name ?? profile.name,\n ramMb: options.ramMb ?? profile.ramMb,\n sdcardSize: options.sdcardSize ?? profile.sdcardSize,\n sdkRoot: options.sdkRoot ?? resolveAndroidSdkRoot(),\n systemImage: options.systemImage ?? profile.systemImage,\n vmHeapMb: options.vmHeapMb ?? profile.vmHeapMb,\n }\n}\n\nexport function resolveEmulatorProfile(profileName = DEFAULT_PROFILE_NAME): typeof DEFAULT_PROFILE {\n if (profileName === DEFAULT_PROFILE_NAME) {\n return DEFAULT_PROFILE\n }\n\n throw new Error(`Unknown emulator profile: ${profileName}`)\n}\n\nexport function serializeAvdConfig(values: Record<string, string>): string {\n return `${Object.keys(values)\n .sort((left, right) => left.localeCompare(right))\n .map((key) => `${key}=${values[key]}`)\n .join('\\n')}\\n`\n}\n\nexport function systemImagePackageToRelativeDirectory(systemImage: string): string {\n return systemImage.split(';').join('/')\n}\n\nfunction getCpuArchitecture(abi: string): string {\n if (abi.startsWith('arm64')) {\n return 'arm64'\n }\n\n if (abi.startsWith('armeabi')) {\n return 'arm'\n }\n\n return abi.split('-', 1)[0] ?? abi\n}\n\nfunction getTagDisplay(tagId: string): string {\n if (tagId === 'google_apis') {\n return 'Google APIs'\n }\n\n if (tagId === 'google_apis_playstore') {\n return 'Google Play'\n }\n\n return tagId\n .split(/[_-]/)\n .filter(Boolean)\n .map((segment) => `${segment[0]?.toUpperCase()}${segment.slice(1).toLowerCase()}`)\n .join(' ')\n}\n","import { spawn } from 'node:child_process'\nimport { basename } from 'node:path'\nimport type { RunCommandOptions } from './emulator-types.ts'\n\nexport async function runExecutable(cmd: [string, ...string[]], options: RunCommandOptions = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd[0], cmd.slice(1), {\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const stderr: Buffer[] = []\n const stdout: Buffer[] = []\n\n child.stderr.on('data', (chunk) => {\n stderr.push(Buffer.from(chunk))\n })\n child.stdout.on('data', (chunk) => {\n stdout.push(Buffer.from(chunk))\n })\n child.on('error', reject)\n child.on('close', (exitCode) => {\n const stderrText = Buffer.concat(stderr).toString()\n const stdoutText = Buffer.concat(stdout).toString()\n\n if (exitCode !== 0) {\n reject(new Error(stderrText.trim() || stdoutText.trim() || `${basename(cmd[0])} exited with code ${exitCode}`))\n return\n }\n\n resolve(stdoutText)\n })\n\n child.stdin.end(options.stdin)\n })\n}\n","import { constants } from 'node:fs'\nimport { access, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport {\n createAvdConfigValues,\n getToolPaths,\n parseAvdConfig,\n parseSystemImagePackage,\n resolveCreateOptions,\n serializeAvdConfig,\n} from './avd-config.ts'\nimport type {\n CreateAvdDependencies,\n CreateAvdResult,\n EmulatorCreateCommandOptions,\n PathChecker,\n} from './emulator-types.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function createAvd(\n options: EmulatorCreateCommandOptions,\n {\n getHomeDirectory = homedir,\n pathExists = defaultPathExists(),\n readTextFile = defaultReadTextFile,\n runCommand = runExecutable,\n writeTextFile = defaultWriteTextFile,\n }: CreateAvdDependencies = {},\n): Promise<CreateAvdResult> {\n const resolvedOptions = resolveCreateOptions(options)\n const toolPaths = getToolPaths(resolvedOptions.sdkRoot)\n const homeDirectory = getHomeDirectory()\n const avdDirectory = join(homeDirectory, '.android', 'avd', `${resolvedOptions.name}.avd`)\n\n if (await pathExists(avdDirectory)) {\n return {\n created: false,\n emulatorPath: toolPaths.emulator,\n name: resolvedOptions.name,\n sdkRoot: resolvedOptions.sdkRoot,\n systemImage: resolvedOptions.systemImage,\n }\n }\n\n const { abi } = parseSystemImagePackage(resolvedOptions.systemImage)\n\n if (!(await isInstalledSystemImage(resolvedOptions.sdkRoot, resolvedOptions.systemImage, pathExists))) {\n await runCommand([toolPaths.sdkmanager, '--install', resolvedOptions.systemImage])\n }\n\n if (!(await isInstalledSystemImage(resolvedOptions.sdkRoot, resolvedOptions.systemImage, pathExists))) {\n throw new Error(`System image is not installed: ${resolvedOptions.systemImage}`)\n }\n\n const avdConfigPath = getAvdConfigPath(homeDirectory, resolvedOptions.name)\n\n await runCommand(\n [\n toolPaths.avdmanager,\n 'create',\n 'avd',\n '--abi',\n abi,\n '--device',\n resolvedOptions.device,\n '--force',\n '--name',\n resolvedOptions.name,\n '--package',\n resolvedOptions.systemImage,\n '--sdcard',\n resolvedOptions.sdcardSize,\n ],\n { stdin: 'no\\n' },\n )\n\n if (!(await pathExists(avdDirectory))) {\n throw new Error(`Emulator directory does not exist: ${avdDirectory}`)\n }\n\n const existingConfig = (await pathExists(avdConfigPath)) ? await readTextFile(avdConfigPath) : ''\n\n await writeTextFile(\n avdConfigPath,\n serializeAvdConfig({\n ...parseAvdConfig(existingConfig),\n ...createAvdConfigValues(resolvedOptions),\n }),\n )\n\n return {\n created: true,\n emulatorPath: toolPaths.emulator,\n name: resolvedOptions.name,\n sdkRoot: resolvedOptions.sdkRoot,\n systemImage: resolvedOptions.systemImage,\n }\n}\n\nexport function defaultPathExists(mode: number = constants.F_OK): PathChecker {\n return async (filePath: string) => {\n try {\n await access(filePath, mode)\n return true\n } catch {\n return false\n }\n }\n}\n\nexport async function defaultWriteTextFile(filePath: string, contents: string) {\n await mkdir(dirname(filePath), { recursive: true })\n await writeFile(filePath, contents)\n}\n\nfunction getAvdConfigPath(homeDirectory: string, avdName: string): string {\n return join(homeDirectory, '.android', 'avd', `${avdName}.avd`, 'config.ini')\n}\n\nfunction getSystemImageDirectory(sdkRoot: string, systemImage: string): string {\n return join(sdkRoot, ...systemImage.split(';'))\n}\n\nasync function defaultReadTextFile(filePath: string) {\n return readFile(filePath, 'utf8')\n}\n\nasync function isInstalledSystemImage(sdkRoot: string, systemImage: string, pathExists: PathChecker) {\n return pathExists(join(getSystemImageDirectory(sdkRoot, systemImage), 'source.properties'))\n}\n","import { readdir, readFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { parseAvdConfig } from './avd-config.ts'\nimport type { DirectoryReader, InstalledAvd, ListInstalledAvdsDependencies } from './emulator-types.ts'\n\nexport async function defaultReadDirectory(directoryPath: string) {\n return readdir(directoryPath, { withFileTypes: true })\n}\n\nexport async function defaultReadTextFile(filePath: string) {\n return readFile(filePath, 'utf8')\n}\n\nexport async function listInstalledAvds({\n getHomeDirectory = homedir,\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n}: ListInstalledAvdsDependencies = {}): Promise<InstalledAvd[]> {\n const avdRootDirectory = join(getHomeDirectory(), '.android', 'avd')\n const avdEntryNames = await listEntryNames(avdRootDirectory, readDirectory)\n const registeredAvdNames = new Set(\n avdEntryNames.filter((name) => name.endsWith('.ini')).map((name) => name.slice(0, -'.ini'.length)),\n )\n const avdDirectoryNames = avdEntryNames.filter(\n (name) => name.endsWith('.avd') && registeredAvdNames.has(name.slice(0, -'.avd'.length)),\n )\n const avds = await Promise.all(\n avdDirectoryNames.map(async (directoryName) => {\n const configPath = join(avdRootDirectory, directoryName, 'config.ini')\n const name = directoryName.slice(0, -'.avd'.length)\n let configValues: Record<string, string> = {}\n\n try {\n configValues = parseAvdConfig(await readTextFile(configPath))\n } catch {\n configValues = {}\n }\n\n return {\n device: configValues['hw.device.name'],\n name,\n target: configValues.target,\n }\n }),\n )\n\n return avds.sort((left, right) => left.name.localeCompare(right.name))\n}\n\nasync function listEntryNames(directoryPath: string, readDirectory: DirectoryReader): Promise<string[]> {\n try {\n return (await readDirectory(directoryPath))\n .map((entry) => entry.name)\n .sort((left, right) => left.localeCompare(right))\n } catch {\n return []\n }\n}\n","import { spawn } from 'node:child_process'\nimport { getToolPaths } from './avd-config.ts'\nimport type { EmulatorStartCommandOptions, StartEmulatorDependencies } from './emulator-types.ts'\nimport { listInstalledAvds } from './list-installed-avds.ts'\nimport { resolveAndroidSdkRoot } from './resolve-android-sdk-root.ts'\n\nexport async function defaultStartProcess(cmd: [string, ...string[]]) {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(cmd[0], cmd.slice(1), {\n detached: true,\n stdio: 'ignore',\n })\n\n child.once('error', reject)\n child.once('spawn', () => {\n child.unref()\n resolve()\n })\n })\n}\n\nexport async function startEmulator(\n { name, sdkRoot = resolveAndroidSdkRoot() }: EmulatorStartCommandOptions,\n { getHomeDirectory, readDirectory, readTextFile, startProcess = defaultStartProcess }: StartEmulatorDependencies = {},\n): Promise<void> {\n if (!name) {\n throw new Error('Emulator name is required.')\n }\n\n const avds = await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile })\n\n if (!avds.some((avd) => avd.name === name)) {\n throw new Error(`Unknown emulator: ${name}`)\n }\n\n await startProcess([getToolPaths(sdkRoot).emulator, `@${name}`])\n}\n","import { cancel, isCancel } from '@clack/prompts'\n\nexport type MultiSelectPrompt = (options: {\n message: string\n options: Array<{ hint?: string; label: string; value: string }>\n required?: boolean\n}) => Promise<string[] | symbol>\n\nexport interface PromptDependencies {\n runMultiselect?: MultiSelectPrompt\n runSelect?: SelectPrompt\n runText?: TextPrompt\n}\n\nexport type SelectPrompt = (options: {\n message: string\n options: Array<{ hint?: string; label: string; value: string }>\n}) => Promise<string | symbol>\n\nexport type TextPrompt = (options: {\n defaultValue?: string\n initialValue?: string\n message: string\n placeholder?: string\n validate?: (value: string) => string | undefined\n}) => Promise<string | symbol>\n\nexport function resolvePromptCancellation(value: symbol): undefined {\n if (isCancel(value)) {\n cancel('Cancelled')\n process.exitCode = 1\n }\n\n return undefined\n}\n","import { text } from '@clack/prompts'\nimport { DEFAULT_PROFILE } from '../data-access/avd-config.ts'\nimport { resolvePromptCancellation, type TextPrompt } from './emulator-ui-prompt-types.ts'\n\nexport async function promptEmulatorName(\n defaultName: string = DEFAULT_PROFILE.name,\n runText: TextPrompt = text as TextPrompt,\n): Promise<string | undefined> {\n const selected = await runText({\n defaultValue: defaultName,\n initialValue: defaultName,\n message: 'Emulator name',\n validate: (value) => (value.trim().length > 0 ? undefined : 'Emulator name is required.'),\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected.trim()\n}\n","import { homedir } from 'node:os'\nimport { resolveEmulatorProfile } from './data-access/avd-config.ts'\nimport { createAvd, defaultPathExists, defaultWriteTextFile } from './data-access/create-avd.ts'\nimport type {\n CreateAvdDependencies,\n EmulatorCreateCommandOptions,\n StartEmulatorDependencies,\n} from './data-access/emulator-types.ts'\nimport { defaultReadDirectory, defaultReadTextFile } from './data-access/list-installed-avds.ts'\nimport { runExecutable } from './data-access/run-executable.ts'\nimport { defaultStartProcess, startEmulator } from './data-access/start-emulator.ts'\nimport { promptEmulatorName } from './ui/emulator-ui-prompt-emulator-name.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\n\ninterface RunEmulatorCreateDependencies extends CreateAvdDependencies, PromptDependencies, StartEmulatorDependencies {}\n\nexport async function runEmulatorCreate(\n options: EmulatorCreateCommandOptions = {},\n {\n getHomeDirectory = homedir,\n pathExists = defaultPathExists(),\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n runCommand = runExecutable,\n runText,\n startProcess = defaultStartProcess,\n writeTextFile = defaultWriteTextFile,\n }: RunEmulatorCreateDependencies = {},\n) {\n const profile = resolveEmulatorProfile(options.profile)\n const name = options.name ?? (await promptEmulatorName(profile.name, runText))\n\n if (!name) {\n return\n }\n\n console.log(`Preparing emulator: ${name}`)\n\n const result = await createAvd(\n {\n ...options,\n name,\n },\n {\n getHomeDirectory,\n pathExists,\n readTextFile,\n runCommand,\n writeTextFile,\n },\n )\n\n if (!result.created) {\n console.log(`Emulator already exists: ${result.name}`)\n console.log(`To recreate, delete it first with: solana-mobile emulator delete ${result.name}`)\n return\n }\n\n console.log(`Created emulator: ${result.name}`)\n\n if (options.start) {\n await startEmulator(\n { name: result.name, sdkRoot: result.sdkRoot },\n {\n getHomeDirectory,\n readDirectory,\n readTextFile,\n startProcess,\n },\n )\n console.log(`Started emulator: ${result.name}`)\n return\n }\n\n console.log(`Start with: solana-mobile emulator start ${result.name}`)\n}\n","import { getToolPaths } from './avd-config.ts'\nimport type { DeleteInstalledAvdsDependencies } from './emulator-types.ts'\nimport { resolveAndroidSdkRoot } from './resolve-android-sdk-root.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function deleteInstalledAvds(\n names: readonly string[],\n sdkRoot: string = resolveAndroidSdkRoot(),\n { runCommand = runExecutable }: DeleteInstalledAvdsDependencies = {},\n): Promise<void> {\n const { avdmanager } = getToolPaths(sdkRoot)\n const results = await Promise.allSettled(\n names.map((name) => runCommand([avdmanager, 'delete', 'avd', '--name', name])),\n )\n const failures = results.flatMap((result, index) => {\n if (result.status === 'fulfilled') {\n return []\n }\n\n const message = result.reason instanceof Error ? result.reason.message : String(result.reason)\n\n return [`${names[index]}: ${message}`]\n })\n\n if (failures.length > 0) {\n throw new Error(`Some emulators could not be deleted:\\n- ${failures.join('\\n- ')}`)\n }\n}\n","import { select } from '@clack/prompts'\nimport type { InstalledAvd } from '../data-access/emulator-types.ts'\nimport { resolvePromptCancellation, type SelectPrompt } from './emulator-ui-prompt-types.ts'\n\nexport function createInstalledEmulatorOption({ device, name, target }: InstalledAvd) {\n const hint = [device ? `device: ${device}` : undefined, target ? `target: ${target}` : undefined]\n .filter(Boolean)\n .join(', ')\n\n return {\n hint: hint || undefined,\n label: name,\n value: name,\n }\n}\n\nexport async function selectInstalledEmulatorName(\n avds: readonly InstalledAvd[],\n message: string,\n runSelect: SelectPrompt = select as SelectPrompt,\n): Promise<string | undefined> {\n if (avds.length === 0) {\n console.log('No Android emulators found.')\n return undefined\n }\n\n const selected = await runSelect({\n message,\n options: avds.map(createInstalledEmulatorOption),\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected\n}\n","import { multiselect } from '@clack/prompts'\nimport type { InstalledAvd } from '../data-access/emulator-types.ts'\nimport { type MultiSelectPrompt, resolvePromptCancellation } from './emulator-ui-prompt-types.ts'\nimport { createInstalledEmulatorOption } from './emulator-ui-select-installed-emulator-name.ts'\n\nexport async function selectInstalledEmulatorNames(\n avds: readonly InstalledAvd[],\n runMultiselect: MultiSelectPrompt = multiselect as MultiSelectPrompt,\n): Promise<string[] | undefined> {\n if (avds.length === 0) {\n console.log('No Android emulators found.')\n return undefined\n }\n\n const selected = await runMultiselect({\n message: 'Select emulators to delete',\n options: avds.map(createInstalledEmulatorOption),\n required: false,\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected\n}\n","import { homedir } from 'node:os'\nimport { deleteInstalledAvds } from './data-access/delete-installed-avds.ts'\nimport type {\n DeleteInstalledAvdsDependencies,\n EmulatorDeleteCommandOptions,\n ListInstalledAvdsDependencies,\n} from './data-access/emulator-types.ts'\nimport { defaultReadDirectory, defaultReadTextFile, listInstalledAvds } from './data-access/list-installed-avds.ts'\nimport { runExecutable } from './data-access/run-executable.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\nimport { selectInstalledEmulatorNames } from './ui/emulator-ui-select-installed-emulator-names.ts'\n\ninterface RunEmulatorDeleteDependencies\n extends DeleteInstalledAvdsDependencies,\n ListInstalledAvdsDependencies,\n PromptDependencies {}\n\nexport async function runEmulatorDelete(\n options: EmulatorDeleteCommandOptions,\n {\n getHomeDirectory = homedir,\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n runCommand = runExecutable,\n runMultiselect,\n }: RunEmulatorDeleteDependencies = {},\n) {\n const names =\n options.names && options.names.length > 0\n ? options.names\n : await selectInstalledEmulatorNames(\n await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile }),\n runMultiselect,\n )\n\n if (!names || names.length === 0) {\n return\n }\n\n await deleteInstalledAvds(names, options.sdkRoot, { runCommand })\n\n for (const name of names) {\n console.log(`Deleted emulator: ${name}`)\n }\n}\n","import type { InstalledAvd } from '../data-access/emulator-types.ts'\n\nexport function renderInstalledEmulators(avds: readonly InstalledAvd[]) {\n if (avds.length === 0) {\n console.log('No Android emulators found.')\n return\n }\n\n console.table(\n avds.map(({ device, name, target }) => ({\n device: device ?? '',\n name,\n target: target ?? '',\n })),\n ['device', 'name', 'target'],\n )\n}\n","import type { EmulatorListCommandOptions } from './data-access/emulator-types.ts'\nimport { listInstalledAvds } from './data-access/list-installed-avds.ts'\nimport { renderInstalledEmulators } from './ui/emulator-ui-render-installed-emulators.ts'\n\nexport async function runEmulatorList(_options: EmulatorListCommandOptions = {}) {\n renderInstalledEmulators(await listInstalledAvds())\n}\n","import { homedir } from 'node:os'\nimport type { EmulatorStartCommandOptions, StartEmulatorDependencies } from './data-access/emulator-types.ts'\nimport { defaultReadDirectory, defaultReadTextFile, listInstalledAvds } from './data-access/list-installed-avds.ts'\nimport { defaultStartProcess, startEmulator } from './data-access/start-emulator.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\nimport { selectInstalledEmulatorName } from './ui/emulator-ui-select-installed-emulator-name.ts'\n\ninterface RunEmulatorStartDependencies extends PromptDependencies, StartEmulatorDependencies {}\n\nexport async function runEmulatorStart(\n options: EmulatorStartCommandOptions = {},\n {\n getHomeDirectory = homedir,\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n runSelect,\n startProcess = defaultStartProcess,\n }: RunEmulatorStartDependencies = {},\n) {\n const name =\n options.name ??\n (await selectInstalledEmulatorName(\n await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile }),\n 'Select an emulator to start',\n runSelect,\n ))\n\n if (!name) {\n return\n }\n\n await startEmulator(\n {\n name,\n sdkRoot: options.sdkRoot,\n },\n {\n getHomeDirectory,\n readDirectory,\n readTextFile,\n startProcess,\n },\n )\n console.log(`Started emulator: ${name}`)\n}\n","import type { EmulatorAdbDevice, ListRunningEmulatorsDependencies, RunningEmulator } from './emulator-types.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function listRunningEmulators({\n runCommand = runExecutable,\n}: ListRunningEmulatorsDependencies = {}): Promise<RunningEmulator[]> {\n const serials = parseAdbEmulatorDevices(await runCommand(['adb', 'devices']))\n .filter(({ state }) => state === 'device')\n .map(({ serial }) => serial)\n const runningEmulators = await Promise.all(\n serials.map(async (serial) => ({\n name: parseRunningEmulatorName(await runCommand(['adb', '-s', serial, 'emu', 'avd', 'name'])) ?? serial,\n serial,\n })),\n )\n\n return runningEmulators.sort(\n (left, right) => left.name.localeCompare(right.name) || left.serial.localeCompare(right.serial),\n )\n}\n\nexport function parseAdbEmulatorDevices(contents: string): EmulatorAdbDevice[] {\n return contents\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .filter(Boolean)\n .flatMap((line) => {\n if (line.startsWith('List of devices attached')) {\n return []\n }\n\n const [serial, state] = line.split(/\\s+/, 3)\n\n if (!serial?.startsWith('emulator-') || !state) {\n return []\n }\n\n return [\n {\n serial,\n state,\n },\n ]\n })\n .sort((left, right) => left.serial.localeCompare(right.serial))\n}\n\nexport function parseRunningEmulatorName(contents: string): string | undefined {\n return contents\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .find((value) => value.length > 0 && value !== 'OK')\n}\n","import type { CommandRunner, EmulatorStatus, ListEmulatorStatusesDependencies } from './emulator-types.ts'\nimport { listInstalledAvds } from './list-installed-avds.ts'\nimport { parseAdbEmulatorDevices, parseRunningEmulatorName } from './list-running-emulators.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function listEmulatorStatuses({\n getHomeDirectory,\n readDirectory,\n readTextFile,\n runCommand = runExecutable,\n}: ListEmulatorStatusesDependencies = {}): Promise<EmulatorStatus[]> {\n const installedAvds = await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile })\n const adbDevices = parseAdbEmulatorDevices(await runCommand(['adb', 'devices']))\n const adbStatuses = await Promise.all(\n adbDevices.map(async ({ serial, state }) => {\n const name = state === 'device' ? await resolveAdbEmulatorName(serial, runCommand) : undefined\n\n return {\n booted: await resolveBootCompleted(serial, state, runCommand),\n name,\n serial,\n state: renderAdbState(state),\n }\n }),\n )\n const statuses: EmulatorStatus[] = installedAvds.map(({ device, name, target }) => {\n const adbStatus = adbStatuses.find((status) => status.name === name)\n\n return {\n booted: adbStatus?.booted ?? 'no',\n device,\n name,\n serial: adbStatus?.serial,\n state: adbStatus?.state ?? 'offline',\n target,\n }\n })\n const installedNames = new Set(installedAvds.map(({ name }) => name))\n\n for (const adbStatus of adbStatuses) {\n if (adbStatus.name && installedNames.has(adbStatus.name)) {\n continue\n }\n\n statuses.push({\n booted: adbStatus.booted,\n name: adbStatus.name ?? '',\n serial: adbStatus.serial,\n state: adbStatus.state,\n })\n }\n\n return statuses.sort(\n (left, right) => left.name.localeCompare(right.name) || (left.serial ?? '').localeCompare(right.serial ?? ''),\n )\n}\n\nasync function resolveAdbEmulatorName(serial: string, runCommand: CommandRunner): Promise<string | undefined> {\n try {\n return parseRunningEmulatorName(await runCommand(['adb', '-s', serial, 'emu', 'avd', 'name']))\n } catch {\n return undefined\n }\n}\n\nasync function resolveBootCompleted(\n serial: string,\n state: string,\n runCommand: CommandRunner,\n): Promise<EmulatorStatus['booted']> {\n if (state !== 'device') {\n return 'unknown'\n }\n\n try {\n return (await runCommand(['adb', '-s', serial, 'shell', 'getprop', 'sys.boot_completed'])).trim() === '1'\n ? 'yes'\n : 'no'\n } catch {\n return 'unknown'\n }\n}\n\nfunction renderAdbState(state: string): string {\n return state === 'device' ? 'online' : state\n}\n","import type { EmulatorStatus } from '../data-access/emulator-types.ts'\n\nexport function renderEmulatorStatuses(statuses: readonly EmulatorStatus[]) {\n if (statuses.length === 0) {\n console.log('No Android emulators found.')\n return\n }\n\n console.table(\n statuses.map(({ booted, device, name, serial, state, target }) => ({\n booted,\n device: device ?? '',\n name,\n serial: serial ?? '',\n state,\n target: target ?? '',\n })),\n ['booted', 'device', 'name', 'serial', 'state', 'target'],\n )\n}\n","import type { EmulatorStatusCommandOptions } from './data-access/emulator-types.ts'\nimport { listEmulatorStatuses } from './data-access/list-emulator-statuses.ts'\nimport { renderEmulatorStatuses } from './ui/emulator-ui-render-emulator-statuses.ts'\n\nexport async function runEmulatorStatus(options: EmulatorStatusCommandOptions = {}) {\n const statuses = await listEmulatorStatuses()\n const visibleStatuses = options.nameOrSerial\n ? statuses.filter((status) => status.name === options.nameOrSerial || status.serial === options.nameOrSerial)\n : statuses\n\n if (options.nameOrSerial && visibleStatuses.length === 0) {\n console.error(`Unknown emulator: ${options.nameOrSerial}`)\n process.exitCode = 2\n return\n }\n\n renderEmulatorStatuses(visibleStatuses)\n\n if (options.nameOrSerial) {\n process.exitCode = visibleStatuses.some((status) => status.state === 'online' && status.booted === 'yes') ? 0 : 1\n }\n}\n","import type { RunningEmulator, StopEmulatorDependencies } from './emulator-types.ts'\nimport { listRunningEmulators } from './list-running-emulators.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function stopEmulator(\n nameOrSerial: string,\n { runCommand = runExecutable }: StopEmulatorDependencies = {},\n): Promise<RunningEmulator> {\n const runningEmulators = await listRunningEmulators({ runCommand })\n const matchingEmulators = runningEmulators.filter(\n (emulator) => emulator.name === nameOrSerial || emulator.serial === nameOrSerial,\n )\n\n if (matchingEmulators.length === 0) {\n throw new Error(`Emulator is not running: ${nameOrSerial}`)\n }\n\n if (matchingEmulators.length > 1) {\n throw new Error(`Multiple running emulators match ${nameOrSerial}. Stop by serial instead.`)\n }\n\n const emulator = matchingEmulators[0] as RunningEmulator\n\n await runCommand(['adb', '-s', emulator.serial, 'emu', 'kill'])\n\n return emulator\n}\n","import { select } from '@clack/prompts'\nimport type { RunningEmulator } from '../data-access/emulator-types.ts'\nimport { resolvePromptCancellation, type SelectPrompt } from './emulator-ui-prompt-types.ts'\n\nexport async function selectRunningEmulatorSerial(\n runningEmulators: readonly RunningEmulator[],\n runSelect: SelectPrompt = select as SelectPrompt,\n): Promise<string | undefined> {\n if (runningEmulators.length === 0) {\n console.log('No running Android emulators found.')\n return undefined\n }\n\n const selected = await runSelect({\n message: 'Select a running emulator to stop',\n options: runningEmulators.map(createRunningEmulatorOption),\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected\n}\n\nfunction createRunningEmulatorOption({ name, serial }: RunningEmulator) {\n return {\n hint: `serial: ${serial}`,\n label: name,\n value: serial,\n }\n}\n","import type { EmulatorStopCommandOptions, StopEmulatorDependencies } from './data-access/emulator-types.ts'\nimport { listRunningEmulators } from './data-access/list-running-emulators.ts'\nimport { runExecutable } from './data-access/run-executable.ts'\nimport { stopEmulator } from './data-access/stop-emulator.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\nimport { selectRunningEmulatorSerial } from './ui/emulator-ui-select-running-emulator-serial.ts'\n\ninterface RunEmulatorStopDependencies extends PromptDependencies, StopEmulatorDependencies {}\n\nexport async function runEmulatorStop(\n options: EmulatorStopCommandOptions = {},\n { runCommand = runExecutable, runSelect }: RunEmulatorStopDependencies = {},\n) {\n const nameOrSerial =\n options.nameOrSerial ?? (await selectRunningEmulatorSerial(await listRunningEmulators({ runCommand }), runSelect))\n\n if (!nameOrSerial) {\n return\n }\n\n const stopped = await stopEmulator(nameOrSerial, { runCommand })\n\n console.log(`Stopped emulator: ${stopped.name} (${stopped.serial})`)\n}\n","import { Command, InvalidArgumentError } from 'commander'\nimport { readPackageMetadata } from './core/data-access/package-metadata.ts'\nimport { type CreateCommandOptions, parsePackageManagerOption, runCreate } from './create/create-feature-index.ts'\nimport { runDoctor } from './doctor/doctor-feature-index.ts'\nimport {\n type EmulatorCreateCommandOptions,\n type EmulatorDeleteCommandOptions,\n type EmulatorListCommandOptions,\n type EmulatorStartCommandOptions,\n type EmulatorStatusCommandOptions,\n type EmulatorStopCommandOptions,\n runEmulatorCreate,\n runEmulatorDelete,\n runEmulatorList,\n runEmulatorStart,\n runEmulatorStatus,\n runEmulatorStop,\n} from './emulator/emulator-feature-index.ts'\n\nexport type AppOptions = {\n runEmulatorCreate?: (options: EmulatorCreateCommandOptions) => Promise<void>\n runEmulatorDelete?: (options: EmulatorDeleteCommandOptions) => Promise<void>\n runEmulatorList?: (options: EmulatorListCommandOptions) => Promise<void>\n runEmulatorStart?: (options: EmulatorStartCommandOptions) => Promise<void>\n runEmulatorStatus?: (options: EmulatorStatusCommandOptions) => Promise<void>\n runEmulatorStop?: (options: EmulatorStopCommandOptions) => Promise<void>\n runCreate?: (options: CreateCommandOptions) => Promise<void>\n runDoctor?: () => Promise<number>\n}\n\nexport function createApp({\n runEmulatorCreate: runEmulatorCreateCommand = runEmulatorCreate,\n runEmulatorDelete: runEmulatorDeleteCommand = runEmulatorDelete,\n runEmulatorList: runEmulatorListCommand = runEmulatorList,\n runEmulatorStart: runEmulatorStartCommand = runEmulatorStart,\n runEmulatorStatus: runEmulatorStatusCommand = runEmulatorStatus,\n runEmulatorStop: runEmulatorStopCommand = runEmulatorStop,\n runCreate: runCreateCommand = runCreate,\n runDoctor: runDoctorCommand = runDoctor,\n}: AppOptions = {}) {\n const metadata = readPackageMetadata()\n const app = new Command()\n\n app\n .enablePositionalOptions()\n .name(metadata.name)\n .description(metadata.description)\n .showHelpAfterError()\n .version(metadata.version)\n\n app\n .command('create [projectName]')\n .description('Create a new Solana Mobile project')\n .option('--pm, --package-manager <packageManager>', 'Package manager to use', parsePackageManagerOption)\n .option('-d, --dry-run', 'Dry run')\n .option('-t, --template <templateName>', 'Use a template')\n .option('--list-template-ids', 'List available template ids as JSON array')\n .option('--list-templates', 'List available templates')\n .option('--list-versions', 'Verify your versions of Anchor, AVM, Rust, and Solana')\n .option('--minimal', 'Use the minimal template')\n .option('--skip-git', 'Skip git initialization')\n .option('--skip-init', 'Skip running the init script')\n .option('--skip-install', 'Skip installing dependencies')\n .option('-v, --verbose', 'Verbose output')\n .action(async (projectName: string | undefined, options: CreateCommandOptions) => {\n await runCreateCommand({\n ...options,\n projectName,\n template: options.template ?? (options.minimal ? 'kit-expo-minimal' : undefined),\n })\n })\n\n app\n .command('doctor')\n .description('Check local development dependencies')\n .action(async () => {\n process.exitCode = await runDoctorCommand()\n })\n\n const emulatorCommand = app.command('emulator').alias('emu').description('Manage Android emulators')\n\n emulatorCommand.action(() => {\n emulatorCommand.outputHelp()\n })\n\n emulatorCommand\n .command('create [name]')\n .description('Create or update an Android emulator')\n .option('--data-size <size>', 'Data partition size')\n .option('--device <device>', 'Android device profile id')\n .option('--profile <profile>', 'Solana Mobile emulator profile')\n .option('--ram-mb <megabytes>', 'RAM size in MB', parseIntegerOption)\n .option('--sdcard-size <size>', 'SD card size')\n .option('--sdk-root <path>', 'Android SDK root')\n .option('--start', 'Start the emulator after creating it')\n .option('--system-image <package>', 'Android system image package')\n .option('--vm-heap-mb <megabytes>', 'VM heap size in MB', parseIntegerOption)\n .action(async (name: string | undefined, options: Omit<EmulatorCreateCommandOptions, 'name'>) => {\n await runEmulatorCreateCommand({ ...options, name })\n })\n\n emulatorCommand\n .command('delete [names...]')\n .description('Delete Android emulators')\n .option('--sdk-root <path>', 'Android SDK root')\n .action(async (names: string[] | undefined, options: Omit<EmulatorDeleteCommandOptions, 'names'>) => {\n await runEmulatorDeleteCommand({ ...options, names: names ?? [] })\n })\n\n emulatorCommand\n .command('list')\n .description('List installed Android emulators')\n .action(async (options: EmulatorListCommandOptions) => {\n await runEmulatorListCommand(options)\n })\n\n emulatorCommand\n .command('start [name]')\n .description('Start an Android emulator')\n .option('--sdk-root <path>', 'Android SDK root')\n .action(async (name: string | undefined, options: Omit<EmulatorStartCommandOptions, 'name'>) => {\n await runEmulatorStartCommand({ ...options, name })\n })\n\n emulatorCommand\n .command('status [nameOrSerial]')\n .description('Show Android emulator status')\n .action(async (nameOrSerial: string | undefined) => {\n await runEmulatorStatusCommand({ nameOrSerial })\n })\n\n emulatorCommand\n .command('stop [nameOrSerial]')\n .description('Stop a running Android emulator')\n .action(async (nameOrSerial: string | undefined) => {\n await runEmulatorStopCommand({ nameOrSerial })\n })\n\n return app\n}\n\nexport async function runApp(argv = process.argv, options: AppOptions = {}) {\n const app = createApp(options)\n\n if (argv.slice(2).length === 0) {\n app.outputHelp()\n return\n }\n\n await app.parseAsync(argv)\n}\n\nfunction parseIntegerOption(value: string) {\n const parsed = Number(value)\n\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(`Expected a positive integer, received: ${value}`)\n }\n\n return parsed\n}\n","#!/usr/bin/env node\n\nimport { runApp } from './app.ts'\n\nrunApp().catch((error: unknown) => {\n console.error(error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":["packageJson","InvalidArgumentError","homedir","platform","release","runExecutable","delimiter","defaultReadTextFile","homedir","homedir","constants","text","homedir","defaultReadTextFile","select","multiselect","homedir","defaultReadTextFile","homedir","defaultReadTextFile","select","Command","InvalidArgumentError"],"sources":["../package.json","../src/core/util/read-package-string.ts","../src/core/data-access/package-metadata.ts","../src/create/create-feature-index.ts","../src/doctor/data-access/doctor-environment.ts","../src/doctor/data-access/check-adb-version.ts","../src/emulator/data-access/resolve-android-sdk-root.ts","../src/emulator/data-access/avd-config.ts","../src/emulator/data-access/list-installed-avds.ts","../src/doctor/data-access/check-android-devices.ts","../src/doctor/data-access/check-android-sdk.ts","../src/doctor/data-access/check-java.ts","../src/doctor/data-access/check-node-version.ts","../src/doctor/data-access/check-system-and-javascript.ts","../src/doctor/ui/doctor-ui-report.ts","../src/doctor/doctor-feature-index.ts","../src/emulator/data-access/run-executable.ts","../src/emulator/data-access/create-avd.ts","../src/emulator/data-access/start-emulator.ts","../src/emulator/ui/emulator-ui-prompt-types.ts","../src/emulator/ui/emulator-ui-prompt-emulator-name.ts","../src/emulator/emulator-feature-create.ts","../src/emulator/data-access/delete-installed-avds.ts","../src/emulator/ui/emulator-ui-select-installed-emulator-name.ts","../src/emulator/ui/emulator-ui-select-installed-emulator-names.ts","../src/emulator/emulator-feature-delete.ts","../src/emulator/ui/emulator-ui-render-installed-emulators.ts","../src/emulator/emulator-feature-list.ts","../src/emulator/emulator-feature-start.ts","../src/emulator/data-access/list-running-emulators.ts","../src/emulator/data-access/list-emulator-statuses.ts","../src/emulator/ui/emulator-ui-render-emulator-statuses.ts","../src/emulator/emulator-feature-status.ts","../src/emulator/data-access/stop-emulator.ts","../src/emulator/ui/emulator-ui-select-running-emulator-serial.ts","../src/emulator/emulator-feature-stop.ts","../src/app.ts","../src/cli.ts"],"sourcesContent":["","export function readPackageString<TPackageKey extends string>(\n packageJson: Partial<Record<TPackageKey, unknown>>,\n key: TPackageKey,\n) {\n const value = packageJson[key]\n\n if (typeof value !== 'string') {\n throw new Error(`package.json ${key} must be a string`)\n }\n\n return value\n}\n","import packageJson from '../../../package.json' with { type: 'json' }\nimport { readPackageString } from '../util/read-package-string.ts'\n\nexport type PackageMetadata = {\n description: string\n name: string\n version: string\n}\n\nexport function readPackageMetadata(): PackageMetadata {\n return {\n description: readPackageString(packageJson, 'description'),\n name: readPackageString(packageJson, 'name'),\n version: readPackageString(packageJson, 'version'),\n }\n}\n","import { resolve } from 'node:path'\nimport { cancel, intro, isCancel, log, note, outro, select, text } from '@clack/prompts'\nimport { InvalidArgumentError } from 'commander'\nimport {\n type CreateAppArgs,\n createApp,\n detectInvokedPackageManager,\n fetchTemplateData,\n finalNote,\n getAppInfo,\n listTemplateIds,\n listTemplates,\n listVersions,\n type MenuConfig,\n type PackageManager,\n type Template,\n type TemplateJsonTemplate,\n validateProjectName,\n} from 'create-solana-dapp'\n\nexport const CUSTOM_TEMPLATES_URL = 'https://raw.githubusercontent.com/solana-mobile/templates/main/templates.json'\n\nconst SOLANA_MOBILE_MENU_CONFIG: MenuConfig = [\n {\n description: 'Solana Mobile templates',\n groups: ['mobile'],\n id: 'solana-mobile',\n keywords: [],\n name: 'Solana Mobile',\n },\n]\n\ntype CreateOptions = {\n dryRun?: boolean\n listTemplateIds?: boolean\n listTemplates?: boolean\n listVersions?: boolean\n minimal?: boolean\n packageManager?: PackageManager\n projectName?: string\n skipGit?: boolean\n skipInit?: boolean\n skipInstall?: boolean\n template?: string\n verbose?: boolean\n}\nexport type CreateCommandOptions = CreateOptions\n\nexport type CreateSolanaDappApi = {\n createApp: typeof createApp\n detectInvokedPackageManager: typeof detectInvokedPackageManager\n fetchTemplateData: typeof fetchTemplateData\n finalNote: typeof finalNote\n getAppInfo: typeof getAppInfo\n listTemplateIds: typeof listTemplateIds\n listTemplates: typeof listTemplates\n listVersions: typeof listVersions\n validateProjectName: typeof validateProjectName\n}\n\ntype RunCreateOptions = {\n createSolanaDapp?: CreateSolanaDappApi\n promptProjectName?: (createSolanaDapp: CreateSolanaDappApi) => Promise<string | undefined>\n selectTemplate?: (templates: TemplateJsonTemplate[]) => Promise<Template | undefined>\n}\n\nconst createSolanaDappApi = {\n createApp,\n detectInvokedPackageManager,\n fetchTemplateData,\n finalNote,\n getAppInfo,\n listTemplateIds,\n listTemplates,\n listVersions,\n validateProjectName,\n} satisfies CreateSolanaDappApi\n\nexport async function runCreate(\n options: CreateCommandOptions,\n {\n createSolanaDapp: injectedCreateSolanaDapp,\n promptProjectName: promptProjectNameInput = promptProjectName,\n selectTemplate = selectCustomTemplate,\n }: RunCreateOptions = {},\n) {\n try {\n const createSolanaDapp = injectedCreateSolanaDapp ?? createSolanaDappApi\n const packageManager = options.packageManager ?? createSolanaDapp.detectInvokedPackageManager()\n\n if (options.listVersions) {\n createSolanaDapp.listVersions()\n return\n }\n\n const { templates } = await createSolanaDapp.fetchTemplateData({\n config: SOLANA_MOBILE_MENU_CONFIG,\n url: CUSTOM_TEMPLATES_URL,\n verbose: options.verbose ?? false,\n })\n\n if (options.listTemplates) {\n createSolanaDapp.listTemplates({ templates })\n return\n }\n\n if (options.listTemplateIds) {\n console.log(JSON.stringify(createSolanaDapp.listTemplateIds({ templates })))\n return\n }\n\n intro('solana-mobile create')\n\n const projectName = options.projectName ?? (await promptProjectNameInput(createSolanaDapp))\n\n if (!projectName) {\n process.exitCode = 1\n return\n }\n\n const template = options.template ? resolveTemplate(options.template, templates) : await selectTemplate(templates)\n\n if (!template) {\n process.exitCode = 1\n return\n }\n\n const targetDirectory = resolve(process.cwd(), projectName)\n const createArgs: CreateAppArgs = {\n app: createSolanaDapp.getAppInfo(),\n dryRun: options.dryRun ?? false,\n name: projectName,\n packageManager,\n skipGit: options.skipGit ?? false,\n skipInit: options.skipInit ?? false,\n skipInstall: options.skipInstall ?? false,\n targetDirectory,\n template,\n verbose: options.verbose ?? false,\n }\n\n if (options.dryRun) {\n note(JSON.stringify(createArgs, undefined, 2), 'Arguments')\n outro('Dry run was used, no changes were made')\n return\n }\n\n if (options.verbose) {\n log.warn('Verbose output enabled')\n console.warn(createArgs)\n }\n\n const instructions = await createSolanaDapp.createApp(createArgs)\n\n note(\n createSolanaDapp.finalNote({\n ...createArgs,\n instructions,\n target: createArgs.targetDirectory.replace(process.cwd(), '.'),\n }),\n 'Installation successful',\n )\n\n outro('Good luck with your project!')\n } catch (error) {\n cancel(`${error}`)\n process.exitCode = 1\n }\n}\n\nexport function parsePackageManagerOption(next: string): PackageManager {\n if (!next || !isPackageManager(next)) {\n throw new InvalidArgumentError(`Invalid package manager: ${next}`)\n }\n\n return next\n}\n\nfunction isPackageManager(value: string): value is PackageManager {\n return value === 'bun' || value === 'npm' || value === 'pnpm' || value === 'yarn'\n}\n\nasync function promptProjectName(createSolanaDapp: CreateSolanaDappApi) {\n const projectName = await text({\n message: 'Enter project name',\n validate: (value) => createSolanaDapp.validateProjectName(value ?? '') ?? undefined,\n })\n\n if (isCancel(projectName)) {\n cancel('Operation cancelled.')\n return undefined\n }\n\n return projectName\n}\n\nasync function selectCustomTemplate(templates: TemplateJsonTemplate[]) {\n const template = await select<TemplateJsonTemplate>({\n message: 'Select a template',\n options: templates.map((template) => ({\n hint: template.description,\n label: template.name,\n value: template,\n })),\n })\n\n if (isCancel(template)) {\n cancel('Operation cancelled.')\n return undefined\n }\n\n return template\n}\n\nfunction resolveTemplate(templateName: string, templates: TemplateJsonTemplate[]): Template {\n const template = templates.find(\n (template) =>\n template.name === templateName ||\n template.path === templateName ||\n template.id === templateName ||\n template.id.endsWith(`/${templateName}`),\n )\n\n if (template) {\n return template\n }\n\n return {\n description: `${templateName} (external)`,\n id: templateName.includes(':') ? templateName : `gh:${templateName}`,\n name: templateName,\n }\n}\n","import { execFile } from 'node:child_process'\nimport { access, readdir, realpath, statfs } from 'node:fs/promises'\nimport { homedir, platform, release } from 'node:os'\nimport { delimiter, dirname, extname, join, resolve, sep } from 'node:path'\n\nexport type CommandResult = { path: string; stderr: string; stdout: string }\nexport type CommandRunner = (command: string, args?: string[]) => Promise<CommandResult>\n\nexport type DoctorEnvironment = {\n architecture: string\n environment: NodeJS.ProcessEnv\n getDiskSpace: (path: string) => Promise<number>\n getHomeDirectory: () => string\n getPlatform: () => NodeJS.Platform\n getRelease: () => string\n listDirectory: (path: string) => Promise<string[]>\n pathExists: (path: string) => Promise<boolean>\n resolvePath: (path: string) => Promise<string>\n runCommand: CommandRunner\n}\n\nexport const defaultDoctorEnvironment: DoctorEnvironment = {\n architecture: process.arch,\n environment: process.env,\n getDiskSpace: async (path) => {\n const stats = await statfs(path)\n return stats.bavail * stats.bsize\n },\n getHomeDirectory: homedir,\n getPlatform: platform,\n getRelease: release,\n listDirectory: async (path) => readdir(path),\n pathExists: async (path) =>\n access(path).then(\n () => true,\n () => false,\n ),\n resolvePath: async (path) => realpath(path),\n runCommand: runExecutable,\n}\n\nexport function runExecutable(command: string, args: string[] = [], timeout = 5_000): Promise<CommandResult> {\n return new Promise((resolvePromise, reject) => {\n const child = execFile(command, args, { timeout, windowsHide: true }, (error, stdout, stderr) => {\n if (error) {\n reject(error)\n return\n }\n resolvePromise({ path: command, stderr, stdout })\n })\n child.stdin?.end()\n })\n}\n\nexport async function findExecutable(\n name: string,\n environment: DoctorEnvironment,\n preferredDirectories: string[] = [],\n): Promise<string | undefined> {\n const extensions = environment.getPlatform() === 'win32' ? ['', '.exe', '.bat', '.cmd'] : ['']\n const pathDirectories = (environment.environment.PATH ?? '').split(delimiter).filter(Boolean)\n for (const directory of [...preferredDirectories, ...pathDirectories]) {\n for (const extension of extensions) {\n const candidate = join(directory, `${name}${extension}`)\n if (await environment.pathExists(candidate)) return candidate\n }\n }\n return undefined\n}\n\nexport function expandHome(path: string, homeDirectory: string) {\n return path === '~' ? homeDirectory : path.startsWith(`~${sep}`) ? join(homeDirectory, path.slice(2)) : path\n}\n\nexport function parseVersion(output: string) {\n return output.match(/(?:^|[^\\d])(\\d+(?:\\.\\d+){0,3})(?:[^\\d]|$)/m)?.[1]\n}\n\nexport function sortVersions(values: string[]) {\n return [...values].sort((left, right) => compareVersions(left, right))\n}\n\nexport function compareVersions(left: string, right: string) {\n const leftParts = left.split('.').map(Number)\n const rightParts = right.split('.').map(Number)\n for (let index = 0; index < Math.max(leftParts.length, rightParts.length); index += 1) {\n const difference = (leftParts[index] ?? 0) - (rightParts[index] ?? 0)\n if (difference !== 0) return difference\n }\n return 0\n}\n\nexport function executableDirectory(path: string) {\n return extname(path) ? dirname(path) : resolve(path)\n}\n","import { join } from 'node:path'\nimport type { DoctorCheckResult } from './doctor-check-result.ts'\nimport { type DoctorEnvironment, defaultDoctorEnvironment, findExecutable } from './doctor-environment.ts'\n\nconst minimumAdbMajorVersion = 33\n\nexport async function checkAdbVersion(\n environment: DoctorEnvironment = defaultDoctorEnvironment,\n sdkRoot?: string,\n): Promise<DoctorCheckResult> {\n const executable = await findExecutable('adb', environment, sdkRoot ? [join(sdkRoot, 'platform-tools')] : [])\n if (!executable) return missingAdb()\n try {\n const output = await environment.runCommand(executable, ['version'])\n const version = parseAdbVersion(`${output.stdout}\\n${output.stderr}`)\n const passes = Boolean(version) && Number.parseInt(version ?? '', 10) >= minimumAdbMajorVersion\n return {\n actual: version ?? 'unknown',\n category: 'android-sdk',\n details: [`Executable: ${executable}`],\n message: version ? `Detected adb ${version}.` : 'Unable to detect adb platform-tools version.',\n name: 'adb',\n recommendation: passes ? undefined : 'Install or update Android SDK Platform Tools to version 33 or higher.',\n required: '33 or higher',\n status: passes ? 'pass' : 'fail',\n }\n } catch {\n return missingAdb()\n }\n}\n\nexport function parseAdbVersion(output: string) {\n return output.match(/^Version\\s+(\\d+(?:\\.\\d+)*)/im)?.[1]\n}\n\nfunction missingAdb(): DoctorCheckResult {\n return {\n actual: 'not found',\n category: 'android-sdk',\n message: 'adb is not available.',\n name: 'adb',\n recommendation: 'Install Android SDK Platform Tools 33 or higher.',\n required: '33 or higher',\n status: 'fail',\n }\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport function resolveAndroidSdkRoot(environment: NodeJS.ProcessEnv = process.env, homeDirectory: string = homedir()) {\n return environment.ANDROID_SDK_ROOT ?? environment.ANDROID_HOME ?? join(homeDirectory, 'Library', 'Android', 'sdk')\n}\n","import { join } from 'node:path'\nimport type { EmulatorCreateCommandOptions, ParsedSystemImagePackage, ResolvedCreateOptions } from './emulator-types.ts'\nimport { resolveAndroidSdkRoot } from './resolve-android-sdk-root.ts'\n\nexport const DEFAULT_PROFILE_NAME = 'solana-mobile'\n\nexport const DEFAULT_PROFILE = {\n dataSize: '32G',\n device: 'pixel_9_pro_xl',\n name: 'solana-mobile',\n ramMb: 8192,\n sdcardSize: '512M',\n systemImage: 'system-images;android-36;google_apis_playstore;arm64-v8a',\n vmHeapMb: 576,\n} as const\n\nexport function createAvdConfigValues(options: ResolvedCreateOptions): Record<string, string> {\n const { abi, platform, tagId } = parseSystemImagePackage(options.systemImage)\n\n return {\n 'abi.type': abi,\n 'avd.ini.displayname': options.name.replaceAll('_', ' '),\n 'disk.dataPartition.size': options.dataSize,\n 'fastboot.forceChosenSnapshotBoot': 'no',\n 'fastboot.forceColdBoot': 'no',\n 'fastboot.forceFastBoot': 'yes',\n 'hw.audioInput': 'yes',\n 'hw.camera.back': 'virtualscene',\n 'hw.camera.front': 'emulated',\n 'hw.cpu.arch': getCpuArchitecture(abi),\n 'hw.cpu.ncore': '4',\n 'hw.device.name': options.device,\n 'hw.gpu.enabled': 'yes',\n 'hw.gpu.mode': 'auto',\n 'hw.keyboard': 'yes',\n 'hw.ramSize': String(options.ramMb),\n 'hw.sdCard': 'yes',\n 'image.sysdir.1': `${systemImagePackageToRelativeDirectory(options.systemImage)}/`,\n 'PlayStore.enabled': String(tagId.includes('play')),\n 'runtime.network.latency': 'none',\n 'runtime.network.speed': 'full',\n 'sdcard.size': options.sdcardSize,\n showDeviceFrame: 'yes',\n 'skin.dynamic': 'yes',\n 'tag.display': getTagDisplay(tagId),\n 'tag.id': tagId,\n target: platform,\n 'userdata.useQcow2': 'no',\n 'vm.heapSize': String(options.vmHeapMb),\n }\n}\n\nexport function getToolPaths(sdkRoot: string) {\n return {\n avdmanager: join(sdkRoot, 'cmdline-tools', 'latest', 'bin', 'avdmanager'),\n emulator: join(sdkRoot, 'emulator', 'emulator'),\n sdkmanager: join(sdkRoot, 'cmdline-tools', 'latest', 'bin', 'sdkmanager'),\n }\n}\n\nexport function parseAvdConfig(contents: string): Record<string, string> {\n const values: Record<string, string> = {}\n\n for (const line of contents\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .filter(Boolean)) {\n const separatorIndex = line.indexOf('=')\n\n if (separatorIndex === -1) {\n continue\n }\n\n const key = line.slice(0, separatorIndex)\n const value = line.slice(separatorIndex + 1)\n\n if (key) {\n values[key] = value\n }\n }\n\n return Object.fromEntries(Object.entries(values).sort(([left], [right]) => left.localeCompare(right)))\n}\n\nexport function parseSystemImagePackage(systemImage: string): ParsedSystemImagePackage {\n const [category, platform, tagId, abi] = systemImage.split(';')\n\n if (category !== 'system-images' || !platform || !tagId || !abi) {\n throw new Error(`Invalid system image package: ${systemImage}`)\n }\n\n return {\n abi,\n platform,\n tagId,\n }\n}\n\nexport function resolveCreateOptions(options: EmulatorCreateCommandOptions): ResolvedCreateOptions {\n const profile = resolveEmulatorProfile(options.profile)\n\n return {\n dataSize: options.dataSize ?? profile.dataSize,\n device: options.device ?? profile.device,\n name: options.name ?? profile.name,\n ramMb: options.ramMb ?? profile.ramMb,\n sdcardSize: options.sdcardSize ?? profile.sdcardSize,\n sdkRoot: options.sdkRoot ?? resolveAndroidSdkRoot(),\n systemImage: options.systemImage ?? profile.systemImage,\n vmHeapMb: options.vmHeapMb ?? profile.vmHeapMb,\n }\n}\n\nexport function resolveEmulatorProfile(profileName = DEFAULT_PROFILE_NAME): typeof DEFAULT_PROFILE {\n if (profileName === DEFAULT_PROFILE_NAME) {\n return DEFAULT_PROFILE\n }\n\n throw new Error(`Unknown emulator profile: ${profileName}`)\n}\n\nexport function serializeAvdConfig(values: Record<string, string>): string {\n return `${Object.keys(values)\n .sort((left, right) => left.localeCompare(right))\n .map((key) => `${key}=${values[key]}`)\n .join('\\n')}\\n`\n}\n\nexport function systemImagePackageToRelativeDirectory(systemImage: string): string {\n return systemImage.split(';').join('/')\n}\n\nfunction getCpuArchitecture(abi: string): string {\n if (abi.startsWith('arm64')) {\n return 'arm64'\n }\n\n if (abi.startsWith('armeabi')) {\n return 'arm'\n }\n\n return abi.split('-', 1)[0] ?? abi\n}\n\nfunction getTagDisplay(tagId: string): string {\n if (tagId === 'google_apis') {\n return 'Google APIs'\n }\n\n if (tagId === 'google_apis_playstore') {\n return 'Google Play'\n }\n\n return tagId\n .split(/[_-]/)\n .filter(Boolean)\n .map((segment) => `${segment[0]?.toUpperCase()}${segment.slice(1).toLowerCase()}`)\n .join(' ')\n}\n","import { readdir, readFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { parseAvdConfig } from './avd-config.ts'\nimport type { DirectoryReader, InstalledAvd, ListInstalledAvdsDependencies } from './emulator-types.ts'\n\nexport async function defaultReadDirectory(directoryPath: string) {\n return readdir(directoryPath, { withFileTypes: true })\n}\n\nexport async function defaultReadTextFile(filePath: string) {\n return readFile(filePath, 'utf8')\n}\n\nexport async function listInstalledAvds({\n getHomeDirectory = homedir,\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n}: ListInstalledAvdsDependencies = {}): Promise<InstalledAvd[]> {\n const avdRootDirectory = join(getHomeDirectory(), '.android', 'avd')\n const avdEntryNames = await listEntryNames(avdRootDirectory, readDirectory)\n const registeredAvdNames = new Set(\n avdEntryNames.filter((name) => name.endsWith('.ini')).map((name) => name.slice(0, -'.ini'.length)),\n )\n const avdDirectoryNames = avdEntryNames.filter(\n (name) => name.endsWith('.avd') && registeredAvdNames.has(name.slice(0, -'.avd'.length)),\n )\n const avds = await Promise.all(\n avdDirectoryNames.map(async (directoryName) => {\n const configPath = join(avdRootDirectory, directoryName, 'config.ini')\n const name = directoryName.slice(0, -'.avd'.length)\n let configValues: Record<string, string> = {}\n\n try {\n configValues = parseAvdConfig(await readTextFile(configPath))\n } catch {\n configValues = {}\n }\n\n return {\n device: configValues['hw.device.name'],\n name,\n target: configValues.target,\n }\n }),\n )\n\n return avds.sort((left, right) => left.name.localeCompare(right.name))\n}\n\nasync function listEntryNames(directoryPath: string, readDirectory: DirectoryReader): Promise<string[]> {\n try {\n return (await readDirectory(directoryPath))\n .map((entry) => entry.name)\n .sort((left, right) => left.localeCompare(right))\n } catch {\n return []\n }\n}\n","import { access } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { InstalledAvd } from '../../emulator/data-access/emulator-types.ts'\nimport { listInstalledAvds } from '../../emulator/data-access/list-installed-avds.ts'\nimport type { DoctorCheckResult } from './doctor-check-result.ts'\nimport { type DoctorEnvironment, findExecutable } from './doctor-environment.ts'\n\nexport type AdbDevice = {\n attributes: Record<string, string>\n kind: 'emulator' | 'physical'\n serial: string\n state: string\n}\n\nexport function parseAdbDevices(output: string): AdbDevice[] {\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('List of devices attached'))\n .flatMap((line) => {\n const [serial, state, ...parts] = line.split(/\\s+/)\n if (!serial || !state) return []\n const attributes = Object.fromEntries(\n parts.flatMap((part) => {\n const index = part.indexOf(':')\n return index > 0 ? [[part.slice(0, index), part.slice(index + 1)]] : []\n }),\n )\n return [\n {\n attributes,\n kind: serial.startsWith('emulator-') ? ('emulator' as const) : ('physical' as const),\n serial,\n state,\n },\n ]\n })\n .sort((left, right) => left.serial.localeCompare(right.serial))\n}\n\nexport async function checkAndroidDevices(\n environment: DoctorEnvironment,\n adbAvailable: boolean,\n sdkRoot?: string,\n installedAvds?: InstalledAvd[],\n): Promise<DoctorCheckResult[]> {\n const resolvedInstalledAvds = installedAvds ?? (await listInstalledAvds())\n const avdNames = resolvedInstalledAvds.map(({ name }) => name)\n const avdCheck: DoctorCheckResult = {\n actual: avdNames.length ? `${avdNames.length} installed (${avdNames.join(', ')})` : 'none installed',\n category: 'emulator',\n message: avdNames.length\n ? `Detected ${avdNames.length} installed Android emulator(s).`\n : 'No Android emulators are installed.',\n name: 'Android emulators',\n recommendation: avdNames.length ? undefined : 'Create one with: npx solana-mobile emulator create',\n status: avdNames.length ? 'pass' : 'warn',\n }\n if (!adbAvailable)\n return [\n avdCheck,\n {\n actual: 'unknown',\n category: 'emulator',\n message: 'Running emulators cannot be checked without adb.',\n name: 'Running emulators',\n status: 'info',\n },\n {\n actual: 'unknown',\n category: 'device',\n message: 'Physical devices cannot be checked without adb.',\n name: 'Physical devices',\n status: 'info',\n },\n ]\n const adbExecutable = await findExecutable('adb', environment, sdkRoot ? [join(sdkRoot, 'platform-tools')] : [])\n if (!adbExecutable)\n return [\n avdCheck,\n {\n actual: 'unknown',\n category: 'emulator',\n message: 'Running emulators cannot be checked without adb.',\n name: 'Running emulators',\n status: 'info',\n },\n {\n actual: 'unknown',\n category: 'device',\n message: 'Physical devices cannot be checked without adb.',\n name: 'Physical devices',\n status: 'info',\n },\n ]\n let devices: AdbDevice[] = []\n try {\n const result = await environment.runCommand(adbExecutable, ['devices', '-l'])\n devices = parseAdbDevices(result.stdout)\n } catch {\n /* reported by adb check */\n }\n const emulators = devices.filter(({ kind }) => kind === 'emulator')\n const physical = devices.filter(({ kind }) => kind === 'physical')\n const running: DoctorCheckResult = {\n actual: emulators.length ? emulators.map(({ serial, state }) => `${serial} (${state})`).join(', ') : 'none',\n category: 'emulator',\n details: emulators.map(({ serial }) => `Serial: ${serial}`),\n message: emulators.length ? 'Detected running emulator instances.' : 'No emulator is currently running.',\n name: 'Running emulators',\n status: 'info',\n }\n const authorized = physical.filter(({ state }) => state === 'device')\n const problematic = physical.filter(({ state }) => state !== 'device')\n const recommendation = problematic.some(({ state }) => state === 'unauthorized')\n ? 'Unlock the phone and accept the USB debugging authorization dialog.'\n : problematic.length\n ? 'Reconnect the offline Android device and restart adb if necessary.'\n : undefined\n const physicalCheck: DoctorCheckResult = {\n actual: physical.length ? physical.map(formatPhysicalDevice).join(', ') : 'none connected',\n category: 'device',\n details: physical.map(({ serial }) => `Serial: ${serial}`),\n message: authorized.length\n ? `Detected ${authorized.length} authorized physical device(s).`\n : problematic.length\n ? 'A physical device is connected but unavailable.'\n : 'No physical Android device is connected.',\n name: 'Physical devices',\n recommendation,\n status: authorized.length ? 'pass' : problematic.length ? 'warn' : 'info',\n }\n return [avdCheck, running, physicalCheck]\n}\n\nexport async function checkEmulatorAcceleration(environment: DoctorEnvironment): Promise<DoctorCheckResult> {\n const platform = environment.getPlatform()\n if (platform === 'darwin')\n return {\n actual: 'Hypervisor Framework available on supported Macs',\n category: 'emulator',\n message: 'macOS Android Emulator uses Hypervisor Framework when supported.',\n name: 'Emulator acceleration',\n status: 'info',\n }\n if (platform === 'linux') {\n const available = await access('/dev/kvm').then(\n () => true,\n () => false,\n )\n return {\n actual: available ? '/dev/kvm available' : '/dev/kvm unavailable',\n category: 'emulator',\n message: available ? 'KVM acceleration is available.' : 'KVM acceleration is unavailable or inaccessible.',\n name: 'Emulator acceleration',\n recommendation: available ? undefined : 'Enable KVM and grant the current user access to /dev/kvm.',\n status: available ? 'pass' : 'warn',\n }\n }\n return {\n actual: 'unknown',\n category: 'emulator',\n message: 'Emulator acceleration could not be determined reliably.',\n name: 'Emulator acceleration',\n status: 'info',\n }\n}\n\nfunction formatPhysicalDevice(device: AdbDevice) {\n const label = device.attributes.model?.replaceAll('_', ' ') ?? device.serial\n const state = device.state === 'device' ? 'authorized' : device.state\n return `${label} (${state})`\n}\n","import { basename, join } from 'node:path'\nimport type { DoctorCheckResult } from './doctor-check-result.ts'\nimport { type DoctorEnvironment, findExecutable, parseVersion, sortVersions } from './doctor-environment.ts'\n\nexport type AndroidSdkResolution = { conflict?: string; path?: string; searched: string[]; source?: string }\n\nexport async function resolveAndroidSdk(environment: DoctorEnvironment): Promise<AndroidSdkResolution> {\n const home = environment.getHomeDirectory()\n const defaults: Partial<Record<NodeJS.Platform, string>> = {\n darwin: join(home, 'Library', 'Android', 'sdk'),\n linux: join(home, 'Android', 'Sdk'),\n win32: environment.environment.LOCALAPPDATA\n ? join(environment.environment.LOCALAPPDATA, 'Android', 'Sdk')\n : undefined,\n }\n const candidates = [\n { path: environment.environment.ANDROID_HOME, source: 'ANDROID_HOME' },\n { path: environment.environment.ANDROID_SDK_ROOT, source: 'ANDROID_SDK_ROOT' },\n { path: defaults[environment.getPlatform()], source: 'default location' },\n ].filter((value): value is { path: string; source: string } => Boolean(value.path))\n const homeValue = environment.environment.ANDROID_HOME\n const rootValue = environment.environment.ANDROID_SDK_ROOT\n const conflict =\n homeValue && rootValue && homeValue !== rootValue ? `${homeValue} conflicts with ${rootValue}` : undefined\n for (const candidate of candidates) {\n if (await environment.pathExists(candidate.path)) {\n return {\n conflict,\n path: await environment.resolvePath(candidate.path).catch(() => candidate.path),\n searched: candidates.map(({ path }) => path),\n source: candidate.source,\n }\n }\n }\n return { conflict, searched: candidates.map(({ path }) => path) }\n}\n\nexport async function checkAndroidSdk(environment: DoctorEnvironment, resolution: AndroidSdkResolution) {\n const checks: DoctorCheckResult[] = []\n checks.push({\n actual: resolution.path ? `${resolution.path} (${resolution.source})` : 'not found',\n category: 'android-sdk',\n details: [`Searched: ${resolution.searched.join(', ') || 'no locations available'}`],\n message: resolution.path\n ? `Resolved Android SDK from ${resolution.source}.`\n : 'No valid Android SDK directory was found.',\n name: 'Android SDK',\n recommendation: resolution.path ? undefined : 'Install the Android SDK or set ANDROID_HOME to its location.',\n status: resolution.path ? 'pass' : 'fail',\n })\n if (resolution.conflict)\n checks.push({\n actual: resolution.conflict,\n category: 'android-sdk',\n message: 'ANDROID_HOME and ANDROID_SDK_ROOT point to different locations.',\n name: 'Android SDK environment',\n recommendation: 'Make ANDROID_HOME and ANDROID_SDK_ROOT point to the same Android SDK.',\n status: 'warn',\n })\n if (!resolution.path) return checks\n checks.push(\n await checkVersionDirectories(\n environment,\n resolution.path,\n 'platforms',\n 'Android platforms',\n 'android-',\n 'Install an Android SDK platform through Android Studio SDK Manager.',\n ),\n )\n checks.push(\n await checkVersionDirectories(\n environment,\n resolution.path,\n 'build-tools',\n 'Build Tools',\n '',\n 'Install Android SDK Build Tools through Android Studio SDK Manager.',\n ),\n )\n checks.push(\n await checkTool(\n environment,\n resolution.path,\n 'emulator',\n [join(resolution.path, 'emulator')],\n 'Emulator',\n 'Install Android Emulator through Android Studio SDK Manager.',\n 'warn',\n ),\n )\n const commandLineDirectories = await commandLineToolDirectories(environment, resolution.path)\n checks.push(\n await checkTool(\n environment,\n resolution.path,\n 'avdmanager',\n commandLineDirectories,\n 'avdmanager',\n 'Install Android SDK Command-line Tools; avdmanager is needed by solana-mobile emulator create.',\n 'warn',\n ),\n )\n const sdkManagerExecutable = await findExecutable('sdkmanager', environment, commandLineDirectories)\n const sdkManager = await checkTool(\n environment,\n resolution.path,\n 'sdkmanager',\n commandLineDirectories,\n 'sdkmanager',\n 'Install Android SDK Command-line Tools through Android Studio SDK Manager.',\n 'warn',\n sdkManagerExecutable,\n )\n checks.push(sdkManager)\n checks.push(await checkSdkLicenses(environment, sdkManagerExecutable))\n return checks\n}\n\nexport async function checkSdkLicenses(\n environment: DoctorEnvironment,\n sdkManagerExecutable?: string,\n): Promise<DoctorCheckResult> {\n const command = sdkManagerExecutable ?? 'sdkmanager'\n const instruction = `Run: ${command} --licenses`\n if (!sdkManagerExecutable)\n return {\n actual: 'unable to check',\n category: 'android-sdk',\n message: 'SDK licenses cannot be checked because sdkmanager is unavailable.',\n name: 'SDK licenses',\n recommendation: instruction,\n status: 'info',\n }\n try {\n const output = await environment.runCommand(sdkManagerExecutable, ['--licenses'])\n const status = parseSdkLicenseStatus(`${output.stdout}\\n${output.stderr}`)\n if (status === 'accepted')\n return {\n actual: 'all accepted',\n category: 'android-sdk',\n message: 'All Android SDK package licenses are accepted.',\n name: 'SDK licenses',\n status: 'pass',\n }\n return {\n actual: status === 'unaccepted' ? 'acceptance required' : 'unable to verify',\n category: 'android-sdk',\n message: 'Android SDK package licenses require attention.',\n name: 'SDK licenses',\n recommendation: instruction,\n status: status === 'unaccepted' ? 'warn' : 'info',\n }\n } catch {\n return {\n actual: 'unable to verify',\n category: 'android-sdk',\n message: 'Android SDK package license status could not be determined.',\n name: 'SDK licenses',\n recommendation: instruction,\n status: 'info',\n }\n }\n}\n\nexport function parseSdkLicenseStatus(output: string): 'accepted' | 'unaccepted' | 'unknown' {\n if (/all sdk package licenses accepted/i.test(output)) return 'accepted'\n if (/licenses?.*not been accepted|accept\\?\\s*\\(y\\/n\\)/is.test(output)) return 'unaccepted'\n return 'unknown'\n}\n\nasync function checkVersionDirectories(\n environment: DoctorEnvironment,\n sdkRoot: string,\n directory: string,\n name: string,\n prefix: string,\n recommendation: string,\n): Promise<DoctorCheckResult> {\n const entries = await environment.listDirectory(join(sdkRoot, directory)).catch(() => [])\n const versions = sortVersions(\n entries\n .map((entry) => (entry.startsWith(prefix) ? entry.slice(prefix.length) : entry))\n .filter((entry) => /^\\d+(?:\\.\\d+)*$/.test(entry)),\n )\n const actual = versions.length\n ? name === 'Android platforms'\n ? versions.map((version) => `API ${version}`).join(', ')\n : (versions.at(-1) ?? '')\n : 'none installed'\n return {\n actual,\n category: 'android-sdk',\n details: versions.map((version) => `${name}: ${version}`),\n message: versions.length\n ? `Detected ${versions.length} installed ${name.toLowerCase()} version(s).`\n : `No ${name} are installed.`,\n name,\n recommendation: versions.length ? undefined : recommendation,\n required: 'at least one installed version',\n status: versions.length ? 'pass' : 'fail',\n }\n}\n\nasync function commandLineToolDirectories(environment: DoctorEnvironment, sdkRoot: string) {\n const root = join(sdkRoot, 'cmdline-tools')\n const entries = await environment.listDirectory(root).catch(() => [])\n return entries.sort().map((entry) => join(root, entry, 'bin'))\n}\n\nasync function checkTool(\n environment: DoctorEnvironment,\n sdkRoot: string,\n command: string,\n directories: string[],\n name: string,\n recommendation: string,\n missingStatus: 'fail' | 'warn',\n resolvedExecutable?: string,\n): Promise<DoctorCheckResult> {\n const executable = resolvedExecutable ?? (await findExecutable(command, environment, directories))\n if (!executable)\n return {\n actual: 'not found',\n category: name === 'Emulator' ? 'emulator' : 'android-sdk',\n message: `${name} is not available.`,\n name,\n recommendation,\n status: missingStatus,\n }\n let version: string | undefined\n try {\n const output = await environment.runCommand(executable, ['-version'])\n version = parseVersion(`${output.stdout}\\n${output.stderr}`)\n } catch {\n version = undefined\n }\n return {\n actual: version ?? 'available',\n category: name === 'Emulator' ? 'emulator' : 'android-sdk',\n details: [`Executable: ${executable}`, `SDK root: ${sdkRoot}`],\n message: `${name} is available.`,\n name,\n status: 'pass',\n }\n}\n\nexport function parseAndroidApiLevels(entries: string[]) {\n return sortVersions(\n entries.filter((entry) => /^android-\\d+$/.test(entry)).map((entry) => entry.slice('android-'.length)),\n )\n}\nexport function selectHighestBuildToolsVersion(entries: string[]) {\n return sortVersions(entries.filter((entry) => /^\\d+(?:\\.\\d+)*$/.test(entry))).at(-1)\n}\nexport function parseEmulatorVersion(output: string) {\n return output.match(/Android emulator version\\s+(\\d+(?:\\.\\d+)*)/i)?.[1] ?? parseVersion(output)\n}\nexport function sdkComponentName(path: string) {\n return basename(path)\n}\n","import { join } from 'node:path'\nimport type { DoctorCheckResult } from './doctor-check-result.ts'\nimport { type DoctorEnvironment, findExecutable, parseVersion } from './doctor-environment.ts'\n\nexport function parseJavaVersion(output: string) {\n const quoted = output.match(/version\\s+\"([^\"]+)\"/i)?.[1]\n return quoted ? parseVersion(quoted) : parseVersion(output)\n}\n\nexport async function checkJava(environment: DoctorEnvironment): Promise<DoctorCheckResult[]> {\n const java = await checkJavaExecutable(environment)\n const compiler = await checkJavaCompiler(environment, java.status !== 'fail')\n const javaHome = await checkJavaHome(environment, java.status !== 'fail' && compiler.status !== 'fail')\n return [java, compiler, javaHome]\n}\n\nasync function checkJavaExecutable(environment: DoctorEnvironment): Promise<DoctorCheckResult> {\n const executable = await findExecutable('java', environment)\n if (!executable) return javaFailure('Java', 'Java is not available.', 'Install JDK 17 or higher.')\n try {\n const result = await environment.runCommand(executable, ['-version'])\n const version = parseJavaVersion(`${result.stdout}\\n${result.stderr}`)\n const passes = Boolean(version) && Number.parseInt(version ?? '', 10) >= 17\n return {\n actual: version ?? 'unknown',\n category: 'java',\n details: [`Executable: ${executable}`],\n message: version ? `Detected Java ${version}.` : 'Unable to parse the Java version.',\n name: 'Java',\n recommendation: passes ? undefined : 'Install JDK 17 or higher.',\n required: '17 or higher',\n status: passes ? 'pass' : 'fail',\n }\n } catch {\n return javaFailure('Java', 'Java is not usable.', 'Install JDK 17 or higher.')\n }\n}\n\nasync function checkJavaCompiler(environment: DoctorEnvironment, javaAvailable: boolean): Promise<DoctorCheckResult> {\n const executable = await findExecutable('javac', environment)\n if (!executable)\n return javaFailure(\n 'Java compiler',\n 'javac is not available.',\n 'Install a complete JDK 17 or higher, not only a JRE.',\n )\n try {\n const result = await environment.runCommand(executable, ['-version'])\n const version = parseJavaVersion(`${result.stdout}\\n${result.stderr}`)\n return {\n actual: version ?? 'available',\n category: 'java',\n details: [`Executable: ${executable}`],\n message: `Detected Java compiler ${version ?? ''}.`.trim(),\n name: 'Java compiler',\n required: 'JDK 17 or higher',\n status: javaAvailable ? 'pass' : 'fail',\n }\n } catch {\n return javaFailure('Java compiler', 'javac is not usable.', 'Install a complete JDK 17 or higher.')\n }\n}\n\nasync function checkJavaHome(environment: DoctorEnvironment, toolsAvailable: boolean): Promise<DoctorCheckResult> {\n const configured = environment.environment.JAVA_HOME\n if (!configured)\n return {\n actual: 'not set',\n category: 'java',\n message: 'JAVA_HOME is not set.',\n name: 'JAVA_HOME',\n recommendation: 'Set JAVA_HOME to your JDK path to make Java discovery deterministic.',\n status: toolsAvailable ? 'warn' : 'fail',\n }\n const resolved = await environment.resolvePath(configured).catch(() => configured)\n const javaPath = join(resolved, 'bin', environment.getPlatform() === 'win32' ? 'java.exe' : 'java')\n if (!(await environment.pathExists(resolved)) || !(await environment.pathExists(javaPath))) {\n return {\n actual: resolved,\n category: 'java',\n message: 'JAVA_HOME does not point to a usable JDK.',\n name: 'JAVA_HOME',\n recommendation:\n environment.getPlatform() === 'win32'\n ? 'Set JAVA_HOME to the installed JDK directory in Windows environment variables.'\n : 'Set JAVA_HOME to the installed JDK directory.',\n status: 'fail',\n }\n }\n return {\n actual: resolved,\n category: 'java',\n details: [`Java executable: ${javaPath}`],\n message: `JAVA_HOME resolves to ${resolved}.`,\n name: 'JAVA_HOME',\n status: 'pass',\n }\n}\n\nfunction javaFailure(name: string, message: string, recommendation: string): DoctorCheckResult {\n return {\n actual: 'not found',\n category: 'java',\n message,\n name,\n recommendation,\n required: '17 or higher',\n status: 'fail',\n }\n}\n","import type { DoctorCheckResult } from './doctor-check-result.ts'\n\nexport const minimumNodeMajorVersion = 22\n\nexport function checkNodeVersion(version = process.version): DoctorCheckResult {\n const normalizedVersion = normalizeNodeVersion(version)\n const majorVersion = Number.parseInt(normalizedVersion, 10)\n const passes = Boolean(normalizedVersion) && !Number.isNaN(majorVersion) && majorVersion >= minimumNodeMajorVersion\n return {\n actual: normalizedVersion || 'unknown',\n category: 'javascript',\n message: passes ? `Detected Node.js ${normalizedVersion}.` : 'Node.js 22 or higher is required.',\n name: 'Node.js',\n recommendation: passes ? undefined : 'Install Node.js 22 or higher.',\n required: '22 or higher',\n status: passes ? 'pass' : 'fail',\n }\n}\n\nexport function normalizeNodeVersion(version: string) {\n return version.trim().replace(/^v/i, '')\n}\n","import type { DoctorCheckResult } from './doctor-check-result.ts'\nimport type { DoctorEnvironment } from './doctor-environment.ts'\nimport { findExecutable, parseVersion } from './doctor-environment.ts'\n\nconst gigabyte = 1024 ** 3\n\nexport function checkOperatingSystem(environment: DoctorEnvironment): DoctorCheckResult {\n const names: Partial<Record<NodeJS.Platform, string>> = { darwin: 'macOS', linux: 'Linux', win32: 'Windows' }\n const platform = environment.getPlatform()\n const name = names[platform] ?? 'Unknown platform'\n const actual = `${name} ${environment.getRelease()} ${environment.architecture}`\n return {\n actual,\n category: 'system',\n message: `Detected ${actual}.`,\n name: 'Operating system',\n status: names[platform] ? 'pass' : 'info',\n }\n}\n\nexport async function checkDiskSpace(environment: DoctorEnvironment, path = process.cwd()): Promise<DoctorCheckResult> {\n try {\n const bytes = await environment.getDiskSpace(path)\n const available = bytes / gigabyte\n const status = available < 10 ? 'fail' : available < 20 ? 'warn' : 'pass'\n return {\n actual: `${Math.floor(available)} GB available`,\n category: 'system',\n message: `Detected ${Math.floor(available)} GB of available disk space.`,\n name: 'Disk space',\n recommendation:\n status === 'pass'\n ? undefined\n : 'Free disk space for Android SDK packages, emulator images, Gradle caches, and project dependencies.',\n required: '10 GB minimum; 20 GB recommended',\n status,\n }\n } catch {\n return {\n actual: 'unknown',\n category: 'system',\n message: 'Unable to determine available disk space.',\n name: 'Disk space',\n status: 'info',\n }\n }\n}\n\nconst packageManagers = [\n { command: 'bun', label: 'Bun' },\n { command: 'npm', label: 'npm' },\n { command: 'pnpm', label: 'pnpm' },\n { command: 'yarn', label: 'Yarn' },\n] as const\n\nexport async function checkPackageManagers(environment: DoctorEnvironment): Promise<DoctorCheckResult> {\n const found = (\n await Promise.all(\n packageManagers.map(async ({ command, label }) => {\n const executable = await findExecutable(command, environment)\n if (!executable) return undefined\n try {\n const result = await environment.runCommand(executable, ['--version'])\n return { detail: `${label}: ${executable}`, value: `${label} ${parseVersion(result.stdout) ?? 'unknown'}` }\n } catch {\n return undefined\n }\n }),\n )\n ).filter((value): value is { detail: string; value: string } => Boolean(value))\n return {\n actual: found.length ? found.map(({ value }) => value).join(', ') : 'none found',\n category: 'javascript',\n details: found.map(({ detail }) => detail),\n message: found.length\n ? `Detected ${found.length} supported package manager(s).`\n : 'No supported package manager found.',\n name: 'Package managers',\n recommendation: found.length ? undefined : 'Install npm, pnpm, Yarn, or Bun.',\n required: 'at least one of npm, pnpm, Yarn, or Bun',\n status: found.length ? 'pass' : 'fail',\n }\n}\n","import type {\n DoctorCheckCategory,\n DoctorCheckResult,\n DoctorCheckStatus,\n DoctorReport,\n} from '../data-access/doctor-check-result.ts'\n\nconst sections: { categories: DoctorCheckCategory[]; checks: string[]; title: string }[] = [\n { categories: ['system'], checks: ['Operating system', 'Disk space'], title: 'System' },\n { categories: ['javascript'], checks: ['Node.js', 'Package managers'], title: 'JavaScript' },\n { categories: ['java'], checks: ['Java', 'Java compiler', 'JAVA_HOME'], title: 'Java' },\n {\n categories: ['android-sdk'],\n checks: [\n 'Android SDK',\n 'Android SDK environment',\n 'Android platforms',\n 'Build Tools',\n 'adb',\n 'sdkmanager',\n 'avdmanager',\n 'SDK licenses',\n ],\n title: 'Android SDK',\n },\n {\n categories: ['emulator', 'device'],\n checks: ['Emulator', 'Android emulators', 'Running emulators', 'Emulator acceleration', 'Physical devices'],\n title: 'Devices',\n },\n]\n\nconst styles = {\n fail: ['\\u001b[31m', '\\u001b[39m'],\n heading: ['\\u001b[1m', '\\u001b[22m'],\n info: ['\\u001b[36m', '\\u001b[39m'],\n muted: ['\\u001b[2m', '\\u001b[22m'],\n pass: ['\\u001b[32m', '\\u001b[39m'],\n warn: ['\\u001b[33m', '\\u001b[39m'],\n} as const\n\nconst symbols: Record<DoctorCheckStatus, string> = { fail: '✗', info: '•', pass: '✓', warn: '!' }\n\nexport function renderDoctorReport(report: DoctorReport, verbose = false) {\n process.stdout.write(`${formatDoctorReport(report, verbose, Boolean(process.stdout.isTTY))}\\n`)\n}\n\nexport function formatDoctorReport(report: DoctorReport, verbose = false, color = false) {\n const output = [paint('Solana Mobile Doctor', 'heading', color)]\n\n for (const section of sections) {\n const checks = report.checks\n .filter(({ category }) => section.categories.includes(category))\n .sort((left, right) => checkOrder(section.checks, left.name) - checkOrder(section.checks, right.name))\n if (!checks.length) continue\n output.push('', paint(section.title, 'heading', color), ...formatChecks(checks, verbose, color))\n }\n\n const readiness: DoctorCheckResult[] = [\n capability('Project creation', report.capabilities.projectCreation),\n capability('Android build', report.capabilities.androidBuild),\n capability('Emulator workflow', report.capabilities.emulator),\n capability('Physical device workflow', report.capabilities.physicalDevice),\n ]\n output.push('', paint('Readiness', 'heading', color), ...formatChecks(readiness, false, color))\n\n if (report.recommendations.length) {\n output.push('', paint('Recommendations', 'heading', color))\n for (const { name, recommendation } of recommendationChecks(report))\n output.push(` ${paint('!', 'warn', color)} ${name}: ${recommendation}`)\n }\n\n const summaryStatus = report.ready ? 'pass' : report.capabilities.projectCreation ? 'warn' : 'fail'\n output.push('', `${paint(symbols[summaryStatus], summaryStatus, color)} ${finalMessage(report)}`)\n return output.join('\\n')\n}\n\nfunction capability(name: string, ready: boolean): DoctorCheckResult {\n return {\n actual: ready ? 'ready' : 'unavailable',\n category: 'system',\n message: '',\n name,\n status: ready ? 'pass' : 'info',\n }\n}\n\nfunction checkOrder(order: string[], name: string) {\n const index = order.indexOf(name)\n return index === -1 ? order.length : index\n}\n\nfunction finalMessage(report: DoctorReport) {\n if (report.capabilities.projectCreation && report.capabilities.androidBuild)\n return 'Ready for Solana Mobile development.'\n if (report.capabilities.projectCreation) return 'Project creation is ready; the Android environment needs attention.'\n return 'Not ready for Solana Mobile development.'\n}\n\nfunction formatChecks(checks: DoctorCheckResult[], verbose: boolean, color: boolean) {\n const labelWidth = Math.max(...checks.map(({ name }) => name.length))\n return checks.flatMap((check) => {\n const requirement = check.status === 'pass' || !check.required ? '' : ` (requires ${check.required})`\n const line = ` ${paint(symbols[check.status], check.status, color)} ${check.name.padEnd(labelWidth)} ${check.actual}${requirement}`\n if (!verbose || !check.details?.length) return [line]\n return [line, ...check.details.map((detail) => ` ${' '.repeat(labelWidth)} ${paint(detail, 'muted', color)}`)]\n })\n}\n\nfunction paint(value: string, style: keyof typeof styles, color: boolean) {\n if (!color) return value\n const [open, close] = styles[style]\n return `${open}${value}${close}`\n}\n\nfunction recommendationChecks(report: DoctorReport) {\n const seen = new Set<string>()\n return report.checks.filter(({ recommendation }) => {\n if (!recommendation || seen.has(recommendation)) return false\n seen.add(recommendation)\n return true\n }) as (DoctorCheckResult & { recommendation: string })[]\n}\n","import { checkAdbVersion } from './data-access/check-adb-version.ts'\nimport { checkAndroidDevices, checkEmulatorAcceleration } from './data-access/check-android-devices.ts'\nimport { checkAndroidSdk, resolveAndroidSdk } from './data-access/check-android-sdk.ts'\nimport { checkJava } from './data-access/check-java.ts'\nimport { checkNodeVersion } from './data-access/check-node-version.ts'\nimport {\n checkDiskSpace,\n checkOperatingSystem,\n checkPackageManagers,\n} from './data-access/check-system-and-javascript.ts'\nimport type { DoctorCapabilities, DoctorCheckResult, DoctorReport } from './data-access/doctor-check-result.ts'\nimport { type DoctorEnvironment, defaultDoctorEnvironment } from './data-access/doctor-environment.ts'\nimport { renderDoctorReport } from './ui/doctor-ui-report.ts'\n\nexport type DoctorCommandOptions = { json?: boolean; verbose?: boolean }\n\nexport async function createDoctorReport(\n environment: DoctorEnvironment = defaultDoctorEnvironment,\n): Promise<DoctorReport> {\n const [disk, packageManagers, java] = await Promise.all([\n checkDiskSpace(environment),\n checkPackageManagers(environment),\n checkJava(environment),\n ])\n const sdkResolution = await resolveAndroidSdk(environment)\n const [sdkChecks, adb, acceleration] = await Promise.all([\n checkAndroidSdk(environment, sdkResolution),\n checkAdbVersion(environment, sdkResolution.path),\n checkEmulatorAcceleration(environment),\n ])\n const deviceChecks = await checkAndroidDevices(environment, adb.status === 'pass', sdkResolution.path)\n const checks = [\n checkOperatingSystem(environment),\n disk,\n checkNodeVersion(),\n packageManagers,\n ...java,\n ...sdkChecks,\n adb,\n acceleration,\n ...deviceChecks,\n ]\n return buildDoctorReport(checks)\n}\n\nexport function buildDoctorReport(checks: DoctorCheckResult[]): DoctorReport {\n const capabilities = deriveCapabilities(checks)\n return {\n capabilities,\n checks,\n ready: capabilities.projectCreation && capabilities.androidBuild,\n recommendations: [...new Set(checks.flatMap(({ recommendation }) => (recommendation ? [recommendation] : [])))],\n }\n}\n\nexport function deriveCapabilities(checks: DoctorCheckResult[]): DoctorCapabilities {\n const passes = (name: string) => checks.some((check) => check.name === name && check.status === 'pass')\n const androidBuild = ['Android SDK', 'Android platforms', 'Build Tools', 'Java', 'Java compiler', 'adb'].every(passes)\n const projectCreation = ['Node.js', 'Package managers'].every(passes)\n return {\n androidBuild,\n emulator: androidBuild && ['Android emulators', 'Emulator', 'avdmanager'].every(passes),\n physicalDevice: androidBuild && passes('Physical devices'),\n projectCreation,\n }\n}\n\nexport async function runDoctor(options: DoctorCommandOptions = {}) {\n const report = await createDoctorReport()\n if (options.json) process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`)\n else renderDoctorReport(report, options.verbose)\n return getDoctorExitCode(report)\n}\n\nexport function getDoctorExitCode(report: DoctorReport) {\n return report.checks.some(({ status }) => status === 'fail') ? 1 : 0\n}\n","import { spawn } from 'node:child_process'\nimport { basename } from 'node:path'\nimport type { RunCommandOptions } from './emulator-types.ts'\n\nexport async function runExecutable(cmd: [string, ...string[]], options: RunCommandOptions = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd[0], cmd.slice(1), {\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const stderr: Buffer[] = []\n const stdout: Buffer[] = []\n\n child.stderr.on('data', (chunk) => {\n stderr.push(Buffer.from(chunk))\n })\n child.stdout.on('data', (chunk) => {\n stdout.push(Buffer.from(chunk))\n })\n child.on('error', reject)\n child.on('close', (exitCode) => {\n const stderrText = Buffer.concat(stderr).toString()\n const stdoutText = Buffer.concat(stdout).toString()\n\n if (exitCode !== 0) {\n reject(new Error(stderrText.trim() || stdoutText.trim() || `${basename(cmd[0])} exited with code ${exitCode}`))\n return\n }\n\n resolve(stdoutText)\n })\n\n child.stdin.end(options.stdin)\n })\n}\n","import { constants } from 'node:fs'\nimport { access, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport {\n createAvdConfigValues,\n getToolPaths,\n parseAvdConfig,\n parseSystemImagePackage,\n resolveCreateOptions,\n serializeAvdConfig,\n} from './avd-config.ts'\nimport type {\n CreateAvdDependencies,\n CreateAvdResult,\n EmulatorCreateCommandOptions,\n PathChecker,\n} from './emulator-types.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function createAvd(\n options: EmulatorCreateCommandOptions,\n {\n getHomeDirectory = homedir,\n pathExists = defaultPathExists(),\n readTextFile = defaultReadTextFile,\n runCommand = runExecutable,\n writeTextFile = defaultWriteTextFile,\n }: CreateAvdDependencies = {},\n): Promise<CreateAvdResult> {\n const resolvedOptions = resolveCreateOptions(options)\n const toolPaths = getToolPaths(resolvedOptions.sdkRoot)\n const homeDirectory = getHomeDirectory()\n const avdDirectory = join(homeDirectory, '.android', 'avd', `${resolvedOptions.name}.avd`)\n\n if (await pathExists(avdDirectory)) {\n return {\n created: false,\n emulatorPath: toolPaths.emulator,\n name: resolvedOptions.name,\n sdkRoot: resolvedOptions.sdkRoot,\n systemImage: resolvedOptions.systemImage,\n }\n }\n\n const { abi } = parseSystemImagePackage(resolvedOptions.systemImage)\n\n if (!(await isInstalledSystemImage(resolvedOptions.sdkRoot, resolvedOptions.systemImage, pathExists))) {\n await runCommand([toolPaths.sdkmanager, '--install', resolvedOptions.systemImage])\n }\n\n if (!(await isInstalledSystemImage(resolvedOptions.sdkRoot, resolvedOptions.systemImage, pathExists))) {\n throw new Error(`System image is not installed: ${resolvedOptions.systemImage}`)\n }\n\n const avdConfigPath = getAvdConfigPath(homeDirectory, resolvedOptions.name)\n\n await runCommand(\n [\n toolPaths.avdmanager,\n 'create',\n 'avd',\n '--abi',\n abi,\n '--device',\n resolvedOptions.device,\n '--force',\n '--name',\n resolvedOptions.name,\n '--package',\n resolvedOptions.systemImage,\n '--sdcard',\n resolvedOptions.sdcardSize,\n ],\n { stdin: 'no\\n' },\n )\n\n if (!(await pathExists(avdDirectory))) {\n throw new Error(`Emulator directory does not exist: ${avdDirectory}`)\n }\n\n const existingConfig = (await pathExists(avdConfigPath)) ? await readTextFile(avdConfigPath) : ''\n\n await writeTextFile(\n avdConfigPath,\n serializeAvdConfig({\n ...parseAvdConfig(existingConfig),\n ...createAvdConfigValues(resolvedOptions),\n }),\n )\n\n return {\n created: true,\n emulatorPath: toolPaths.emulator,\n name: resolvedOptions.name,\n sdkRoot: resolvedOptions.sdkRoot,\n systemImage: resolvedOptions.systemImage,\n }\n}\n\nexport function defaultPathExists(mode: number = constants.F_OK): PathChecker {\n return async (filePath: string) => {\n try {\n await access(filePath, mode)\n return true\n } catch {\n return false\n }\n }\n}\n\nexport async function defaultWriteTextFile(filePath: string, contents: string) {\n await mkdir(dirname(filePath), { recursive: true })\n await writeFile(filePath, contents)\n}\n\nfunction getAvdConfigPath(homeDirectory: string, avdName: string): string {\n return join(homeDirectory, '.android', 'avd', `${avdName}.avd`, 'config.ini')\n}\n\nfunction getSystemImageDirectory(sdkRoot: string, systemImage: string): string {\n return join(sdkRoot, ...systemImage.split(';'))\n}\n\nasync function defaultReadTextFile(filePath: string) {\n return readFile(filePath, 'utf8')\n}\n\nasync function isInstalledSystemImage(sdkRoot: string, systemImage: string, pathExists: PathChecker) {\n return pathExists(join(getSystemImageDirectory(sdkRoot, systemImage), 'source.properties'))\n}\n","import { spawn } from 'node:child_process'\nimport { getToolPaths } from './avd-config.ts'\nimport type { EmulatorStartCommandOptions, StartEmulatorDependencies } from './emulator-types.ts'\nimport { listInstalledAvds } from './list-installed-avds.ts'\nimport { resolveAndroidSdkRoot } from './resolve-android-sdk-root.ts'\n\nexport async function defaultStartProcess(cmd: [string, ...string[]]) {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(cmd[0], cmd.slice(1), {\n detached: true,\n stdio: 'ignore',\n })\n\n child.once('error', reject)\n child.once('spawn', () => {\n child.unref()\n resolve()\n })\n })\n}\n\nexport async function startEmulator(\n { name, sdkRoot = resolveAndroidSdkRoot() }: EmulatorStartCommandOptions,\n { getHomeDirectory, readDirectory, readTextFile, startProcess = defaultStartProcess }: StartEmulatorDependencies = {},\n): Promise<void> {\n if (!name) {\n throw new Error('Emulator name is required.')\n }\n\n const avds = await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile })\n\n if (!avds.some((avd) => avd.name === name)) {\n throw new Error(`Unknown emulator: ${name}`)\n }\n\n await startProcess([getToolPaths(sdkRoot).emulator, `@${name}`])\n}\n","import { cancel, isCancel } from '@clack/prompts'\n\nexport type MultiSelectPrompt = (options: {\n message: string\n options: Array<{ hint?: string; label: string; value: string }>\n required?: boolean\n}) => Promise<string[] | symbol>\n\nexport interface PromptDependencies {\n runMultiselect?: MultiSelectPrompt\n runSelect?: SelectPrompt\n runText?: TextPrompt\n}\n\nexport type SelectPrompt = (options: {\n message: string\n options: Array<{ hint?: string; label: string; value: string }>\n}) => Promise<string | symbol>\n\nexport type TextPrompt = (options: {\n defaultValue?: string\n initialValue?: string\n message: string\n placeholder?: string\n validate?: (value: string) => string | undefined\n}) => Promise<string | symbol>\n\nexport function resolvePromptCancellation(value: symbol): undefined {\n if (isCancel(value)) {\n cancel('Cancelled')\n process.exitCode = 1\n }\n\n return undefined\n}\n","import { text } from '@clack/prompts'\nimport { DEFAULT_PROFILE } from '../data-access/avd-config.ts'\nimport { resolvePromptCancellation, type TextPrompt } from './emulator-ui-prompt-types.ts'\n\nexport async function promptEmulatorName(\n defaultName: string = DEFAULT_PROFILE.name,\n runText: TextPrompt = text as TextPrompt,\n): Promise<string | undefined> {\n const selected = await runText({\n defaultValue: defaultName,\n initialValue: defaultName,\n message: 'Emulator name',\n validate: (value) => (value.trim().length > 0 ? undefined : 'Emulator name is required.'),\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected.trim()\n}\n","import { homedir } from 'node:os'\nimport { resolveEmulatorProfile } from './data-access/avd-config.ts'\nimport { createAvd, defaultPathExists, defaultWriteTextFile } from './data-access/create-avd.ts'\nimport type {\n CreateAvdDependencies,\n EmulatorCreateCommandOptions,\n StartEmulatorDependencies,\n} from './data-access/emulator-types.ts'\nimport { defaultReadDirectory, defaultReadTextFile } from './data-access/list-installed-avds.ts'\nimport { runExecutable } from './data-access/run-executable.ts'\nimport { defaultStartProcess, startEmulator } from './data-access/start-emulator.ts'\nimport { promptEmulatorName } from './ui/emulator-ui-prompt-emulator-name.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\n\ninterface RunEmulatorCreateDependencies extends CreateAvdDependencies, PromptDependencies, StartEmulatorDependencies {}\n\nexport async function runEmulatorCreate(\n options: EmulatorCreateCommandOptions = {},\n {\n getHomeDirectory = homedir,\n pathExists = defaultPathExists(),\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n runCommand = runExecutable,\n runText,\n startProcess = defaultStartProcess,\n writeTextFile = defaultWriteTextFile,\n }: RunEmulatorCreateDependencies = {},\n) {\n const profile = resolveEmulatorProfile(options.profile)\n const name = options.name ?? (await promptEmulatorName(profile.name, runText))\n\n if (!name) {\n return\n }\n\n console.log(`Preparing emulator: ${name}`)\n\n const result = await createAvd(\n {\n ...options,\n name,\n },\n {\n getHomeDirectory,\n pathExists,\n readTextFile,\n runCommand,\n writeTextFile,\n },\n )\n\n if (!result.created) {\n console.log(`Emulator already exists: ${result.name}`)\n console.log(`To recreate, delete it first with: solana-mobile emulator delete ${result.name}`)\n return\n }\n\n console.log(`Created emulator: ${result.name}`)\n\n if (options.start) {\n await startEmulator(\n { name: result.name, sdkRoot: result.sdkRoot },\n {\n getHomeDirectory,\n readDirectory,\n readTextFile,\n startProcess,\n },\n )\n console.log(`Started emulator: ${result.name}`)\n return\n }\n\n console.log(`Start with: solana-mobile emulator start ${result.name}`)\n}\n","import { getToolPaths } from './avd-config.ts'\nimport type { DeleteInstalledAvdsDependencies } from './emulator-types.ts'\nimport { resolveAndroidSdkRoot } from './resolve-android-sdk-root.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function deleteInstalledAvds(\n names: readonly string[],\n sdkRoot: string = resolveAndroidSdkRoot(),\n { runCommand = runExecutable }: DeleteInstalledAvdsDependencies = {},\n): Promise<void> {\n const { avdmanager } = getToolPaths(sdkRoot)\n const results = await Promise.allSettled(\n names.map((name) => runCommand([avdmanager, 'delete', 'avd', '--name', name])),\n )\n const failures = results.flatMap((result, index) => {\n if (result.status === 'fulfilled') {\n return []\n }\n\n const message = result.reason instanceof Error ? result.reason.message : String(result.reason)\n\n return [`${names[index]}: ${message}`]\n })\n\n if (failures.length > 0) {\n throw new Error(`Some emulators could not be deleted:\\n- ${failures.join('\\n- ')}`)\n }\n}\n","import { select } from '@clack/prompts'\nimport type { InstalledAvd } from '../data-access/emulator-types.ts'\nimport { resolvePromptCancellation, type SelectPrompt } from './emulator-ui-prompt-types.ts'\n\nexport function createInstalledEmulatorOption({ device, name, target }: InstalledAvd) {\n const hint = [device ? `device: ${device}` : undefined, target ? `target: ${target}` : undefined]\n .filter(Boolean)\n .join(', ')\n\n return {\n hint: hint || undefined,\n label: name,\n value: name,\n }\n}\n\nexport async function selectInstalledEmulatorName(\n avds: readonly InstalledAvd[],\n message: string,\n runSelect: SelectPrompt = select as SelectPrompt,\n): Promise<string | undefined> {\n if (avds.length === 0) {\n console.log('No Android emulators found.')\n return undefined\n }\n\n const selected = await runSelect({\n message,\n options: avds.map(createInstalledEmulatorOption),\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected\n}\n","import { multiselect } from '@clack/prompts'\nimport type { InstalledAvd } from '../data-access/emulator-types.ts'\nimport { type MultiSelectPrompt, resolvePromptCancellation } from './emulator-ui-prompt-types.ts'\nimport { createInstalledEmulatorOption } from './emulator-ui-select-installed-emulator-name.ts'\n\nexport async function selectInstalledEmulatorNames(\n avds: readonly InstalledAvd[],\n runMultiselect: MultiSelectPrompt = multiselect as MultiSelectPrompt,\n): Promise<string[] | undefined> {\n if (avds.length === 0) {\n console.log('No Android emulators found.')\n return undefined\n }\n\n const selected = await runMultiselect({\n message: 'Select emulators to delete',\n options: avds.map(createInstalledEmulatorOption),\n required: false,\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected\n}\n","import { homedir } from 'node:os'\nimport { deleteInstalledAvds } from './data-access/delete-installed-avds.ts'\nimport type {\n DeleteInstalledAvdsDependencies,\n EmulatorDeleteCommandOptions,\n ListInstalledAvdsDependencies,\n} from './data-access/emulator-types.ts'\nimport { defaultReadDirectory, defaultReadTextFile, listInstalledAvds } from './data-access/list-installed-avds.ts'\nimport { runExecutable } from './data-access/run-executable.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\nimport { selectInstalledEmulatorNames } from './ui/emulator-ui-select-installed-emulator-names.ts'\n\ninterface RunEmulatorDeleteDependencies\n extends DeleteInstalledAvdsDependencies,\n ListInstalledAvdsDependencies,\n PromptDependencies {}\n\nexport async function runEmulatorDelete(\n options: EmulatorDeleteCommandOptions,\n {\n getHomeDirectory = homedir,\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n runCommand = runExecutable,\n runMultiselect,\n }: RunEmulatorDeleteDependencies = {},\n) {\n const names =\n options.names && options.names.length > 0\n ? options.names\n : await selectInstalledEmulatorNames(\n await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile }),\n runMultiselect,\n )\n\n if (!names || names.length === 0) {\n return\n }\n\n await deleteInstalledAvds(names, options.sdkRoot, { runCommand })\n\n for (const name of names) {\n console.log(`Deleted emulator: ${name}`)\n }\n}\n","import type { InstalledAvd } from '../data-access/emulator-types.ts'\n\nexport function renderInstalledEmulators(avds: readonly InstalledAvd[]) {\n if (avds.length === 0) {\n console.log('No Android emulators found.')\n return\n }\n\n console.table(\n avds.map(({ device, name, target }) => ({\n device: device ?? '',\n name,\n target: target ?? '',\n })),\n ['device', 'name', 'target'],\n )\n}\n","import type { EmulatorListCommandOptions } from './data-access/emulator-types.ts'\nimport { listInstalledAvds } from './data-access/list-installed-avds.ts'\nimport { renderInstalledEmulators } from './ui/emulator-ui-render-installed-emulators.ts'\n\nexport async function runEmulatorList(_options: EmulatorListCommandOptions = {}) {\n renderInstalledEmulators(await listInstalledAvds())\n}\n","import { homedir } from 'node:os'\nimport type { EmulatorStartCommandOptions, StartEmulatorDependencies } from './data-access/emulator-types.ts'\nimport { defaultReadDirectory, defaultReadTextFile, listInstalledAvds } from './data-access/list-installed-avds.ts'\nimport { defaultStartProcess, startEmulator } from './data-access/start-emulator.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\nimport { selectInstalledEmulatorName } from './ui/emulator-ui-select-installed-emulator-name.ts'\n\ninterface RunEmulatorStartDependencies extends PromptDependencies, StartEmulatorDependencies {}\n\nexport async function runEmulatorStart(\n options: EmulatorStartCommandOptions = {},\n {\n getHomeDirectory = homedir,\n readDirectory = defaultReadDirectory,\n readTextFile = defaultReadTextFile,\n runSelect,\n startProcess = defaultStartProcess,\n }: RunEmulatorStartDependencies = {},\n) {\n const name =\n options.name ??\n (await selectInstalledEmulatorName(\n await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile }),\n 'Select an emulator to start',\n runSelect,\n ))\n\n if (!name) {\n return\n }\n\n await startEmulator(\n {\n name,\n sdkRoot: options.sdkRoot,\n },\n {\n getHomeDirectory,\n readDirectory,\n readTextFile,\n startProcess,\n },\n )\n console.log(`Started emulator: ${name}`)\n}\n","import type { EmulatorAdbDevice, ListRunningEmulatorsDependencies, RunningEmulator } from './emulator-types.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function listRunningEmulators({\n runCommand = runExecutable,\n}: ListRunningEmulatorsDependencies = {}): Promise<RunningEmulator[]> {\n const serials = parseAdbEmulatorDevices(await runCommand(['adb', 'devices']))\n .filter(({ state }) => state === 'device')\n .map(({ serial }) => serial)\n const runningEmulators = await Promise.all(\n serials.map(async (serial) => ({\n name: parseRunningEmulatorName(await runCommand(['adb', '-s', serial, 'emu', 'avd', 'name'])) ?? serial,\n serial,\n })),\n )\n\n return runningEmulators.sort(\n (left, right) => left.name.localeCompare(right.name) || left.serial.localeCompare(right.serial),\n )\n}\n\nexport function parseAdbEmulatorDevices(contents: string): EmulatorAdbDevice[] {\n return contents\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .filter(Boolean)\n .flatMap((line) => {\n if (line.startsWith('List of devices attached')) {\n return []\n }\n\n const [serial, state] = line.split(/\\s+/, 3)\n\n if (!serial?.startsWith('emulator-') || !state) {\n return []\n }\n\n return [\n {\n serial,\n state,\n },\n ]\n })\n .sort((left, right) => left.serial.localeCompare(right.serial))\n}\n\nexport function parseRunningEmulatorName(contents: string): string | undefined {\n return contents\n .split(/\\r?\\n/)\n .map((value) => value.trim())\n .find((value) => value.length > 0 && value !== 'OK')\n}\n","import type { CommandRunner, EmulatorStatus, ListEmulatorStatusesDependencies } from './emulator-types.ts'\nimport { listInstalledAvds } from './list-installed-avds.ts'\nimport { parseAdbEmulatorDevices, parseRunningEmulatorName } from './list-running-emulators.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function listEmulatorStatuses({\n getHomeDirectory,\n readDirectory,\n readTextFile,\n runCommand = runExecutable,\n}: ListEmulatorStatusesDependencies = {}): Promise<EmulatorStatus[]> {\n const installedAvds = await listInstalledAvds({ getHomeDirectory, readDirectory, readTextFile })\n const adbDevices = parseAdbEmulatorDevices(await runCommand(['adb', 'devices']))\n const adbStatuses = await Promise.all(\n adbDevices.map(async ({ serial, state }) => {\n const name = state === 'device' ? await resolveAdbEmulatorName(serial, runCommand) : undefined\n\n return {\n booted: await resolveBootCompleted(serial, state, runCommand),\n name,\n serial,\n state: renderAdbState(state),\n }\n }),\n )\n const statuses: EmulatorStatus[] = installedAvds.map(({ device, name, target }) => {\n const adbStatus = adbStatuses.find((status) => status.name === name)\n\n return {\n booted: adbStatus?.booted ?? 'no',\n device,\n name,\n serial: adbStatus?.serial,\n state: adbStatus?.state ?? 'offline',\n target,\n }\n })\n const installedNames = new Set(installedAvds.map(({ name }) => name))\n\n for (const adbStatus of adbStatuses) {\n if (adbStatus.name && installedNames.has(adbStatus.name)) {\n continue\n }\n\n statuses.push({\n booted: adbStatus.booted,\n name: adbStatus.name ?? '',\n serial: adbStatus.serial,\n state: adbStatus.state,\n })\n }\n\n return statuses.sort(\n (left, right) => left.name.localeCompare(right.name) || (left.serial ?? '').localeCompare(right.serial ?? ''),\n )\n}\n\nasync function resolveAdbEmulatorName(serial: string, runCommand: CommandRunner): Promise<string | undefined> {\n try {\n return parseRunningEmulatorName(await runCommand(['adb', '-s', serial, 'emu', 'avd', 'name']))\n } catch {\n return undefined\n }\n}\n\nasync function resolveBootCompleted(\n serial: string,\n state: string,\n runCommand: CommandRunner,\n): Promise<EmulatorStatus['booted']> {\n if (state !== 'device') {\n return 'unknown'\n }\n\n try {\n return (await runCommand(['adb', '-s', serial, 'shell', 'getprop', 'sys.boot_completed'])).trim() === '1'\n ? 'yes'\n : 'no'\n } catch {\n return 'unknown'\n }\n}\n\nfunction renderAdbState(state: string): string {\n return state === 'device' ? 'online' : state\n}\n","import type { EmulatorStatus } from '../data-access/emulator-types.ts'\n\nexport function renderEmulatorStatuses(statuses: readonly EmulatorStatus[]) {\n if (statuses.length === 0) {\n console.log('No Android emulators found.')\n return\n }\n\n console.table(\n statuses.map(({ booted, device, name, serial, state, target }) => ({\n booted,\n device: device ?? '',\n name,\n serial: serial ?? '',\n state,\n target: target ?? '',\n })),\n ['booted', 'device', 'name', 'serial', 'state', 'target'],\n )\n}\n","import type { EmulatorStatusCommandOptions } from './data-access/emulator-types.ts'\nimport { listEmulatorStatuses } from './data-access/list-emulator-statuses.ts'\nimport { renderEmulatorStatuses } from './ui/emulator-ui-render-emulator-statuses.ts'\n\nexport async function runEmulatorStatus(options: EmulatorStatusCommandOptions = {}) {\n const statuses = await listEmulatorStatuses()\n const visibleStatuses = options.nameOrSerial\n ? statuses.filter((status) => status.name === options.nameOrSerial || status.serial === options.nameOrSerial)\n : statuses\n\n if (options.nameOrSerial && visibleStatuses.length === 0) {\n console.error(`Unknown emulator: ${options.nameOrSerial}`)\n process.exitCode = 2\n return\n }\n\n renderEmulatorStatuses(visibleStatuses)\n\n if (options.nameOrSerial) {\n process.exitCode = visibleStatuses.some((status) => status.state === 'online' && status.booted === 'yes') ? 0 : 1\n }\n}\n","import type { RunningEmulator, StopEmulatorDependencies } from './emulator-types.ts'\nimport { listRunningEmulators } from './list-running-emulators.ts'\nimport { runExecutable } from './run-executable.ts'\n\nexport async function stopEmulator(\n nameOrSerial: string,\n { runCommand = runExecutable }: StopEmulatorDependencies = {},\n): Promise<RunningEmulator> {\n const runningEmulators = await listRunningEmulators({ runCommand })\n const matchingEmulators = runningEmulators.filter(\n (emulator) => emulator.name === nameOrSerial || emulator.serial === nameOrSerial,\n )\n\n if (matchingEmulators.length === 0) {\n throw new Error(`Emulator is not running: ${nameOrSerial}`)\n }\n\n if (matchingEmulators.length > 1) {\n throw new Error(`Multiple running emulators match ${nameOrSerial}. Stop by serial instead.`)\n }\n\n const emulator = matchingEmulators[0] as RunningEmulator\n\n await runCommand(['adb', '-s', emulator.serial, 'emu', 'kill'])\n\n return emulator\n}\n","import { select } from '@clack/prompts'\nimport type { RunningEmulator } from '../data-access/emulator-types.ts'\nimport { resolvePromptCancellation, type SelectPrompt } from './emulator-ui-prompt-types.ts'\n\nexport async function selectRunningEmulatorSerial(\n runningEmulators: readonly RunningEmulator[],\n runSelect: SelectPrompt = select as SelectPrompt,\n): Promise<string | undefined> {\n if (runningEmulators.length === 0) {\n console.log('No running Android emulators found.')\n return undefined\n }\n\n const selected = await runSelect({\n message: 'Select a running emulator to stop',\n options: runningEmulators.map(createRunningEmulatorOption),\n })\n\n if (typeof selected === 'symbol') {\n return resolvePromptCancellation(selected)\n }\n\n return selected\n}\n\nfunction createRunningEmulatorOption({ name, serial }: RunningEmulator) {\n return {\n hint: `serial: ${serial}`,\n label: name,\n value: serial,\n }\n}\n","import type { EmulatorStopCommandOptions, StopEmulatorDependencies } from './data-access/emulator-types.ts'\nimport { listRunningEmulators } from './data-access/list-running-emulators.ts'\nimport { runExecutable } from './data-access/run-executable.ts'\nimport { stopEmulator } from './data-access/stop-emulator.ts'\nimport type { PromptDependencies } from './ui/emulator-ui-prompt-types.ts'\nimport { selectRunningEmulatorSerial } from './ui/emulator-ui-select-running-emulator-serial.ts'\n\ninterface RunEmulatorStopDependencies extends PromptDependencies, StopEmulatorDependencies {}\n\nexport async function runEmulatorStop(\n options: EmulatorStopCommandOptions = {},\n { runCommand = runExecutable, runSelect }: RunEmulatorStopDependencies = {},\n) {\n const nameOrSerial =\n options.nameOrSerial ?? (await selectRunningEmulatorSerial(await listRunningEmulators({ runCommand }), runSelect))\n\n if (!nameOrSerial) {\n return\n }\n\n const stopped = await stopEmulator(nameOrSerial, { runCommand })\n\n console.log(`Stopped emulator: ${stopped.name} (${stopped.serial})`)\n}\n","import { Command, InvalidArgumentError } from 'commander'\nimport { readPackageMetadata } from './core/data-access/package-metadata.ts'\nimport { type CreateCommandOptions, parsePackageManagerOption, runCreate } from './create/create-feature-index.ts'\nimport type { DoctorCommandOptions } from './doctor/doctor-feature-index.ts'\nimport { runDoctor } from './doctor/doctor-feature-index.ts'\nimport {\n type EmulatorCreateCommandOptions,\n type EmulatorDeleteCommandOptions,\n type EmulatorListCommandOptions,\n type EmulatorStartCommandOptions,\n type EmulatorStatusCommandOptions,\n type EmulatorStopCommandOptions,\n runEmulatorCreate,\n runEmulatorDelete,\n runEmulatorList,\n runEmulatorStart,\n runEmulatorStatus,\n runEmulatorStop,\n} from './emulator/emulator-feature-index.ts'\n\nexport type AppOptions = {\n runEmulatorCreate?: (options: EmulatorCreateCommandOptions) => Promise<void>\n runEmulatorDelete?: (options: EmulatorDeleteCommandOptions) => Promise<void>\n runEmulatorList?: (options: EmulatorListCommandOptions) => Promise<void>\n runEmulatorStart?: (options: EmulatorStartCommandOptions) => Promise<void>\n runEmulatorStatus?: (options: EmulatorStatusCommandOptions) => Promise<void>\n runEmulatorStop?: (options: EmulatorStopCommandOptions) => Promise<void>\n runCreate?: (options: CreateCommandOptions) => Promise<void>\n runDoctor?: (options: DoctorCommandOptions) => Promise<number>\n}\n\nexport function createApp({\n runEmulatorCreate: runEmulatorCreateCommand = runEmulatorCreate,\n runEmulatorDelete: runEmulatorDeleteCommand = runEmulatorDelete,\n runEmulatorList: runEmulatorListCommand = runEmulatorList,\n runEmulatorStart: runEmulatorStartCommand = runEmulatorStart,\n runEmulatorStatus: runEmulatorStatusCommand = runEmulatorStatus,\n runEmulatorStop: runEmulatorStopCommand = runEmulatorStop,\n runCreate: runCreateCommand = runCreate,\n runDoctor: runDoctorCommand = runDoctor,\n}: AppOptions = {}) {\n const metadata = readPackageMetadata()\n const app = new Command()\n\n app\n .enablePositionalOptions()\n .name(metadata.name)\n .description(metadata.description)\n .showHelpAfterError()\n .version(metadata.version)\n\n app\n .command('create [projectName]')\n .description('Create a new Solana Mobile project')\n .option('--pm, --package-manager <packageManager>', 'Package manager to use', parsePackageManagerOption)\n .option('-d, --dry-run', 'Dry run')\n .option('-t, --template <templateName>', 'Use a template')\n .option('--list-template-ids', 'List available template ids as JSON array')\n .option('--list-templates', 'List available templates')\n .option('--list-versions', 'Verify your versions of Anchor, AVM, Rust, and Solana')\n .option('--minimal', 'Use the minimal template')\n .option('--skip-git', 'Skip git initialization')\n .option('--skip-init', 'Skip running the init script')\n .option('--skip-install', 'Skip installing dependencies')\n .option('-v, --verbose', 'Verbose output')\n .action(async (projectName: string | undefined, options: CreateCommandOptions) => {\n await runCreateCommand({\n ...options,\n projectName,\n template: options.template ?? (options.minimal ? 'kit-expo-minimal' : undefined),\n })\n })\n\n app\n .command('doctor')\n .description('Check local development dependencies')\n .option('--json', 'Print a stable JSON report')\n .option('--verbose', 'Include resolved paths and diagnostic details')\n .action(async (options: DoctorCommandOptions) => {\n process.exitCode = await runDoctorCommand(options)\n })\n\n const emulatorCommand = app.command('emulator').alias('emu').description('Manage Android emulators')\n\n emulatorCommand.action(() => {\n emulatorCommand.outputHelp()\n })\n\n emulatorCommand\n .command('create [name]')\n .description('Create or update an Android emulator')\n .option('--data-size <size>', 'Data partition size')\n .option('--device <device>', 'Android device profile id')\n .option('--profile <profile>', 'Solana Mobile emulator profile')\n .option('--ram-mb <megabytes>', 'RAM size in MB', parseIntegerOption)\n .option('--sdcard-size <size>', 'SD card size')\n .option('--sdk-root <path>', 'Android SDK root')\n .option('--start', 'Start the emulator after creating it')\n .option('--system-image <package>', 'Android system image package')\n .option('--vm-heap-mb <megabytes>', 'VM heap size in MB', parseIntegerOption)\n .action(async (name: string | undefined, options: Omit<EmulatorCreateCommandOptions, 'name'>) => {\n await runEmulatorCreateCommand({ ...options, name })\n })\n\n emulatorCommand\n .command('delete [names...]')\n .description('Delete Android emulators')\n .option('--sdk-root <path>', 'Android SDK root')\n .action(async (names: string[] | undefined, options: Omit<EmulatorDeleteCommandOptions, 'names'>) => {\n await runEmulatorDeleteCommand({ ...options, names: names ?? [] })\n })\n\n emulatorCommand\n .command('list')\n .description('List installed Android emulators')\n .action(async (options: EmulatorListCommandOptions) => {\n await runEmulatorListCommand(options)\n })\n\n emulatorCommand\n .command('start [name]')\n .description('Start an Android emulator')\n .option('--sdk-root <path>', 'Android SDK root')\n .action(async (name: string | undefined, options: Omit<EmulatorStartCommandOptions, 'name'>) => {\n await runEmulatorStartCommand({ ...options, name })\n })\n\n emulatorCommand\n .command('status [nameOrSerial]')\n .description('Show Android emulator status')\n .action(async (nameOrSerial: string | undefined) => {\n await runEmulatorStatusCommand({ nameOrSerial })\n })\n\n emulatorCommand\n .command('stop [nameOrSerial]')\n .description('Stop a running Android emulator')\n .action(async (nameOrSerial: string | undefined) => {\n await runEmulatorStopCommand({ nameOrSerial })\n })\n\n return app\n}\n\nexport async function runApp(argv = process.argv, options: AppOptions = {}) {\n const app = createApp(options)\n\n if (argv.slice(2).length === 0) {\n app.outputHelp()\n return\n }\n\n await app.parseAsync(argv)\n}\n\nfunction parseIntegerOption(value: string) {\n const parsed = Number(value)\n\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(`Expected a positive integer, received: ${value}`)\n }\n\n return parsed\n}\n","#!/usr/bin/env node\n\nimport { runApp } from './app.ts'\n\nrunApp().catch((error: unknown) => {\n console.error(error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|