Files
BrowserOS/packages/browseros-agent/scripts/codegen/lib/protocol-api-emitter.ts
Dani Akash 290ee91a8b Add 'packages/browseros-agent/' from commit '90bd4be3008285bf3825aad3702aff98f872671a'
git-subtree-dir: packages/browseros-agent
git-subtree-mainline: 8f148d0918
git-subtree-split: 90bd4be300
2026-03-13 21:22:09 +05:30

89 lines
2.7 KiB
TypeScript

import { domainToKebab } from './naming'
import type { ProtocolDomain } from './protocol-parser'
export function emitProtocolApiFile(domains: ProtocolDomain[]): string {
const lines: string[] = []
const sorted = [...domains].sort((a, b) => {
const aPath = domainToKebab(a.domain)
const bPath = domainToKebab(b.domain)
return aPath.localeCompare(bPath)
})
lines.push('// ── AUTO-GENERATED from CDP protocol. DO NOT EDIT. ──')
lines.push('')
for (const domain of sorted) {
const kebab = domainToKebab(domain.domain)
lines.push(
`import type { ${domain.domain}Api } from './domain-apis/${kebab}'`,
)
}
lines.push('')
lines.push('export interface ProtocolApi {')
for (const domain of domains) {
lines.push(` readonly ${domain.domain}: ${domain.domain}Api`)
}
lines.push('}')
lines.push('')
return lines.join('\n')
}
export function emitCreateApiFile(domains: ProtocolDomain[]): string {
const lines: string[] = []
lines.push('// ── AUTO-GENERATED from CDP protocol. DO NOT EDIT. ──')
lines.push('')
lines.push("import type { ProtocolApi } from './protocol-api'")
lines.push('')
lines.push('export type RawSend = (')
lines.push(' method: string,')
lines.push(' params?: Record<string, unknown>,')
lines.push(') => Promise<unknown>')
lines.push('')
lines.push('export type RawOn = (')
lines.push(' event: string,')
lines.push(' handler: (params: unknown) => void,')
lines.push(') => () => void')
lines.push('')
lines.push(
'function createDomainProxy(domain: string, send: RawSend, on: RawOn): unknown {',
)
lines.push(' return new Proxy(Object.create(null), {')
lines.push(' get(_, method: string) {')
lines.push(" if (method === 'on') {")
lines.push(
' return (event: string, handler: (params: unknown) => void) =>',
)
// biome-ignore lint/suspicious/noTemplateCurlyInString: emitting template literal source code
lines.push(' on(`${domain}.${event}`, handler)')
lines.push(' }')
lines.push(' return (params?: Record<string, unknown>) =>')
// biome-ignore lint/suspicious/noTemplateCurlyInString: emitting template literal source code
lines.push(' send(`${domain}.${method}`, params)')
lines.push(' },')
lines.push(' })')
lines.push('}')
lines.push('')
lines.push(
'export function createProtocolApi(send: RawSend, on: RawOn): ProtocolApi {',
)
lines.push(' return {')
for (const domain of domains) {
lines.push(
` ${domain.domain}: createDomainProxy('${domain.domain}', send, on),`,
)
}
lines.push(' } as unknown as ProtocolApi')
lines.push('}')
lines.push('')
return lines.join('\n')
}