synthex
Version:
Type-safe LLM response simulation with streaming & error injection
88 lines (87 loc) • 3 kB
JavaScript
describe("types", () => {
it("should type-check", () => {
expect(true).toBe(true);
});
});
import { s, MockGenerator, TypeInference } from "../src/index";
const userSchema = s
.object({
id: s.uuid().required(),
name: s.string().required(),
email: s.email().required(),
age: s.number().optional(),
isActive: s.boolean().required(),
tags: s.array(s.string()).min(1).max(5),
profile: s.object({
bio: s.string().max(200),
website: s.url(),
}),
role: s.enum(["admin", "user", "moderator"]),
createdAt: s.date().format("date-time"),
})
.build("UserSchema", "1.0.0");
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _user = {
id: "abc",
name: "Test",
email: "test@example.com",
isActive: true,
tags: ["a"],
profile: { bio: "b", website: "https://a.com" },
role: "admin",
createdAt: "2025-01-01T00:00:00Z",
age: 42,
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _tsType = TypeInference.inferType(userSchema);
// $ExpectType string
// @ts-expect-no-error
const _generator = new MockGenerator({ seed: 1 });
const _response = _generator.generate(userSchema);
// $ExpectType User
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _data = _response.data;
// @ts-expect-error Missing required fields
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _badUser = { id: "abc" };
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _badUser2 = {
// @ts-expect-error Wrong type: id should be string
id: 123,
name: "Test",
email: "a",
isActive: true,
tags: [],
profile: { bio: "", website: "" },
role: "admin",
createdAt: "",
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _extendedSchema = s
.object({ foo: s.string().required() })
.extend({ bar: s.number().optional() })
.build("X");
// @ts-expect-error TS limitation: bar is optional but required in intersection
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _ext = { foo: "a", bar: undefined };
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _unionSchema = s.union([s.string(), s.number()]).build();
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _u1 = "a";
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _u2 = 1;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _intersectionSchema = s
.intersection([
s.object({ a: s.string().required() }),
s.object({ b: s.number().required() }),
])
.build();
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _i = { a: "a", b: 1 };
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _nullableSchema = s.nullable(s.string()).build();
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _n1 = null;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _n2 = "x";