import { describe, it } from "@std/testing/bdd"; import { expect } from "@std/expect"; import { createSchemaTransformerV2 } from "../../src/plugin.ts"; import { asObjectSchema, getTypeFromCode } from "../utils.ts"; describe("Schema: Cell types", () => { it("handles Cell", async () => { const code = ` interface X { name: Cell; } `; const { type, checker } = await getTypeFromCode(code, "X"); const gen = createSchemaTransformerV2(); const result = asObjectSchema(gen.generateSchema(type, checker)); const name = result.properties?.name as Record; expect(name).toBeDefined(); expect(name.type).toBe("string"); expect(name.asCell).toBe(true); expect(result.required).toContain("name"); }); it("handles Cell>", async () => { const code = ` interface X { users: Cell>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const gen = createSchemaTransformerV2(); const result = asObjectSchema(gen.generateSchema(type, checker)); const users = result.properties?.users as Record; expect(users).toBeDefined(); expect(users.type).toBe("array"); const usersItems = users.items as any; expect(usersItems?.type).toBe("object"); const usersItemsProps = usersItems?.properties as any; expect(usersItemsProps?.id?.type).toBe("string"); expect(users.asCell).toBe(true); }); it("handles Stream>", async () => { const code = ` interface X { value: Stream>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const gen = createSchemaTransformerV2(); const result = asObjectSchema(gen.generateSchema(type, checker)); const prop = result.properties?.value as Record; expect(prop).toBeDefined(); expect(prop.type).toBe("number"); expect(prop.asStream).toBe(true); // No asCell marker for inner Cell when wrapped in Stream expect((prop as any).asCell).toBeUndefined(); }); it("disallows Cell> and suggests boxing", async () => { const code = ` interface X { invalid: Cell>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const gen = createSchemaTransformerV2(); expect(() => gen.generateSchema(type, checker)).toThrow( "Cell> is unsupported. Wrap the stream: Cell<{ stream: Stream }>", ); }); });