@expo/event-log 0.0.1-init

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expo-event-log-cli.mjs","sources":["../src/commands/shared.ts","../src/commands/clean/index.ts","../src/commands/export/chromeTrace.ts","../src/commands/export/opentelemetry.ts","../src/commands/export/index.ts","../src/commands/extract/index.ts","../src/commands/inspect/trace.ts","../src/commands/inspect/index.ts","../src/commands/ps/index.ts","../src/commands/tap/index.ts","../src/cli.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport type { Readable } from 'node:stream';\nimport { parseArgs } from 'node:util';\n\nimport {\n compileEventFilter,\n matchesEventFilter,\n parseEventLine,\n parseSince,\n type ListedSession,\n} from '../tap';\nimport type { ParsedEvent } from '../types';\n\nexport const tapArgOptions = {\n since: { type: 'string' },\n filter: { type: 'string', multiple: true },\n tail: { type: 'boolean' },\n} as const;\n\nexport interface SharedTapOptions {\n since?: string;\n filter?: string[];\n follow: boolean;\n}\n\nexport function formatSessionProcessName(session: ListedSession) {\n return session.version\n ? `${session.command} (v${session.version}, PID ${session.pid})`\n : `${session.command} (PID ${session.pid})`;\n}\n\nexport async function* readJsonlFile(file: string) {\n yield* readJsonlStream(fs.createReadStream(file, { encoding: 'utf8' }));\n}\n\nexport async function* readJsonlStdin() {\n yield* readJsonlStream(process.stdin);\n}\n\nexport async function* readJsonlStream(stream: Readable) {\n const rl = createInterface({ input: stream });\n for await (const line of rl) {\n if (!line) continue;\n const event = parseEventLine(line);\n if (event) yield event;\n }\n}\n\nexport async function* filterEvents(\n events: AsyncIterable<ParsedEvent> | Iterable<ParsedEvent>,\n options: Pick<SharedTapOptions, 'since' | 'filter'>\n) {\n const eventFilter = compileEventFilter(options.filter);\n const since = parseSince(options.since);\n for await (const event of events) {\n if (matchesTapOptions(event, since, eventFilter)) yield event;\n }\n}\n\nexport function parseSharedTapOptions(values: {\n since?: string;\n filter?: string[];\n tail?: boolean;\n}): SharedTapOptions {\n return {\n since: values.since,\n filter: values.filter\n ?.flatMap(value => value.split(','))\n .map(item => item.trim())\n .filter(Boolean),\n follow: values.tail === true,\n };\n}\n\nexport function parseHelp(args: string[]) {\n return (\n parseArgs({\n args,\n allowPositionals: true,\n strict: false,\n options: {\n help: { type: 'boolean', short: 'h' },\n },\n }).values.help === true\n );\n}\n\nexport function parseJsonFlag(args: string[]) {\n return parseArgs({\n args,\n allowPositionals: true,\n options: {\n json: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n },\n }).values;\n}\n\nexport function parseDuration(value?: string) {\n if (value == null || value === '') return undefined;\n const input = value.trim().toLowerCase();\n if (!input) return undefined;\n\n let total = 0;\n let index = 0;\n const pattern =\n /(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h)?/gy;\n\n while (index < input.length) {\n pattern.lastIndex = index;\n const match = pattern.exec(input);\n if (!match) throw new Error(`Invalid duration: ${value}`);\n const amount = Number(match[1]);\n if (!Number.isFinite(amount)) throw new Error(`Invalid duration: ${value}`);\n total += amount * durationUnitToMs(match[2] ?? 'ms');\n index = pattern.lastIndex;\n while (input[index] === ' ' || input[index] === ',') index++;\n }\n\n return total;\n}\n\nexport function parsePort(value: string | undefined) {\n if (value == null) return undefined;\n const port = parseInteger(value, 'port');\n if (port < 0 || port > 65_535) throw new Error(`Invalid port: ${value}`);\n return port;\n}\n\nexport function parseNonNegativeNumber(\n value: string | undefined,\n label: string\n) {\n if (value == null) return undefined;\n const number = Number(value);\n if (!Number.isFinite(number) || number < 0)\n throw new Error(`Invalid ${label}: ${value}`);\n return number;\n}\n\nfunction parseInteger(value: string, label: string) {\n if (!/^\\d+$/.test(value)) throw new Error(`Invalid ${label}: ${value}`);\n const number = Number(value);\n if (!Number.isSafeInteger(number))\n throw new Error(`Invalid ${label}: ${value}`);\n return number;\n}\n\nfunction matchesTapOptions(\n event: ParsedEvent,\n since: number | undefined,\n eventFilter: RegExp | null\n) {\n if (since != null && event._t < since) return false;\n return matchesEventFilter(event._e, eventFilter);\n}\n\nfunction durationUnitToMs(unit: string) {\n if (\n unit === 'ms' ||\n unit === 'msec' ||\n unit === 'msecs' ||\n unit === 'millisecond' ||\n unit === 'milliseconds'\n )\n return 1;\n if (\n unit === 's' ||\n unit === 'sec' ||\n unit === 'secs' ||\n unit === 'second' ||\n unit === 'seconds'\n )\n return 1000;\n if (\n unit === 'm' ||\n unit === 'min' ||\n unit === 'mins' ||\n unit === 'minute' ||\n unit === 'minutes'\n )\n return 60_000;\n if (\n unit === 'h' ||\n unit === 'hr' ||\n unit === 'hrs' ||\n unit === 'hour' ||\n unit === 'hours'\n )\n return 3_600_000;\n throw new Error(`Invalid duration unit: ${unit}`);\n}\n","import { cleanStaleSessionsSync } from '../../clean';\nimport { redirectConsoleToStderr } from '../../utils/redirectConsole';\nimport { parseJsonFlag } from '../shared';\n\nexport function runCleanCli(args: string[] = []) {\n const options = parseJsonFlag(args);\n if (options.json) redirectConsoleToStderr();\n const removed = cleanStaleSessionsSync();\n process.stdout.write(\n options.json\n ? `${JSON.stringify({ removed })}\\n`\n : `Removed ${removed} stale sessions.\\n`\n );\n}\n\nexport function printCleanHelp() {\n process.stdout.write(\n ['Usage: event-log clean', '', 'Options:', ' --json', ''].join('\\n')\n );\n}\n","import type { ParsedEvent } from '../../types';\n\nexport interface ConvertToChromeTraceOptions {\n processName?: string;\n pid?: number;\n}\n\nexport interface TraceFile {\n traceEvents: TraceEvent[];\n metadata: {\n source: 'expo-event-log';\n version: string;\n convertedAt: string;\n };\n}\n\nexport type TraceEvent = TraceComplete | TraceInstant | TraceMetadata;\n\nexport interface TraceComplete {\n ph: 'X';\n name: string;\n cat: string;\n pid: number;\n tid: number;\n ts: number;\n dur: number;\n args?: Record<string, unknown>;\n}\n\nexport interface TraceInstant {\n ph: 'i';\n name: string;\n cat: string;\n pid: number;\n tid: number;\n ts: number;\n s: 'g' | 'p' | 't';\n args?: Record<string, unknown>;\n}\n\nexport interface TraceMetadata {\n ph: 'M';\n name: 'process_name' | 'thread_name';\n pid: number;\n tid?: number;\n args: Record<string, unknown>;\n}\n\nconst STRIP_SUFFIXES = [':started', ':done', ':failed'];\n\nexport async function convertToChromeTrace(\n events: Iterable<ParsedEvent> | AsyncIterable<ParsedEvent>,\n options: ConvertToChromeTraceOptions = {}\n): Promise<TraceFile> {\n const converter = new TraceConverter(options);\n for await (const event of toAsyncIterable(events)) {\n converter.add(event);\n }\n return converter.toTraceFile();\n}\n\nexport class TraceConverter {\n readonly traceEvents: TraceEvent[] = [];\n #categoryTids = new Map<string, number>();\n #nextTid = 1;\n #pid: number;\n #processName: string;\n #version = '0.1.0';\n\n constructor(options: ConvertToChromeTraceOptions = {}) {\n this.#pid = options.pid ?? 1;\n this.#processName = options.processName ?? 'event log';\n this.traceEvents.push({\n ph: 'M',\n name: 'process_name',\n pid: this.#pid,\n args: { name: this.#processName },\n });\n }\n\n add(event: ParsedEvent) {\n if (event._e === 'root:init') {\n if (typeof event.version === 'string') this.#version = event.version;\n if (\n this.#processName === 'event log' &&\n typeof event.version === 'string'\n ) {\n this.#processName = `event log (v${event.version})`;\n }\n this.traceEvents.push({\n ph: 'M',\n name: 'process_name',\n pid: this.#pid,\n args: { name: this.#processName },\n });\n return;\n }\n\n const parsed = splitEventName(event._e);\n if (!parsed) return;\n\n const tid = this.#getTid(\n parsed.category,\n typeof event._w === 'string' ? event._w : undefined\n );\n const args = extractArgs(event);\n\n if (typeof event._d === 'number') {\n this.traceEvents.push({\n ph: 'X',\n name: stripSuffix(parsed.name),\n cat: parsed.category,\n pid: this.#pid,\n tid,\n ts: Math.round((event._t - event._d) * 1000),\n dur: Math.round(event._d * 1000),\n args,\n });\n } else {\n this.traceEvents.push({\n ph: 'i',\n name: stripSuffix(parsed.name),\n cat: parsed.category,\n pid: this.#pid,\n tid,\n ts: Math.round(event._t * 1000),\n s: event._e.endsWith(':progress') ? 't' : 'g',\n args,\n });\n }\n }\n\n toTraceFile(): TraceFile {\n return {\n traceEvents: this.traceEvents,\n metadata: {\n source: 'expo-event-log',\n version: this.#version,\n convertedAt: new Date().toISOString(),\n },\n };\n }\n\n #getTid(category: string, worker?: string) {\n const key = worker ? `${category}:${worker}` : category;\n let tid = this.#categoryTids.get(key);\n if (tid == null) {\n tid = this.#nextTid++;\n this.#categoryTids.set(key, tid);\n this.traceEvents.push({\n ph: 'M',\n name: 'thread_name',\n pid: this.#pid,\n tid,\n args: { name: worker ? `${category} ${worker}` : category },\n });\n }\n return tid;\n }\n}\n\nexport function convertEventToTraceEvents(\n event: ParsedEvent,\n converter = new TraceConverter()\n): TraceEvent[] {\n const start = converter.traceEvents.length;\n converter.add(event);\n return converter.traceEvents.slice(start);\n}\n\nfunction splitEventName(value: string) {\n const index = value.indexOf(':');\n if (index < 1) return null;\n return {\n category: value.slice(0, index),\n name: value.slice(index + 1),\n };\n}\n\nfunction stripSuffix(name: string) {\n for (const suffix of STRIP_SUFFIXES) {\n if (name.endsWith(suffix)) return name.slice(0, -suffix.length);\n }\n return name;\n}\n\nfunction extractArgs(event: ParsedEvent) {\n const args: Record<string, unknown> = {};\n for (const key of Object.keys(event)) {\n if (key === '_e' || key === '_t' || key === '_d') continue;\n args[key] = event[key];\n }\n return Object.keys(args).length ? args : undefined;\n}\n\nasync function* toAsyncIterable<T>(events: Iterable<T> | AsyncIterable<T>) {\n if (Symbol.asyncIterator in events) {\n yield* events;\n } else {\n yield* events;\n }\n}\n","import crypto from 'node:crypto';\n\nimport type { ParsedEvent } from '../../types';\n\nexport interface ConvertToOpenTelemetryOptions {\n processName?: string;\n pid?: number;\n}\n\nexport interface OpenTelemetryFile {\n resourceSpans: OpenTelemetryResourceSpan[];\n}\n\ninterface OpenTelemetryResourceSpan {\n resource: {\n attributes: OpenTelemetryAttribute[];\n };\n scopeSpans: Array<{\n scope: {\n name: string;\n };\n spans: OpenTelemetrySpan[];\n }>;\n}\n\ninterface OpenTelemetrySpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes?: OpenTelemetryAttribute[];\n events?: OpenTelemetrySpanEvent[];\n}\n\ninterface OpenTelemetrySpanEvent {\n timeUnixNano: string;\n name: string;\n attributes?: OpenTelemetryAttribute[];\n}\n\ninterface OpenTelemetryAttribute {\n key: string;\n value: OpenTelemetryAnyValue;\n}\n\ntype OpenTelemetryAnyValue =\n | { stringValue: string }\n | { intValue: string }\n | { doubleValue: number }\n | { boolValue: boolean }\n | { arrayValue: { values: OpenTelemetryAnyValue[] } }\n | { kvlistValue: { values: OpenTelemetryAttribute[] } };\n\nconst STRIP_SUFFIXES = [':started', ':done', ':failed'];\n\nexport async function convertToOpenTelemetry(\n events: Iterable<ParsedEvent> | AsyncIterable<ParsedEvent>,\n options: ConvertToOpenTelemetryOptions = {}\n): Promise<OpenTelemetryFile> {\n const converter = new OpenTelemetryConverter(options);\n for await (const event of toAsyncIterable(events)) {\n converter.add(event);\n }\n return converter.toFile();\n}\n\nclass OpenTelemetryConverter {\n readonly #traceId = crypto.randomBytes(16).toString('hex');\n readonly #sessionSpanId = createSpanId();\n readonly #spans: OpenTelemetrySpan[] = [];\n readonly #events: OpenTelemetrySpanEvent[] = [];\n #processName: string;\n #version = '0.1.0';\n #startTimeUnixNano: string | undefined;\n #endTimeUnixNano: string | undefined;\n\n constructor(private readonly options: ConvertToOpenTelemetryOptions) {\n this.#processName = options.processName ?? 'event log';\n }\n\n add(event: ParsedEvent) {\n const eventTime = unixNano(event._t);\n this.#startTimeUnixNano =\n this.#startTimeUnixNano == null ||\n BigInt(eventTime) < BigInt(this.#startTimeUnixNano)\n ? eventTime\n : this.#startTimeUnixNano;\n this.#endTimeUnixNano =\n this.#endTimeUnixNano == null ||\n BigInt(eventTime) > BigInt(this.#endTimeUnixNano)\n ? eventTime\n : this.#endTimeUnixNano;\n\n if (event._e === 'root:init') {\n if (typeof event.version === 'string') this.#version = event.version;\n if (\n this.#processName === 'event log' &&\n typeof event.version === 'string'\n ) {\n this.#processName = `event log (v${event.version})`;\n }\n return;\n }\n\n if (typeof event._d === 'number') {\n this.#spans.push(this.#createSpan(event));\n } else {\n this.#events.push(this.#createEvent(event));\n }\n }\n\n toFile(): OpenTelemetryFile {\n const startTimeUnixNano = this.#startTimeUnixNano ?? unixNano(Date.now());\n const endTimeUnixNano = this.#endTimeUnixNano ?? startTimeUnixNano;\n return {\n resourceSpans: [\n {\n resource: {\n attributes: attributes({\n 'service.name': this.#processName,\n 'service.version': this.#version,\n 'process.pid': this.options.pid,\n 'telemetry.sdk.name': '@expo/event-log',\n 'telemetry.sdk.language': 'nodejs',\n }),\n },\n scopeSpans: [\n {\n scope: { name: '@expo/event-log' },\n spans: [\n {\n traceId: this.#traceId,\n spanId: this.#sessionSpanId,\n name: this.#processName,\n startTimeUnixNano,\n endTimeUnixNano,\n attributes: attributes({\n 'event_log.kind': 'session',\n }),\n events: this.#events.length ? this.#events : undefined,\n },\n ...this.#spans,\n ],\n },\n ],\n },\n ],\n };\n }\n\n #createSpan(event: ParsedEvent): OpenTelemetrySpan {\n const parsed = splitEventName(event._e);\n const startTimeUnixNano = unixNano(event._t - event._d!);\n const endTimeUnixNano = unixNano(event._t);\n return {\n traceId: this.#traceId,\n spanId: createSpanId(),\n parentSpanId: this.#sessionSpanId,\n name: parsed ? stripSuffix(parsed.name) : event._e,\n startTimeUnixNano,\n endTimeUnixNano,\n attributes: eventAttributes(event, parsed),\n };\n }\n\n #createEvent(event: ParsedEvent): OpenTelemetrySpanEvent {\n const parsed = splitEventName(event._e);\n return {\n timeUnixNano: unixNano(event._t),\n name: parsed ? stripSuffix(parsed.name) : event._e,\n attributes: eventAttributes(event, parsed),\n };\n }\n}\n\nfunction eventAttributes(\n event: ParsedEvent,\n parsed: ReturnType<typeof splitEventName>\n) {\n const values: Record<string, unknown> = {\n 'event.name': event._e,\n };\n if (parsed) {\n values['event.category'] = parsed.category;\n values['event.action'] = parsed.name;\n }\n if (typeof event._w === 'string') values['event.worker.id'] = event._w;\n\n for (const key of Object.keys(event)) {\n if (key === '_e' || key === '_t' || key === '_d' || key === '_w') continue;\n values[`event_log.${key}`] = event[key];\n }\n\n return attributes(values);\n}\n\nfunction attributes(values: Record<string, unknown>): OpenTelemetryAttribute[] {\n const result: OpenTelemetryAttribute[] = [];\n for (const [key, value] of Object.entries(values)) {\n const converted = anyValue(value);\n if (converted) result.push({ key, value: converted });\n }\n return result;\n}\n\nfunction anyValue(value: unknown): OpenTelemetryAnyValue | null {\n if (typeof value === 'string') return { stringValue: value };\n if (typeof value === 'boolean') return { boolValue: value };\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) return null;\n return Number.isInteger(value)\n ? { intValue: String(value) }\n : { doubleValue: value };\n }\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.flatMap(item => {\n const converted = anyValue(item);\n return converted ? [converted] : [];\n }),\n },\n };\n }\n if (value && typeof value === 'object') {\n return {\n kvlistValue: {\n values: attributes(value as Record<string, unknown>),\n },\n };\n }\n return null;\n}\n\nfunction createSpanId() {\n return crypto.randomBytes(8).toString('hex');\n}\n\nfunction unixNano(timeMs: number) {\n return String(BigInt(Math.round(timeMs * 1_000_000)));\n}\n\nfunction splitEventName(value: string) {\n const index = value.indexOf(':');\n if (index < 1) return null;\n return {\n category: value.slice(0, index),\n name: value.slice(index + 1),\n };\n}\n\nfunction stripSuffix(name: string) {\n for (const suffix of STRIP_SUFFIXES) {\n if (name.endsWith(suffix)) return name.slice(0, -suffix.length);\n }\n return name;\n}\n\nasync function* toAsyncIterable<T>(events: Iterable<T> | AsyncIterable<T>) {\n if (Symbol.asyncIterator in events) {\n yield* events;\n } else {\n yield* events;\n }\n}\n","import fs from 'node:fs';\nimport { parseArgs } from 'node:util';\n\nimport { resolveSession, tap } from '../../tap';\nimport type { ParsedEvent } from '../../types';\nimport { redirectConsoleToStderr } from '../../utils/redirectConsole';\nimport {\n filterEvents,\n formatSessionProcessName,\n parseHelp,\n parseDuration,\n parseSharedTapOptions,\n readJsonlFile,\n readJsonlStdin,\n tapArgOptions,\n} from '../shared';\nimport { convertToChromeTrace } from './chromeTrace';\nimport { convertToOpenTelemetry } from './opentelemetry';\n\ntype ExportFormat = 'chrome-trace' | 'opentelemetry';\nconst DEFAULT_IDLE_TIMEOUT = 30_000;\n\nexport async function runExportCli(args: string[]) {\n if (parseHelp(args)) {\n printExportHelp();\n return;\n }\n const options = parseExportOptions(args);\n if (options.json) redirectConsoleToStderr();\n let events: AsyncIterable<ParsedEvent> | ParsedEvent[];\n let processName: string | undefined;\n let exportPid: number | undefined;\n\n if (options.selector) {\n const session = await resolveSession(options.selector);\n processName = formatSessionProcessName(session);\n exportPid = session.pid;\n events = tap(session.sessionDir, {\n follow: options.follow,\n timeout: options.timeout,\n idleTimeout: options.follow ? options.idleTimeout : undefined,\n });\n } else if (options.inputFile) {\n events = readJsonlFile(options.inputFile);\n } else {\n events = readJsonlStdin();\n }\n\n const filteredEvents = filterEvents(events, options);\n const file =\n options.format === 'opentelemetry'\n ? await convertToOpenTelemetry(filteredEvents, {\n pid: exportPid,\n processName,\n })\n : await convertToChromeTrace(filteredEvents, {\n pid: exportPid,\n processName,\n });\n const output = JSON.stringify(file, null, 2);\n if (options.output) fs.writeFileSync(options.output, `${output}\\n`);\n else process.stdout.write(`${output}\\n`);\n}\n\nfunction parseExportOptions(args: string[]) {\n const parsed = parseArgs({\n args,\n allowPositionals: true,\n options: {\n ...tapArgOptions,\n input: { type: 'string' },\n output: { type: 'string', short: 'o' },\n format: { type: 'string' },\n json: { type: 'boolean' },\n timeout: { type: 'string' },\n help: { type: 'boolean', short: 'h' },\n },\n });\n const tapOptions = parseSharedTapOptions(parsed.values);\n const timeout = parseDuration(parsed.values.timeout);\n\n const format = parsed.values.format ?? 'chrome-trace';\n if (!isExportFormat(format)) throw new Error(`Unsupported format: ${format}`);\n if (parsed.positionals[0] && parsed.values.input)\n throw new Error('Use either a session selector or --input, not both');\n if (timeout != null && !tapOptions.follow)\n throw new Error('Use --timeout only with --tail');\n\n return {\n selector: parsed.positionals[0],\n inputFile: parsed.values.input,\n output: parsed.values.output,\n format,\n since: tapOptions.since,\n filter: tapOptions.filter,\n follow: tapOptions.follow,\n timeout,\n idleTimeout: DEFAULT_IDLE_TIMEOUT,\n json: parsed.values.json ?? false,\n };\n}\n\nfunction isExportFormat(value: string): value is ExportFormat {\n return value === 'chrome-trace' || value === 'opentelemetry';\n}\n\nfunction printExportHelp() {\n process.stdout.write(\n [\n 'Usage: event-log export [selector]',\n '',\n 'Options:',\n ' selector Match by PID, command, or cwd',\n ' --input <file> Read JSONL events from a file',\n ' -o, --output <file> Write output to a file',\n ' --format <format> chrome-trace or opentelemetry',\n ' --json Print JSON output',\n ' --since <time> Duration, Unix time, or ISO date',\n ' --filter <pattern> category[:kind], wildcards allowed',\n ' --tail Follow live events after replaying history',\n ' --timeout <duration> Stop tailing after an absolute duration',\n ' Tail also stops after 30s without new events',\n '',\n ].join('\\n')\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { parseArgs } from 'node:util';\n\nimport ts from 'typescript';\nimport { redirectConsoleToStderr } from '../../utils/redirectConsole';\nimport { parseHelp } from '../shared';\n\nexport interface ExtractOptions {\n format?: 'dts' | 'json';\n output?: string;\n project?: string;\n}\n\ninterface ExtractedEvent {\n key: string;\n category: string;\n name: string;\n fields: Record<string, string>;\n optionalFields: string[];\n}\n\nexport function extractEventRegistry(options: ExtractOptions = {}) {\n const project = options.project ?? findTsconfig(process.cwd());\n if (!project) throw new Error('Could not find tsconfig.json');\n\n const config = ts.readConfigFile(project, ts.sys.readFile);\n if (config.error) throw new Error(formatDiagnostic(config.error));\n\n const parsed = ts.parseJsonConfigFileContent(\n config.config,\n ts.sys,\n path.dirname(project)\n );\n const program = ts.createProgram(parsed.fileNames, parsed.options);\n const checker = program.getTypeChecker();\n const registry = findEventRegistry(program, checker);\n if (!registry) throw new Error('Could not resolve EventRegistry');\n\n const events = registry\n .getProperties()\n .map(symbol => serializeRegistryEntry(symbol, checker))\n .sort((a, b) => a.key.localeCompare(b.key));\n\n return options.format === 'json'\n ? JSON.stringify(events, null, 2)\n : formatDts(events);\n}\n\nexport function runExtractCli(args: string[]) {\n if (parseHelp(args)) {\n printExtractHelp();\n return;\n }\n const parsed = parseArgs({\n args,\n options: {\n format: { type: 'string' },\n json: { type: 'boolean' },\n output: { type: 'string', short: 'o' },\n project: { type: 'string', short: 'p' },\n help: { type: 'boolean', short: 'h' },\n },\n });\n if (parsed.values.json && parsed.values.format === 'dts')\n throw new Error('Use either --json or --format dts, not both');\n if (parsed.values.json) redirectConsoleToStderr();\n const format = parsed.values.json ? 'json' : (parsed.values.format ?? 'dts');\n if (format !== 'dts' && format !== 'json')\n throw new Error(`Unsupported format: ${format}`);\n\n const options: ExtractOptions = {\n format,\n output: parsed.values.output,\n project: parsed.values.project,\n };\n\n const output = extractEventRegistry(options);\n if (options.output) fs.writeFileSync(options.output, `${output}\\n`);\n else process.stdout.write(`${output}\\n`);\n}\n\nfunction findEventRegistry(program: ts.Program, checker: ts.TypeChecker) {\n const ambient = checker\n .getAmbientModules()\n .find(symbol => symbol.getName() === '\"@expo/event-log\"');\n const ambientRegistry = ambient?.exports?.get('EventRegistry' as ts.__String);\n if (ambientRegistry) return checker.getDeclaredTypeOfSymbol(ambientRegistry);\n\n for (const sourceFile of program.getSourceFiles()) {\n if (isEventLogEntrypoint(sourceFile.fileName)) {\n const moduleSymbol = checker.getSymbolAtLocation(sourceFile);\n const registry = moduleSymbol?.exports?.get(\n 'EventRegistry' as ts.__String\n );\n if (registry) return checker.getDeclaredTypeOfSymbol(registry);\n }\n }\n\n for (const sourceFile of program.getSourceFiles()) {\n if (!/[\\\\/](@expo[\\\\/]event-log|event-log)[\\\\/]/.test(sourceFile.fileName))\n continue;\n let found: ts.InterfaceDeclaration | undefined;\n sourceFile.forEachChild(function visit(node) {\n if (ts.isInterfaceDeclaration(node) && node.name.text === 'EventRegistry')\n found = node;\n node.forEachChild(visit);\n });\n if (found) {\n const symbol = checker.getSymbolAtLocation(found.name);\n if (symbol) return checker.getDeclaredTypeOfSymbol(symbol);\n }\n }\n return null;\n}\n\nfunction isEventLogEntrypoint(fileName: string) {\n return /(?:^|[\\\\/])(?:src[\\\\/]index\\.ts|dist[\\\\/]event-log\\.d\\.ts)$/.test(\n fileName\n );\n}\n\nfunction serializeRegistryEntry(\n symbol: ts.Symbol,\n checker: ts.TypeChecker\n): ExtractedEvent {\n const key = symbol.getName().replace(/^\"|\"$/g, '');\n const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];\n const type = declaration\n ? checker.getTypeOfSymbolAtLocation(symbol, declaration)\n : undefined;\n const fields: Record<string, string> = {};\n const optionalFields: string[] = [];\n\n for (const field of type?.getProperties() ?? []) {\n const fieldDeclaration = field.valueDeclaration ?? field.declarations?.[0];\n if (!fieldDeclaration) continue;\n if ((field.flags & ts.SymbolFlags.Optional) !== 0)\n optionalFields.push(field.getName());\n fields[field.getName()] = checker.typeToString(\n checker.getTypeOfSymbolAtLocation(field, fieldDeclaration)\n );\n }\n\n const index = key.indexOf(':');\n return {\n key,\n category: index > -1 ? key.slice(0, index) : '',\n name: index > -1 ? key.slice(index + 1) : key,\n fields,\n optionalFields,\n };\n}\n\nfunction formatDts(events: ExtractedEvent[]) {\n const lines = [\n '// Auto-generated by @expo/event-log extract',\n '// Do not edit manually.',\n '',\n \"declare module '@expo/event-log' {\",\n ' interface EventRegistry {',\n ];\n\n for (const event of events) {\n lines.push(` '${event.key}': {`);\n for (const [name, type] of Object.entries(event.fields)) {\n const optional = event.optionalFields.includes(name) ? '?' : '';\n lines.push(` ${name}${optional}: ${type};`);\n }\n lines.push(' };');\n }\n\n lines.push(' }', '}');\n return lines.join('\\n');\n}\n\nfunction findTsconfig(start: string) {\n let dir = start;\n while (true) {\n const file = path.join(dir, 'tsconfig.json');\n if (fs.existsSync(file)) return file;\n const next = path.dirname(dir);\n if (next === dir) return null;\n dir = next;\n }\n}\n\nfunction formatDiagnostic(diagnostic: ts.Diagnostic) {\n return ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n}\n\nfunction printExtractHelp() {\n process.stdout.write(\n [\n 'Usage: event-log extract',\n '',\n 'Options:',\n ' -p, --project <file> tsconfig.json path',\n ' -o, --output <file> Write output to a file',\n ' --format <format> dts or json',\n ' --json Print JSON schema',\n '',\n ].join('\\n')\n );\n}\n","import type { ParsedEvent } from '../../types';\n\nexport type InspectTraceEvent = TraceComplete | TraceInstant | TraceMetadata;\n\ninterface TraceComplete {\n ph: 'X';\n name: string;\n cat: string;\n pid: number;\n tid: number;\n ts: number;\n dur: number;\n args?: Record<string, unknown>;\n}\n\ninterface TraceInstant {\n ph: 'i';\n name: string;\n cat: string;\n pid: number;\n tid: number;\n ts: number;\n s: 'g' | 'p' | 't';\n args?: Record<string, unknown>;\n}\n\ninterface TraceMetadata {\n ph: 'M';\n name: 'process_name' | 'thread_name';\n pid: number;\n tid?: number;\n args: Record<string, unknown>;\n}\n\nconst STRIP_SUFFIXES = [':started', ':done', ':failed'];\n\nexport class InspectTrace {\n readonly events: InspectTraceEvent[] = [];\n #categoryTids = new Map<string, number>();\n #nextTid = 1;\n #pid: number;\n #processName: string;\n\n constructor(options: { processName: string; pid?: number }) {\n this.#pid = options.pid ?? 1;\n this.#processName = options.processName;\n this.#push({\n ph: 'M',\n name: 'process_name',\n pid: this.#pid,\n args: { name: this.#processName },\n });\n }\n\n add(event: ParsedEvent): InspectTraceEvent[] {\n const start = this.events.length;\n\n if (event._e === 'root:init') {\n this.#push({\n ph: 'M',\n name: 'process_name',\n pid: this.#pid,\n args: { name: this.#processName },\n });\n return this.events.slice(start);\n }\n\n const parsed = splitEventName(event._e);\n if (!parsed) return [];\n\n const tid = this.#getTid(\n parsed.category,\n typeof event._w === 'string' ? event._w : undefined\n );\n const args = extractArgs(event);\n\n if (typeof event._d === 'number') {\n this.#push({\n ph: 'X',\n name: stripSuffix(parsed.name),\n cat: parsed.category,\n pid: this.#pid,\n tid,\n ts: Math.round((event._t - event._d) * 1000),\n dur: Math.round(event._d * 1000),\n args,\n });\n } else {\n this.#push({\n ph: 'i',\n name: stripSuffix(parsed.name),\n cat: parsed.category,\n pid: this.#pid,\n tid,\n ts: Math.round(event._t * 1000),\n s: event._e.endsWith(':progress') ? 't' : 'g',\n args,\n });\n }\n\n return this.events.slice(start);\n }\n\n #getTid(category: string, worker?: string) {\n const key = worker ? `${category}:${worker}` : category;\n let tid = this.#categoryTids.get(key);\n if (tid == null) {\n tid = this.#nextTid++;\n this.#categoryTids.set(key, tid);\n this.#push({\n ph: 'M',\n name: 'thread_name',\n pid: this.#pid,\n tid,\n args: { name: worker ? `${category} ${worker}` : category },\n });\n }\n return tid;\n }\n\n #push(event: InspectTraceEvent) {\n this.events.push(event);\n }\n}\n\nfunction splitEventName(value: string) {\n const index = value.indexOf(':');\n if (index < 1) return null;\n return {\n category: value.slice(0, index),\n name: value.slice(index + 1),\n };\n}\n\nfunction stripSuffix(name: string) {\n for (const suffix of STRIP_SUFFIXES) {\n if (name.endsWith(suffix)) return name.slice(0, -suffix.length);\n }\n return name;\n}\n\nfunction extractArgs(event: ParsedEvent) {\n const args: Record<string, unknown> = {};\n for (const key of Object.keys(event)) {\n if (key === '_e' || key === '_t' || key === '_d') continue;\n args[key] = event[key];\n }\n return Object.keys(args).length ? args : undefined;\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport http from 'node:http';\nimport { createInterface } from 'node:readline';\nimport type { Readable } from 'node:stream';\nimport type { Socket } from 'node:net';\nimport { parseArgs } from 'node:util';\n\nimport { LOG_EVENTS_ENV } from '../../constants';\nimport type { ParsedEvent } from '../../types';\nimport { parseHelp, parseNonNegativeNumber, parsePort } from '../shared';\nimport { InspectTrace, type InspectTraceEvent } from './trace';\n\nexport interface InspectOptions {\n command: string;\n args: string[];\n port?: number;\n host?: string;\n wait?: boolean;\n linger?: number;\n banner?: boolean;\n}\n\nexport function runInspectCli(args: string[]) {\n if (parseHelp(argsBeforeSeparator(args))) {\n printInspectHelp();\n return Promise.resolve(0);\n }\n return runInspectSidecar(parseInspectOptions(args));\n}\n\nexport async function runInspectSidecar(\n options: InspectOptions\n): Promise<number> {\n const port = options.port ?? 9229;\n const host = options.host ?? '127.0.0.1';\n const linger = options.linger ?? 5;\n const trace = new InspectTrace({ processName: options.command });\n const cdp = await CdpTraceServer.listen({\n host,\n port,\n command: options.command,\n });\n\n if (options.banner !== false) {\n process.stderr.write(\n `Debugger listening on ${cdp.url}\\nOpen chrome://inspect to connect.\\n`\n );\n }\n\n if (options.wait) await cdp.waitForClient();\n\n const child = spawnInspectedProcess(options.command, options.args);\n const forward = (signal: NodeJS.Signals) => child.process.kill(signal);\n process.once('SIGINT', () => forward('SIGINT'));\n process.once('SIGTERM', () => forward('SIGTERM'));\n process.once('SIGHUP', () => forward('SIGHUP'));\n\n const reader = readEvents(child.eventStream, event => {\n cdp.add(trace.add(event));\n });\n\n const exitCode = await waitForChild(child.process);\n await reader;\n cdp.add(trace.events);\n\n if (linger > 0)\n await new Promise(resolve => setTimeout(resolve, linger * 1000));\n await cdp.close();\n return exitCode;\n}\n\nfunction parseInspectOptions(args: string[]) {\n const separator = args.indexOf('--');\n const optionArgs = separator >= 0 ? args.slice(0, separator) : [];\n const commandArgs = separator >= 0 ? args.slice(separator + 1) : args;\n const parsed = parseArgs({\n args: optionArgs,\n options: {\n port: { type: 'string' },\n host: { type: 'string' },\n wait: { type: 'boolean' },\n linger: { type: 'string' },\n help: { type: 'boolean', short: 'h' },\n 'no-banner': { type: 'boolean' },\n },\n });\n\n if (!commandArgs.length)\n throw new Error('inspect requires -- <command> [args...]');\n return {\n port: parsePort(parsed.values.port) ?? 9229,\n host: parsed.values.host ?? '127.0.0.1',\n wait: parsed.values.wait ?? false,\n linger: parseNonNegativeNumber(parsed.values.linger, 'linger') ?? 5,\n banner: parsed.values['no-banner'] ? false : true,\n command: commandArgs[0],\n args: commandArgs.slice(1),\n };\n}\n\nfunction argsBeforeSeparator(args: string[]) {\n const separator = args.indexOf('--');\n return separator >= 0 ? args.slice(0, separator) : args;\n}\n\nfunction printInspectHelp() {\n process.stdout.write(\n [\n 'Usage: event-log inspect [options] -- <command> [args...]',\n '',\n 'Options:',\n ' --port <port> Inspector port, defaults to 9229',\n ' --host <host> Inspector host, defaults to 127.0.0.1',\n ' --wait Wait for a DevTools client before spawning',\n ' --linger <seconds> Keep inspector open after child exits',\n ' --no-banner Do not print inspector connection info',\n '',\n ].join('\\n')\n );\n}\n\nclass CdpTraceServer {\n readonly id = crypto.randomUUID();\n readonly #server: http.Server;\n readonly #clients = new Set<Socket>();\n readonly #frameBuffers = new Map<Socket, Buffer>();\n readonly #buffer: InspectTraceEvent[] = [];\n readonly #clientWaiters: Array<() => void> = [];\n #recording = false;\n\n private constructor(\n server: http.Server,\n readonly host: string,\n public port: number,\n readonly command: string\n ) {\n this.#server = server;\n }\n\n static listen(options: { host: string; port: number; command: string }) {\n const server = http.createServer();\n const cdp = new CdpTraceServer(\n server,\n options.host,\n options.port,\n options.command\n );\n server.on('request', (req, res) => cdp.#handleRequest(req, res));\n server.on('upgrade', (req, socket) =>\n cdp.#handleUpgrade(req, socket as Socket)\n );\n return new Promise<CdpTraceServer>((resolve, reject) => {\n server.once('error', reject);\n server.listen(options.port, options.host, () => {\n server.off('error', reject);\n const address = server.address();\n if (address && typeof address === 'object') cdp.port = address.port;\n resolve(cdp);\n });\n });\n }\n\n get url() {\n return `ws://${this.host}:${this.port}/${this.id}`;\n }\n\n add(events: InspectTraceEvent[]) {\n if (!events.length) return;\n if (!this.#recording || !this.#clients.size) {\n this.#buffer.push(...events);\n if (this.#buffer.length > 10_000)\n this.#buffer.splice(0, this.#buffer.length - 10_000);\n return;\n }\n this.#sendEvent('Tracing.dataCollected', { value: events });\n }\n\n waitForClient() {\n if (this.#clients.size) return Promise.resolve();\n return new Promise<void>(resolve => this.#clientWaiters.push(resolve));\n }\n\n close() {\n for (const client of this.#clients) client.destroy();\n return new Promise<void>(resolve => this.#server.close(() => resolve()));\n }\n\n #handleRequest(_req: http.IncomingMessage, res: http.ServerResponse) {\n const target = {\n id: this.id,\n type: 'node',\n title: this.command,\n description: '@expo/event-log inspect',\n webSocketDebuggerUrl: this.url,\n devtoolsFrontendUrl: `/devtools/inspector.html?ws=${this.host}:${this.port}/${this.id}`,\n };\n res.setHeader('content-type', 'application/json');\n res.end(JSON.stringify([target]));\n }\n\n #handleUpgrade(req: http.IncomingMessage, socket: Socket) {\n const key = req.headers['sec-websocket-key'];\n if (typeof key !== 'string') {\n socket.destroy();\n return;\n }\n\n const accept = crypto\n .createHash('sha1')\n .update(`${key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`)\n .digest('base64');\n\n socket.write(\n [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${accept}`,\n '',\n '',\n ].join('\\r\\n')\n );\n\n this.#clients.add(socket);\n for (const resolve of this.#clientWaiters.splice(0)) resolve();\n socket.on('data', chunk => this.#handleFrames(socket, Buffer.from(chunk)));\n socket.on('close', () => {\n this.#clients.delete(socket);\n this.#frameBuffers.delete(socket);\n });\n socket.on('error', () => {\n this.#clients.delete(socket);\n this.#frameBuffers.delete(socket);\n });\n }\n\n #handleFrames(socket: Socket, chunk: Buffer) {\n const pending = this.#frameBuffers.get(socket);\n const input = pending ? Buffer.concat([pending, chunk]) : chunk;\n let offset = 0;\n while (offset < input.length) {\n const frame = readFrame(input, offset);\n if (!frame) {\n this.#frameBuffers.set(socket, input.subarray(offset));\n return;\n }\n offset = frame.nextOffset;\n if (frame.opcode === 8) {\n socket.end();\n } else if (frame.opcode === 1) {\n this.#handleMessage(socket, frame.payload.toString('utf8'));\n }\n }\n this.#frameBuffers.delete(socket);\n }\n\n #handleMessage(socket: Socket, payload: string) {\n let message: { id?: number; method?: string };\n try {\n message = JSON.parse(payload);\n } catch {\n return;\n }\n\n if (message.method === 'Tracing.start') {\n this.#recording = true;\n this.#respond(socket, message.id);\n if (this.#buffer.length) {\n this.#sendEvent('Tracing.dataCollected', {\n value: this.#buffer.splice(0),\n });\n }\n } else if (message.method === 'Tracing.end') {\n this.#recording = false;\n this.#respond(socket, message.id);\n this.#sendEvent('Tracing.tracingComplete', {});\n } else {\n this.#respond(socket, message.id);\n }\n }\n\n #respond(socket: Socket, id?: number) {\n if (id != null) writeFrame(socket, JSON.stringify({ id, result: {} }));\n }\n\n #sendEvent(method: string, params: Record<string, unknown>) {\n const payload = JSON.stringify({ method, params });\n for (const client of this.#clients) writeFrame(client, payload);\n }\n}\n\nfunction spawnInspectedProcess(command: string, args: string[]) {\n const child = spawn(command, args, {\n stdio: ['inherit', 'inherit', 'inherit', 'pipe'],\n env: {\n ...process.env,\n [LOG_EVENTS_ENV]: '3',\n },\n });\n\n return {\n process: child,\n eventStream: child.stdio[3] as Readable,\n };\n}\n\nfunction readEvents(stream: Readable, onEvent: (event: ParsedEvent) => void) {\n const rl = createInterface({ input: stream });\n\n rl.on('line', line => {\n try {\n onEvent(JSON.parse(line));\n } catch {}\n });\n\n return new Promise<void>(resolve => rl.on('close', resolve));\n}\n\nfunction waitForChild(child: ChildProcess) {\n return new Promise<number>(resolve => {\n child.on('exit', (code, signal) => {\n if (typeof code === 'number') resolve(code);\n else resolve(signal ? 128 : 1);\n });\n });\n}\n\nfunction readFrame(buffer: Buffer, offset: number) {\n if (offset + 2 > buffer.length) return null;\n const first = buffer[offset];\n const second = buffer[offset + 1];\n const opcode = first & 0x0f;\n const masked = (second & 0x80) !== 0;\n let length = second & 0x7f;\n let header = offset + 2;\n\n if (length === 126) {\n if (header + 2 > buffer.length) return null;\n length = buffer.readUInt16BE(header);\n header += 2;\n } else if (length === 127) {\n if (header + 8 > buffer.length) return null;\n const bigLength = buffer.readBigUInt64BE(header);\n if (bigLength > BigInt(Number.MAX_SAFE_INTEGER)) return null;\n length = Number(bigLength);\n header += 8;\n }\n\n const maskOffset = header;\n if (masked) header += 4;\n if (header + length > buffer.length) return null;\n\n const payload = Buffer.from(buffer.subarray(header, header + length));\n if (masked) {\n const mask = buffer.subarray(maskOffset, maskOffset + 4);\n for (let i = 0; i < payload.length; i++) payload[i] ^= mask[i % 4];\n }\n\n return { opcode, payload, nextOffset: header + length };\n}\n\nfunction writeFrame(socket: Socket, payload: string) {\n const body = Buffer.from(payload);\n let header: Buffer;\n if (body.length < 126) {\n header = Buffer.from([0x81, body.length]);\n } else if (body.length < 65_536) {\n header = Buffer.allocUnsafe(4);\n header[0] = 0x81;\n header[1] = 126;\n header.writeUInt16BE(body.length, 2);\n } else {\n header = Buffer.allocUnsafe(10);\n header[0] = 0x81;\n header[1] = 127;\n header.writeBigUInt64BE(BigInt(body.length), 2);\n }\n socket.write(Buffer.concat([header, body]));\n}\n","import { parseArgs } from 'node:util';\n\nimport { listSessions } from '../../tap';\nimport { redirectConsoleToStderr } from '../../utils/redirectConsole';\n\nexport async function runPsCli(args: string[] = []) {\n const parsed = parseArgs({\n args,\n allowPositionals: true,\n options: {\n json: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n },\n });\n if (parsed.values.json) redirectConsoleToStderr();\n const sessions = await listSessions({ selector: parsed.positionals[0] });\n if (parsed.values.json) {\n process.stdout.write(`${JSON.stringify(sessions, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write('PID\\tSTATUS\\tSTARTED\\tCOMMAND\\tCWD\\n');\n for (const session of sessions) {\n process.stdout.write(\n `${escapeTsv(session.pid)}\\t${escapeTsv(\n session.alive ? 'alive' : 'exited'\n )}\\t${escapeTsv(\n new Date(session.startedAt).toISOString()\n )}\\t${escapeTsv(session.command)}\\t${escapeTsv(session.cwd)}\\n`\n );\n }\n}\n\nfunction escapeTsv(value: unknown) {\n return String(value)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n');\n}\n\nexport function printPsHelp() {\n process.stdout.write(\n [\n 'Usage: event-log ps [selector]',\n '',\n 'Options:',\n ' selector Match by PID, command, or cwd',\n ' --json Print sessions as JSON',\n '',\n ].join('\\n')\n );\n}\n","import { parseArgs } from 'node:util';\n\nimport { resolveSession, tap } from '../../tap';\nimport { redirectConsoleToStderr } from '../../utils/redirectConsole';\nimport { parseHelp, parseSharedTapOptions, tapArgOptions } from '../shared';\n\nexport async function runTapCli(args: string[]) {\n if (parseHelp(args)) {\n printTapHelp();\n return;\n }\n const options = parseTapOptions(args);\n if (options.json) redirectConsoleToStderr();\n const session = await resolveSession(options.selector);\n for await (const event of tap(session.sessionDir, options)) {\n if (options.pretty) {\n process.stdout.write(\n `${new Date(event._t).toISOString()} ${event._e} ${JSON.stringify(event)}\\n`\n );\n } else {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n }\n }\n}\n\nfunction parseTapOptions(args: string[]) {\n const parsed = parseArgs({\n args,\n allowPositionals: true,\n options: {\n ...tapArgOptions,\n format: { type: 'string' },\n json: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n },\n });\n const tapOptions = parseSharedTapOptions(parsed.values);\n if (parsed.values.json && parsed.values.format === 'pretty')\n throw new Error('Use either --json or --format pretty, not both');\n\n return {\n selector: parsed.positionals[0],\n since: tapOptions.since,\n follow: tapOptions.follow,\n filter: tapOptions.filter,\n json: parsed.values.json ?? false,\n pretty: parsed.values.json ? false : parsed.values.format === 'pretty',\n };\n}\n\nfunction printTapHelp() {\n process.stdout.write(\n [\n 'Usage: event-log tap [selector]',\n '',\n 'Options:',\n ' selector Match by PID, command, or cwd',\n ' --since <time> Duration, Unix time, or ISO date',\n ' --filter <pattern> category[:kind], wildcards allowed',\n ' --format pretty Print a readable line per event',\n ' --tail Follow live events after replaying history',\n '',\n ].join('\\n')\n );\n}\n","#!/usr/bin/env node\nimport { fileURLToPath } from 'node:url';\n\nimport { printCleanHelp, runCleanCli } from './commands/clean';\nimport { runExportCli } from './commands/export';\nimport { runExtractCli } from './commands/extract';\nimport { runInspectCli } from './commands/inspect';\nimport { printPsHelp, runPsCli } from './commands/ps';\nimport { runTapCli } from './commands/tap';\nimport { parseHelp } from './commands/shared';\n\nexport async function main(argv = process.argv.slice(2)) {\n const [command, ...args] = argv;\n\n if (!command || command === '--help' || command === '-h') {\n printHelp();\n return 0;\n }\n\n switch (command) {\n case 'extract':\n runExtractCli(args);\n return 0;\n case 'ps':\n if (parseHelp(args)) {\n printPsHelp();\n return 0;\n }\n await runPsCli(args);\n return 0;\n case 'tap':\n await runTapCli(args);\n return 0;\n case 'clean':\n if (parseHelp(args)) {\n printCleanHelp();\n return 0;\n }\n runCleanCli(args);\n return 0;\n case 'export':\n await runExportCli(args);\n return 0;\n case 'inspect':\n return runInspectCli(args);\n default:\n throw new Error(`Unknown command: ${command}`);\n }\n}\n\nfunction printHelp() {\n process.stdout.write(\n [\n 'Usage: event-log <command>',\n '',\n 'Commands:',\n ' ps [selector] List sessions; selector matches PID, command, or cwd',\n ' --json',\n '',\n ' tap [selector] Replay session events as JSONL',\n ' --since <time> --filter <category[:kind]> --tail --format pretty',\n '',\n ' export [selector] Export events to Chrome Trace or OTLP JSON',\n ' --input <file> -o <file> --format <format> --filter <category[:kind]> --tail',\n '',\n ' inspect [options] -- <cmd> Run a command with inspector sidecar',\n ' --port <port> --host <host> --wait --linger <seconds> --no-banner',\n '',\n ' extract Extract merged EventRegistry schema',\n ' --project <file> --output <file> --format dts|json --json',\n '',\n ' clean Remove stale sessions',\n ' --json',\n '',\n 'Run event-log <command> --help for full command help.',\n '',\n ].join('\\n')\n );\n}\n\nif (isCliEntrypoint()) {\n main()\n .then(code => {\n process.exitCode = code;\n })\n .catch(error => {\n process.stderr.write(\n `${error instanceof Error ? error.message : String(error)}\\n`\n );\n process.exitCode = 1;\n });\n}\n\nfunction isCliEntrypoint() {\n try {\n return process.argv[1] === fileURLToPath(import.meta.url);\n } catch {\n return false;\n }\n}\n"],"names":["tapArgOptions","since","type","filter","multiple","tail","async","readJsonlStream","stream","rl","createInterface","input","line","event","parseEventLine","parseSharedTapOptions","values","flatMap","value","split","map","item","trim","Boolean","follow","parseHelp","args","parseArgs","allowPositionals","strict","options","help","short","parsePort","port","parseInteger","label","test","Error","number","Number","isSafeInteger","parseNonNegativeNumber","isFinite","matchesTapOptions","eventFilter","_t","matchesEventFilter","_e","durationUnitToMs","unit","runCleanCli","parseJsonFlag","json","redirectConsoleToStderr","removed","cleanStaleSessionsSync","process","stdout","write","JSON","stringify","STRIP_SUFFIXES","convertToChromeTrace","events","converter","TraceConverter","toAsyncIterable","Symbol","asyncIterator","add","toTraceFile","traceEvents","categoryTids","Map","nextTid","pid","processName","version","constructor","this","push","ph","name","parsed","splitEventName","index","indexOf","category","slice","tid","getTid","_w","undefined","extractArgs","key","Object","keys","length","_d","stripSuffix","cat","ts","Math","round","dur","s","endsWith","metadata","source","convertedAt","Date","toISOString","worker","get","set","suffix","convertToOpenTelemetry","OpenTelemetryConverter","toFile","traceId","crypto","randomBytes","toString","sessionSpanId","createSpanId","spans","startTimeUnixNano","endTimeUnixNano","eventTime","unixNano","BigInt","createSpan","createEvent","now","resourceSpans","resource","attributes","scopeSpans","scope","spanId","parentSpanId","eventAttributes","timeUnixNano","result","entries","converted","anyValue","stringValue","boolValue","isInteger","intValue","String","doubleValue","Array","isArray","arrayValue","kvlistValue","timeMs","runExportCli","printExportHelp","join","parseExportOptions","output","format","timeout","tapOptions","parseDuration","toLowerCase","total","pattern","lastIndex","match","exec","amount","isExportFormat","positionals","selector","inputFile","idleTimeout","exportPid","session","resolveSession","formatSessionProcessName","command","tap","sessionDir","readJsonlFile","file","fs","createReadStream","encoding","readJsonlStdin","stdin","filteredEvents","filterEvents","compileEventFilter","parseSince","writeFileSync","extractEventRegistry","project","findTsconfig","start","dir","path","existsSync","next","dirname","cwd","config","readConfigFile","sys","readFile","error","formatDiagnostic","diagnostic","flattenDiagnosticMessageText","messageText","parseJsonConfigFileContent","program","createProgram","fileNames","checker","getTypeChecker","registry","findEventRegistry","ambient","getAmbientModules","find","symbol","getName","ambientRegistry","exports","getDeclaredTypeOfSymbol","sourceFile","getSourceFiles","isEventLogEntrypoint","fileName","moduleSymbol","getSymbolAtLocation","found","forEachChild","visit","node","isInterfaceDeclaration","text","getProperties","serializeRegistryEntry","replace","declaration","valueDeclaration","declarations","getTypeOfSymbolAtLocation","fields","optionalFields","field","fieldDeclaration","flags","SymbolFlags","Optional","typeToString","sort","a","b","localeCompare","formatDts","lines","optional","includes","runExtractCli","printExtractHelp","InspectTrace","runInspectCli","argsBeforeSeparator","separator","printInspectHelp","Promise","resolve","runInspectSidecar","host","linger","trace","cdp","CdpTraceServer","listen","banner","stderr","url","wait","waitForClient","child","spawnInspectedProcess","spawn","stdio","env","LOG_EVENTS_ENV","eventStream","forward","signal","kill","once","reader","readEvents","onEvent","on","parse","exitCode","waitForChild","code","setTimeout","close","parseInspectOptions","optionArgs","commandArgs","id","randomUUID","server","clients","Set","frameBuffers","buffer","clientWaiters","recording","http","createServer","req","res","handleRequest","socket","handleUpgrade","reject","off","address","size","splice","sendEvent","client","destroy","_req","target","title","description","webSocketDebuggerUrl","devtoolsFrontendUrl","setHeader","end","headers","accept","createHash","update","digest","chunk","handleFrames","Buffer","from","delete","pending","concat","offset","frame","readFrame","subarray","nextOffset","opcode","handleMessage","payload","message","method","respond","writeFrame","params","second","masked","header","readUInt16BE","bigLength","readBigUInt64BE","MAX_SAFE_INTEGER","maskOffset","mask","i","body","allocUnsafe","writeUInt16BE","writeBigUInt64BE","escapeTsv","runTapCli","printTapHelp","parseTapOptions","pretty","main","argv","printHelp","printPsHelp","runPsCli","sessions","listSessions","alive","startedAt","printCleanHelp","isCliEntrypoint","fileURLToPath","then","catch"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAcO,MAAMA,IAAgB;EAC3BC,OAAO;IAAEC,MAAM;;EACfC,QAAQ;IAAED,MAAM;IAAUE,WAAU;;EACpCC,MAAM;IAAEH,MAAM;;;;AAuBTI,gBAAgBC,gBAAgBC;EACrC,MAAMC,IAAKC,EAAgB;IAAEC,OAAOH;;EACpC,WAAW,MAAMI,KAAQH,GAAI;IAC3B,KAAKG;MAAM;;IACX,MAAMC,IAAQC,EAAeF;IAC7B,IAAIC;YAAaA;;AACnB;AACF;;AAaO,SAASE,sBAAsBC;EAKpC,OAAO;IACLf,OAAOe,EAAOf;IACdE,QAAQa,EAAOb,QACXc,QAAQC,KAASA,EAAMC,MAAM,MAC9BC,IAAIC,KAAQA,EAAKC,QACjBnB,OAAOoB;IACVC,SAAwB,MAAhBR,EAAOX;;AAEnB;;AAEO,SAASoB,UAAUC;EACxB,QAQqB,MAPnBC,EAAU;IACRD;IACAE,mBAAkB;IAClBC,SAAQ;IACRC,SAAS;MACPC,MAAM;QAAE7B,MAAM;QAAW8B,OAAO;;;KAEjChB,OAAOe;AAEd;;AAqCO,SAASE,UAAUf;EACxB,IAAa,QAATA;IAAe;;EACnB,MAAMgB,IAgBR,SAASC,aAAajB,GAAekB;IACnC,KAAK,QAAQC,KAAKnB;MAAQ,MAAM,IAAIoB,MAAM,WAAWF,MAAUlB;;IAC/D,MAAMqB,IAASC,OAAOtB;IACtB,KAAKsB,OAAOC,cAAcF;MACxB,MAAM,IAAID,MAAM,WAAWF,MAAUlB;;IACvC,OAAOqB;AACT,GAtBeJ,CAAajB,GAAO;EACjC,IAAIgB,IAAO,KAAKA,IAAO;IAAQ,MAAM,IAAII,MAAM,iBAAiBpB;;EAChE,OAAOgB;AACT;;AAEO,SAASQ,uBACdxB,GACAkB;EAEA,IAAa,QAATlB;IAAe;;EACnB,MAAMqB,IAASC,OAAOtB;EACtB,KAAKsB,OAAOG,SAASJ,MAAWA,IAAS;IACvC,MAAM,IAAID,MAAM,WAAWF,MAAUlB;;EACvC,OAAOqB;AACT;;AAUA,SAASK,kBACP/B,GACAZ,GACA4C;EAEA,IAAa,QAAT5C,KAAiBY,EAAMiC,KAAK7C;IAAO,QAAO;;EAC9C,OAAO8C,EAAmBlC,EAAMmC,IAAIH;AACtC;;AAEA,SAASI,iBAAiBC;EACxB,IACW,SAATA,KACS,WAATA,KACS,YAATA,KACS,kBAATA,KACS,mBAATA;IAEA,OAAO;;EACT,IACW,QAATA,KACS,UAATA,KACS,WAATA,KACS,aAATA,KACS,cAATA;IAEA,OAAO;;EACT,IACW,QAATA,KACS,UAATA,KACS,WAATA,KACS,aAATA,KACS,cAATA;IAEA,OAAO;;EACT,IACW,QAATA,KACS,SAATA,KACS,UAATA,KACS,WAATA,KACS,YAATA;IAEA,OAAO;;EACT,MAAM,IAAIZ,MAAM,0BAA0BY;AAC5C;;AC5LO,SAASC,YAAYzB,IAAiB;EAC3C,MAAMI,IDmFD,SAASsB,cAAc1B;IAC5B,OAAOC,EAAU;MACfD;MACAE,mBAAkB;MAClBE,SAAS;QACPuB,MAAM;UAAEnD,MAAM;;QACd6B,MAAM;UAAE7B,MAAM;UAAW8B,OAAO;;;OAEjChB;AACL,GC5FkBoC,CAAc1B;EAC9B,IAAII,EAAQuB;IAAMC;;EAClB,MAAMC,IAAUC;EAChBC,QAAQC,OAAOC,MACb7B,EAAQuB,OACJ,GAAGO,KAAKC,UAAU;IAAEN;WACpB,WAAWA;AAEnB;;ACmCA,MAAMO,IAAiB,EAAC,YAAY,SAAS;;AAEtCxD,eAAeyD,qBACpBC,GACAlC,IAAuC;EAEvC,MAAMmC,IAAY,IAAIC,eAAepC;EACrC,WAAW,MAAMjB,KA4InBP,gBAAgB6D,kBAAmBH;IACjC,IAAII,OAAOC,iBAAiBL;aACnBA;;aAEAA;;AAEX,GAlJ4BG,CAAgBH;IACxCC,EAAUK,IAAIzD;;EAEhB,OAAOoD,EAAUM;AACnB;;AAEO,MAAML;EACFM,YAA4B;EACrCC,GAAgB,IAAIC;EACpBC,GAAW;EACXC;EACAC;EACAC,GAAW;EAEXC,WAAAA,CAAYjD,IAAuC;IACjDkD,MAAKJ,IAAO9C,EAAQ8C,OAAO;IAC3BI,MAAKH,IAAe/C,EAAQ+C,eAAe;IAC3CG,KAAKR,YAAYS,KAAK;MACpBC,IAAI;MACJC,MAAM;MACNP,KAAKI,MAAKJ;MACVlD,MAAM;QAAEyD,MAAMH,MAAKH;;;AAEvB;EAEAP,GAAAA,CAAIzD;IACF,IAAiB,gBAAbA,EAAMmC,IAAoB;MAC5B,IAA6B,mBAAlBnC,EAAMiE;QAAsBE,MAAKF,IAAWjE,EAAMiE;;MAC7D,IACwB,gBAAtBE,MAAKH,KACoB,mBAAlBhE,EAAMiE;QAEbE,MAAKH,IAAe,eAAehE,EAAMiE;;MAE3CE,KAAKR,YAAYS,KAAK;QACpBC,IAAI;QACJC,MAAM;QACNP,KAAKI,MAAKJ;QACVlD,MAAM;UAAEyD,MAAMH,MAAKH;;;MAErB;AACF;IAEA,MAAMO,IAwEV,SAASC,iBAAenE;MACtB,MAAMoE,IAAQpE,EAAMqE,QAAQ;MAC5B,IAAID,IAAQ;QAAG,OAAO;;MACtB,OAAO;QACLE,UAAUtE,EAAMuE,MAAM,GAAGH;QACzBH,MAAMjE,EAAMuE,MAAMH,IAAQ;;AAE9B,KA/EmBD,CAAexE,EAAMmC;IACpC,KAAKoC;MAAQ;;IAEb,MAAMM,IAAMV,MAAKW,EACfP,EAAOI,UACa,mBAAb3E,EAAM+E,KAAkB/E,EAAM+E,UAAKC;IAE5C,MAAMnE,IAiFV,SAASoE,cAAYjF;MACnB,MAAMa,IAAgC,CAAA;MACtC,KAAK,MAAMqE,KAAOC,OAAOC,KAAKpF,IAAQ;QACpC,IAAY,SAARkF,KAAwB,SAARA,KAAwB,SAARA;UAAc;;QAClDrE,EAAKqE,KAAOlF,EAAMkF;AACpB;MACA,OAAOC,OAAOC,KAAKvE,GAAMwE,SAASxE,SAAOmE;AAC3C,KAxFiBC,CAAYjF;IAEzB,IAAwB,mBAAbA,EAAMsF;MACfnB,KAAKR,YAAYS,KAAK;QACpBC,IAAI;QACJC,MAAMiB,cAAYhB,EAAOD;QACzBkB,KAAKjB,EAAOI;QACZZ,KAAKI,MAAKJ;QACVc;QACAY,IAAIC,KAAKC,MAA8B,OAAvB3F,EAAMiC,KAAKjC,EAAMsF;QACjCM,KAAKF,KAAKC,MAAiB,MAAX3F,EAAMsF;QACtBzE;;;MAGFsD,KAAKR,YAAYS,KAAK;QACpBC,IAAI;QACJC,MAAMiB,cAAYhB,EAAOD;QACzBkB,KAAKjB,EAAOI;QACZZ,KAAKI,MAAKJ;QACVc;QACAY,IAAIC,KAAKC,MAAiB,MAAX3F,EAAMiC;QACrB4D,GAAG7F,EAAMmC,GAAG2D,SAAS,eAAe,MAAM;QAC1CjF;;;AAGN;EAEA6C,WAAAA;IACE,OAAO;MACLC,aAAaQ,KAAKR;MAClBoC,UAAU;QACRC,QAAQ;QACR/B,SAASE,MAAKF;QACdgC,cAAa,IAAIC,MAAOC;;;AAG9B;EAEA,EAAArB,CAAQH,GAAkByB;IACxB,MAAMlB,IAAMkB,IAAS,GAAGzB,KAAYyB,MAAWzB;IAC/C,IAAIE,IAAMV,MAAKP,EAAcyC,IAAInB;IACjC,IAAW,QAAPL,GAAa;MACfA,IAAMV,MAAKL;MACXK,MAAKP,EAAc0C,IAAIpB,GAAKL;MAC5BV,KAAKR,YAAYS,KAAK;QACpBC,IAAI;QACJC,MAAM;QACNP,KAAKI,MAAKJ;QACVc;QACAhE,MAAM;UAAEyD,MAAM8B,IAAS,GAAGzB,KAAYyB,MAAWzB;;;AAErD;IACA,OAAOE;AACT;;;AAqBF,SAASU,cAAYjB;EACnB,KAAK,MAAMiC,KAAUtD;IACnB,IAAIqB,EAAKwB,SAASS;MAAS,OAAOjC,EAAKM,MAAM,IAAI2B,EAAOlB;;;EAE1D,OAAOf;AACT;;ACjIA,MAAMrB,IAAiB,EAAC,YAAY,SAAS;;AAEtCxD,eAAe+G,uBACpBrD,GACAlC,IAAyC;EAEzC,MAAMmC,IAAY,IAAIqD,uBAAuBxF;EAC7C,WAAW,MAAMjB,KAsMnBP,gBAAgB6D,gBAAmBH;IACjC,IAAII,OAAOC,iBAAiBL;aACnBA;;aAEAA;;AAEX,GA5M4BG,CAAgBH;IACxCC,EAAUK,IAAIzD;;EAEhB,OAAOoD,EAAUsD;AACnB;;AAEA,MAAMD;EACKE,GAAWC,EAAOC,YAAY,IAAIC,SAAS;EAC3CC,GAAiBC;EACjBC,GAA8B;EAC9B9D,GAAoC;EAC7Ca;EACAC,GAAW;EACXiD;EACAC;EAEAjD,WAAAA,CAA6BjD;IAAwCkD,KAAxClD,UAAAA;IAC3BkD,MAAKH,IAAe/C,EAAQ+C,eAAe;AAC7C;EAEAP,GAAAA,CAAIzD;IACF,MAAMoH,IAAYC,SAASrH,EAAMiC;IACjCkC,MAAK+C,IACwB,QAA3B/C,MAAK+C,KACLI,OAAOF,KAAaE,OAAOnD,MAAK+C,KAC5BE,IACAjD,MAAK+C;IACX/C,MAAKgD,IACsB,QAAzBhD,MAAKgD,KACLG,OAAOF,KAAaE,OAAOnD,MAAKgD,KAC5BC,IACAjD,MAAKgD;IAEX,IAAiB,gBAAbnH,EAAMmC,IAAoB;MAC5B,IAA6B,mBAAlBnC,EAAMiE;QAAsBE,MAAKF,IAAWjE,EAAMiE;;MAC7D,IACwB,gBAAtBE,MAAKH,KACoB,mBAAlBhE,EAAMiE;QAEbE,MAAKH,IAAe,eAAehE,EAAMiE;;MAE3C;AACF;IAEA,IAAwB,mBAAbjE,EAAMsF;MACfnB,MAAK8C,EAAO7C,KAAKD,MAAKoD,EAAYvH;;MAElCmE,MAAKhB,EAAQiB,KAAKD,MAAKqD,EAAaxH;;AAExC;EAEA0G,MAAAA;IACE,MAAMQ,IAAoB/C,MAAK+C,KAAsBG,SAASnB,KAAKuB;IACnE,MAAMN,IAAkBhD,MAAKgD,KAAoBD;IACjD,OAAO;MACLQ,eAAe,EACb;QACEC,UAAU;UACRC,YAAYA,WAAW;YACrB,gBAAgBzD,MAAKH;YACrB,mBAAmBG,MAAKF;YACxB,eAAeE,KAAKlD,QAAQ8C;YAC5B,sBAAsB;YACtB,0BAA0B;;;QAG9B8D,YAAY,EACV;UACEC,OAAO;YAAExD,MAAM;;UACf2C,OAAO,EACL;YACEN,SAASxC,MAAKwC;YACdoB,QAAQ5D,MAAK4C;YACbzC,MAAMH,MAAKH;YACXkD;YACAC;YACAS,YAAYA,WAAW;cACrB,kBAAkB;;YAEpBzE,QAAQgB,MAAKhB,EAAQkC,SAASlB,MAAKhB,SAAU6B;gBAE5Cb,MAAK8C;;;;AAOtB;EAEA,EAAAM,CAAYvH;IACV,MAAMuE,IAASC,iBAAexE,EAAMmC;IACpC,MAAM+E,IAAoBG,SAASrH,EAAMiC,KAAKjC,EAAMsF;IACpD,MAAM6B,IAAkBE,SAASrH,EAAMiC;IACvC,OAAO;MACL0E,SAASxC,MAAKwC;MACdoB,QAAQf;MACRgB,cAAc7D,MAAK4C;MACnBzC,MAAMC,IAASgB,cAAYhB,EAAOD,QAAQtE,EAAMmC;MAChD+E;MACAC;MACAS,YAAYK,gBAAgBjI,GAAOuE;;AAEvC;EAEA,EAAAiD,CAAaxH;IACX,MAAMuE,IAASC,iBAAexE,EAAMmC;IACpC,OAAO;MACL+F,cAAcb,SAASrH,EAAMiC;MAC7BqC,MAAMC,IAASgB,cAAYhB,EAAOD,QAAQtE,EAAMmC;MAChDyF,YAAYK,gBAAgBjI,GAAOuE;;AAEvC;;;AAGF,SAAS0D,gBACPjI,GACAuE;EAEA,MAAMpE,IAAkC;IACtC,cAAcH,EAAMmC;;EAEtB,IAAIoC,GAAQ;IACVpE,EAAO,oBAAoBoE,EAAOI;IAClCxE,EAAO,kBAAkBoE,EAAOD;AAClC;EACA,IAAwB,mBAAbtE,EAAM+E;IAAiB5E,EAAO,qBAAqBH,EAAM+E;;EAEpE,KAAK,MAAMG,KAAOC,OAAOC,KAAKpF,IAAQ;IACpC,IAAY,SAARkF,KAAwB,SAARA,KAAwB,SAARA,KAAwB,SAARA;MAAc;;IAClE/E,EAAO,aAAa+E,OAASlF,EAAMkF;AACrC;EAEA,OAAO0C,WAAWzH;AACpB;;AAEA,SAASyH,WAAWzH;EAClB,MAAMgI,IAAmC;EACzC,KAAK,OAAOjD,GAAK7E,MAAU8E,OAAOiD,QAAQjI,IAAS;IACjD,MAAMkI,IAAYC,SAASjI;IAC3B,IAAIgI;MAAWF,EAAO/D,KAAK;QAAEc;QAAK7E,OAAOgI;;;AAC3C;EACA,OAAOF;AACT;;AAEA,SAASG,SAASjI;EAChB,IAAqB,mBAAVA;IAAoB,OAAO;MAAEkI,aAAalI;;;EACrD,IAAqB,oBAAVA;IAAqB,OAAO;MAAEmI,WAAWnI;;;EACpD,IAAqB,mBAAVA,GAAoB;IAC7B,KAAKsB,OAAOG,SAASzB;MAAQ,OAAO;;IACpC,OAAOsB,OAAO8G,UAAUpI,KACpB;MAAEqI,UAAUC,OAAOtI;QACnB;MAAEuI,aAAavI;;AACrB;EACA,IAAIwI,MAAMC,QAAQzI;IAChB,OAAO;MACL0I,YAAY;QACV5I,QAAQE,EAAMD,QAAQI;UACpB,MAAM6H,IAAYC,SAAS9H;UAC3B,OAAO6H,IAAY,EAACA,MAAa;;;;;EAKzC,IAAIhI,KAA0B,mBAAVA;IAClB,OAAO;MACL2I,aAAa;QACX7I,QAAQyH,WAAWvH;;;;EAIzB,OAAO;AACT;;AAEA,SAAS2G;EACP,OAAOJ,EAAOC,YAAY,GAAGC,SAAS;AACxC;;AAEA,SAASO,SAAS4B;EAChB,OAAON,OAAOrB,OAAO5B,KAAKC,MAAe,MAATsD;AAClC;;AAEA,SAASzE,iBAAenE;EACtB,MAAMoE,IAAQpE,EAAMqE,QAAQ;EAC5B,IAAID,IAAQ;IAAG,OAAO;;EACtB,OAAO;IACLE,UAAUtE,EAAMuE,MAAM,GAAGH;IACzBH,MAAMjE,EAAMuE,MAAMH,IAAQ;;AAE9B;;AAEA,SAASc,cAAYjB;EACnB,KAAK,MAAMiC,KAAUtD;IACnB,IAAIqB,EAAKwB,SAASS;MAAS,OAAOjC,EAAKM,MAAM,IAAI2B,EAAOlB;;;EAE1D,OAAOf;AACT;;AC5OO7E,eAAeyJ,aAAarI;EACjC,IAAID,UAAUC,IAAO;KAmFvB,SAASsI;MACPvG,QAAQC,OAAOC,MACb,EACE,sCACA,IACA,YACA,4DACA,2DACA,qDACA,4DACA,gDACA,+DACA,iEACA,yEACA,sEACA,2EACA,KACAsG,KAAK;AAEX,KArGID;IACA;AACF;EACA,MAAMlI,IAqCR,SAASoI,mBAAmBxI;IAC1B,MAAM0D,IAASzD,EAAU;MACvBD;MACAE,mBAAkB;MAClBE,SAAS;WACJ9B;QACHW,OAAO;UAAET,MAAM;;QACfiK,QAAQ;UAAEjK,MAAM;UAAU8B,OAAO;;QACjCoI,QAAQ;UAAElK,MAAM;;QAChBmD,MAAM;UAAEnD,MAAM;;QACdmK,SAAS;UAAEnK,MAAM;;QACjB6B,MAAM;UAAE7B,MAAM;UAAW8B,OAAO;;;;IAGpC,MAAMsI,IAAavJ,sBAAsBqE,EAAOpE;IAChD,MAAMqJ,IJoBD,SAASE,cAAcrJ;MAC5B,IAAa,QAATA,KAA2B,OAAVA;QAAc;;MACnC,MAAMP,IAAQO,EAAMI,OAAOkJ;MAC3B,KAAK7J;QAAO;;MAEZ,IAAI8J,IAAQ;MACZ,IAAInF,IAAQ;MACZ,MAAMoF,IACJ;MAEF,OAAOpF,IAAQ3E,EAAMuF,QAAQ;QAC3BwE,EAAQC,YAAYrF;QACpB,MAAMsF,IAAQF,EAAQG,KAAKlK;QAC3B,KAAKiK;UAAO,MAAM,IAAItI,MAAM,qBAAqBpB;;QACjD,MAAM4J,IAAStI,OAAOoI,EAAM;QAC5B,KAAKpI,OAAOG,SAASmI;UAAS,MAAM,IAAIxI,MAAM,qBAAqBpB;;QACnEuJ,KAASK,IAAS7H,iBAAiB2H,EAAM,MAAM;QAC/CtF,IAAQoF,EAAQC;QAChB,OAAwB,QAAjBhK,EAAM2E,MAAmC,QAAjB3E,EAAM2E;UAAgBA;;AACvD;MAEA,OAAOmF;AACT,KI1CkBF,CAAcnF,EAAOpE,OAAOqJ;IAE5C,MAAMD,IAAShF,EAAOpE,OAAOoJ,UAAU;IACvC,KAoBF,SAASW,eAAe7J;MACtB,OAAiB,mBAAVA,KAAsC,oBAAVA;AACrC,KAtBO6J,CAAeX;MAAS,MAAM,IAAI9H,MAAM,uBAAuB8H;;IACpE,IAAIhF,EAAO4F,YAAY,MAAM5F,EAAOpE,OAAOL;MACzC,MAAM,IAAI2B,MAAM;;IAClB,IAAe,QAAX+H,MAAoBC,EAAW9I;MACjC,MAAM,IAAIc,MAAM;;IAElB,OAAO;MACL2I,UAAU7F,EAAO4F,YAAY;MAC7BE,WAAW9F,EAAOpE,OAAOL;MACzBwJ,QAAQ/E,EAAOpE,OAAOmJ;MACtBC;MACAnK,OAAOqK,EAAWrK;MAClBE,QAAQmK,EAAWnK;MACnBqB,QAAQ8I,EAAW9I;MACnB6I;MACAc,aA7EyB;MA8EzB9H,MAAM+B,EAAOpE,OAAOqC,SAAQ;;AAEhC,GAzEkB6G,CAAmBxI;EACnC,IAAII,EAAQuB;IAAMC;;EAClB,IAAIU;EACJ,IAAIa;EACJ,IAAIuG;EAEJ,IAAItJ,EAAQmJ,UAAU;IACpB,MAAMI,UAAgBC,EAAexJ,EAAQmJ;IAC7CpG,IJTG,SAAS0G,yBAAyBF;MACvC,OAAOA,EAAQvG,UACX,GAAGuG,EAAQG,aAAaH,EAAQvG,gBAAgBuG,EAAQzG,SACxD,GAAGyG,EAAQG,gBAAgBH,EAAQzG;AACzC,KIKkB2G,CAAyBF;IACvCD,IAAYC,EAAQzG;IACpBZ,IAASyH,EAAIJ,EAAQK,YAAY;MAC/BlK,QAAQM,EAAQN;MAChB6I,SAASvI,EAAQuI;MACjBc,aAAarJ,EAAQN,SAASM,EAAQqJ,mBAActF;;AAExD,SAAO,IAAI/D,EAAQoJ;IACjBlH,IJXG1D,gBAAgBqL,cAAcC;aAC5BrL,gBAAgBsL,EAAGC,iBAAiBF,GAAM;QAAEG,UAAU;;AAC/D,KISaJ,CAAc7J,EAAQoJ;;IAE/BlH,IJTG1D,gBAAgB0L;aACdzL,gBAAgBkD,QAAQwI;AACjC,KIOaD;;EAGX,MAAME,IJCD5L,gBAAgB6L,aACrBnI,GACAlC;IAEA,MAAMe,IAAcuJ,EAAmBtK,EAAQ3B;IAC/C,MAAMF,IAAQoM,EAAWvK,EAAQ7B;IACjC,WAAW,MAAMY,KAASmD;MACxB,IAAIpB,kBAAkB/B,GAAOZ,GAAO4C;cAAoBhC;;;AAE5D,GIVyBsL,CAAanI,GAAQlC;EAC5C,MAAM8J,IACe,oBAAnB9J,EAAQsI,eACE/C,uBAAuB6E,GAAgB;IAC3CtH,KAAKwG;IACLvG;aAEId,qBAAqBmI,GAAgB;IACzCtH,KAAKwG;IACLvG;;EAER,MAAMsF,IAASvG,KAAKC,UAAU+H,GAAM,MAAM;EAC1C,IAAI9J,EAAQqI;IAAQ0B,EAAGS,cAAcxK,EAAQqI,QAAQ,GAAGA;;IACnD1G,QAAQC,OAAOC,MAAM,GAAGwG;;AAC/B;;ACxCO,SAASoC,qBAAqBzK,IAA0B;EAC7D,MAAM0K,IAAU1K,EAAQ0K,WAyJ1B,SAASC,aAAaC;IACpB,IAAIC,IAAMD;IACV,OAAO,GAAM;MACX,MAAMd,IAAOgB,EAAK3C,KAAK0C,GAAK;MAC5B,IAAId,EAAGgB,WAAWjB;QAAO,OAAOA;;MAChC,MAAMkB,IAAOF,EAAKG,QAAQJ;MAC1B,IAAIG,MAASH;QAAK,OAAO;;MACzBA,IAAMG;AACR;AACF,GAlKqCL,CAAahJ,QAAQuJ;EACxD,KAAKR;IAAS,MAAM,IAAIlK,MAAM;;EAE9B,MAAM2K,IAAS3G,EAAG4G,eAAeV,GAASlG,EAAG6G,IAAIC;EACjD,IAAIH,EAAOI;IAAO,MAAM,IAAI/K,MAgK9B,SAASgL,iBAAiBC;MACxB,OAAOjH,EAAGkH,6BAA6BD,EAAWE,aAAa;AACjE,KAlKoCH,CAAiBL,EAAOI;;EAE1D,MAAMjI,IAASkB,EAAGoH,2BAChBT,EAAOA,QACP3G,EAAG6G,KACHP,EAAKG,QAAQP;EAEf,MAAMmB,IAAUrH,EAAGsH,cAAcxI,EAAOyI,WAAWzI,EAAOtD;EAC1D,MAAMgM,IAAUH,EAAQI;EACxB,MAAMC,IA8CR,SAASC,kBAAkBN,GAAqBG;IAC9C,MAAMI,IAAUJ,EACbK,oBACAC,KAAKC,KAA+B,wBAArBA,EAAOC;IACzB,MAAMC,IAAkBL,GAASM,SAAStH,IAAI;IAC9C,IAAIqH;MAAiB,OAAOT,EAAQW,wBAAwBF;;IAE5D,KAAK,MAAMG,KAAcf,EAAQgB;MAC/B,IAAIC,qBAAqBF,EAAWG,WAAW;QAC7C,MAAMC,IAAehB,EAAQiB,oBAAoBL;QACjD,MAAMV,IAAWc,GAAcN,SAAStH,IACtC;QAEF,IAAI8G;UAAU,OAAOF,EAAQW,wBAAwBT;;AACvD;;IAGF,KAAK,MAAMU,KAAcf,EAAQgB,kBAAkB;MACjD,KAAK,4CAA4CtM,KAAKqM,EAAWG;QAC/D;;MACF,IAAIG;MACJN,EAAWO,aAAa,SAASC,MAAMC;QACrC,IAAI7I,EAAG8I,uBAAuBD,MAA4B,oBAAnBA,EAAKhK,KAAKkK;UAC/CL,IAAQG;;QACVA,EAAKF,aAAaC;AACpB;MACA,IAAIF,GAAO;QACT,MAAMX,IAASP,EAAQiB,oBAAoBC,EAAM7J;QACjD,IAAIkJ;UAAQ,OAAOP,EAAQW,wBAAwBJ;;AACrD;AACF;IACA,OAAO;AACT,GA9EmBJ,CAAkBN,GAASG;EAC5C,KAAKE;IAAU,MAAM,IAAI1L,MAAM;;EAE/B,MAAM0B,IAASgK,EACZsB,gBACAlO,IAAIiN,KAiFT,SAASkB,uBACPlB,GACAP;IAEA,MAAM/H,IAAMsI,EAAOC,UAAUkB,QAAQ,UAAU;IAC/C,MAAMC,IAAcpB,EAAOqB,oBAAoBrB,EAAOsB,eAAe;IACrE,MAAMzP,IAAOuP,IACT3B,EAAQ8B,0BAA0BvB,GAAQoB,UAC1C5J;IACJ,MAAMgK,IAAiC,CAAA;IACvC,MAAMC,IAA2B;IAEjC,KAAK,MAAMC,KAAS7P,GAAMoP,mBAAmB,IAAI;MAC/C,MAAMU,IAAmBD,EAAML,oBAAoBK,EAAMJ,eAAe;MACxE,KAAKK;QAAkB;;MACvB,IAAgD,OAA3CD,EAAME,QAAQ3J,EAAG4J,YAAYC;QAChCL,EAAe7K,KAAK8K,EAAMzB;;MAC5BuB,EAAOE,EAAMzB,aAAaR,EAAQsC,aAChCtC,EAAQ8B,0BAA0BG,GAAOC;AAE7C;IAEA,MAAM1K,IAAQS,EAAIR,QAAQ;IAC1B,OAAO;MACLQ;MACAP,UAAUF,SAAaS,EAAIN,MAAM,GAAGH,KAAS;MAC7CH,MAAMG,SAAaS,EAAIN,MAAMH,IAAQ,KAAKS;MAC1C8J;MACAC;;AAEJ,GA/GmBP,CAAuBlB,GAAQP,IAC7CuC,KAAK,CAACC,GAAGC,MAAMD,EAAEvK,IAAIyK,cAAcD,EAAExK;EAExC,OAA0B,WAAnBjE,EAAQsI,SACXxG,KAAKC,UAAUG,GAAQ,MAAM,KA6GnC,SAASyM,UAAUzM;IACjB,MAAM0M,IAAQ,EACZ,gDACA,4BACA,IACA,sCACA;IAGF,KAAK,MAAM7P,KAASmD,GAAQ;MAC1B0M,EAAMzL,KAAK,QAAQpE,EAAMkF;MACzB,KAAK,OAAOZ,GAAMjF,MAAS8F,OAAOiD,QAAQpI,EAAMgP,SAAS;QACvD,MAAMc,IAAW9P,EAAMiP,eAAec,SAASzL,KAAQ,MAAM;QAC7DuL,EAAMzL,KAAK,SAASE,IAAOwL,MAAazQ;AAC1C;MACAwQ,EAAMzL,KAAK;AACb;IAEAyL,EAAMzL,KAAK,OAAO;IAClB,OAAOyL,EAAMzG,KAAK;AACpB,GAhIMwG,CAAUzM;AAChB;;AAEO,SAAS6M,cAAcnP;EAC5B,IAAID,UAAUC,IAAO;KA6IvB,SAASoP;MACPrN,QAAQC,OAAOC,MACb,EACE,4BACA,IACA,YACA,iDACA,qDACA,0CACA,gDACA,KACAsG,KAAK;AAEX,KAzJI6G;IACA;AACF;EACA,MAAM1L,IAASzD,EAAU;IACvBD;IACAI,SAAS;MACPsI,QAAQ;QAAElK,MAAM;;MAChBmD,MAAM;QAAEnD,MAAM;;MACdiK,QAAQ;QAAEjK,MAAM;QAAU8B,OAAO;;MACjCwK,SAAS;QAAEtM,MAAM;QAAU8B,OAAO;;MAClCD,MAAM;QAAE7B,MAAM;QAAW8B,OAAO;;;;EAGpC,IAAIoD,EAAOpE,OAAOqC,QAAiC,UAAzB+B,EAAOpE,OAAOoJ;IACtC,MAAM,IAAI9H,MAAM;;EAClB,IAAI8C,EAAOpE,OAAOqC;IAAMC;;EACxB,MAAM8G,IAAShF,EAAOpE,OAAOqC,OAAO,SAAU+B,EAAOpE,OAAOoJ,UAAU;EACtE,IAAe,UAAXA,KAA+B,WAAXA;IACtB,MAAM,IAAI9H,MAAM,uBAAuB8H;;EAEzC,MAAMtI,IAA0B;IAC9BsI;IACAD,QAAQ/E,EAAOpE,OAAOmJ;IACtBqC,SAASpH,EAAOpE,OAAOwL;;EAGzB,MAAMrC,IAASoC,qBAAqBzK;EACpC,IAAIA,EAAQqI;IAAQ0B,EAAGS,cAAcxK,EAAQqI,QAAQ,GAAGA;;IACnD1G,QAAQC,OAAOC,MAAM,GAAGwG;;AAC/B;;AAoCA,SAASyE,qBAAqBC;EAC5B,OAAO,8DAA8DxM,KACnEwM;AAEJ;;ACtFA,MAAM/K,IAAiB,EAAC,YAAY,SAAS;;AAEtC,MAAMiN;EACF/M,OAA8B;EACvCS,GAAgB,IAAIC;EACpBC,GAAW;EACXC;EACAC;EAEAE,WAAAA,CAAYjD;IACVkD,MAAKJ,IAAO9C,EAAQ8C,OAAO;IAC3BI,MAAKH,IAAe/C,EAAQ+C;IAC5BG,MAAKC,EAAM;MACTC,IAAI;MACJC,MAAM;MACNP,KAAKI,MAAKJ;MACVlD,MAAM;QAAEyD,MAAMH,MAAKH;;;AAEvB;EAEAP,GAAAA,CAAIzD;IACF,MAAM6L,IAAQ1H,KAAKhB,OAAOkC;IAE1B,IAAiB,gBAAbrF,EAAMmC,IAAoB;MAC5BgC,MAAKC,EAAM;QACTC,IAAI;QACJC,MAAM;QACNP,KAAKI,MAAKJ;QACVlD,MAAM;UAAEyD,MAAMH,MAAKH;;;MAErB,OAAOG,KAAKhB,OAAOyB,MAAMiH;AAC3B;IAEA,MAAMtH,IA0DV,SAASC,eAAenE;MACtB,MAAMoE,IAAQpE,EAAMqE,QAAQ;MAC5B,IAAID,IAAQ;QAAG,OAAO;;MACtB,OAAO;QACLE,UAAUtE,EAAMuE,MAAM,GAAGH;QACzBH,MAAMjE,EAAMuE,MAAMH,IAAQ;;AAE9B,KAjEmBD,CAAexE,EAAMmC;IACpC,KAAKoC;MAAQ,OAAO;;IAEpB,MAAMM,IAAMV,MAAKW,EACfP,EAAOI,UACa,mBAAb3E,EAAM+E,KAAkB/E,EAAM+E,UAAKC;IAE5C,MAAMnE,IAmEV,SAASoE,YAAYjF;MACnB,MAAMa,IAAgC,CAAA;MACtC,KAAK,MAAMqE,KAAOC,OAAOC,KAAKpF,IAAQ;QACpC,IAAY,SAARkF,KAAwB,SAARA,KAAwB,SAARA;UAAc;;QAClDrE,EAAKqE,KAAOlF,EAAMkF;AACpB;MACA,OAAOC,OAAOC,KAAKvE,GAAMwE,SAASxE,SAAOmE;AAC3C,KA1EiBC,CAAYjF;IAEzB,IAAwB,mBAAbA,EAAMsF;MACfnB,MAAKC,EAAM;QACTC,IAAI;QACJC,MAAMiB,YAAYhB,EAAOD;QACzBkB,KAAKjB,EAAOI;QACZZ,KAAKI,MAAKJ;QACVc;QACAY,IAAIC,KAAKC,MAA8B,OAAvB3F,EAAMiC,KAAKjC,EAAMsF;QACjCM,KAAKF,KAAKC,MAAiB,MAAX3F,EAAMsF;QACtBzE;;;MAGFsD,MAAKC,EAAM;QACTC,IAAI;QACJC,MAAMiB,YAAYhB,EAAOD;QACzBkB,KAAKjB,EAAOI;QACZZ,KAAKI,MAAKJ;QACVc;QACAY,IAAIC,KAAKC,MAAiB,MAAX3F,EAAMiC;QACrB4D,GAAG7F,EAAMmC,GAAG2D,SAAS,eAAe,MAAM;QAC1CjF;;;IAIJ,OAAOsD,KAAKhB,OAAOyB,MAAMiH;AAC3B;EAEA,EAAA/G,CAAQH,GAAkByB;IACxB,MAAMlB,IAAMkB,IAAS,GAAGzB,KAAYyB,MAAWzB;IAC/C,IAAIE,IAAMV,MAAKP,EAAcyC,IAAInB;IACjC,IAAW,QAAPL,GAAa;MACfA,IAAMV,MAAKL;MACXK,MAAKP,EAAc0C,IAAIpB,GAAKL;MAC5BV,MAAKC,EAAM;QACTC,IAAI;QACJC,MAAM;QACNP,KAAKI,MAAKJ;QACVc;QACAhE,MAAM;UAAEyD,MAAM8B,IAAS,GAAGzB,KAAYyB,MAAWzB;;;AAErD;IACA,OAAOE;AACT;EAEA,EAAAT,CAAMpE;IACJmE,KAAKhB,OAAOiB,KAAKpE;AACnB;;;AAYF,SAASuF,YAAYjB;EACnB,KAAK,MAAMiC,KAAUtD;IACnB,IAAIqB,EAAKwB,SAASS;MAAS,OAAOjC,EAAKM,MAAM,IAAI2B,EAAOlB;;;EAE1D,OAAOf;AACT;;ACpHO,SAAS6L,cAActP;EAC5B,IAAID,UA6EN,SAASwP,oBAAoBvP;IAC3B,MAAMwP,IAAYxP,EAAK6D,QAAQ;IAC/B,OAAO2L,KAAa,IAAIxP,EAAK+D,MAAM,GAAGyL,KAAaxP;AACrD,GAhFgBuP,CAAoBvP,KAAQ;KAkF5C,SAASyP;MACP1N,QAAQC,OAAOC,MACb,EACE,6DACA,IACA,YACA,8DACA,mEACA,wEACA,mEACA,oEACA,KACAsG,KAAK;AAEX,KA/FIkH;IACA,OAAOC,QAAQC,QAAQ;AACzB;EACA,OAGK/Q,eAAegR,kBACpBxP;IAEA,MAAMI,IAAOJ,EAAQI,QAAQ;IAC7B,MAAMqP,IAAOzP,EAAQyP,QAAQ;IAC7B,MAAMC,IAAS1P,EAAQ0P,UAAU;IACjC,MAAMC,IAAQ,IAAIV,aAAa;MAAElM,aAAa/C,EAAQ0J;;IACtD,MAAMkG,UAAYC,eAAeC,OAAO;MACtCL;MACArP;MACAsJ,SAAS1J,EAAQ0J;;IAGnB,KAAuB,MAAnB1J,EAAQ+P;MACVpO,QAAQqO,OAAOnO,MACb,yBAAyB+N,EAAIK;;IAIjC,IAAIjQ,EAAQkQ;YAAYN,EAAIO;;IAE5B,MAAMC,IAgPR,SAASC,sBAAsB3G,GAAiB9J;MAC9C,MAAMwQ,IAAQE,EAAM5G,GAAS9J,GAAM;QACjC2Q,OAAO,EAAC,WAAW,WAAW,WAAW;QACzCC,KAAK;aACA7O,QAAQ6O;UACXC,CAACA,IAAiB;;;MAItB,OAAO;QACL9O,SAASyO;QACTM,aAAaN,EAAMG,MAAM;;AAE7B,KA7PgBF,CAAsBrQ,EAAQ0J,SAAS1J,EAAQJ;IAC7D,MAAM+Q,UAAWC,KAA2BR,EAAMzO,QAAQkP,KAAKD;IAC/DjP,QAAQmP,KAAK,UAAU,MAAMH,QAAQ;IACrChP,QAAQmP,KAAK,WAAW,MAAMH,QAAQ;IACtChP,QAAQmP,KAAK,UAAU,MAAMH,QAAQ;IAErC,MAAMI,IAyPR,SAASC,WAAWtS,GAAkBuS;MACpC,MAAMtS,IAAKC,EAAgB;QAAEC,OAAOH;;MAEpCC,EAAGuS,GAAG,QAAQpS;QACZ;UACEmS,EAAQnP,KAAKqP,MAAMrS;AACrB,UAAE,OAAO;;MAGX,OAAO,IAAIwQ,QAAcC,KAAW5Q,EAAGuS,GAAG,SAAS3B;AACrD,KAnQiByB,CAAWZ,EAAMM,aAAa3R;MAC3C6Q,EAAIpN,IAAImN,EAAMnN,IAAIzD;;IAGpB,MAAMqS,UAiQR,SAASC,aAAajB;MACpB,OAAO,IAAId,QAAgBC;QACzBa,EAAMc,GAAG,QAAQ,CAACI,GAAMV;UACtB,IAAoB,mBAATU;YAAmB/B,EAAQ+B;;YACjC/B,EAAQqB,IAAS,MAAM;;;;AAGlC,KAxQyBS,CAAajB,EAAMzO;UACpCoP;IACNnB,EAAIpN,IAAImN,EAAMzN;IAEd,IAAIwN,IAAS;YACL,IAAIJ,QAAQC,KAAWgC,WAAWhC,GAAkB,MAATG;;UAC7CE,EAAI4B;IACV,OAAOJ;AACT,GA1CS5B,CA4CT,SAASiC,oBAAoB7R;IAC3B,MAAMwP,IAAYxP,EAAK6D,QAAQ;IAC/B,MAAMiO,IAAatC,KAAa,IAAIxP,EAAK+D,MAAM,GAAGyL,KAAa;IAC/D,MAAMuC,IAAcvC,KAAa,IAAIxP,EAAK+D,MAAMyL,IAAY,KAAKxP;IACjE,MAAM0D,IAASzD,EAAU;MACvBD,MAAM8R;MACN1R,SAAS;QACPI,MAAM;UAAEhC,MAAM;;QACdqR,MAAM;UAAErR,MAAM;;QACd8R,MAAM;UAAE9R,MAAM;;QACdsR,QAAQ;UAAEtR,MAAM;;QAChB6B,MAAM;UAAE7B,MAAM;UAAW8B,OAAO;;QAChC,aAAa;UAAE9B,MAAM;;;;IAIzB,KAAKuT,EAAYvN;MACf,MAAM,IAAI5D,MAAM;;IAClB,OAAO;MACLJ,MAAMD,UAAUmD,EAAOpE,OAAOkB,SAAS;MACvCqP,MAAMnM,EAAOpE,OAAOuQ,QAAQ;MAC5BS,MAAM5M,EAAOpE,OAAOgR,SAAQ;MAC5BR,QAAQ9O,uBAAuB0C,EAAOpE,OAAOwQ,QAAQ,aAAa;MAClEK,QAAQzM,EAAOpE,OAAO,gBAAe,KAAQ;MAC7CwK,SAASiI,EAAY;MACrB/R,MAAM+R,EAAYhO,MAAM;;AAE5B,GAvE2B8N,CAAoB7R;AAC/C;;AA6FA,MAAMiQ;EACK+B,GAAKjM,EAAOkM;EACZC;EACAC,GAAW,IAAIC;EACfC,GAAgB,IAAIrP;EACpBsP,GAA+B;EAC/BC,GAAoC;EAC7CC,IAAa;EAELnP,WAAAA,CACN6O,GACSrC,GACFrP,GACEsJ;IACTxG,KAHSuM,OAAAA;IAAYvM,KACd9C,OAAAA;IAAY8C,KACVwG,UAAAA;IAETxG,MAAK4O,IAAUA;AACjB;EAEA,aAAOhC,CAAO9P;IACZ,MAAM8R,IAASO,EAAKC;IACpB,MAAM1C,IAAM,IAAIC,eACdiC,GACA9R,EAAQyP,MACRzP,EAAQI,MACRJ,EAAQ0J;IAEVoI,EAAOZ,GAAG,WAAW,CAACqB,GAAKC,MAAQ5C,GAAI6C,EAAeF,GAAKC;IAC3DV,EAAOZ,GAAG,WAAW,CAACqB,GAAKG,MACzB9C,GAAI+C,EAAeJ,GAAKG;IAE1B,OAAO,IAAIpD,QAAwB,CAACC,GAASqD;MAC3Cd,EAAOhB,KAAK,SAAS8B;MACrBd,EAAOhC,OAAO9P,EAAQI,MAAMJ,EAAQyP,MAAM;QACxCqC,EAAOe,IAAI,SAASD;QACpB,MAAME,IAAUhB,EAAOgB;QACvB,IAAIA,KAA8B,mBAAZA;UAAsBlD,EAAIxP,OAAO0S,EAAQ1S;;QAC/DmP,EAAQK;;;AAGd;EAEA,OAAIK;IACF,OAAO,QAAQ/M,KAAKuM,QAAQvM,KAAK9C,QAAQ8C,KAAK0O;AAChD;EAEApP,GAAAA,CAAIN;IACF,KAAKA,EAAOkC;MAAQ;;IACpB,KAAKlB,MAAKkP,MAAelP,MAAK6O,EAASgB,MAAM;MAC3C7P,MAAKgP,EAAQ/O,QAAQjB;MACrB,IAAIgB,MAAKgP,EAAQ9N,SAAS;QACxBlB,MAAKgP,EAAQc,OAAO,GAAG9P,MAAKgP,EAAQ9N,SAAS;;MAC/C;AACF;IACAlB,MAAK+P,EAAW,yBAAyB;MAAE7T,OAAO8C;;AACpD;EAEAiO,aAAAA;IACE,IAAIjN,MAAK6O,EAASgB;MAAM,OAAOzD,QAAQC;;IACvC,OAAO,IAAID,QAAcC,KAAWrM,MAAKiP,EAAehP,KAAKoM;AAC/D;EAEAiC,KAAAA;IACE,KAAK,MAAM0B,KAAUhQ,MAAK6O;MAAUmB,EAAOC;;IAC3C,OAAO,IAAI7D,QAAcC,KAAWrM,MAAK4O,EAAQN,MAAM,MAAMjC;AAC/D;EAEA,EAAAkD,CAAeW,GAA4BZ;IACzC,MAAMa,IAAS;MACbzB,IAAI1O,KAAK0O;MACTxT,MAAM;MACNkV,OAAOpQ,KAAKwG;MACZ6J,aAAa;MACbC,sBAAsBtQ,KAAK+M;MAC3BwD,qBAAqB,+BAA+BvQ,KAAKuM,QAAQvM,KAAK9C,QAAQ8C,KAAK0O;;IAErFY,EAAIkB,UAAU,gBAAgB;IAC9BlB,EAAImB,IAAI7R,KAAKC,UAAU,EAACsR;AAC1B;EAEA,EAAAV,CAAeJ,GAA2BG;IACxC,MAAMzO,IAAMsO,EAAIqB,QAAQ;IACxB,IAAmB,mBAAR3P,GAAkB;MAC3ByO,EAAOS;MACP;AACF;IAEA,MAAMU,IAASlO,EACZmO,WAAW,QACXC,OAAO,GAAG9P,yCACV+P,OAAO;IAEVtB,EAAO7Q,MACL,EACE,oCACA,sBACA,uBACA,yBAAyBgS,KACzB,IACA,KACA1L,KAAK;IAGTjF,MAAK6O,EAASvP,IAAIkQ;IAClB,KAAK,MAAMnD,KAAWrM,MAAKiP,EAAea,OAAO;MAAIzD;;IACrDmD,EAAOxB,GAAG,QAAQ+C,KAAS/Q,MAAKgR,EAAcxB,GAAQyB,OAAOC,KAAKH;IAClEvB,EAAOxB,GAAG,SAAS;MACjBhO,MAAK6O,EAASsC,OAAO3B;MACrBxP,MAAK+O,EAAcoC,OAAO3B;;IAE5BA,EAAOxB,GAAG,SAAS;MACjBhO,MAAK6O,EAASsC,OAAO3B;MACrBxP,MAAK+O,EAAcoC,OAAO3B;;AAE9B;EAEA,EAAAwB,CAAcxB,GAAgBuB;IAC5B,MAAMK,IAAUpR,MAAK+O,EAAc7M,IAAIsN;IACvC,MAAM7T,IAAQyV,IAAUH,OAAOI,OAAO,EAACD,GAASL,OAAUA;IAC1D,IAAIO,IAAS;IACb,OAAOA,IAAS3V,EAAMuF,QAAQ;MAC5B,MAAMqQ,IAAQC,UAAU7V,GAAO2V;MAC/B,KAAKC,GAAO;QACVvR,MAAK+O,EAAc5M,IAAIqN,GAAQ7T,EAAM8V,SAASH;QAC9C;AACF;MACAA,IAASC,EAAMG;MACf,IAAqB,MAAjBH,EAAMI;QACRnC,EAAOiB;aACF,IAAqB,MAAjBc,EAAMI;QACf3R,MAAK4R,EAAepC,GAAQ+B,EAAMM,QAAQlP,SAAS;;AAEvD;IACA3C,MAAK+O,EAAcoC,OAAO3B;AAC5B;EAEA,EAAAoC,CAAepC,GAAgBqC;IAC7B,IAAIC;IACJ;MACEA,IAAUlT,KAAKqP,MAAM4D;AACvB,MAAE;MACA;AACF;IAEA,IAAuB,oBAAnBC,EAAQC,QAA4B;MACtC/R,MAAKkP,KAAa;MAClBlP,MAAKgS,EAASxC,GAAQsC,EAAQpD;MAC9B,IAAI1O,MAAKgP,EAAQ9N;QACflB,MAAK+P,EAAW,yBAAyB;UACvC7T,OAAO8D,MAAKgP,EAAQc,OAAO;;;AAGjC,WAAO,IAAuB,kBAAnBgC,EAAQC,QAA0B;MAC3C/R,MAAKkP,KAAa;MAClBlP,MAAKgS,EAASxC,GAAQsC,EAAQpD;MAC9B1O,MAAK+P,EAAW,2BAA2B;AAC7C;MACE/P,MAAKgS,EAASxC,GAAQsC,EAAQpD;;AAElC;EAEA,EAAAsD,CAASxC,GAAgBd;IACvB,IAAU,QAANA;MAAYuD,WAAWzC,GAAQ5Q,KAAKC,UAAU;QAAE6P;QAAI1K,QAAQ,CAAA;;;AAClE;EAEA,EAAA+L,CAAWgC,GAAgBG;IACzB,MAAML,IAAUjT,KAAKC,UAAU;MAAEkT;MAAQG;;IACzC,KAAK,MAAMlC,KAAUhQ,MAAK6O;MAAUoD,WAAWjC,GAAQ6B;;AACzD;;;AAuCF,SAASL,UAAUxC,GAAgBsC;EACjC,IAAIA,IAAS,IAAItC,EAAO9N;IAAQ,OAAO;;EAEvC,MAAMiR,IAASnD,EAAOsC,IAAS;EAC/B,MAAMK,IAAiB,KAFT3C,EAAOsC;EAGrB,MAAMc,OAAmB,MAATD;EAChB,IAAIjR,IAAkB,MAATiR;EACb,IAAIE,IAASf,IAAS;EAEtB,IAAe,QAAXpQ,GAAgB;IAClB,IAAImR,IAAS,IAAIrD,EAAO9N;MAAQ,OAAO;;IACvCA,IAAS8N,EAAOsD,aAAaD;IAC7BA,KAAU;AACZ,SAAO,IAAe,QAAXnR,GAAgB;IACzB,IAAImR,IAAS,IAAIrD,EAAO9N;MAAQ,OAAO;;IACvC,MAAMqR,IAAYvD,EAAOwD,gBAAgBH;IACzC,IAAIE,IAAYpP,OAAO3F,OAAOiV;MAAmB,OAAO;;IACxDvR,IAAS1D,OAAO+U;IAChBF,KAAU;AACZ;EAEA,MAAMK,IAAaL;EACnB,IAAID;IAAQC,KAAU;;EACtB,IAAIA,IAASnR,IAAS8N,EAAO9N;IAAQ,OAAO;;EAE5C,MAAM2Q,IAAUZ,OAAOC,KAAKlC,EAAOyC,SAASY,GAAQA,IAASnR;EAC7D,IAAIkR,GAAQ;IACV,MAAMO,IAAO3D,EAAOyC,SAASiB,GAAYA,IAAa;IACtD,KAAK,IAAIE,IAAI,GAAGA,IAAIf,EAAQ3Q,QAAQ0R;MAAKf,EAAQe,MAAMD,EAAKC,IAAI;;AAClE;EAEA,OAAO;IAAEjB;IAAQE;IAASH,YAAYW,IAASnR;;AACjD;;AAEA,SAAS+Q,WAAWzC,GAAgBqC;EAClC,MAAMgB,IAAO5B,OAAOC,KAAKW;EACzB,IAAIQ;EACJ,IAAIQ,EAAK3R,SAAS;IAChBmR,IAASpB,OAAOC,KAAK,EAAC,KAAM2B,EAAK3R;SAC5B,IAAI2R,EAAK3R,SAAS,OAAQ;IAC/BmR,IAASpB,OAAO6B,YAAY;IAC5BT,EAAO,KAAK;IACZA,EAAO,KAAK;IACZA,EAAOU,cAAcF,EAAK3R,QAAQ;AACpC,SAAO;IACLmR,IAASpB,OAAO6B,YAAY;IAC5BT,EAAO,KAAK;IACZA,EAAO,KAAK;IACZA,EAAOW,iBAAiB7P,OAAO0P,EAAK3R,SAAS;AAC/C;EACAsO,EAAO7Q,MAAMsS,OAAOI,OAAO,EAACgB,GAAQQ;AACtC;;AC1VA,SAASI,UAAU/W;EACjB,OAAOsI,OAAOtI,GACXsO,QAAQ,OAAO,QACfA,QAAQ,OAAO,OACfA,QAAQ,OAAO,OACfA,QAAQ,OAAO;AACpB;;ACjCOlP,eAAe4X,UAAUxW;EAC9B,IAAID,UAAUC,IAAO;KA2CvB,SAASyW;MACP1U,QAAQC,OAAOC,MACb,EACE,mCACA,IACA,YACA,4DACA,+DACA,iEACA,8DACA,yEACA,KACAsG,KAAK;AAEX,KAxDIkO;IACA;AACF;EACA,MAAMrW,IAcR,SAASsW,gBAAgB1W;IACvB,MAAM0D,IAASzD,EAAU;MACvBD;MACAE,mBAAkB;MAClBE,SAAS;WACJ9B;QACHoK,QAAQ;UAAElK,MAAM;;QAChBmD,MAAM;UAAEnD,MAAM;;QACd6B,MAAM;UAAE7B,MAAM;UAAW8B,OAAO;;;;IAGpC,MAAMsI,IAAavJ,sBAAsBqE,EAAOpE;IAChD,IAAIoE,EAAOpE,OAAOqC,QAAiC,aAAzB+B,EAAOpE,OAAOoJ;MACtC,MAAM,IAAI9H,MAAM;;IAElB,OAAO;MACL2I,UAAU7F,EAAO4F,YAAY;MAC7B/K,OAAOqK,EAAWrK;MAClBuB,QAAQ8I,EAAW9I;MACnBrB,QAAQmK,EAAWnK;MACnBkD,MAAM+B,EAAOpE,OAAOqC,SAAQ;MAC5BgV,QAAQjT,EAAOpE,OAAOqC,QAAO,IAAiC,aAAzB+B,EAAOpE,OAAOoJ;;AAEvD,GArCkBgO,CAAgB1W;EAChC,IAAII,EAAQuB;IAAMC;;EAClB,MAAM+H,UAAgBC,EAAexJ,EAAQmJ;EAC7C,WAAW,MAAMpK,KAAS4K,EAAIJ,EAAQK,YAAY5J;IAChD,IAAIA,EAAQuW;MACV5U,QAAQC,OAAOC,MACb,GAAG,IAAIoD,KAAKlG,EAAMiC,IAAIkE,iBAAiBnG,EAAMmC,MAAMY,KAAKC,UAAUhD;;MAGpE4C,QAAQC,OAAOC,MAAM,GAAGC,KAAKC,UAAUhD;;;AAG7C;;ACZOP,eAAegY,KAAKC,IAAO9U,QAAQ8U,KAAK9S,MAAM;EACnD,OAAO+F,MAAY9J,KAAQ6W;EAE3B,KAAK/M,KAAuB,aAAZA,KAAoC,SAAZA,GAAkB;KAoC5D,SAASgN;MACP/U,QAAQC,OAAOC,MACb,EACE,8BACA,IACA,aACA,wFACA,cACA,IACA,kEACA,wEACA,IACA,8EACA,oFACA,IACA,wEACA,yEACA,IACA,uEACA,iEACA,IACA,yDACA,cACA,IACA,yDACA,KACAsG,KAAK;AAEX,KA/DIuO;IACA,OAAO;AACT;EAEA,QAAQhN;GACN,KAAK;IACHqF,cAAcnP;IACd,OAAO;;GACT,KAAK;IACH,IAAID,UAAUC,IAAO;OFiBpB,SAAS+W;QACdhV,QAAQC,OAAOC,MACb,EACE,kCACA,IACA,YACA,2DACA,oDACA,KACAsG,KAAK;AAEX,OE3BQwO;MACA,OAAO;AACT;UFtBCnY,eAAeoY,SAAShX,IAAiB;MAC9C,MAAM0D,IAASzD,EAAU;QACvBD;QACAE,mBAAkB;QAClBE,SAAS;UACPuB,MAAM;YAAEnD,MAAM;;UACd6B,MAAM;YAAE7B,MAAM;YAAW8B,OAAO;;;;MAGpC,IAAIoD,EAAOpE,OAAOqC;QAAMC;;MACxB,MAAMqV,UAAiBC,EAAa;QAAE3N,UAAU7F,EAAO4F,YAAY;;MACnE,IAAI5F,EAAOpE,OAAOqC,MAAM;QACtBI,QAAQC,OAAOC,MAAM,GAAGC,KAAKC,UAAU8U,GAAU,MAAM;QACvD;AACF;MAEAlV,QAAQC,OAAOC,MAAM;MACrB,KAAK,MAAM0H,KAAWsN;QACpBlV,QAAQC,OAAOC,MACb,GAAGsU,UAAU5M,EAAQzG,SAASqT,UAC5B5M,EAAQwN,QAAQ,UAAU,cACtBZ,UACJ,IAAIlR,KAAKsE,EAAQyN,WAAW9R,mBACxBiR,UAAU5M,EAAQG,aAAayM,UAAU5M,EAAQ2B;;AAG7D,KEHY0L,CAAShX;IACf,OAAO;;GACT,KAAK;UACGwW,UAAUxW;IAChB,OAAO;;GACT,KAAK;IACH,IAAID,UAAUC,IAAO;OTnBpB,SAASqX;QACdtV,QAAQC,OAAOC,MACb,EAAC,0BAA0B,IAAI,YAAY,YAAY,KAAIsG,KAAK;AAEpE,OSgBQ8O;MACA,OAAO;AACT;IACA5V,YAAYzB;IACZ,OAAO;;GACT,KAAK;UACGqI,aAAarI;IACnB,OAAO;;GACT,KAAK;IACH,OAAOsP,cAActP;;GACvB;IACE,MAAM,IAAIY,MAAM,oBAAoBkJ;;AAE1C;;AAgCA,IAaA,SAASwN;EACP;IACE,OAAOvV,QAAQ8U,KAAK,OAAOU,cAA0BlH;AACvD,IAAE;IACA,QAAO;AACT;AACF,CAnBIiH;EACFV,OACGY,KAAK9F;IACJ3P,QAAQyP,WAAWE;KAEpB+F,MAAM9L;IACL5J,QAAQqO,OAAOnO,MACb,GAAG0J,aAAiB/K,QAAQ+K,EAAMyJ,UAAUtN,OAAO6D;IAErD5J,QAAQyP,WAAW;;;;"}
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "@expo/event-log",
3
+ "version": "0.0.1-init",
4
+ "description": "",
5
+ "author": "Phil Pluckthun <phil@kitten.sh>",
6
+ "source": "./src/index.ts",
7
+ "main": "./dist/event-log.js",
8
+ "module": "./dist/event-log.mjs",
9
+ "types": "./dist/event-log.d.ts",
10
+ "bin": {
11
+ "event-log": "./bin/cli.js",
12
+ "expo-event-log": "./bin/cli.js"
13
+ },
14
+ "files": [
15
+ "LICENSE.md",
16
+ "README.md",
17
+ "CHANGELOG.md",
18
+ "bin/",
19
+ "cli/",
20
+ "dist/"
21
+ ],
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/event-log.d.ts",
25
+ "import": "./dist/event-log.mjs",
26
+ "require": "./dist/event-log.js",
27
+ "source": "./src/index.ts"
28
+ },
29
+ "./cli": {
30
+ "types": "./dist/expo-event-log-cli.d.ts",
31
+ "import": "./dist/expo-event-log-cli.mjs",
32
+ "require": "./dist/expo-event-log-cli.js",
33
+ "source": "./src/cli.ts"
34
+ },
35
+ "./package.json": "./package.json"
36
+ },
37
+ "prettier": {
38
+ "singleQuote": true,
39
+ "arrowParens": "avoid",
40
+ "trailingComma": "es5"
41
+ },
42
+ "lint-staged": {
43
+ "*.{js,ts,json,md}": "prettier --write"
44
+ },
45
+ "keywords": [],
46
+ "license": "MIT",
47
+ "repository": "https://github.com/kitten/event-log",
48
+ "bugs": {
49
+ "url": "https://github.com/kitten/event-log/issues"
50
+ },
51
+ "devDependencies": {
52
+ "@babel/plugin-transform-typescript": "^7.28.5",
53
+ "@changesets/cli": "^2.29.7",
54
+ "@changesets/get-github-info": "^0.6.0",
55
+ "@rollup/plugin-babel": "^6.1.0",
56
+ "@rollup/plugin-commonjs": "^29.0.0",
57
+ "@rollup/plugin-node-resolve": "^16.0.3",
58
+ "@rollup/plugin-terser": "^0.4.4",
59
+ "@types/node": "^25.9.2",
60
+ "dotenv": "^17.2.3",
61
+ "lint-staged": "^16.2.6",
62
+ "modern-tar": "^0.7.2",
63
+ "npm-run-all": "^4.1.5",
64
+ "prettier": "^3.6.2",
65
+ "rimraf": "^6.1.0",
66
+ "rollup": "^4.53.3",
67
+ "rollup-plugin-cjs-check": "^1.0.3",
68
+ "rollup-plugin-dts": "^6.2.3",
69
+ "typescript": "^5.9.3",
70
+ "vitest": "^4.0.10"
71
+ },
72
+ "peerDependencies": {
73
+ "typescript": ">=5"
74
+ },
75
+ "peerDependenciesMeta": {
76
+ "typescript": {
77
+ "optional": true
78
+ }
79
+ },
80
+ "publishConfig": {
81
+ "access": "public"
82
+ },
83
+ "scripts": {
84
+ "test": "vitest test",
85
+ "test:run": "vitest test --run",
86
+ "prebench": "pnpm run build",
87
+ "bench": "vitest bench",
88
+ "build": "rollup -c ./scripts/rollup.config.mjs",
89
+ "postbuild": "tsc --lib esnext,dom,dom.iterable --target esnext --module nodenext --moduleResolution nodenext --noEmit ./dist/event-log.d.ts ./dist/expo-event-log-cli.d.ts",
90
+ "check": "tsc --noEmit",
91
+ "clean": "rimraf dist node_modules/.cache",
92
+ "changeset:version": "changeset version && pnpm install --lockfile-only",
93
+ "changeset:publish": "changeset publish"
94
+ }
95
+ }