import * as fs from 'fs/promises' import * as path from 'path' import { z } from 'zod' import { getConfigDir } from './config.js' import type { MarketV1ClientOptions } from './v1/client.js' const installationIdSchema = z.string().uuid() function installationIdPath(): string { return path.join(getConfigDir(), 'installation-id') } export async function getInstallationId(): Promise { try { return installationIdSchema.parse((await fs.readFile(installationIdPath(), 'utf-8')).trim()) } catch (error) { if (!isMissingFile(error)) throw error } const dir = getConfigDir() const installationId = crypto.randomUUID() await fs.mkdir(dir, { recursive: true }) await fs.chmod(dir, 0o700) await fs.writeFile(installationIdPath(), `${installationId}\n`, { encoding: 'utf-8', flag: 'wx', mode: 0o600, }) return installationId } export async function getCliSource(): Promise> { const analyticsDisabled = process.env.DO_NOT_TRACK === '1' || process.env.MARKET_TELEMETRY_DISABLED === '1' return { surface: 'cli', distinctId: analyticsDisabled ? undefined : await getInstallationId(), analyticsDisabled, } } function isMissingFile(error: unknown): boolean { return error instanceof Error && 'code' in error && error.code === 'ENOENT' }