Files
BrowserOS/scripts/codegen/lib/protocol-api-emitter.ts
Nikhil b83f50b8f6 feat: generate cdp types based on protocol" (#355)
* feat: gen cdp types

* feat: move apis to use typed cdp

* fix: lint errors on scripts/codegen

* fix: lint errors on scripts/codegen
2026-02-23 13:47:57 -08:00

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')
}