Compilers for @effect/schema. Currently in alpha; although, the api is pretty simple and probably won't change too much. For a collection of types preconfigured to work with these types see effect-types
- Convert to monorepo to allow supporting multiple compilers without dep issues.
- Create compiler for avro
Generate "empty" values from a Schema. Similar to zod-empty with a similar motivation.
import * as E from "effect-schema-compilers/dist/empty";
const s = E.to(S.struct({ num: S.number, str: S.string }))(); // { num: 0, str: "" }
Also supports setting the empty value for a schema. E.g.
import * as E from "effect-schema-compilers/dist/empty";
import { pipe } from "@effect/data/Function";
const s = pipe(S.number, E.empty(() => 1), E.to()) // 1
Generates a Semigroup from the provided Schema. The default Semigroup.last is used which simply overrides the previous value.
import * as S from "@effect/schema/Schema";
import * as _ from "effect-schema-compilers/dist/semigroup";
const schema = S.struct({ a: S.number, b: S.string });
const { combine } = _.to(schema)()
expect(combine({ a: 0, b: "0" }, { a: 1, b: "1" })).toEqual({ a: 1, b: "1" })
The semigroup for a Schema can be set using the semigroup() fn. For example,
import * as S from "@effect/schema/Schema";
import * as Semi from "@effect/typeclass/Semigroup"'
import * as _ from "effect-schema-compilers/dist/semigroup";
import { pipe } from "@effect/data/Function";
const schema = S.struct({
a: pipe(S.number, _.semigroup(Semi.min(n.Order))),
b: pipe(S.string, _.semigroup(Semi.string)),
c: S.boolean
});
const { combine } = _.to(schema)()
expect(combine({ a: 0, b: "0", c: true }, { a: 1, b: "1", c: false })).toEqual({ a: 0, b: "01", c: false })
Generates realistic objects from a Schema using fakerjs.
import * as F from '@faker-js/faker';
import * as S from "@effect/schema/Schema"
import { pipe } from "@effect/data/Function";
import * as _ from "effect-schema-compilers/dist/faker";
const Person = S.struct({
name: pipe(S.string, _.faker(f => f.person.fullName())),
age: pipe(S.number, S.int(), S.greaterThanOrEqualTo(18), S.lessThanOrEqualTo(120)),
sex: S.literal("male", "female")
});
const fakeData = _.to(Person)(F.faker) // { name: "Seth Gottlieb", age: 36, sex: "male" }