Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jessekelly881/effect-schema-compilers
Compilers for @effect/schema
https://github.com/jessekelly881/effect-schema-compilers
effect-ts fakerjs schema typescript
Last synced: 2 months ago
JSON representation
Compilers for @effect/schema
- Host: GitHub
- URL: https://github.com/jessekelly881/effect-schema-compilers
- Owner: jessekelly881
- License: mit
- Created: 2023-05-25T20:41:19.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-10-14T07:16:37.000Z (3 months ago)
- Last Synced: 2024-11-04T04:03:25.625Z (3 months ago)
- Topics: effect-ts, fakerjs, schema, typescript
- Language: TypeScript
- Homepage:
- Size: 955 KB
- Stars: 19
- Watchers: 1
- Forks: 1
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# effect-schema-compilers
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](https://github.com/jessekelly881/effect-types)
[![Npm package monthly downloads](https://badgen.net/npm/dm/effect-schema-compilers)](https://npmjs.com/package/effect-schema-compilers)
![img](code.png)
## Current TODOs
- Convert to monorepo to allow supporting multiple compilers without dep issues.
- Create compiler for avro## Empty
Generate "empty" values from a Schema. Similar to [zod-empty](https://github.com/toiroakr/zod-empty) with a similar motivation.
```ts
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.
```ts
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
```## Semigroup
Generates a [Semigroup](https://effect-ts.github.io/data/modules/typeclass/Semigroup.ts.html) from the provided Schema. The default Semigroup.last is used which simply overrides the previous value.
```ts
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,
```ts
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 })
```## Fakerjs
Generates realistic objects from a Schema using [fakerjs](@fakerjs/faker).
```ts
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" }
```