@playfast/reform-forms-react 1.2.1 → 1.4.0

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,48 @@
1
+ import { type ComponentType, type ReactNode } from 'react';
2
+ import { type MadeView, type UiClass, type UiContract, type ViewImpl } from '@playfast/reform';
3
+ import type { ArrayItem, ArrayPath, FieldBinding, FieldPath, PathValue, Values, VariantBody, VariantPath, VariantTag, VariantValue, View, AnyForm } from '@playfast/reform-forms';
4
+ export type FieldComponent<A, P extends object = {}> = ComponentType<{
5
+ readonly field: FieldBinding<A>;
6
+ } & P>;
7
+ export interface FieldHandle<A> {
8
+ as(component: FieldComponent<A>): ReactNode;
9
+ as<P extends object>(component: FieldComponent<A, P>, props: P): ReactNode;
10
+ }
11
+ export interface ArrayItemScope<Item> extends ScopeHelpers<Item> {
12
+ readonly key: string;
13
+ readonly index: number;
14
+ readonly value: Item;
15
+ readonly remove: () => void;
16
+ readonly move: (to: number) => void;
17
+ }
18
+ export interface ArrayRenderArgs<Item> {
19
+ readonly items: ReadonlyArray<ArrayItemScope<Item>>;
20
+ readonly append: (value?: Item) => void;
21
+ readonly remove: (index: number) => void;
22
+ readonly move: (from: number, to: number) => void;
23
+ readonly swap: (a: number, b: number) => void;
24
+ }
25
+ type VariantCases<V> = {
26
+ readonly [Tag in VariantTag<V>]: (scope: ScopeHelpers<VariantBody<V, Tag>>) => ReactNode;
27
+ };
28
+ export interface ScopeHelpers<ScopeValues> {
29
+ readonly field: <P extends FieldPath<ScopeValues>>(path: P) => FieldHandle<PathValue<ScopeValues, P>>;
30
+ readonly array: <P extends ArrayPath<ScopeValues>>(path: P, render: (args: ArrayRenderArgs<ArrayItem<ScopeValues, P>>) => ReactNode) => ReactNode;
31
+ readonly variant: <P extends VariantPath<ScopeValues>>(path: P, cases: VariantCases<VariantValue<ScopeValues, P>>) => ReactNode;
32
+ }
33
+ export interface RootHelpers<F extends AnyForm> extends ScopeHelpers<Values<F>> {
34
+ readonly form: View<F>;
35
+ }
36
+ type ContractWithForm<F extends AnyForm> = UiContract & {
37
+ readonly props: {
38
+ readonly form: View<F>;
39
+ };
40
+ };
41
+ export declare const make: <F extends AnyForm, C extends ContractWithForm<F>, N extends string>(contract: UiClass<C, N>, _form: F, render: (helpers: RootHelpers<F> & {
42
+ readonly props: C["props"];
43
+ }, slots: Parameters<ViewImpl<C>>[1], events: Parameters<ViewImpl<C>>[2]) => ReactNode) => MadeView<C, N>;
44
+ export declare const FormUi: {
45
+ readonly make: typeof make;
46
+ };
47
+ export {};
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ import { createElement } from 'react';
2
+ import { Function as Fn } from 'effect';
3
+ import { Ui } from '@playfast/reform';
4
+ import { joinPath } from '@playfast/reform-forms';
5
+ const makeFieldHandle = (field) => ({
6
+ as: (component, props) => createElement(component, Fn.unsafeCoerce({ ...props, field })),
7
+ });
8
+ const makeScope = (form, prefix) => {
9
+ const full = (path) => joinPath(prefix, path);
10
+ return {
11
+ field: (path) => makeFieldHandle(form.field(full(String(path)))),
12
+ array: (path, render) => {
13
+ const binding = form.array(full(String(path)));
14
+ return render({
15
+ append: binding.append,
16
+ remove: binding.remove,
17
+ move: binding.move,
18
+ swap: binding.swap,
19
+ items: Fn.unsafeCoerce(binding.items.map((element) => ({
20
+ ...makeScope(form, `${binding.path}[${element.index}]`),
21
+ key: element.key,
22
+ index: element.index,
23
+ value: element.value,
24
+ remove: element.remove,
25
+ move: element.move,
26
+ }))),
27
+ });
28
+ },
29
+ variant: (path, cases) => {
30
+ const variantPath = full(String(path));
31
+ const current = form.variantValue(variantPath);
32
+ if (current === null || typeof current !== 'object' || !('_tag' in current)) {
33
+ return null;
34
+ }
35
+ const tag = String(current._tag);
36
+ const handlers = Fn.unsafeCoerce(cases);
37
+ const render = handlers[tag];
38
+ return render === undefined ? null : render(makeScope(form, variantPath));
39
+ },
40
+ };
41
+ };
42
+ export const make = (contract, _form, render) => Ui.make(contract, (props, slots, events) => render({
43
+ ...makeScope(Fn.unsafeCoerce(props.form), ''),
44
+ form: props.form,
45
+ props,
46
+ }, slots, events));
47
+ export const FormUi = { make };
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playfast/reform-forms-react",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "React bindings for @playfast/forms — render a typed reform form View with scoped field/array/variant helpers.",
5
5
  "keywords": [
6
6
  "effect",
@@ -19,15 +19,26 @@
19
19
  "directory": "packages/forms-react"
20
20
  },
21
21
  "files": [
22
+ "dist",
22
23
  "src",
23
24
  "README.md"
24
25
  ],
25
26
  "type": "module",
26
27
  "sideEffects": false,
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
27
30
  "exports": {
28
31
  "./package.json": "./package.json",
29
- ".": "./src/index.tsx",
30
- "./*": "./src/*.tsx"
32
+ ".": {
33
+ "playfast-src": "./src/index.tsx",
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "./*": {
38
+ "playfast-src": "./src/*.tsx",
39
+ "types": "./dist/*.d.ts",
40
+ "default": "./dist/*.js"
41
+ }
31
42
  },
32
43
  "publishConfig": {
33
44
  "access": "public"
@@ -35,12 +46,13 @@
35
46
  "scripts": {
36
47
  "clean": "rm -rf dist .tsbuildinfo",
37
48
  "check": "tsc --noEmit",
38
- "build": "tsc -p tsconfig.build.json",
49
+ "build": "rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist",
39
50
  "test": "vitest run",
40
51
  "test:watch": "vitest",
41
52
  "coverage": "vitest run --coverage",
42
53
  "lint": "oxlint src",
43
- "lint:fix": "oxlint --fix src"
54
+ "lint:fix": "oxlint --fix src",
55
+ "prepack": "bun run build"
44
56
  },
45
57
  "peerDependencies": {
46
58
  "@playfast/reform": "*",