@playfast/reform-forms 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,128 @@
1
+ <div align="center">
2
+
3
+ # `@playfast/forms`
4
+
5
+ **Headless form state for [reform](https://www.npmjs.com/package/@playfast/reform).**
6
+ Values, validation, field metadata, list operations, submit flow, and correlations with the rest of your app state — rendering nothing.
7
+
8
+ [![npm](https://img.shields.io/npm/v/@playfast/forms.svg)](https://www.npmjs.com/package/@playfast/forms)
9
+ [![license](https://img.shields.io/npm/l/@playfast/forms.svg)](#license)
10
+ [![built with Effect](https://img.shields.io/badge/built%20with-Effect-5a67d8.svg)](https://effect.website)
11
+
12
+ </div>
13
+
14
+ ---
15
+
16
+ `@playfast/forms` owns everything a form needs *except* its widgets. It has no DOM and no React API — it produces a typed, platform-neutral view that any renderer can map. Pair it with [`@playfast/forms-react`](https://www.npmjs.com/package/@playfast/forms-react) for typed JSX, or consume the view directly from a custom host.
17
+
18
+ ## Install
19
+
20
+ ```sh
21
+ bun add @playfast/forms @playfast/reform effect
22
+ ```
23
+
24
+ Peers: `effect` and `@playfast/reform`.
25
+
26
+ ## Model
27
+
28
+ Forms follow the same definition / implementation split as the rest of reform:
29
+
30
+ ```ts
31
+ import { Schema as S } from 'effect'
32
+ import { Form } from '@playfast/reform-forms'
33
+ import { CurrentUser, Settings } from './sources'
34
+
35
+ const CheckoutValues = S.Struct({
36
+ email: S.String,
37
+ items: S.Array(S.Struct({ name: S.String, qty: S.Number })),
38
+ payment: S.Union(
39
+ S.TaggedStruct('Card', { cardNumber: S.String, cvv: S.String }),
40
+ S.TaggedStruct('Paypal', { email: S.String }),
41
+ ),
42
+ })
43
+
44
+ class CheckoutForm extends Form.make('CheckoutForm', {
45
+ schema: CheckoutValues,
46
+ inputs: { user: CurrentUser, settings: Settings },
47
+ }) {}
48
+ ```
49
+
50
+ `Form.make` creates a reflectable form definition. `Form.live` provides the runtime behavior:
51
+
52
+ ```ts
53
+ const CheckoutFormLive = Form.live(CheckoutForm, {
54
+ initial: {
55
+ email: '',
56
+ items: [],
57
+ payment: { _tag: 'Card', cardNumber: '', cvv: '' },
58
+ },
59
+ limit: ({ inputs }) => ({
60
+ email: { required: true, disabled: !inputs.settings.emailEditable },
61
+ items: { minItems: 1, maxItems: inputs.settings.maxItems },
62
+ }),
63
+ validate: ({ values }) =>
64
+ values.email.includes('@')
65
+ ? undefined
66
+ : Form.error('email', 'Email must contain @'),
67
+ submit: ({ decoded, inputs }) => saveCheckout(decoded, inputs.user.id),
68
+ })
69
+ ```
70
+
71
+ Read the form inside compositions with `Form.view(CheckoutForm)` — a typed, platform-neutral object:
72
+
73
+ ```ts
74
+ const form = yield* Form.view(CheckoutForm)
75
+
76
+ form.field('email').set('a@example.com')
77
+ form.array('items').append({ name: 'Milk', qty: 1 })
78
+ form.submit()
79
+ ```
80
+
81
+ ## Correlations
82
+
83
+ `inputs` connects a form to other reform state or calculations, read through the same tracking mechanism as normal composition reads — so a view that depends on the form also updates when its limitations or validation context change. Use it for permissions, calculated totals, feature flags, remote defaults, or cross-field constraints sourced from outside the form values.
84
+
85
+ ## Limitations
86
+
87
+ `limit` returns field metadata keyed by form path. The core does not interpret metadata as DOM attributes; it carries constraints to any renderer:
88
+
89
+ ```ts
90
+ limit: ({ values }) => ({
91
+ email: { required: true, maxLength: 120 },
92
+ 'payment.cardNumber': {
93
+ visible: values.payment._tag === 'Card',
94
+ meta: { mask: 'card' },
95
+ },
96
+ })
97
+ ```
98
+
99
+ ## Paths
100
+
101
+ Path strings are type-checked from the Effect Schema encoded value — invalid paths fail at compile time through the typed helpers:
102
+
103
+ - `field('email')` · `field('items[0].qty')` · `array('items')` · `variantValue('payment')`
104
+
105
+ ## Lists
106
+
107
+ Array bindings expose stable keys and item operations:
108
+
109
+ ```ts
110
+ const items = form.array('items')
111
+ items.append({ name: '', qty: 1 })
112
+ items.move(0, 1)
113
+ items.remove(0)
114
+ ```
115
+
116
+ Each item is `{ key, index, value, remove, move }`, so UI layers can map rows without owning form state.
117
+
118
+ ## Validation and submit
119
+
120
+ `submit()` decodes the Effect Schema, then runs custom validation; schema parse issues and custom errors both route into field errors. `canSubmit` is a derived read from the current decoded state and stored errors — advisory UI state, not a substitute for submit-time validation. `validate()` runs validation without submitting; `reset()` restores the initial values.
121
+
122
+ ## The reform family
123
+
124
+ Core [`@playfast/reform`](https://www.npmjs.com/package/@playfast/reform) · typed JSX [`@playfast/forms-react`](https://www.npmjs.com/package/@playfast/forms-react) · hosts [`@playfast/react`](https://www.npmjs.com/package/@playfast/react) / [`@playfast/react-native`](https://www.npmjs.com/package/@playfast/react-native) · testing [`@playfast/proof`](https://www.npmjs.com/package/@playfast/proof)
125
+
126
+ ## License
127
+
128
+ MIT
package/dist/form.d.ts ADDED
@@ -0,0 +1,184 @@
1
+ import { Context, Effect, Layer, Option, Schema as S } from 'effect';
2
+ import { Bus, Event, Reducer, Reducers, State, type Store } from '@playfast/reform';
3
+ import type { AnySource, Source } from '@playfast/reform';
4
+ import { type ArrayItem, type ArrayPath, type FieldPath, type PathValue, type VariantPath, type VariantValue } from './path';
5
+ import { error, type FormError, type FormErrors } from './validation';
6
+ export { error };
7
+ export interface FieldLimitations<A = unknown> {
8
+ readonly required?: boolean;
9
+ readonly disabled?: boolean;
10
+ readonly readonly?: boolean;
11
+ readonly visible?: boolean;
12
+ readonly min?: number;
13
+ readonly max?: number;
14
+ readonly minLength?: number;
15
+ readonly maxLength?: number;
16
+ readonly minItems?: number;
17
+ readonly maxItems?: number;
18
+ readonly options?: ReadonlyArray<A>;
19
+ readonly meta?: Readonly<Record<string, unknown>>;
20
+ }
21
+ export type Limitations = Readonly<Record<string, FieldLimitations>>;
22
+ export interface FormState<Values> {
23
+ readonly values: Values;
24
+ readonly initialValues: Values;
25
+ readonly touched: Readonly<Record<string, boolean>>;
26
+ readonly errors: FormErrors;
27
+ readonly dirtyPaths: ReadonlyArray<string>;
28
+ readonly submitCount: number;
29
+ readonly validationCount: number;
30
+ readonly lastSubmittedValues: Option.Option<Values>;
31
+ readonly arrayKeys: Readonly<Record<string, ReadonlyArray<string>>>;
32
+ }
33
+ export interface FieldBinding<A> {
34
+ readonly path: string;
35
+ readonly value: A;
36
+ readonly set: (value: A | ((prev: A) => A)) => void;
37
+ readonly blur: () => void;
38
+ readonly error: Option.Option<string>;
39
+ readonly dirty: boolean;
40
+ readonly touched: boolean;
41
+ readonly validating: boolean;
42
+ readonly limitations: FieldLimitations<A>;
43
+ }
44
+ export interface ArrayItemView<Item> {
45
+ readonly key: string;
46
+ readonly index: number;
47
+ readonly value: Item;
48
+ readonly remove: () => void;
49
+ readonly move: (to: number) => void;
50
+ }
51
+ export interface ArrayBinding<Item> {
52
+ readonly path: string;
53
+ readonly items: ReadonlyArray<ArrayItemView<Item>>;
54
+ readonly append: (value?: Item) => void;
55
+ readonly remove: (index: number) => void;
56
+ readonly move: (from: number, to: number) => void;
57
+ readonly swap: (a: number, b: number) => void;
58
+ readonly limitations: FieldLimitations<ReadonlyArray<Item>>;
59
+ }
60
+ export interface FormView<Values, Inputs = {}> {
61
+ readonly values: Values;
62
+ readonly inputs: Inputs;
63
+ readonly errors: FormErrors;
64
+ readonly dirty: boolean;
65
+ readonly canSubmit: boolean;
66
+ readonly submitCount: number;
67
+ readonly validationCount: number;
68
+ readonly lastSubmittedValues: Option.Option<Values>;
69
+ readonly submit: () => void;
70
+ readonly reset: () => void;
71
+ readonly validate: () => void;
72
+ readonly field: <P extends FieldPath<Values>>(path: P) => FieldBinding<PathValue<Values, P>>;
73
+ readonly array: <P extends ArrayPath<Values>>(path: P) => ArrayBinding<ArrayItem<Values, P>>;
74
+ readonly variantValue: <P extends VariantPath<Values>>(path: P) => VariantValue<Values, P>;
75
+ }
76
+ type InputRecord = Readonly<Record<string, AnySource>>;
77
+ type SourceName<S extends AnySource> = S['name'];
78
+ type SourceValue<S> = S extends Source<string, infer A> ? A : never;
79
+ type InputsObject<Inputs extends InputRecord> = {
80
+ readonly [K in keyof Inputs as SourceName<Inputs[K]>]: SourceValue<Inputs[K]>;
81
+ };
82
+ type InputStores<Inputs extends InputRecord> = {
83
+ [K in keyof Inputs]: Inputs[K] extends {
84
+ readonly store: Context.Tag<infer Service, any>;
85
+ } ? Service : never;
86
+ }[keyof Inputs];
87
+ type ValuesOfSchema<S extends S.Schema.Any> = S.Schema.Encoded<S>;
88
+ type DecodedOfSchema<S extends S.Schema.Any> = S.Schema.Type<S>;
89
+ export interface RuntimeConfig<Values, Decoded, Inputs> {
90
+ readonly initial: Values;
91
+ readonly limit?: (ctx: {
92
+ readonly values: Values;
93
+ readonly inputs: Inputs;
94
+ }) => Limitations;
95
+ readonly validate: (ctx: {
96
+ readonly values: Values;
97
+ readonly decoded: Decoded;
98
+ readonly inputs: Inputs;
99
+ }) => Effect.Effect<ReadonlyArray<FormError>, never, never>;
100
+ readonly submit: (ctx: {
101
+ readonly values: Values;
102
+ readonly decoded: Decoded;
103
+ readonly inputs: Inputs;
104
+ }) => Effect.Effect<void, unknown, never>;
105
+ }
106
+ export interface FormLiveConfig<Values, Decoded, Inputs, R = never> {
107
+ readonly initial: Values;
108
+ readonly limit?: (ctx: {
109
+ readonly values: Values;
110
+ readonly inputs: Inputs;
111
+ }) => Limitations;
112
+ readonly validate?: (ctx: {
113
+ readonly values: Values;
114
+ readonly decoded: Decoded;
115
+ readonly inputs: Inputs;
116
+ }) => void | FormError | ReadonlyArray<FormError> | Effect.Effect<void | FormError | ReadonlyArray<FormError>, never, R>;
117
+ readonly submit?: (ctx: {
118
+ readonly values: Values;
119
+ readonly decoded: Decoded;
120
+ readonly inputs: Inputs;
121
+ }) => void | Effect.Effect<unknown, unknown, R>;
122
+ }
123
+ export interface FormManifest<N extends string, Schema extends S.Schema.Any, Inputs extends InputRecord> {
124
+ readonly kind: 'Form';
125
+ readonly name: N;
126
+ readonly schema: Schema;
127
+ readonly inputs: Inputs;
128
+ }
129
+ interface FormEvents {
130
+ readonly set: Event.EventClass<string, {
131
+ readonly path: string;
132
+ readonly value: unknown;
133
+ }>;
134
+ readonly blur: Event.EventClass<string, {
135
+ readonly path: string;
136
+ }>;
137
+ readonly reset: Event.EventClass<string, {}>;
138
+ readonly validationFinished: Event.EventClass<string, {
139
+ readonly errors: FormErrors;
140
+ }>;
141
+ readonly submitAttempted: Event.EventClass<string, {}>;
142
+ readonly submitSucceeded: Event.EventClass<string, {
143
+ readonly values: unknown;
144
+ }>;
145
+ readonly append: Event.EventClass<string, {
146
+ readonly path: string;
147
+ readonly value: unknown;
148
+ }>;
149
+ readonly remove: Event.EventClass<string, {
150
+ readonly path: string;
151
+ readonly index: number;
152
+ }>;
153
+ readonly move: Event.EventClass<string, {
154
+ readonly path: string;
155
+ readonly from: number;
156
+ readonly to: number;
157
+ }>;
158
+ readonly swap: Event.EventClass<string, {
159
+ readonly path: string;
160
+ readonly a: number;
161
+ readonly b: number;
162
+ }>;
163
+ }
164
+ export interface FormClass<N extends string, Schema extends S.Schema.Any, Inputs extends InputRecord> {
165
+ new (): {};
166
+ readonly manifest: FormManifest<N, Schema, Inputs>;
167
+ readonly state: State.StateClass<`${N}/state`, FormState<ValuesOfSchema<Schema>>>;
168
+ readonly config: Context.Tag<RuntimeConfig<ValuesOfSchema<Schema>, DecodedOfSchema<Schema>, InputsObject<Inputs>>, RuntimeConfig<ValuesOfSchema<Schema>, DecodedOfSchema<Schema>, InputsObject<Inputs>>>;
169
+ readonly events: FormEvents;
170
+ readonly reducer: Reducer.StateReducerClass<State.StateClass<`${N}/state`, FormState<ValuesOfSchema<Schema>>>, ReadonlyArray<Event.AnyEvent>>;
171
+ }
172
+ export type AnyForm = FormClass<string, S.Schema.Any, any>;
173
+ export type Values<F extends AnyForm> = F extends FormClass<string, infer Schema, any> ? ValuesOfSchema<Schema> : never;
174
+ export type Decoded<F extends AnyForm> = F extends FormClass<string, infer Schema, any> ? DecodedOfSchema<Schema> : never;
175
+ export type Inputs<F extends AnyForm> = F extends FormClass<string, S.Schema.Any, infer Inputs> ? InputsObject<Inputs> : never;
176
+ export type View<F extends AnyForm> = FormView<Values<F>, Inputs<F>>;
177
+ export declare const arrayKeysFor: (value: unknown, path?: string) => Record<string, ReadonlyArray<string>>;
178
+ export declare const make: <const N extends string, Schema extends S.Schema.Any, const Inputs extends InputRecord = {}>(name: N, config: {
179
+ readonly schema: Schema;
180
+ readonly inputs?: Inputs;
181
+ }) => FormClass<N, Schema, Inputs>;
182
+ export declare const live: <F extends AnyForm, R = never>(form: F, config: FormLiveConfig<Values<F>, Decoded<F>, Inputs<F>, R>) => Layer.Layer<Store<FormState<Values<F>>> | RuntimeConfig<Values<F>, Decoded<F>, Inputs<F>>, never, Bus | Reducers | R>;
183
+ export declare const view: <F extends AnyForm>(form: F) => Effect.Effect<View<F>, never, Store<FormState<Values<F>>> | RuntimeConfig<Values<F>, Decoded<F>, Inputs<F>> | Bus | InputStores<F["manifest"]["inputs"]>>;
184
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"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"}
package/dist/form.js ADDED
@@ -0,0 +1,292 @@
1
+ import { Context, Effect, Either, Layer, Option, Runtime, Schema as S, } from 'effect';
2
+ import { Bus, CurrentTracker, Event, Reducer, Reducers, State, } from '@playfast/reform';
3
+ import { getNestedValue, isPathOrParentDirty, moveAt, recalculateDirtyPaths, replaceAt, setNestedValue, } from './path';
4
+ import { error, errorsToRecord, firstError, normalizeErrors, routeParseError, } from './validation';
5
+ export { error };
6
+ const unknownSchema = S.Unknown;
7
+ let nextArrayKey = 0;
8
+ const makeArrayKey = () => `form-item-${nextArrayKey++}`;
9
+ export const arrayKeysFor = (value, path = '') => {
10
+ const out = {};
11
+ const visit = (current, currentPath) => {
12
+ if (Array.isArray(current)) {
13
+ out[currentPath] = current.map(() => makeArrayKey());
14
+ current.forEach((item, index) => visit(item, `${currentPath}[${index}]`));
15
+ return;
16
+ }
17
+ if (current !== null && typeof current === 'object') {
18
+ for (const [key, child] of Object.entries(current)) {
19
+ visit(child, currentPath.length === 0 ? key : `${currentPath}.${key}`);
20
+ }
21
+ }
22
+ };
23
+ visit(value, path);
24
+ return out;
25
+ };
26
+ const initialState = (initial) => ({
27
+ values: initial,
28
+ initialValues: initial,
29
+ touched: {},
30
+ errors: {},
31
+ dirtyPaths: [],
32
+ submitCount: 0,
33
+ validationCount: 0,
34
+ lastSubmittedValues: Option.none(),
35
+ arrayKeys: arrayKeysFor(initial),
36
+ });
37
+ const markTouched = (touched, path) => ({ ...touched, [path]: true });
38
+ const withValues = (state, values) => ({
39
+ ...state,
40
+ values,
41
+ dirtyPaths: recalculateDirtyPaths(state.initialValues, values),
42
+ });
43
+ const currentArray = (values, path) => {
44
+ const current = getNestedValue(values, path);
45
+ return Array.isArray(current) ? current : [];
46
+ };
47
+ const updateKeys = (state, path, f) => {
48
+ const existing = state.arrayKeys[path] ?? currentArray(state.values, path).map(() => makeArrayKey());
49
+ return { ...state.arrayKeys, [path]: f(existing) };
50
+ };
51
+ const setAtPath = (state, path, value) => withValues(state, setNestedValue(state.values, path, value));
52
+ const appendAtPath = (state, path, value) => {
53
+ const items = currentArray(state.values, path);
54
+ const values = setNestedValue(state.values, path, [...items, value]);
55
+ return {
56
+ ...withValues(state, values),
57
+ arrayKeys: updateKeys(state, path, (keys) => [...keys, makeArrayKey()]),
58
+ };
59
+ };
60
+ const removeAtPath = (state, path, index) => {
61
+ const items = currentArray(state.values, path);
62
+ if (index < 0 || index >= items.length)
63
+ return state;
64
+ const values = setNestedValue(state.values, path, items.filter((_, i) => i !== index));
65
+ return {
66
+ ...withValues(state, values),
67
+ arrayKeys: updateKeys(state, path, (keys) => keys.filter((_, i) => i !== index)),
68
+ };
69
+ };
70
+ const moveAtPath = (state, path, from, to) => {
71
+ const items = currentArray(state.values, path);
72
+ const next = moveAt(items, from, to);
73
+ if (next === items)
74
+ return state;
75
+ const values = setNestedValue(state.values, path, next);
76
+ return {
77
+ ...withValues(state, values),
78
+ arrayKeys: updateKeys(state, path, (keys) => moveAt(keys, from, to)),
79
+ };
80
+ };
81
+ const swapAtPath = (state, path, a, b) => {
82
+ const items = currentArray(state.values, path);
83
+ if (a < 0 || b < 0 || a >= items.length || b >= items.length || a === b)
84
+ return state;
85
+ const swapped = replaceAt(replaceAt(items, a, items[b]), b, items[a]);
86
+ const values = setNestedValue(state.values, path, swapped);
87
+ return {
88
+ ...withValues(state, values),
89
+ arrayKeys: updateKeys(state, path, (keys) => replaceAt(replaceAt(keys, a, keys[b] ?? makeArrayKey()), b, keys[a] ?? makeArrayKey())),
90
+ };
91
+ };
92
+ export const make = (name, config) => {
93
+ const state = State.make(`${name}/state`, unknownSchema, {
94
+ title: `${name} form state`,
95
+ });
96
+ const events = {
97
+ set: Event.make(`${name}/SetField`, S.Struct({ path: S.String, value: S.Unknown })),
98
+ blur: Event.make(`${name}/BlurField`, S.Struct({ path: S.String })),
99
+ reset: Event.make(`${name}/Reset`, S.Struct({})),
100
+ validationFinished: Event.make(`${name}/ValidationFinished`, S.Struct({
101
+ errors: S.Record({ key: S.String, value: S.String }),
102
+ })),
103
+ submitAttempted: Event.make(`${name}/SubmitAttempted`, S.Struct({})),
104
+ submitSucceeded: Event.make(`${name}/SubmitSucceeded`, S.Struct({ values: S.Unknown })),
105
+ append: Event.make(`${name}/AppendItem`, S.Struct({ path: S.String, value: S.Unknown })),
106
+ remove: Event.make(`${name}/RemoveItem`, S.Struct({ path: S.String, index: S.Number })),
107
+ move: Event.make(`${name}/MoveItem`, S.Struct({ path: S.String, from: S.Number, to: S.Number })),
108
+ swap: Event.make(`${name}/SwapItems`, S.Struct({ path: S.String, a: S.Number, b: S.Number })),
109
+ };
110
+ const reducer = Reducer.make(`${name}/FormReducer`, {
111
+ states: [state],
112
+ events: Object.values(events),
113
+ });
114
+ const runtimeConfig = Context.GenericTag(`reform/form/${name}/config`);
115
+ const inputs = (config.inputs ?? {});
116
+ return Object.assign(class {
117
+ }, {
118
+ manifest: {
119
+ kind: 'Form',
120
+ name,
121
+ schema: config.schema,
122
+ inputs,
123
+ },
124
+ state,
125
+ config: runtimeConfig,
126
+ events,
127
+ reducer,
128
+ });
129
+ };
130
+ export const live = (form, config) => {
131
+ const configTag = form.config;
132
+ const configLayer = Layer.effect(configTag, Effect.map(Effect.context(), (context) => {
133
+ const runtimeConfig = {
134
+ initial: config.initial,
135
+ validate: (ctx) => {
136
+ const result = config.validate?.(ctx);
137
+ const effect = Effect.isEffect(result) ? result : Effect.succeed(result);
138
+ return Effect.map(Effect.provide(effect, context), (value) => normalizeErrors(value));
139
+ },
140
+ submit: (ctx) => {
141
+ const result = config.submit?.(ctx);
142
+ const effect = Effect.isEffect(result) ? result : Effect.succeed(result);
143
+ return Effect.asVoid(Effect.provide(effect, context));
144
+ },
145
+ };
146
+ return config.limit === undefined
147
+ ? runtimeConfig
148
+ : { ...runtimeConfig, limit: config.limit };
149
+ }));
150
+ const reducerLayer = Reducer.live(form.reducer, (state, event) => {
151
+ switch (event._tag) {
152
+ case form.events.set.tag:
153
+ return 'path' in event && 'value' in event ? setAtPath(state, event.path, event.value) : state;
154
+ case form.events.blur.tag:
155
+ return 'path' in event ? { ...state, touched: markTouched(state.touched, event.path) } : state;
156
+ case form.events.reset.tag:
157
+ return initialState(state.initialValues);
158
+ case form.events.validationFinished.tag:
159
+ return 'errors' in event ? { ...state, errors: event.errors, validationCount: state.validationCount + 1 } : state;
160
+ case form.events.submitAttempted.tag:
161
+ return { ...state, submitCount: state.submitCount + 1 };
162
+ case form.events.submitSucceeded.tag:
163
+ return 'values' in event ? { ...state, lastSubmittedValues: Option.some(event.values) } : state;
164
+ case form.events.append.tag:
165
+ return 'path' in event && 'value' in event ? appendAtPath(state, event.path, event.value) : state;
166
+ case form.events.remove.tag:
167
+ return 'path' in event && 'index' in event ? removeAtPath(state, event.path, event.index) : state;
168
+ case form.events.move.tag:
169
+ return 'path' in event && 'from' in event && 'to' in event ? moveAtPath(state, event.path, event.from, event.to) : state;
170
+ case form.events.swap.tag:
171
+ return 'path' in event && 'a' in event && 'b' in event ? swapAtPath(state, event.path, event.a, event.b) : state;
172
+ default:
173
+ return state;
174
+ }
175
+ });
176
+ return Layer.mergeAll(configLayer, reducerLayer).pipe(Layer.provideMerge(State.live(form.state, initialState(config.initial))));
177
+ };
178
+ const readInput = (source) => Effect.gen(function* () {
179
+ const store = yield* source.store;
180
+ const tracker = yield* Effect.serviceOption(CurrentTracker);
181
+ if (Option.isSome(tracker))
182
+ tracker.value.add(store);
183
+ return store.getSnapshot();
184
+ });
185
+ const readInputs = (inputs) => Effect.gen(function* () {
186
+ const out = {};
187
+ for (const source of Object.values(inputs)) {
188
+ out[source.name] = yield* readInput(source);
189
+ }
190
+ return out;
191
+ });
192
+ const limitationsFor = (limitations, path) => (limitations[path] ?? {});
193
+ const trigger = (eventTrigger) => eventTrigger;
194
+ export const view = (form) => Effect.gen(function* () {
195
+ const state = yield* form.state;
196
+ const runtimeConfig = yield* form.config;
197
+ // Erased boundary (same shape as the casts closing `live`/`readInputs`):
198
+ // under the `AnyForm` constraint `form.manifest.inputs` is the wildcard
199
+ // `any`, which would dissolve the generator's R to `unknown`; restate the
200
+ // call at the concrete `F`'s types so R keeps the declared input stores.
201
+ const inputs = (yield* readInputs(form.manifest.inputs));
202
+ const limitations = runtimeConfig.limit?.({ values: state.values, inputs }) ?? {};
203
+ const setField = yield* trigger(form.events.set.trigger);
204
+ const blurField = yield* trigger(form.events.blur.trigger);
205
+ const reset = yield* trigger(form.events.reset.trigger);
206
+ const append = yield* trigger(form.events.append.trigger);
207
+ const remove = yield* trigger(form.events.remove.trigger);
208
+ const move = yield* trigger(form.events.move.trigger);
209
+ const swap = yield* trigger(form.events.swap.trigger);
210
+ const runtime = yield* Effect.runtime();
211
+ const schema = form.manifest.schema;
212
+ const decodeEither = S.decodeUnknownEither(schema, { errors: 'all' })(state.values);
213
+ const canSubmit = Either.isRight(decodeEither) && Object.keys(state.errors).length === 0;
214
+ const runValidation = (publishSubmitAttempt) => Effect.gen(function* () {
215
+ if (publishSubmitAttempt)
216
+ yield* Event.dispatch(form.events.submitAttempted, {});
217
+ const decoded = S.decodeUnknownEither(schema, { errors: 'all' })(state.values);
218
+ if (Either.isLeft(decoded)) {
219
+ yield* Event.dispatch(form.events.validationFinished, { errors: routeParseError(decoded.left) });
220
+ return Option.none();
221
+ }
222
+ const custom = yield* runtimeConfig.validate({ values: state.values, decoded: decoded.right, inputs });
223
+ const errors = errorsToRecord(custom);
224
+ yield* Event.dispatch(form.events.validationFinished, { errors });
225
+ return Object.keys(errors).length === 0 ? Option.some(decoded.right) : Option.none();
226
+ });
227
+ const submit = () => {
228
+ Runtime.runFork(runtime)(Effect.gen(function* () {
229
+ const decoded = yield* runValidation(true);
230
+ if (Option.isNone(decoded))
231
+ return;
232
+ yield* runtimeConfig.submit({ values: state.values, decoded: decoded.value, inputs });
233
+ yield* Event.dispatch(form.events.submitSucceeded, { values: state.values });
234
+ }).pipe(Effect.catchAllCause((cause) => Effect.logError('reform form submit failed', cause))));
235
+ };
236
+ const validate = () => {
237
+ Runtime.runFork(runtime)(runValidation(false));
238
+ };
239
+ const field = (path) => {
240
+ const value = getNestedValue(state.values, path);
241
+ return {
242
+ path,
243
+ value,
244
+ set: (next) => setField({
245
+ path,
246
+ value: typeof next === 'function' ? next(value) : next,
247
+ }),
248
+ blur: () => blurField({ path }),
249
+ error: firstError(state.errors, path),
250
+ dirty: isPathOrParentDirty(state.dirtyPaths, path),
251
+ touched: state.touched[path] === true,
252
+ validating: false,
253
+ limitations: limitationsFor(limitations, path),
254
+ };
255
+ };
256
+ const array = (path) => {
257
+ const values = currentArray(state.values, path);
258
+ const keys = state.arrayKeys[path] ?? values.map((_, i) => `${path}-${i}`);
259
+ return {
260
+ path,
261
+ items: values.map((value, index) => ({
262
+ value,
263
+ index,
264
+ key: keys[index] ?? `${path}-${index}`,
265
+ remove: () => remove({ path, index }),
266
+ move: (to) => move({ path, from: index, to }),
267
+ })),
268
+ append: (value) => append({ path, value }),
269
+ remove: (index) => remove({ path, index }),
270
+ move: (from, to) => move({ path, from, to }),
271
+ swap: (a, b) => swap({ path, a, b }),
272
+ limitations: limitationsFor(limitations, path),
273
+ };
274
+ };
275
+ return {
276
+ values: state.values,
277
+ inputs,
278
+ errors: state.errors,
279
+ dirty: state.dirtyPaths.length > 0,
280
+ canSubmit,
281
+ submitCount: state.submitCount,
282
+ validationCount: state.validationCount,
283
+ lastSubmittedValues: state.lastSubmittedValues,
284
+ submit,
285
+ reset: () => reset({}),
286
+ validate,
287
+ field,
288
+ array,
289
+ variantValue: (path) => getNestedValue(state.values, path),
290
+ };
291
+ });
292
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * as Form from './form';
2
+ export type { ArrayBinding, ArrayItemView, AnyForm, FieldBinding, FieldLimitations, FormClass, FormLiveConfig, FormManifest, RuntimeConfig, FormState, FormView, Inputs, Limitations, Values, View, } from './form';
3
+ export { arrayKeysFor as unsafeArrayKeysFor, error, live, make, view, } from './form';
4
+ export type { ArrayItem, ArrayPath, FieldPath, PathValue, VariantBody, VariantCase, VariantPath, VariantTag, VariantValue, } from './path';
5
+ export { getNestedValue, isPathOrParentDirty, joinPath, moveAt, recalculateDirtyPaths, schemaPathToFieldPath, setNestedValue, } from './path';
6
+ export type { FormError, FormErrors } from './validation';
7
+ export { errorsToRecord, firstError, normalizeErrors, routeParseError } from './validation';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAA;AAC9B,YAAY,EACV,YAAY,EACZ,aAAa,EACb,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,QAAQ,EACR,MAAM,EACN,WAAW,EACX,MAAM,EACN,IAAI,GACL,MAAM,QAAQ,CAAA;AACf,OAAO,EACL,YAAY,IAAI,kBAAkB,EAClC,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,GACL,MAAM,QAAQ,CAAA;AACf,YAAY,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,QAAQ,CAAA;AACf,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,GACf,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * as Form from './form';
2
+ export { arrayKeysFor as unsafeArrayKeysFor, error, live, make, view, } from './form';
3
+ export { getNestedValue, isPathOrParentDirty, joinPath, moveAt, recalculateDirtyPaths, schemaPathToFieldPath, setNestedValue, } from './path';
4
+ export { errorsToRecord, firstError, normalizeErrors, routeParseError } from './validation';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAA;AAkB9B,OAAO,EACL,YAAY,IAAI,kBAAkB,EAClC,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,GACL,MAAM,QAAQ,CAAA;AAYf,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,GACf,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
package/dist/path.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ export type Primitive = string | number | boolean | bigint | symbol | null | undefined | Date;
2
+ type StringKey<T> = Extract<keyof T, string>;
3
+ type Tagged = {
4
+ readonly _tag: string;
5
+ };
6
+ type IsTagged<T> = T extends Tagged ? true : false;
7
+ export type FieldPath<T> = T extends Primitive ? never : {
8
+ readonly [K in StringKey<T>]: T[K] extends ReadonlyArray<unknown> ? never : IsTagged<T[K]> extends true ? never : T[K] extends Primitive ? K : T[K] extends object ? K | `${K}.${FieldPath<T[K]>}` : K;
9
+ }[StringKey<T>];
10
+ export type ArrayPath<T> = T extends Primitive ? never : {
11
+ readonly [K in StringKey<T>]: T[K] extends ReadonlyArray<unknown> ? K : IsTagged<T[K]> extends true ? never : T[K] extends object ? `${K}.${ArrayPath<T[K]>}` : never;
12
+ }[StringKey<T>];
13
+ export type VariantPath<T> = T extends Primitive ? never : {
14
+ readonly [K in StringKey<T>]: IsTagged<T[K]> extends true ? K : T[K] extends ReadonlyArray<unknown> ? never : T[K] extends object ? `${K}.${VariantPath<T[K]>}` : never;
15
+ }[StringKey<T>];
16
+ export type PathValue<T, P extends string> = P extends `${infer Head}.${infer Tail}` ? Head extends keyof T ? PathValue<T[Head], Tail> : never : P extends keyof T ? T[P] : never;
17
+ export type ArrayItem<T, P extends string> = PathValue<T, P> extends ReadonlyArray<infer Item> ? Item : never;
18
+ export type VariantValue<T, P extends string> = PathValue<T, P>;
19
+ export type VariantTag<V> = V extends {
20
+ readonly _tag: infer Tag;
21
+ } ? Extract<Tag, string> : never;
22
+ export type VariantCase<V, Tag extends string> = Extract<V, {
23
+ readonly _tag: Tag;
24
+ }>;
25
+ export type VariantBody<V, Tag extends string> = Omit<VariantCase<V, Tag>, '_tag'>;
26
+ export declare const schemaPathToFieldPath: (path: ReadonlyArray<PropertyKey>) => string;
27
+ export declare const joinPath: (prefix: string, path: string) => string;
28
+ export declare const isPathUnderRoot: (path: string, rootPath: string) => boolean;
29
+ export declare const isPathOrParentDirty: (dirtyPaths: ReadonlyArray<string>, path: string) => boolean;
30
+ export declare const getNestedValue: (obj: unknown, path: string) => unknown;
31
+ export declare const setNestedValue: <T>(obj: T, path: string, value: unknown) => T;
32
+ export declare const recalculateDirtyPaths: (initial: unknown, values: unknown, rootPath?: string) => ReadonlyArray<string>;
33
+ export declare const replaceAt: <A>(values: ReadonlyArray<A>, index: number, value: A) => ReadonlyArray<A>;
34
+ export declare const moveAt: <A>(values: ReadonlyArray<A>, from: number, to: number) => ReadonlyArray<A>;
35
+ export {};
36
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"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"}
package/dist/path.js ADDED
@@ -0,0 +1,104 @@
1
+ import { Equal } from 'effect';
2
+ const BRACKET_NOTATION_REGEX = /\[(\d+)\]/g;
3
+ export const schemaPathToFieldPath = (path) => {
4
+ if (path.length === 0)
5
+ return '';
6
+ let result = String(path[0]);
7
+ for (let i = 1; i < path.length; i++) {
8
+ const segment = path[i];
9
+ result += typeof segment === 'number' ? `[${segment}]` : `.${String(segment)}`;
10
+ }
11
+ return result;
12
+ };
13
+ export const joinPath = (prefix, path) => prefix.length === 0 ? path : path.length === 0 ? prefix : `${prefix}.${path}`;
14
+ export const isPathUnderRoot = (path, rootPath) => path === rootPath || path.startsWith(`${rootPath}.`) || path.startsWith(`${rootPath}[`);
15
+ export const isPathOrParentDirty = (dirtyPaths, path) => {
16
+ if (dirtyPaths.includes(path))
17
+ return true;
18
+ let parent = path;
19
+ while (true) {
20
+ const lastDot = parent.lastIndexOf('.');
21
+ const lastBracket = parent.lastIndexOf('[');
22
+ const splitIndex = Math.max(lastDot, lastBracket);
23
+ if (splitIndex === -1)
24
+ return false;
25
+ parent = parent.substring(0, splitIndex);
26
+ if (dirtyPaths.includes(parent))
27
+ return true;
28
+ }
29
+ };
30
+ const pathParts = (path) => path === '' ? [] : path.replace(BRACKET_NOTATION_REGEX, '.$1').split('.');
31
+ export const getNestedValue = (obj, path) => {
32
+ const parts = pathParts(path);
33
+ let current = obj;
34
+ for (const part of parts) {
35
+ if (current === null || current === undefined || typeof current !== 'object')
36
+ return undefined;
37
+ current = current[part];
38
+ }
39
+ return current;
40
+ };
41
+ export const setNestedValue = (obj, path, value) => {
42
+ const parts = pathParts(path);
43
+ if (parts.length === 0)
44
+ return value;
45
+ const result = Array.isArray(obj) ? [...obj] : { ...obj };
46
+ let current = result;
47
+ for (let i = 0; i < parts.length - 1; i++) {
48
+ const part = parts[i];
49
+ if (part === undefined)
50
+ return result;
51
+ const next = current[part];
52
+ current[part] = Array.isArray(next) ? [...next] : { ...next };
53
+ current = current[part];
54
+ }
55
+ const last = parts[parts.length - 1];
56
+ if (last !== undefined)
57
+ current[last] = value;
58
+ return result;
59
+ };
60
+ export const recalculateDirtyPaths = (initial, values, rootPath = '') => {
61
+ const dirty = new Set();
62
+ const visit = (current, original, path) => {
63
+ if (Equal.equals(current, original))
64
+ return;
65
+ if (Array.isArray(current) || Array.isArray(original)) {
66
+ const currentItems = Array.isArray(current) ? current : [];
67
+ const originalItems = Array.isArray(original) ? original : [];
68
+ if (currentItems.length !== originalItems.length && path.length > 0)
69
+ dirty.add(path);
70
+ const length = Math.max(currentItems.length, originalItems.length);
71
+ for (let i = 0; i < length; i++) {
72
+ visit(currentItems[i], originalItems[i], path.length === 0 ? `[${i}]` : `${path}[${i}]`);
73
+ }
74
+ return;
75
+ }
76
+ if (current !== null &&
77
+ original !== null &&
78
+ typeof current === 'object' &&
79
+ typeof original === 'object') {
80
+ const currentRecord = current;
81
+ const originalRecord = original;
82
+ const keys = new Set([...Object.keys(currentRecord), ...Object.keys(originalRecord)]);
83
+ for (const key of keys) {
84
+ visit(currentRecord[key], originalRecord[key], path.length === 0 ? key : `${path}.${key}`);
85
+ }
86
+ return;
87
+ }
88
+ if (path.length > 0)
89
+ dirty.add(path);
90
+ };
91
+ visit(rootPath.length === 0 ? values : getNestedValue(values, rootPath), rootPath.length === 0 ? initial : getNestedValue(initial, rootPath), rootPath);
92
+ return Array.from(dirty).sort();
93
+ };
94
+ export const replaceAt = (values, index, value) => values.map((item, i) => (i === index ? value : item));
95
+ export const moveAt = (values, from, to) => {
96
+ if (from < 0 || from >= values.length || to < 0 || to > values.length || from === to)
97
+ return values;
98
+ const next = [...values];
99
+ const item = next.splice(from, 1)[0];
100
+ if (item !== undefined)
101
+ next.splice(to, 0, item);
102
+ return next;
103
+ };
104
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Option, ParseResult } from 'effect';
2
+ export interface FormError {
3
+ readonly path: string;
4
+ readonly message: string;
5
+ }
6
+ export type FormErrors = Readonly<Record<string, string>>;
7
+ export declare const error: (path: string, message: string) => FormError;
8
+ export declare const normalizeErrors: (value: void | FormError | ReadonlyArray<FormError>) => ReadonlyArray<FormError>;
9
+ export declare const errorsToRecord: (errors: ReadonlyArray<FormError>) => FormErrors;
10
+ export declare const routeParseError: (parseError: ParseResult.ParseError) => FormErrors;
11
+ export declare const firstError: (errors: FormErrors, path: string) => Option.Option<string>;
12
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG5C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAEzD,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,SAAgC,CAAA;AAEtF,eAAO,MAAM,eAAe,GAC1B,OAAO,IAAI,GAAG,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,KACjD,aAAa,CAAC,SAAS,CAIzB,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,CAAC,SAAS,CAAC,KAAG,UAMjE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,YAAY,WAAW,CAAC,UAAU,KAAG,UAQpE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU,EAAE,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAGjF,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { Option, ParseResult } from 'effect';
2
+ import { schemaPathToFieldPath } from './path';
3
+ export const error = (path, message) => ({ path, message });
4
+ export const normalizeErrors = (value) => {
5
+ if (value === undefined)
6
+ return [];
7
+ if (Array.isArray(value))
8
+ return value;
9
+ return [value];
10
+ };
11
+ export const errorsToRecord = (errors) => {
12
+ const out = {};
13
+ for (const entry of errors) {
14
+ if (out[entry.path] === undefined)
15
+ out[entry.path] = entry.message;
16
+ }
17
+ return out;
18
+ };
19
+ export const routeParseError = (parseError) => {
20
+ const formatted = ParseResult.ArrayFormatter.formatErrorSync(parseError);
21
+ const out = {};
22
+ for (const issue of formatted) {
23
+ const path = schemaPathToFieldPath(issue.path);
24
+ if (out[path] === undefined)
25
+ out[path] = issue.message;
26
+ }
27
+ return out;
28
+ };
29
+ export const firstError = (errors, path) => {
30
+ const message = errors[path];
31
+ return message === undefined ? Option.none() : Option.some(message);
32
+ };
33
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAA;AAS9C,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,OAAe,EAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAEtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAkD,EACxB,EAAE;IAC5B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAiC,CAAA;IAClE,OAAO,CAAC,KAAkB,CAAC,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAgC,EAAc,EAAE;IAC7E,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAA;IACpE,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkC,EAAc,EAAE;IAChF,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;IACxE,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAA;IACxD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,IAAY,EAAyB,EAAE;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACrE,CAAC,CAAA"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@playfast/reform-forms",
3
+ "playbook": "./playbook",
4
+ "version": "0.0.7",
5
+ "type": "module",
6
+ "description": "Headless, schema-driven form state for reform — values, validation, field limitations, list operations, and submit flow, rendering nothing.",
7
+ "keywords": [
8
+ "reform",
9
+ "effect",
10
+ "forms",
11
+ "form-state",
12
+ "validation",
13
+ "schema",
14
+ "headless"
15
+ ],
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/playfast/reform.git",
20
+ "directory": "packages/forms"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/playfast/reform/issues"
24
+ },
25
+ "sideEffects": false,
26
+ "exports": {
27
+ "./package.json": "./package.json",
28
+ ".": "./src/index.ts",
29
+ "./*": "./src/*.ts"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md"
34
+ ],
35
+ "scripts": {
36
+ "clean": "rm -rf dist .tsbuildinfo",
37
+ "check": "tsc --noEmit",
38
+ "build": "tsc -p tsconfig.build.json",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
41
+ "coverage": "vitest run --coverage",
42
+ "lint": "oxlint src",
43
+ "lint:fix": "oxlint --fix src"
44
+ },
45
+ "peerDependencies": {
46
+ "effect": "*",
47
+ "@playfast/reform": "*"
48
+ },
49
+ "publishConfig": {
50
+ "access": "public"
51
+ }
52
+ }