Add Effect v4 support, Fast Refresh tooling, and revamped docs #56

Merged
Thilawyn merged 133 commits from next into master 2026-07-26 02:32:59 +02:00
3 changed files with 27 additions and 27 deletions
Showing only changes of commit be1038fc8d - Show all commits
@@ -5,12 +5,12 @@ import * as Lens from "./Lens.js"
import * as View from "./View.js" import * as View from "./View.js"
export const SynchronizedFormTypeId: unique symbol = Symbol.for("@effect-fc/Form/SynchronizedForm") export const LensFormTypeId: unique symbol = Symbol.for("@effect-fc/Form/LensForm")
export type SynchronizedFormTypeId = typeof SynchronizedFormTypeId export type LensFormTypeId = typeof LensFormTypeId
export interface SynchronizedForm<in out A, in out I = A, in out RD = never, in out RE = never, out TER = never, out TEW = never, in out TRR = never, in out TRW = never> export interface LensForm<in out A, in out I = A, in out RD = never, in out RE = never, out TER = never, out TEW = never, in out TRR = never, in out TRW = never>
extends Form.Form<readonly [], A, I, TER, TER | TEW> { extends Form.Form<readonly [], A, I, TER, TER | TEW> {
readonly [SynchronizedFormTypeId]: SynchronizedFormTypeId readonly [LensFormTypeId]: LensFormTypeId
readonly schema: Schema.ConstraintCodec<A, I, RD, RE> readonly schema: Schema.ConstraintCodec<A, I, RD, RE>
readonly context: Context.Context<Scope.Scope | RD | RE | TRR | TRW> readonly context: Context.Context<Scope.Scope | RD | RE | TRR | TRW>
@@ -20,10 +20,10 @@ extends Form.Form<readonly [], A, I, TER, TER | TEW> {
readonly run: Effect.Effect<void, TER> readonly run: Effect.Effect<void, TER>
} }
export class SynchronizedFormImpl<in out A, in out I = A, in out RD = never, in out RE = never, out TER = never, out TEW = never, in out TRR = never, in out TRW = never> export class LensFormImpl<in out A, in out I = A, in out RD = never, in out RE = never, out TER = never, out TEW = never, in out TRR = never, in out TRW = never>
extends Pipeable.Class implements SynchronizedForm<A, I, RD, RE, TER, TEW, TRR, TRW> { extends Pipeable.Class implements LensForm<A, I, RD, RE, TER, TEW, TRR, TRW> {
readonly [Form.FormTypeId]: Form.FormTypeId = Form.FormTypeId readonly [Form.FormTypeId]: Form.FormTypeId = Form.FormTypeId
readonly [SynchronizedFormTypeId]: SynchronizedFormTypeId = SynchronizedFormTypeId readonly [LensFormTypeId]: LensFormTypeId = LensFormTypeId
readonly path = [] as const readonly path = [] as const
@@ -150,7 +150,7 @@ extends Pipeable.Class implements SynchronizedForm<A, I, RD, RE, TER, TEW, TRR,
} }
} }
export const isSynchronizedForm = (u: unknown): u is SynchronizedForm<unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, SynchronizedFormTypeId) export const isLensForm = (u: unknown): u is LensForm<unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, LensFormTypeId)
export declare namespace make { export declare namespace make {
@@ -164,7 +164,7 @@ export declare namespace make {
export const make = Effect.fnUntraced(function* <A, I = A, RD = never, RE = never, TER = never, TEW = never, TRR = never, TRW = never>( export const make = Effect.fnUntraced(function* <A, I = A, RD = never, RE = never, TER = never, TEW = never, TRR = never, TRW = never>(
options: make.Options<A, I, RD, RE, TER, TEW, TRR, TRW> options: make.Options<A, I, RD, RE, TER, TEW, TRR, TRW>
): Effect.fn.Return< ): Effect.fn.Return<
SynchronizedForm<A, I, RD, RE, TER, TEW, TRR, TRW>, LensForm<A, I, RD, RE, TER, TEW, TRR, TRW>,
Schema.SchemaError | TER, Schema.SchemaError | TER,
Scope.Scope | RD | RE | TRR | TRW Scope.Scope | RD | RE | TRR | TRW
> { > {
@@ -175,7 +175,7 @@ export const make = Effect.fnUntraced(function* <A, I = A, RD = never, RE = neve
Schema.encodeEffect(options.schema), Schema.encodeEffect(options.schema),
) )
return new SynchronizedFormImpl( return new LensFormImpl(
options.schema, options.schema,
yield* Effect.context<Scope.Scope | RD | RE | TRR | TRW>(), yield* Effect.context<Scope.Scope | RD | RE | TRR | TRW>(),
options.target, options.target,
@@ -197,7 +197,7 @@ export declare namespace service {
export const service = <A, I = A, RD = never, RE = never, TER = never, TEW = never, TRR = never, TRW = never>( export const service = <A, I = A, RD = never, RE = never, TER = never, TEW = never, TRR = never, TRW = never>(
options: service.Options<A, I, RD, RE, TER, TEW, TRR, TRW> options: service.Options<A, I, RD, RE, TER, TEW, TRR, TRW>
): Effect.Effect< ): Effect.Effect<
SynchronizedForm<A, I, RD, RE, TER, TEW, TRR, TRW>, LensForm<A, I, RD, RE, TER, TEW, TRR, TRW>,
Schema.SchemaError | TER, Schema.SchemaError | TER,
Scope.Scope | RD | RE | TRR | TRW Scope.Scope | RD | RE | TRR | TRW
> => Effect.tap( > => Effect.tap(
@@ -7,17 +7,17 @@ import * as Mutation from "./Mutation.js"
import * as View from "./View.js" import * as View from "./View.js"
export const SubmittableFormTypeId: unique symbol = Symbol.for("@effect-fc/Form/SubmittableForm") export const MutationFormTypeId: unique symbol = Symbol.for("@effect-fc/Form/MutationForm")
export type SubmittableFormTypeId = typeof SubmittableFormTypeId export type MutationFormTypeId = typeof MutationFormTypeId
export interface SubmittableForm<in out A, in out I = A, in out RD = never, in out RE = never, out MA = void, out ME = never, in out MR = never> export interface MutationForm<in out A, in out I = A, in out RD = never, in out RE = never, out MA = void, out ME = never, in out MR = never>
extends Form.Form<readonly [], A, I, never, never> { extends Form.Form<readonly [], A, I, never, never> {
readonly [SubmittableFormTypeId]: SubmittableFormTypeId readonly [MutationFormTypeId]: MutationFormTypeId
readonly schema: Schema.ConstraintCodec<A, I, RD, RE> readonly schema: Schema.ConstraintCodec<A, I, RD, RE>
readonly context: Context.Context<Scope.Scope | RD | RE> readonly context: Context.Context<Scope.Scope | RD | RE>
readonly mutation: Mutation.Mutation< readonly mutation: Mutation.Mutation<
readonly [value: A, form: SubmittableForm<A, I, RD, RE, unknown, unknown, unknown>], readonly [value: A, form: MutationForm<A, I, RD, RE, unknown, unknown, unknown>],
MA, ME, MR MA, ME, MR
> >
readonly validationFiber: View.View<Option.Option<Fiber.Fiber<A, Schema.SchemaError>>, never, never> readonly validationFiber: View.View<Option.Option<Fiber.Fiber<A, Schema.SchemaError>>, never, never>
@@ -26,10 +26,10 @@ extends Form.Form<readonly [], A, I, never, never> {
readonly submit: Effect.Effect<Option.Option<AsyncResult.Success<MA, ME> | AsyncResult.Failure<MA, ME>>, Cause.NoSuchElementError> readonly submit: Effect.Effect<Option.Option<AsyncResult.Success<MA, ME> | AsyncResult.Failure<MA, ME>>, Cause.NoSuchElementError>
} }
export class SubmittableFormImpl<in out A, in out I = A, in out RD = never, in out RE = never, out MA = void, out ME = never, in out MR = never> export class MutationFormImpl<in out A, in out I = A, in out RD = never, in out RE = never, out MA = void, out ME = never, in out MR = never>
extends Pipeable.Class implements SubmittableForm<A, I, RD, RE, MA, ME, MR> { extends Pipeable.Class implements MutationForm<A, I, RD, RE, MA, ME, MR> {
readonly [Form.FormTypeId]: Form.FormTypeId = Form.FormTypeId readonly [Form.FormTypeId]: Form.FormTypeId = Form.FormTypeId
readonly [SubmittableFormTypeId]: SubmittableFormTypeId = SubmittableFormTypeId readonly [MutationFormTypeId]: MutationFormTypeId = MutationFormTypeId
readonly path = [] as const readonly path = [] as const
@@ -42,7 +42,7 @@ extends Pipeable.Class implements SubmittableForm<A, I, RD, RE, MA, ME, MR> {
readonly schema: Schema.ConstraintCodec<A, I, RD, RE>, readonly schema: Schema.ConstraintCodec<A, I, RD, RE>,
readonly context: Context.Context<Scope.Scope | RD | RE>, readonly context: Context.Context<Scope.Scope | RD | RE>,
readonly mutation: Mutation.Mutation< readonly mutation: Mutation.Mutation<
readonly [value: A, form: SubmittableForm<A, I, RD, RE, unknown, unknown, unknown>], readonly [value: A, form: MutationForm<A, I, RD, RE, unknown, unknown, unknown>],
MA, ME, MR MA, ME, MR
>, >,
readonly value: Lens.Lens<Option.Option<A>, never, never, never, never>, readonly value: Lens.Lens<Option.Option<A>, never, never, never, never>,
@@ -161,13 +161,13 @@ extends Pipeable.Class implements SubmittableForm<A, I, RD, RE, MA, ME, MR> {
} }
} }
export const isSubmittableForm = (u: unknown): u is SubmittableForm<unknown, unknown, unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, SubmittableFormTypeId) export const isMutationForm = (u: unknown): u is MutationForm<unknown, unknown, unknown, unknown, unknown, unknown, unknown> => Predicate.hasProperty(u, MutationFormTypeId)
export declare namespace make { export declare namespace make {
export interface Options<in out A, in out I = A, in out RD = never, in out RE = never, out MA = void, out ME = never, out MR = never> export interface Options<in out A, in out I = A, in out RD = never, in out RE = never, out MA = void, out ME = never, out MR = never>
extends Mutation.make.Options< extends Mutation.make.Options<
readonly [value: NoInfer<A>, form: SubmittableForm<NoInfer<A>, NoInfer<I>, NoInfer<RD>, NoInfer<RE>, unknown, unknown, unknown>], readonly [value: NoInfer<A>, form: MutationForm<NoInfer<A>, NoInfer<I>, NoInfer<RD>, NoInfer<RE>, unknown, unknown, unknown>],
MA, ME, MR MA, ME, MR
> { > {
readonly schema: Schema.ConstraintCodec<A, I, RD, RE> readonly schema: Schema.ConstraintCodec<A, I, RD, RE>
@@ -178,11 +178,11 @@ export declare namespace make {
export const make = Effect.fnUntraced(function* <A, I = A, RD = never, RE = never, MA = void, ME = never, MR = never>( export const make = Effect.fnUntraced(function* <A, I = A, RD = never, RE = never, MA = void, ME = never, MR = never>(
options: make.Options<A, I, RD, RE, MA, ME, MR> options: make.Options<A, I, RD, RE, MA, ME, MR>
): Effect.fn.Return< ): Effect.fn.Return<
SubmittableForm<A, I, RD, RE, MA, ME, MR>, MutationForm<A, I, RD, RE, MA, ME, MR>,
never, never,
Scope.Scope | RD | RE | MR Scope.Scope | RD | RE | MR
> { > {
return new SubmittableFormImpl( return new MutationFormImpl(
options.schema, options.schema,
yield* Effect.context<Scope.Scope | RD | RE | MR>(), yield* Effect.context<Scope.Scope | RD | RE | MR>(),
yield* Mutation.make(options), yield* Mutation.make(options),
@@ -204,7 +204,7 @@ export declare namespace service {
export const service = <A, I = A, RD = never, RE = never, MA = void, ME = never, MR = never>( export const service = <A, I = A, RD = never, RE = never, MA = void, ME = never, MR = never>(
options: service.Options<A, I, RD, RE, MA, ME, MR> options: service.Options<A, I, RD, RE, MA, ME, MR>
): Effect.Effect< ): Effect.Effect<
SubmittableForm<A, I, RD, RE, MA, ME, MR>, MutationForm<A, I, RD, RE, MA, ME, MR>,
never, never,
Scope.Scope | RD | RE | MR Scope.Scope | RD | RE | MR
> => Effect.tap( > => Effect.tap(
+2 -2
View File
@@ -3,8 +3,10 @@ export * as Component from "./Component.js"
export * as ErrorObserver from "./ErrorObserver.js" export * as ErrorObserver from "./ErrorObserver.js"
export * as Form from "./Form.js" export * as Form from "./Form.js"
export * as Lens from "./Lens.js" export * as Lens from "./Lens.js"
export * as LensForm from "./LensForm.js"
export * as Memoized from "./Memoized.js" export * as Memoized from "./Memoized.js"
export * as Mutation from "./Mutation.js" export * as Mutation from "./Mutation.js"
export * as MutationForm from "./MutationForm.js"
export * as PubSub from "./PubSub.js" export * as PubSub from "./PubSub.js"
export * as Query from "./Query.js" export * as Query from "./Query.js"
export * as QueryClient from "./QueryClient.js" export * as QueryClient from "./QueryClient.js"
@@ -12,6 +14,4 @@ export * as ReactRuntime from "./ReactRuntime.js"
export * as Result from "./Result.js" export * as Result from "./Result.js"
export * as SetStateAction from "./SetStateAction.js" export * as SetStateAction from "./SetStateAction.js"
export * as Stream from "./Stream.js" export * as Stream from "./Stream.js"
export * as SubmittableForm from "./SubmittableForm.js"
export * as SynchronizedForm from "./SynchronizedForm.js"
export * as View from "./View.js" export * as View from "./View.js"