@playfast/reform-forms 0.0.7 → 0.0.8

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.
@@ -0,0 +1,21 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import { getNestedValue, recalculateDirtyPaths, setNestedValue } from './path'
3
+
4
+ describe('form paths', () => {
5
+ test('reads and immutably writes nested values with array indexes', () => {
6
+ const before = { items: [{ name: 'a' }] }
7
+ const after = setNestedValue(before, 'items[0].name', 'b')
8
+
9
+ expect(before.items[0]?.name).toBe('a')
10
+ expect(getNestedValue(after, 'items[0].name')).toBe('b')
11
+ })
12
+
13
+ test('calculates dirty leaf paths', () => {
14
+ expect(
15
+ recalculateDirtyPaths(
16
+ { email: 'a', items: [{ qty: 1 }] },
17
+ { email: 'b', items: [{ qty: 2 }] },
18
+ ),
19
+ ).toEqual(['email', 'items[0].qty'])
20
+ })
21
+ })
package/src/path.ts ADDED
@@ -0,0 +1,194 @@
1
+ import { Equal } from 'effect'
2
+
3
+ const BRACKET_NOTATION_REGEX = /\[(\d+)\]/g
4
+
5
+ export type Primitive =
6
+ | string
7
+ | number
8
+ | boolean
9
+ | bigint
10
+ | symbol
11
+ | null
12
+ | undefined
13
+ | Date
14
+
15
+ type StringKey<T> = Extract<keyof T, string>
16
+ type Tagged = { readonly _tag: string }
17
+ type IsTagged<T> = T extends Tagged ? true : false
18
+
19
+ export type FieldPath<T> = T extends Primitive
20
+ ? never
21
+ : {
22
+ readonly [K in StringKey<T>]:
23
+ T[K] extends ReadonlyArray<unknown>
24
+ ? never
25
+ : IsTagged<T[K]> extends true
26
+ ? never
27
+ : T[K] extends Primitive
28
+ ? K
29
+ : T[K] extends object
30
+ ? K | `${K}.${FieldPath<T[K]>}`
31
+ : K
32
+ }[StringKey<T>]
33
+
34
+ export type ArrayPath<T> = T extends Primitive
35
+ ? never
36
+ : {
37
+ readonly [K in StringKey<T>]:
38
+ T[K] extends ReadonlyArray<unknown>
39
+ ? K
40
+ : IsTagged<T[K]> extends true
41
+ ? never
42
+ : T[K] extends object
43
+ ? `${K}.${ArrayPath<T[K]>}`
44
+ : never
45
+ }[StringKey<T>]
46
+
47
+ export type VariantPath<T> = T extends Primitive
48
+ ? never
49
+ : {
50
+ readonly [K in StringKey<T>]:
51
+ IsTagged<T[K]> extends true
52
+ ? K
53
+ : T[K] extends ReadonlyArray<unknown>
54
+ ? never
55
+ : T[K] extends object
56
+ ? `${K}.${VariantPath<T[K]>}`
57
+ : never
58
+ }[StringKey<T>]
59
+
60
+ export type PathValue<T, P extends string> =
61
+ P extends `${infer Head}.${infer Tail}`
62
+ ? Head extends keyof T
63
+ ? PathValue<T[Head], Tail>
64
+ : never
65
+ : P extends keyof T
66
+ ? T[P]
67
+ : never
68
+
69
+ export type ArrayItem<T, P extends string> =
70
+ PathValue<T, P> extends ReadonlyArray<infer Item> ? Item : never
71
+
72
+ export type VariantValue<T, P extends string> = PathValue<T, P>
73
+
74
+ export type VariantTag<V> = V extends { readonly _tag: infer Tag } ? Extract<Tag, string> : never
75
+
76
+ export type VariantCase<V, Tag extends string> = Extract<V, { readonly _tag: Tag }>
77
+
78
+ export type VariantBody<V, Tag extends string> = Omit<VariantCase<V, Tag>, '_tag'>
79
+
80
+ export const schemaPathToFieldPath = (path: ReadonlyArray<PropertyKey>): string => {
81
+ if (path.length === 0) return ''
82
+ let result = String(path[0])
83
+ for (let i = 1; i < path.length; i++) {
84
+ const segment = path[i]
85
+ result += typeof segment === 'number' ? `[${segment}]` : `.${String(segment)}`
86
+ }
87
+ return result
88
+ }
89
+
90
+ export const joinPath = (prefix: string, path: string): string =>
91
+ prefix.length === 0 ? path : path.length === 0 ? prefix : `${prefix}.${path}`
92
+
93
+ export const isPathUnderRoot = (path: string, rootPath: string): boolean =>
94
+ path === rootPath || path.startsWith(`${rootPath}.`) || path.startsWith(`${rootPath}[`)
95
+
96
+ export const isPathOrParentDirty = (dirtyPaths: ReadonlyArray<string>, path: string): boolean => {
97
+ if (dirtyPaths.includes(path)) return true
98
+ let parent = path
99
+ while (true) {
100
+ const lastDot = parent.lastIndexOf('.')
101
+ const lastBracket = parent.lastIndexOf('[')
102
+ const splitIndex = Math.max(lastDot, lastBracket)
103
+ if (splitIndex === -1) return false
104
+ parent = parent.substring(0, splitIndex)
105
+ if (dirtyPaths.includes(parent)) return true
106
+ }
107
+ }
108
+
109
+ const pathParts = (path: string): ReadonlyArray<string> =>
110
+ path === '' ? [] : path.replace(BRACKET_NOTATION_REGEX, '.$1').split('.')
111
+
112
+ export const getNestedValue = (obj: unknown, path: string): unknown => {
113
+ const parts = pathParts(path)
114
+ let current: unknown = obj
115
+ for (const part of parts) {
116
+ if (current === null || current === undefined || typeof current !== 'object') return undefined
117
+ current = (current as Record<string, unknown>)[part]
118
+ }
119
+ return current
120
+ }
121
+
122
+ export const setNestedValue = <T>(obj: T, path: string, value: unknown): T => {
123
+ const parts = pathParts(path)
124
+ if (parts.length === 0) return value as T
125
+ const result = Array.isArray(obj) ? [...obj] : { ...(obj as Record<string, unknown>) }
126
+ let current = result as Record<string, unknown>
127
+ for (let i = 0; i < parts.length - 1; i++) {
128
+ const part = parts[i]
129
+ if (part === undefined) return result as T
130
+ const next = current[part]
131
+ current[part] = Array.isArray(next) ? [...next] : { ...(next as Record<string, unknown>) }
132
+ current = current[part] as Record<string, unknown>
133
+ }
134
+ const last = parts[parts.length - 1]
135
+ if (last !== undefined) current[last] = value
136
+ return result as T
137
+ }
138
+
139
+ export const recalculateDirtyPaths = (
140
+ initial: unknown,
141
+ values: unknown,
142
+ rootPath = '',
143
+ ): ReadonlyArray<string> => {
144
+ const dirty = new Set<string>()
145
+ const visit = (current: unknown, original: unknown, path: string): void => {
146
+ if (Equal.equals(current, original)) return
147
+ if (Array.isArray(current) || Array.isArray(original)) {
148
+ const currentItems = Array.isArray(current) ? current : []
149
+ const originalItems = Array.isArray(original) ? original : []
150
+ if (currentItems.length !== originalItems.length && path.length > 0) dirty.add(path)
151
+ const length = Math.max(currentItems.length, originalItems.length)
152
+ for (let i = 0; i < length; i++) {
153
+ visit(currentItems[i], originalItems[i], path.length === 0 ? `[${i}]` : `${path}[${i}]`)
154
+ }
155
+ return
156
+ }
157
+ if (
158
+ current !== null &&
159
+ original !== null &&
160
+ typeof current === 'object' &&
161
+ typeof original === 'object'
162
+ ) {
163
+ const currentRecord = current as Record<string, unknown>
164
+ const originalRecord = original as Record<string, unknown>
165
+ const keys = new Set([...Object.keys(currentRecord), ...Object.keys(originalRecord)])
166
+ for (const key of keys) {
167
+ visit(currentRecord[key], originalRecord[key], path.length === 0 ? key : `${path}.${key}`)
168
+ }
169
+ return
170
+ }
171
+ if (path.length > 0) dirty.add(path)
172
+ }
173
+ visit(rootPath.length === 0 ? values : getNestedValue(values, rootPath), rootPath.length === 0 ? initial : getNestedValue(initial, rootPath), rootPath)
174
+ return Array.from(dirty).sort()
175
+ }
176
+
177
+ export const replaceAt = <A>(
178
+ values: ReadonlyArray<A>,
179
+ index: number,
180
+ value: A,
181
+ ): ReadonlyArray<A> =>
182
+ values.map((item, i) => (i === index ? value : item))
183
+
184
+ export const moveAt = <A>(
185
+ values: ReadonlyArray<A>,
186
+ from: number,
187
+ to: number,
188
+ ): ReadonlyArray<A> => {
189
+ if (from < 0 || from >= values.length || to < 0 || to > values.length || from === to) return values
190
+ const next = [...values]
191
+ const item = next.splice(from, 1)[0]
192
+ if (item !== undefined) next.splice(to, 0, item)
193
+ return next
194
+ }
@@ -0,0 +1,42 @@
1
+ import { Option, ParseResult } from 'effect'
2
+ import { schemaPathToFieldPath } from './path'
3
+
4
+ export interface FormError {
5
+ readonly path: string
6
+ readonly message: string
7
+ }
8
+
9
+ export type FormErrors = Readonly<Record<string, string>>
10
+
11
+ export const error = (path: string, message: string): FormError => ({ path, message })
12
+
13
+ export const normalizeErrors = (
14
+ value: void | FormError | ReadonlyArray<FormError>,
15
+ ): ReadonlyArray<FormError> => {
16
+ if (value === undefined) return []
17
+ if (Array.isArray(value)) return value as ReadonlyArray<FormError>
18
+ return [value as FormError]
19
+ }
20
+
21
+ export const errorsToRecord = (errors: ReadonlyArray<FormError>): FormErrors => {
22
+ const out: Record<string, string> = {}
23
+ for (const entry of errors) {
24
+ if (out[entry.path] === undefined) out[entry.path] = entry.message
25
+ }
26
+ return out
27
+ }
28
+
29
+ export const routeParseError = (parseError: ParseResult.ParseError): FormErrors => {
30
+ const formatted = ParseResult.ArrayFormatter.formatErrorSync(parseError)
31
+ const out: Record<string, string> = {}
32
+ for (const issue of formatted) {
33
+ const path = schemaPathToFieldPath(issue.path)
34
+ if (out[path] === undefined) out[path] = issue.message
35
+ }
36
+ return out
37
+ }
38
+
39
+ export const firstError = (errors: FormErrors, path: string): Option.Option<string> => {
40
+ const message = errors[path]
41
+ return message === undefined ? Option.none() : Option.some(message)
42
+ }
package/dist/form.d.ts DELETED
@@ -1,184 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"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"}