34 lines
1.4 KiB
TypeScript
34 lines
1.4 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { isOpenCodeEvent, type OpenCodeEvent, type OpenCodeEventEncoded } from "../src/groups/event.js"
|
|
|
|
type JsonShape<Value> = Value extends string | number | boolean | null
|
|
? Value
|
|
: Value extends undefined
|
|
? never
|
|
: Value extends ReadonlyArray<infer Item>
|
|
? ReadonlyArray<JsonShape<Item>>
|
|
: Value extends object
|
|
? {
|
|
readonly [Key in keyof Value as undefined extends Value[Key] ? never : Key]: JsonShape<Value[Key]>
|
|
} & {
|
|
readonly [Key in keyof Value as undefined extends Value[Key] ? Key : never]?: JsonShape<
|
|
Exclude<Value[Key], undefined>
|
|
>
|
|
}
|
|
: Value
|
|
|
|
// JSON.stringify omits undefined object properties, so normalize them before
|
|
// requiring every runtime event shape to fit its encoded wire contract.
|
|
const wireReady: [JsonShape<OpenCodeEvent>] extends [JsonShape<OpenCodeEventEncoded>] ? true : false = true
|
|
|
|
test("classifies public events by type", () => {
|
|
expect(isOpenCodeEvent({ type: "server.connected" })).toBe(true)
|
|
expect(isOpenCodeEvent({ type: "mcp.status.changed" })).toBe(true)
|
|
expect(isOpenCodeEvent({ type: "mcp.resources.changed" })).toBe(true)
|
|
expect(isOpenCodeEvent({ type: "mcp.tools.changed" })).toBe(false)
|
|
})
|
|
|
|
test("keeps public event runtime values within the encoded contract", () => {
|
|
expect(wireReady).toBe(true)
|
|
})
|