pdyform 2.0.2 → 2.1.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.
Files changed (190) hide show
  1. package/package.json +9 -3
  2. package/packages/vue/dist/index.d.ts +2 -36
  3. package/packages/vue/dist/index.js +1 -28
  4. package/packages/vue/dist/index.mjs +267 -6512
  5. package/eslint.config.mjs +0 -53
  6. package/example/README.md +0 -36
  7. package/example/react-demo/index.html +0 -12
  8. package/example/react-demo/node_modules/.bin/browserslist +0 -17
  9. package/example/react-demo/node_modules/.bin/tsc +0 -17
  10. package/example/react-demo/node_modules/.bin/tsserver +0 -17
  11. package/example/react-demo/node_modules/.bin/vite +0 -17
  12. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js +0 -300
  13. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js.map +0 -7
  14. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js +0 -194
  15. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js.map +0 -7
  16. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js +0 -530
  17. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js.map +0 -7
  18. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js +0 -4808
  19. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js.map +0 -7
  20. package/example/react-demo/node_modules/.vite/deps/_metadata.json +0 -115
  21. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js +0 -49
  22. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js.map +0 -7
  23. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js +0 -127
  24. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js.map +0 -7
  25. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js +0 -36
  26. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js.map +0 -7
  27. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js +0 -370
  28. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js.map +0 -7
  29. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js +0 -928
  30. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js.map +0 -7
  31. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js +0 -21
  32. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js.map +0 -7
  33. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js +0 -1906
  34. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js.map +0 -7
  35. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js +0 -21628
  36. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js.map +0 -7
  37. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js +0 -144
  38. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js.map +0 -7
  39. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js +0 -51
  40. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js.map +0 -7
  41. package/example/react-demo/node_modules/.vite/deps/clsx.js +0 -10
  42. package/example/react-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  43. package/example/react-demo/node_modules/.vite/deps/lucide-react.js +0 -29725
  44. package/example/react-demo/node_modules/.vite/deps/lucide-react.js.map +0 -7
  45. package/example/react-demo/node_modules/.vite/deps/package.json +0 -3
  46. package/example/react-demo/node_modules/.vite/deps/react-dom.js +0 -7
  47. package/example/react-demo/node_modules/.vite/deps/react-dom.js.map +0 -7
  48. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js +0 -39
  49. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  50. package/example/react-demo/node_modules/.vite/deps/react.js +0 -6
  51. package/example/react-demo/node_modules/.vite/deps/react.js.map +0 -7
  52. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -913
  53. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  54. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js +0 -7
  55. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  56. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  57. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  58. package/example/react-demo/package.json +0 -23
  59. package/example/react-demo/postcss.config.mjs +0 -6
  60. package/example/react-demo/src/App.tsx +0 -64
  61. package/example/react-demo/src/main.tsx +0 -10
  62. package/example/react-demo/src/styles.css +0 -102
  63. package/example/react-demo/tailwind.config.mjs +0 -50
  64. package/example/react-demo/tsconfig.json +0 -16
  65. package/example/react-demo/vite.config.ts +0 -14
  66. package/example/shared/defaultSchema.ts +0 -68
  67. package/example/vue-demo/index.html +0 -12
  68. package/example/vue-demo/node_modules/.bin/tsc +0 -17
  69. package/example/vue-demo/node_modules/.bin/tsserver +0 -17
  70. package/example/vue-demo/node_modules/.bin/vite +0 -17
  71. package/example/vue-demo/node_modules/.vite/deps/_metadata.json +0 -46
  72. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js +0 -10
  73. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js.map +0 -7
  74. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js +0 -12877
  75. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js.map +0 -7
  76. package/example/vue-demo/node_modules/.vite/deps/clsx.js +0 -22
  77. package/example/vue-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  78. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js +0 -29720
  79. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js.map +0 -7
  80. package/example/vue-demo/node_modules/.vite/deps/package.json +0 -3
  81. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js +0 -24321
  82. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js.map +0 -7
  83. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  84. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  85. package/example/vue-demo/node_modules/.vite/deps/vue.js +0 -348
  86. package/example/vue-demo/node_modules/.vite/deps/vue.js.map +0 -7
  87. package/example/vue-demo/package.json +0 -20
  88. package/example/vue-demo/postcss.config.mjs +0 -6
  89. package/example/vue-demo/src/App.vue +0 -61
  90. package/example/vue-demo/src/env.d.ts +0 -1
  91. package/example/vue-demo/src/main.ts +0 -5
  92. package/example/vue-demo/src/style.css +0 -102
  93. package/example/vue-demo/tailwind.config.mjs +0 -50
  94. package/example/vue-demo/tsconfig.json +0 -15
  95. package/example/vue-demo/vite.config.ts +0 -14
  96. package/packages/core/node_modules/.bin/api-extractor +0 -17
  97. package/packages/core/node_modules/.bin/esbuild +0 -14
  98. package/packages/core/node_modules/.bin/jiti +0 -17
  99. package/packages/core/node_modules/.bin/tsc +0 -17
  100. package/packages/core/node_modules/.bin/tsserver +0 -17
  101. package/packages/core/node_modules/.bin/tsup +0 -17
  102. package/packages/core/node_modules/.bin/tsup-node +0 -17
  103. package/packages/core/node_modules/.bin/vitest +0 -17
  104. package/packages/core/node_modules/.vite/vitest/results.json +0 -1
  105. package/packages/core/package.json +0 -37
  106. package/packages/core/src/formState.ts +0 -79
  107. package/packages/core/src/index.ts +0 -3
  108. package/packages/core/src/types.ts +0 -42
  109. package/packages/core/src/utils.ts +0 -104
  110. package/packages/core/test/formState.test.ts +0 -71
  111. package/packages/core/test/utils.test.ts +0 -178
  112. package/packages/core/tsconfig.json +0 -15
  113. package/packages/core/tsup.config.ts +0 -9
  114. package/packages/react/node_modules/.bin/api-extractor +0 -17
  115. package/packages/react/node_modules/.bin/browserslist +0 -17
  116. package/packages/react/node_modules/.bin/esbuild +0 -14
  117. package/packages/react/node_modules/.bin/jiti +0 -17
  118. package/packages/react/node_modules/.bin/tsc +0 -17
  119. package/packages/react/node_modules/.bin/tsserver +0 -17
  120. package/packages/react/node_modules/.bin/tsup +0 -17
  121. package/packages/react/node_modules/.bin/tsup-node +0 -17
  122. package/packages/react/node_modules/.bin/vite +0 -17
  123. package/packages/react/node_modules/.bin/vitest +0 -17
  124. package/packages/react/node_modules/.vite/vitest/results.json +0 -1
  125. package/packages/react/package.json +0 -57
  126. package/packages/react/postcss.config.mjs +0 -6
  127. package/packages/react/src/DynamicForm.tsx +0 -69
  128. package/packages/react/src/FormFieldRenderer.tsx +0 -50
  129. package/packages/react/src/components/Checkbox.tsx +0 -28
  130. package/packages/react/src/components/CheckboxRenderer.tsx +0 -37
  131. package/packages/react/src/components/Input.tsx +0 -24
  132. package/packages/react/src/components/InputRenderer.tsx +0 -25
  133. package/packages/react/src/components/Label.tsx +0 -24
  134. package/packages/react/src/components/RadioGroup.tsx +0 -42
  135. package/packages/react/src/components/RadioRenderer.tsx +0 -29
  136. package/packages/react/src/components/Select.tsx +0 -93
  137. package/packages/react/src/components/SelectRenderer.tsx +0 -27
  138. package/packages/react/src/components/Textarea.tsx +0 -23
  139. package/packages/react/src/components/TextareaRenderer.tsx +0 -17
  140. package/packages/react/src/components/index.ts +0 -55
  141. package/packages/react/src/components/types.ts +0 -17
  142. package/packages/react/src/index.tsx +0 -3
  143. package/packages/react/src/utils.ts +0 -7
  144. package/packages/react/tailwind.config.mjs +0 -10
  145. package/packages/react/test/DynamicForm.test.tsx +0 -25
  146. package/packages/react/test/FormFieldRenderer.test.tsx +0 -127
  147. package/packages/react/tsconfig.json +0 -15
  148. package/packages/react/vitest.config.ts +0 -16
  149. package/packages/vue/node_modules/.bin/rollup +0 -17
  150. package/packages/vue/node_modules/.bin/tsc +0 -17
  151. package/packages/vue/node_modules/.bin/tsserver +0 -17
  152. package/packages/vue/node_modules/.bin/vite +0 -17
  153. package/packages/vue/node_modules/.bin/vitest +0 -17
  154. package/packages/vue/node_modules/.bin/vue-tsc +0 -17
  155. package/packages/vue/node_modules/.vite/vitest/results.json +0 -1
  156. package/packages/vue/node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts +0 -118
  157. package/packages/vue/node_modules/.vue-global-types/vue_3.5_false.d.ts +0 -128
  158. package/packages/vue/package.json +0 -53
  159. package/packages/vue/postcss.config.mjs +0 -6
  160. package/packages/vue/src/DynamicForm.vue +0 -63
  161. package/packages/vue/src/FormFieldRenderer.vue +0 -70
  162. package/packages/vue/src/components/Checkbox.vue +0 -28
  163. package/packages/vue/src/components/CheckboxRenderer.vue +0 -35
  164. package/packages/vue/src/components/Input.vue +0 -21
  165. package/packages/vue/src/components/InputRenderer.vue +0 -24
  166. package/packages/vue/src/components/Label.vue +0 -21
  167. package/packages/vue/src/components/RadioGroup.vue +0 -30
  168. package/packages/vue/src/components/RadioGroupItem.vue +0 -26
  169. package/packages/vue/src/components/RadioRenderer.vue +0 -24
  170. package/packages/vue/src/components/Select.vue +0 -40
  171. package/packages/vue/src/components/SelectContent.vue +0 -38
  172. package/packages/vue/src/components/SelectItem.vue +0 -43
  173. package/packages/vue/src/components/SelectRenderer.vue +0 -30
  174. package/packages/vue/src/components/SelectTrigger.vue +0 -27
  175. package/packages/vue/src/components/Textarea.vue +0 -19
  176. package/packages/vue/src/components/TextareaRenderer.vue +0 -18
  177. package/packages/vue/src/components/index.ts +0 -24
  178. package/packages/vue/src/env.d.ts +0 -7
  179. package/packages/vue/src/fieldComponentMap.ts +0 -34
  180. package/packages/vue/src/index.ts +0 -4
  181. package/packages/vue/src/utils.ts +0 -6
  182. package/packages/vue/tailwind.config.mjs +0 -10
  183. package/packages/vue/test/DynamicForm.test.ts +0 -19
  184. package/packages/vue/test/FormFieldRenderer.test.ts +0 -133
  185. package/packages/vue/tsconfig.json +0 -16
  186. package/packages/vue/vite.config.ts +0 -29
  187. package/packages/vue/vitest.config.ts +0 -16
  188. package/pnpm-workspace.yaml +0 -4
  189. package/tsconfig.json +0 -21
  190. package/turbo.json +0 -25
@@ -1,93 +0,0 @@
1
- import * as React from "react"
2
- import * as SelectPrimitive from "@radix-ui/react-select"
3
- import { Check, ChevronDown, ChevronUp } from "lucide-react"
4
-
5
- import { cn } from "../utils"
6
-
7
- const Select = SelectPrimitive.Root
8
-
9
- const SelectGroup = SelectPrimitive.Group
10
-
11
- const SelectValue = SelectPrimitive.Value
12
-
13
- const SelectTrigger = React.forwardRef<
14
- React.ElementRef<typeof SelectPrimitive.Trigger>,
15
- React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
16
- >(({ className, children, ...props }, ref) => (
17
- <SelectPrimitive.Trigger
18
- ref={ref}
19
- className={cn(
20
- "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
21
- className
22
- )}
23
- {...props}
24
- >
25
- {children}
26
- <SelectPrimitive.Icon asChild>
27
- <ChevronDown className="h-4 w-4 opacity-50" />
28
- </SelectPrimitive.Icon>
29
- </SelectPrimitive.Trigger>
30
- ))
31
- SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
32
-
33
- const SelectContent = React.forwardRef<
34
- React.ElementRef<typeof SelectPrimitive.Content>,
35
- React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
36
- >(({ className, children, position = "popper", ...props }, ref) => (
37
- <SelectPrimitive.Portal>
38
- <SelectPrimitive.Content
39
- ref={ref}
40
- className={cn(
41
- "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
42
- position === "popper" &&
43
- "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
44
- className
45
- )}
46
- position={position}
47
- {...props}
48
- >
49
- <SelectPrimitive.Viewport
50
- className={cn(
51
- "p-1",
52
- position === "popper" &&
53
- "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
54
- )}
55
- >
56
- {children}
57
- </SelectPrimitive.Viewport>
58
- </SelectPrimitive.Content>
59
- </SelectPrimitive.Portal>
60
- ))
61
- SelectContent.displayName = SelectPrimitive.Content.displayName
62
-
63
- const SelectItem = React.forwardRef<
64
- React.ElementRef<typeof SelectPrimitive.Item>,
65
- React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
66
- >(({ className, children, ...props }, ref) => (
67
- <SelectPrimitive.Item
68
- ref={ref}
69
- className={cn(
70
- "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
71
- className
72
- )}
73
- {...props}
74
- >
75
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
76
- <SelectPrimitive.ItemIndicator>
77
- <Check className="h-4 w-4" />
78
- </SelectPrimitive.ItemIndicator>
79
- </span>
80
-
81
- <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
82
- </SelectPrimitive.Item>
83
- ))
84
- SelectItem.displayName = SelectPrimitive.Item.displayName
85
-
86
- export {
87
- Select,
88
- SelectGroup,
89
- SelectValue,
90
- SelectTrigger,
91
- SelectContent,
92
- SelectItem,
93
- }
@@ -1,27 +0,0 @@
1
- import React from 'react';
2
- import type { FieldRenderContext } from './types';
3
- import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from './Select';
4
-
5
- const SelectRenderer: React.FC<FieldRenderContext> = ({ field, value, onChange, onBlur, fieldId }) => (
6
- <Select
7
- value={value != null ? String(value) : ''}
8
- onValueChange={onChange}
9
- disabled={field.disabled}
10
- name={field.name}
11
- >
12
- <SelectTrigger id={fieldId} onBlur={onBlur}>
13
- <SelectValue placeholder={field.placeholder || 'Select an option'} />
14
- </SelectTrigger>
15
- <SelectContent>
16
- <SelectGroup>
17
- {field.options?.map((opt) => (
18
- <SelectItem key={opt.value} value={String(opt.value)}>
19
- {opt.label}
20
- </SelectItem>
21
- ))}
22
- </SelectGroup>
23
- </SelectContent>
24
- </Select>
25
- );
26
-
27
- export default SelectRenderer;
@@ -1,23 +0,0 @@
1
- import * as React from "react"
2
- import { cn } from "../utils"
3
-
4
- export interface TextareaProps
5
- extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
6
-
7
- const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
8
- ({ className, ...props }, ref) => {
9
- return (
10
- <textarea
11
- className={cn(
12
- "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
13
- className
14
- )}
15
- ref={ref}
16
- {...props}
17
- />
18
- )
19
- }
20
- )
21
- Textarea.displayName = "Textarea"
22
-
23
- export { Textarea }
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
- import type { FieldRenderContext } from './types';
3
- import { Textarea } from './Textarea';
4
-
5
- const TextareaRenderer: React.FC<FieldRenderContext> = ({ field, value, onChange, onBlur, fieldId }) => (
6
- <Textarea
7
- id={fieldId}
8
- placeholder={field.placeholder}
9
- value={value ?? ''}
10
- onChange={(e) => onChange(e.target.value)}
11
- onBlur={onBlur}
12
- disabled={field.disabled}
13
- name={field.name}
14
- />
15
- );
16
-
17
- export default TextareaRenderer;
@@ -1,55 +0,0 @@
1
- // ─── Primitive UI components ─────────────────────────────────────────────────
2
- export { Input } from './Input';
3
- export { Textarea } from './Textarea';
4
- export { Checkbox } from './Checkbox';
5
- export { RadioGroup, RadioGroupItem } from './RadioGroup';
6
- export {
7
- Select,
8
- SelectGroup,
9
- SelectValue,
10
- SelectTrigger,
11
- SelectContent,
12
- SelectItem,
13
- } from './Select';
14
- export { Label } from './Label';
15
-
16
- // ─── Field renderer components ────────────────────────────────────────────────
17
- export { default as InputRenderer } from './InputRenderer';
18
- export { default as TextareaRenderer } from './TextareaRenderer';
19
- export { default as SelectRenderer } from './SelectRenderer';
20
- export { default as CheckboxRenderer } from './CheckboxRenderer';
21
- export { default as RadioRenderer } from './RadioRenderer';
22
-
23
- // ─── Types ───────────────────────────────────────────────────────────────────
24
- export type { FieldRenderContext, FieldRenderer, FieldComponentMap } from './types';
25
-
26
- // ─── Default component map ───────────────────────────────────────────────────
27
- import InputRenderer from './InputRenderer';
28
- import TextareaRenderer from './TextareaRenderer';
29
- import SelectRenderer from './SelectRenderer';
30
- import CheckboxRenderer from './CheckboxRenderer';
31
- import RadioRenderer from './RadioRenderer';
32
- import type { FieldComponentMap } from './types';
33
-
34
- /**
35
- * The default built-in component map.
36
- * Import and spread this to extend or override individual field types:
37
- *
38
- * @example
39
- * ```tsx
40
- * import { defaultComponentMap } from 'pdyform-react';
41
- * const myMap = { ...defaultComponentMap, text: MyInput, rating: StarRating };
42
- * <FormFieldRenderer componentMap={myMap} ... />
43
- * ```
44
- */
45
- export const defaultComponentMap: FieldComponentMap = {
46
- text: InputRenderer,
47
- number: InputRenderer,
48
- password: InputRenderer,
49
- email: InputRenderer,
50
- date: InputRenderer,
51
- textarea: TextareaRenderer,
52
- select: SelectRenderer,
53
- checkbox: CheckboxRenderer,
54
- radio: RadioRenderer,
55
- };
@@ -1,17 +0,0 @@
1
- import type React from 'react';
2
- import type { FormField } from 'pdyform/core';
3
-
4
- /** All props passed into each individual field renderer component */
5
- export interface FieldRenderContext {
6
- field: FormField;
7
- value: any;
8
- onChange: (value: any) => void;
9
- onBlur?: () => void;
10
- fieldId: string;
11
- }
12
-
13
- /** A React component that renders a specific field type */
14
- export type FieldRenderer = React.ComponentType<FieldRenderContext>;
15
-
16
- /** Map from field `type` string to its renderer component */
17
- export type FieldComponentMap = Record<string, FieldRenderer>;
@@ -1,3 +0,0 @@
1
- export * from './DynamicForm';
2
- export * from './FormFieldRenderer';
3
- export * from './components';
@@ -1,7 +0,0 @@
1
- import * as React from "react"
2
- import { clsx, type ClassValue } from "clsx"
3
- import { twMerge } from "tailwind-merge"
4
-
5
- export function cn(...inputs: ClassValue[]) {
6
- return twMerge(clsx(inputs))
7
- }
@@ -1,10 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- export default {
3
- content: [
4
- "./src/**/*.{js,ts,jsx,tsx}",
5
- ],
6
- theme: {
7
- extend: {},
8
- },
9
- plugins: [],
10
- }
@@ -1,25 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect } from 'vitest';
3
- import { render, screen, fireEvent } from '@testing-library/react';
4
- import { DynamicForm } from '../src/DynamicForm';
5
- import React from 'react';
6
-
7
- describe('React DynamicForm', () => {
8
- const schema: any = {
9
- fields: [
10
- { name: 'username', label: 'Username', type: 'text', validations: [{ type: 'required', message: 'Required' }] }
11
- ]
12
- };
13
-
14
- it('renders correctly', () => {
15
- render(<DynamicForm schema={schema} onSubmit={() => {}} />);
16
- expect(screen.getByLabelText('Username')).toBeTruthy();
17
- });
18
-
19
- it('shows validation error on blur', async () => {
20
- render(<DynamicForm schema={schema} onSubmit={() => {}} />);
21
- const input = screen.getByLabelText('Username');
22
- fireEvent.blur(input);
23
- expect(await screen.findByText('Required')).toBeTruthy();
24
- });
25
- });
@@ -1,127 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect, vi } from 'vitest';
3
- import { render, screen, fireEvent } from '@testing-library/react';
4
- import { FormFieldRenderer } from '../src/FormFieldRenderer';
5
- import React from 'react';
6
- import type { FormField } from 'pdyform/core';
7
-
8
- describe('FormFieldRenderer', () => {
9
- const defaultField: FormField = {
10
- name: 'testField',
11
- label: 'Test Label',
12
- type: 'text',
13
- id: 'test-field-id',
14
- };
15
-
16
- it('renders a text input correctly', () => {
17
- const onChange = vi.fn();
18
- render(<FormFieldRenderer field={defaultField} value="test value" onChange={onChange} />);
19
-
20
- expect(screen.getByLabelText('Test Label')).toBeTruthy();
21
- const input = screen.getByDisplayValue('test value') as HTMLInputElement;
22
- expect(input.type).toBe('text');
23
-
24
- fireEvent.change(input, { target: { value: 'new value' } });
25
- expect(onChange).toHaveBeenCalledWith('new value');
26
- });
27
-
28
- it('emits number for number inputs', () => {
29
- const field: FormField = { ...defaultField, type: 'number' };
30
- const onChange = vi.fn();
31
- render(<FormFieldRenderer field={field} value={22} onChange={onChange} />);
32
-
33
- const input = screen.getByLabelText('Test Label') as HTMLInputElement;
34
- fireEvent.change(input, { target: { value: '23' } });
35
- expect(onChange).toHaveBeenCalledWith(23);
36
- });
37
-
38
- it('renders a textarea correctly', () => {
39
- const field: FormField = { ...defaultField, type: 'textarea' };
40
- const onChange = vi.fn();
41
- render(<FormFieldRenderer field={field} value={"text\narea"} onChange={onChange} />);
42
-
43
- const textarea = screen.getByRole('textbox') as HTMLTextAreaElement;
44
- expect(textarea.value).toBe('text\narea');
45
- });
46
-
47
- it('renders a select correctly', () => {
48
- const field: FormField = {
49
- ...defaultField,
50
- type: 'select',
51
- options: [
52
- { label: 'Option 1', value: 'opt1' },
53
- { label: 'Option 2', value: 'opt2' }
54
- ]
55
- };
56
- const onChange = vi.fn();
57
- render(<FormFieldRenderer field={field} value="opt1" onChange={onChange} />);
58
-
59
- // Radix Select Trigger is a button (combobox)
60
- const trigger = screen.getByRole('combobox');
61
- expect(trigger.textContent).toContain('Option 1');
62
-
63
- // Open select to trigger change
64
- fireEvent.click(trigger);
65
-
66
- // Select Option 2
67
- const option2 = screen.getByRole('option', { name: 'Option 2' });
68
- fireEvent.click(option2);
69
-
70
- expect(onChange).toHaveBeenCalledWith('opt2');
71
- });
72
-
73
- it('renders a checkbox correctly', () => {
74
- const field: FormField = {
75
- ...defaultField,
76
- type: 'checkbox',
77
- options: [
78
- { label: 'Check 1', value: 'c1' },
79
- { label: 'Check 2', value: 'c2' }
80
- ]
81
- };
82
- const onChange = vi.fn();
83
- render(<FormFieldRenderer field={field} value={['c1']} onChange={onChange} />);
84
-
85
- const checkbox1 = screen.getByRole('checkbox', { name: 'Check 1' });
86
- const checkbox2 = screen.getByRole('checkbox', { name: 'Check 2' });
87
-
88
- expect(checkbox1.getAttribute('aria-checked')).toBe('true');
89
- expect(checkbox2.getAttribute('aria-checked')).toBe('false');
90
-
91
- fireEvent.click(checkbox2);
92
- expect(onChange).toHaveBeenCalledWith(['c1', 'c2']);
93
-
94
- fireEvent.click(checkbox1);
95
- expect(onChange).toHaveBeenCalledWith([]);
96
- });
97
-
98
- it('renders a radio correctly', () => {
99
- const field: FormField = {
100
- ...defaultField,
101
- type: 'radio',
102
- options: [
103
- { label: 'Radio 1', value: 'r1' },
104
- { label: 'Radio 2', value: 'r2' }
105
- ]
106
- };
107
- const onChange = vi.fn();
108
- render(<FormFieldRenderer field={field} value="r1" onChange={onChange} />);
109
-
110
- const radio1 = screen.getByRole('radio', { name: 'Radio 1' });
111
- const radio2 = screen.getByRole('radio', { name: 'Radio 2' });
112
-
113
- expect(radio1.getAttribute('aria-checked')).toBe('true');
114
- expect(radio2.getAttribute('aria-checked')).toBe('false');
115
-
116
- fireEvent.click(radio2);
117
- expect(onChange).toHaveBeenCalledWith('r2');
118
- });
119
-
120
- it('displays description and error', () => {
121
- const field: FormField = { ...defaultField, description: 'Desc text' };
122
- render(<FormFieldRenderer field={field} value="" onChange={() => {}} error="Error text" />);
123
-
124
- expect(screen.getByText('Desc text')).toBeTruthy();
125
- expect(screen.getByText('Error text')).toBeTruthy();
126
- });
127
- });
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": false,
4
- "target": "ESNext",
5
- "module": "ESNext",
6
- "moduleResolution": "bundler",
7
- "jsx": "react-jsx",
8
- "outDir": "./dist",
9
- "strict": true,
10
- "esModuleInterop": true,
11
- "skipLibCheck": true,
12
- },
13
- "include": ["src/**/*.ts", "src/**/*.tsx"],
14
- "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.test.tsx"]
15
- }
@@ -1,16 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
- import react from '@vitejs/plugin-react';
3
- import path from 'path';
4
-
5
- export default defineConfig({
6
- plugins: [react()],
7
- test: {
8
- environment: 'jsdom',
9
- globals: true,
10
- },
11
- resolve: {
12
- alias: {
13
- 'pdyform/core': path.resolve(__dirname, '../core/src'),
14
- },
15
- },
16
- });
@@ -1,17 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
6
- esac
7
-
8
- if [ -z "$NODE_PATH" ]; then
9
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/dist/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/dist/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
10
- else
11
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/dist/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/dist/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/rollup@4.59.0/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- if [ -x "$basedir/node" ]; then
14
- exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/dist/bin/rollup" "$@"
15
- else
16
- exec node "$basedir/../../../../node_modules/.pnpm/rollup@4.59.0/node_modules/rollup/dist/bin/rollup" "$@"
17
- fi
@@ -1,17 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
6
- esac
7
-
8
- if [ -z "$NODE_PATH" ]; then
9
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
10
- else
11
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- if [ -x "$basedir/node" ]; then
14
- exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
15
- else
16
- exec node "$basedir/../typescript/bin/tsc" "$@"
17
- fi
@@ -1,17 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
6
- esac
7
-
8
- if [ -z "$NODE_PATH" ]; then
9
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
10
- else
11
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- if [ -x "$basedir/node" ]; then
14
- exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
15
- else
16
- exec node "$basedir/../typescript/bin/tsserver" "$@"
17
- fi
@@ -1,17 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
6
- esac
7
-
8
- if [ -z "$NODE_PATH" ]; then
9
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.35/node_modules/vite/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.35/node_modules/vite/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.35/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
10
- else
11
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.35/node_modules/vite/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.35/node_modules/vite/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vite@5.4.21_@types+node@20.19.35/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- if [ -x "$basedir/node" ]; then
14
- exec "$basedir/node" "$basedir/../vite/bin/vite.js" "$@"
15
- else
16
- exec node "$basedir/../vite/bin/vite.js" "$@"
17
- fi
@@ -1,17 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
6
- esac
7
-
8
- if [ -z "$NODE_PATH" ]; then
9
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vitest@1.6.1_@types+node@20.19.35_jsdom@22.1.0/node_modules/vitest/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vitest@1.6.1_@types+node@20.19.35_jsdom@22.1.0/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
10
- else
11
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vitest@1.6.1_@types+node@20.19.35_jsdom@22.1.0/node_modules/vitest/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vitest@1.6.1_@types+node@20.19.35_jsdom@22.1.0/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- if [ -x "$basedir/node" ]; then
14
- exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
15
- else
16
- exec node "$basedir/../vitest/vitest.mjs" "$@"
17
- fi
@@ -1,17 +0,0 @@
1
- #!/bin/sh
2
- basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
-
4
- case `uname` in
5
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
6
- esac
7
-
8
- if [ -z "$NODE_PATH" ]; then
9
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vue-tsc@2.2.12_typescript@5.9.3/node_modules/vue-tsc/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vue-tsc@2.2.12_typescript@5.9.3/node_modules/vue-tsc/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vue-tsc@2.2.12_typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
10
- else
11
- export NODE_PATH="/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vue-tsc@2.2.12_typescript@5.9.3/node_modules/vue-tsc/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vue-tsc@2.2.12_typescript@5.9.3/node_modules/vue-tsc/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/vue-tsc@2.2.12_typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- if [ -x "$basedir/node" ]; then
14
- exec "$basedir/node" "$basedir/../vue-tsc/bin/vue-tsc.js" "$@"
15
- else
16
- exec node "$basedir/../vue-tsc/bin/vue-tsc.js" "$@"
17
- fi
@@ -1 +0,0 @@
1
- {"version":"1.6.1","results":[[":test/DynamicForm.test.ts",{"duration":19,"failed":false}],[":test/FormFieldRenderer.test.ts",{"duration":77,"failed":false}]]}