pdyform 2.0.2 → 2.2.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 (215) hide show
  1. package/README.md +98 -74
  2. package/package.json +9 -3
  3. package/packages/core/dist/chunk-6F4PWJZI.js +0 -0
  4. package/packages/core/dist/chunk-KA6QUMVR.js +158 -0
  5. package/packages/core/dist/chunk-REHKL5VH.js +76 -0
  6. package/packages/core/dist/formState.cjs +132 -78
  7. package/packages/core/dist/formState.d.cts +14 -10
  8. package/packages/core/dist/formState.d.ts +14 -10
  9. package/packages/core/dist/formState.js +4 -12
  10. package/packages/core/dist/index.cjs +138 -78
  11. package/packages/core/dist/index.d.cts +4 -3
  12. package/packages/core/dist/index.d.ts +4 -3
  13. package/packages/core/dist/index.js +11 -12
  14. package/packages/core/dist/types.d.cts +17 -5
  15. package/packages/core/dist/types.d.ts +17 -5
  16. package/packages/core/dist/types.js +1 -0
  17. package/packages/core/dist/utils.cjs +78 -19
  18. package/packages/core/dist/utils.d.cts +17 -5
  19. package/packages/core/dist/utils.d.ts +17 -5
  20. package/packages/core/dist/utils.js +7 -1
  21. package/packages/react/dist/index.cjs +1 -461
  22. package/packages/react/dist/index.d.cts +33 -2
  23. package/packages/react/dist/index.d.ts +33 -2
  24. package/packages/react/dist/index.js +1 -411
  25. package/packages/vue/dist/index.d.ts +51 -39
  26. package/packages/vue/dist/index.js +1 -28
  27. package/packages/vue/dist/index.mjs +630 -6527
  28. package/eslint.config.mjs +0 -53
  29. package/example/README.md +0 -36
  30. package/example/react-demo/index.html +0 -12
  31. package/example/react-demo/node_modules/.bin/browserslist +0 -17
  32. package/example/react-demo/node_modules/.bin/tsc +0 -17
  33. package/example/react-demo/node_modules/.bin/tsserver +0 -17
  34. package/example/react-demo/node_modules/.bin/vite +0 -17
  35. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js +0 -300
  36. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-checkbox.js.map +0 -7
  37. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js +0 -194
  38. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-label.js.map +0 -7
  39. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js +0 -530
  40. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-radio-group.js.map +0 -7
  41. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js +0 -4808
  42. package/example/react-demo/node_modules/.vite/deps/@radix-ui_react-select.js.map +0 -7
  43. package/example/react-demo/node_modules/.vite/deps/_metadata.json +0 -115
  44. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js +0 -49
  45. package/example/react-demo/node_modules/.vite/deps/chunk-3D5PZ6F6.js.map +0 -7
  46. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js +0 -127
  47. package/example/react-demo/node_modules/.vite/deps/chunk-5Q2RBQLA.js.map +0 -7
  48. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js +0 -36
  49. package/example/react-demo/node_modules/.vite/deps/chunk-G3PMV62Z.js.map +0 -7
  50. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js +0 -370
  51. package/example/react-demo/node_modules/.vite/deps/chunk-GX7YZ5KV.js.map +0 -7
  52. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js +0 -928
  53. package/example/react-demo/node_modules/.vite/deps/chunk-PUFJGYAC.js.map +0 -7
  54. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js +0 -21
  55. package/example/react-demo/node_modules/.vite/deps/chunk-SIU35MPB.js.map +0 -7
  56. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js +0 -1906
  57. package/example/react-demo/node_modules/.vite/deps/chunk-TOMGVNQP.js.map +0 -7
  58. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js +0 -21628
  59. package/example/react-demo/node_modules/.vite/deps/chunk-YYN6DZAU.js.map +0 -7
  60. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js +0 -144
  61. package/example/react-demo/node_modules/.vite/deps/chunk-ZE5VSJFE.js.map +0 -7
  62. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js +0 -51
  63. package/example/react-demo/node_modules/.vite/deps/class-variance-authority.js.map +0 -7
  64. package/example/react-demo/node_modules/.vite/deps/clsx.js +0 -10
  65. package/example/react-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  66. package/example/react-demo/node_modules/.vite/deps/lucide-react.js +0 -29725
  67. package/example/react-demo/node_modules/.vite/deps/lucide-react.js.map +0 -7
  68. package/example/react-demo/node_modules/.vite/deps/package.json +0 -3
  69. package/example/react-demo/node_modules/.vite/deps/react-dom.js +0 -7
  70. package/example/react-demo/node_modules/.vite/deps/react-dom.js.map +0 -7
  71. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js +0 -39
  72. package/example/react-demo/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  73. package/example/react-demo/node_modules/.vite/deps/react.js +0 -6
  74. package/example/react-demo/node_modules/.vite/deps/react.js.map +0 -7
  75. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -913
  76. package/example/react-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  77. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js +0 -7
  78. package/example/react-demo/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  79. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  80. package/example/react-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  81. package/example/react-demo/package.json +0 -23
  82. package/example/react-demo/postcss.config.mjs +0 -6
  83. package/example/react-demo/src/App.tsx +0 -64
  84. package/example/react-demo/src/main.tsx +0 -10
  85. package/example/react-demo/src/styles.css +0 -102
  86. package/example/react-demo/tailwind.config.mjs +0 -50
  87. package/example/react-demo/tsconfig.json +0 -16
  88. package/example/react-demo/vite.config.ts +0 -14
  89. package/example/shared/defaultSchema.ts +0 -68
  90. package/example/vue-demo/index.html +0 -12
  91. package/example/vue-demo/node_modules/.bin/tsc +0 -17
  92. package/example/vue-demo/node_modules/.bin/tsserver +0 -17
  93. package/example/vue-demo/node_modules/.bin/vite +0 -17
  94. package/example/vue-demo/node_modules/.vite/deps/_metadata.json +0 -46
  95. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js +0 -10
  96. package/example/vue-demo/node_modules/.vite/deps/chunk-PZ5AY32C.js.map +0 -7
  97. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js +0 -12877
  98. package/example/vue-demo/node_modules/.vite/deps/chunk-TCXBSQ4M.js.map +0 -7
  99. package/example/vue-demo/node_modules/.vite/deps/clsx.js +0 -22
  100. package/example/vue-demo/node_modules/.vite/deps/clsx.js.map +0 -7
  101. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js +0 -29720
  102. package/example/vue-demo/node_modules/.vite/deps/lucide-vue-next.js.map +0 -7
  103. package/example/vue-demo/node_modules/.vite/deps/package.json +0 -3
  104. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js +0 -24321
  105. package/example/vue-demo/node_modules/.vite/deps/radix-vue.js.map +0 -7
  106. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js +0 -2534
  107. package/example/vue-demo/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  108. package/example/vue-demo/node_modules/.vite/deps/vue.js +0 -348
  109. package/example/vue-demo/node_modules/.vite/deps/vue.js.map +0 -7
  110. package/example/vue-demo/package.json +0 -20
  111. package/example/vue-demo/postcss.config.mjs +0 -6
  112. package/example/vue-demo/src/App.vue +0 -61
  113. package/example/vue-demo/src/env.d.ts +0 -1
  114. package/example/vue-demo/src/main.ts +0 -5
  115. package/example/vue-demo/src/style.css +0 -102
  116. package/example/vue-demo/tailwind.config.mjs +0 -50
  117. package/example/vue-demo/tsconfig.json +0 -15
  118. package/example/vue-demo/vite.config.ts +0 -14
  119. package/packages/core/dist/chunk-TP3IHKWV.js +0 -69
  120. package/packages/core/dist/chunk-WEDHXOHH.js +0 -102
  121. package/packages/core/node_modules/.bin/api-extractor +0 -17
  122. package/packages/core/node_modules/.bin/esbuild +0 -14
  123. package/packages/core/node_modules/.bin/jiti +0 -17
  124. package/packages/core/node_modules/.bin/tsc +0 -17
  125. package/packages/core/node_modules/.bin/tsserver +0 -17
  126. package/packages/core/node_modules/.bin/tsup +0 -17
  127. package/packages/core/node_modules/.bin/tsup-node +0 -17
  128. package/packages/core/node_modules/.bin/vitest +0 -17
  129. package/packages/core/node_modules/.vite/vitest/results.json +0 -1
  130. package/packages/core/package.json +0 -37
  131. package/packages/core/src/formState.ts +0 -79
  132. package/packages/core/src/index.ts +0 -3
  133. package/packages/core/src/types.ts +0 -42
  134. package/packages/core/src/utils.ts +0 -104
  135. package/packages/core/test/formState.test.ts +0 -71
  136. package/packages/core/test/utils.test.ts +0 -178
  137. package/packages/core/tsconfig.json +0 -15
  138. package/packages/core/tsup.config.ts +0 -9
  139. package/packages/react/node_modules/.bin/api-extractor +0 -17
  140. package/packages/react/node_modules/.bin/browserslist +0 -17
  141. package/packages/react/node_modules/.bin/esbuild +0 -14
  142. package/packages/react/node_modules/.bin/jiti +0 -17
  143. package/packages/react/node_modules/.bin/tsc +0 -17
  144. package/packages/react/node_modules/.bin/tsserver +0 -17
  145. package/packages/react/node_modules/.bin/tsup +0 -17
  146. package/packages/react/node_modules/.bin/tsup-node +0 -17
  147. package/packages/react/node_modules/.bin/vite +0 -17
  148. package/packages/react/node_modules/.bin/vitest +0 -17
  149. package/packages/react/node_modules/.vite/vitest/results.json +0 -1
  150. package/packages/react/package.json +0 -57
  151. package/packages/react/postcss.config.mjs +0 -6
  152. package/packages/react/src/DynamicForm.tsx +0 -69
  153. package/packages/react/src/FormFieldRenderer.tsx +0 -50
  154. package/packages/react/src/components/Checkbox.tsx +0 -28
  155. package/packages/react/src/components/CheckboxRenderer.tsx +0 -37
  156. package/packages/react/src/components/Input.tsx +0 -24
  157. package/packages/react/src/components/InputRenderer.tsx +0 -25
  158. package/packages/react/src/components/Label.tsx +0 -24
  159. package/packages/react/src/components/RadioGroup.tsx +0 -42
  160. package/packages/react/src/components/RadioRenderer.tsx +0 -29
  161. package/packages/react/src/components/Select.tsx +0 -93
  162. package/packages/react/src/components/SelectRenderer.tsx +0 -27
  163. package/packages/react/src/components/Textarea.tsx +0 -23
  164. package/packages/react/src/components/TextareaRenderer.tsx +0 -17
  165. package/packages/react/src/components/index.ts +0 -55
  166. package/packages/react/src/components/types.ts +0 -17
  167. package/packages/react/src/index.tsx +0 -3
  168. package/packages/react/src/utils.ts +0 -7
  169. package/packages/react/tailwind.config.mjs +0 -10
  170. package/packages/react/test/DynamicForm.test.tsx +0 -25
  171. package/packages/react/test/FormFieldRenderer.test.tsx +0 -127
  172. package/packages/react/tsconfig.json +0 -15
  173. package/packages/react/vitest.config.ts +0 -16
  174. package/packages/vue/node_modules/.bin/rollup +0 -17
  175. package/packages/vue/node_modules/.bin/tsc +0 -17
  176. package/packages/vue/node_modules/.bin/tsserver +0 -17
  177. package/packages/vue/node_modules/.bin/vite +0 -17
  178. package/packages/vue/node_modules/.bin/vitest +0 -17
  179. package/packages/vue/node_modules/.bin/vue-tsc +0 -17
  180. package/packages/vue/node_modules/.vite/vitest/results.json +0 -1
  181. package/packages/vue/node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts +0 -118
  182. package/packages/vue/node_modules/.vue-global-types/vue_3.5_false.d.ts +0 -128
  183. package/packages/vue/package.json +0 -53
  184. package/packages/vue/postcss.config.mjs +0 -6
  185. package/packages/vue/src/DynamicForm.vue +0 -63
  186. package/packages/vue/src/FormFieldRenderer.vue +0 -70
  187. package/packages/vue/src/components/Checkbox.vue +0 -28
  188. package/packages/vue/src/components/CheckboxRenderer.vue +0 -35
  189. package/packages/vue/src/components/Input.vue +0 -21
  190. package/packages/vue/src/components/InputRenderer.vue +0 -24
  191. package/packages/vue/src/components/Label.vue +0 -21
  192. package/packages/vue/src/components/RadioGroup.vue +0 -30
  193. package/packages/vue/src/components/RadioGroupItem.vue +0 -26
  194. package/packages/vue/src/components/RadioRenderer.vue +0 -24
  195. package/packages/vue/src/components/Select.vue +0 -40
  196. package/packages/vue/src/components/SelectContent.vue +0 -38
  197. package/packages/vue/src/components/SelectItem.vue +0 -43
  198. package/packages/vue/src/components/SelectRenderer.vue +0 -30
  199. package/packages/vue/src/components/SelectTrigger.vue +0 -27
  200. package/packages/vue/src/components/Textarea.vue +0 -19
  201. package/packages/vue/src/components/TextareaRenderer.vue +0 -18
  202. package/packages/vue/src/components/index.ts +0 -24
  203. package/packages/vue/src/env.d.ts +0 -7
  204. package/packages/vue/src/fieldComponentMap.ts +0 -34
  205. package/packages/vue/src/index.ts +0 -4
  206. package/packages/vue/src/utils.ts +0 -6
  207. package/packages/vue/tailwind.config.mjs +0 -10
  208. package/packages/vue/test/DynamicForm.test.ts +0 -19
  209. package/packages/vue/test/FormFieldRenderer.test.ts +0 -133
  210. package/packages/vue/tsconfig.json +0 -16
  211. package/packages/vue/vite.config.ts +0 -29
  212. package/packages/vue/vitest.config.ts +0 -16
  213. package/pnpm-workspace.yaml +0 -4
  214. package/tsconfig.json +0 -21
  215. package/turbo.json +0 -25
@@ -1,102 +0,0 @@
1
- // src/utils.ts
2
- function parseNumberish(value) {
3
- if (typeof value === "number") return Number.isNaN(value) ? null : value;
4
- if (typeof value !== "string" || value.trim() === "") return null;
5
- const parsed = Number(value);
6
- return Number.isNaN(parsed) ? null : parsed;
7
- }
8
- function normalizeFieldValue(field, value) {
9
- if (field.type !== "number") return value;
10
- if (value === "" || value === void 0 || value === null) return "";
11
- const numericValue = parseNumberish(value);
12
- return numericValue === null ? value : numericValue;
13
- }
14
- function validateField(value, field) {
15
- if (!field.validations) return null;
16
- for (const rule of field.validations) {
17
- switch (rule.type) {
18
- case "required":
19
- if (value === void 0 || value === null || value === "" || Array.isArray(value) && value.length === 0) {
20
- return rule.message || `${field.label} is required`;
21
- }
22
- break;
23
- case "min":
24
- if (field.type === "number") {
25
- const numericValue = parseNumberish(value);
26
- if (numericValue !== null && numericValue < rule.value) {
27
- return rule.message || `${field.label} must be at least ${rule.value}`;
28
- }
29
- break;
30
- }
31
- if (typeof value === "number" && value < rule.value) {
32
- return rule.message || `${field.label} must be at least ${rule.value}`;
33
- }
34
- if (typeof value === "string" && value.length < rule.value) {
35
- return rule.message || `${field.label} must be at least ${rule.value} characters`;
36
- }
37
- break;
38
- case "max":
39
- if (field.type === "number") {
40
- const numericValue = parseNumberish(value);
41
- if (numericValue !== null && numericValue > rule.value) {
42
- return rule.message || `${field.label} must be at most ${rule.value}`;
43
- }
44
- break;
45
- }
46
- if (typeof value === "number" && value > rule.value) {
47
- return rule.message || `${field.label} must be at most ${rule.value}`;
48
- }
49
- if (typeof value === "string" && value.length > rule.value) {
50
- return rule.message || `${field.label} must be at most ${rule.value} characters`;
51
- }
52
- break;
53
- case "email": {
54
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
55
- if (value && !emailRegex.test(value)) {
56
- return rule.message || "Invalid email address";
57
- }
58
- break;
59
- }
60
- case "pattern":
61
- if (value && rule.value && !new RegExp(rule.value).test(value)) {
62
- return rule.message || "Invalid format";
63
- }
64
- break;
65
- case "custom":
66
- if (rule.validator) {
67
- const result = rule.validator(value);
68
- if (typeof result === "string") return result;
69
- if (!result) return rule.message || "Invalid value";
70
- }
71
- break;
72
- }
73
- }
74
- return null;
75
- }
76
- function validateFieldByName(fields, name, value) {
77
- const field = fields.find((f) => f.name === name);
78
- if (!field) return null;
79
- return validateField(value, field);
80
- }
81
- function validateForm(fields, values) {
82
- const errors = {};
83
- for (const field of fields) {
84
- const error = validateField(values[field.name], field);
85
- if (error) errors[field.name] = error;
86
- }
87
- return errors;
88
- }
89
- function getDefaultValues(fields) {
90
- return fields.reduce((acc, field) => {
91
- acc[field.name] = field.defaultValue !== void 0 ? field.defaultValue : field.type === "checkbox" ? [] : "";
92
- return acc;
93
- }, {});
94
- }
95
-
96
- export {
97
- normalizeFieldValue,
98
- validateField,
99
- validateFieldByName,
100
- validateForm,
101
- getDefaultValues
102
- };
@@ -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/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/api-extractor/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/api-extractor/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@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/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/api-extractor/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/api-extractor/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@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/../../../../node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/api-extractor/bin/api-extractor" "$@"
15
- else
16
- exec node "$basedir/../../../../node_modules/.pnpm/@microsoft+api-extractor@7.57.6_@types+node@20.19.35/node_modules/@microsoft/api-extractor/bin/api-extractor" "$@"
17
- fi
@@ -1,14 +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/esbuild@0.27.3/node_modules/esbuild/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/esbuild@0.27.3/node_modules/esbuild/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/esbuild@0.27.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/esbuild@0.27.3/node_modules/esbuild/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/esbuild@0.27.3/node_modules/esbuild/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/esbuild@0.27.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
12
- fi
13
- "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.3/node_modules/esbuild/bin/esbuild" "$@"
14
- exit $?
@@ -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/jiti@1.21.7/node_modules/jiti/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/jiti@1.21.7/node_modules/jiti/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/jiti@1.21.7/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/jiti@1.21.7/node_modules/jiti/bin/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/jiti@1.21.7/node_modules/jiti/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/jiti@1.21.7/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/jiti@1.21.7/node_modules/jiti/bin/jiti.js" "$@"
15
- else
16
- exec node "$basedir/../../../../node_modules/.pnpm/jiti@1.21.7/node_modules/jiti/bin/jiti.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/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/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_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/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_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/../tsup/dist/cli-default.js" "$@"
15
- else
16
- exec node "$basedir/../tsup/dist/cli-default.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/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_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/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_typescript@5.9.3/node_modules/tsup/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.57.6_@types+node@20.19.35__jiti@1.21.7_postcss@8.5.8_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/../tsup/dist/cli-node.js" "$@"
15
- else
16
- exec node "$basedir/../tsup/dist/cli-node.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 +0,0 @@
1
- {"version":"1.6.1","results":[[":test/formState.test.ts",{"duration":2,"failed":false}],[":test/utils.test.ts",{"duration":4,"failed":false}]]}
@@ -1,37 +0,0 @@
1
- {
2
- "name": "pdyform-core",
3
- "version": "1.0.0",
4
- "description": "Core logic and schema parser for pdyform.",
5
- "keywords": [
6
- "dynamic-form",
7
- "schema-form",
8
- "core",
9
- "json-schema"
10
- ],
11
- "type": "module",
12
- "main": "./dist/index.js",
13
- "module": "./dist/index.mjs",
14
- "types": "./dist/index.d.ts",
15
- "files": [
16
- "dist"
17
- ],
18
- "homepage": "https://github.com/LaoChen1994/pdyform",
19
- "repository": {
20
- "type": "git",
21
- "url": "https://github.com/LaoChen1994/pdyform"
22
- },
23
- "scripts": {
24
- "build": "tsup",
25
- "dev": "tsup --watch",
26
- "test": "vitest run",
27
- "lint": "eslint src/**/*.ts --no-error-on-unmatched-pattern"
28
- },
29
- "dependencies": {
30
- "pdyform": "workspace:*"
31
- },
32
- "devDependencies": {
33
- "tsup": "^8.0.0",
34
- "typescript": "^5.0.0",
35
- "vitest": "^1.0.0"
36
- }
37
- }
@@ -1,79 +0,0 @@
1
- import type { FormField } from './types';
2
- import { getDefaultValues, normalizeFieldValue, validateFieldByName, validateForm } from './utils';
3
-
4
- export interface FormRuntimeState {
5
- values: Record<string, any>;
6
- errors: Record<string, string>;
7
- isSubmitting: boolean;
8
- }
9
-
10
- export function createFormRuntimeState(fields: FormField[]): FormRuntimeState {
11
- return {
12
- values: getDefaultValues(fields),
13
- errors: {},
14
- isSubmitting: false,
15
- };
16
- }
17
-
18
- export function setSubmitting(state: FormRuntimeState, isSubmitting: boolean): FormRuntimeState {
19
- return {
20
- ...state,
21
- isSubmitting,
22
- };
23
- }
24
-
25
- export function applyFieldChange(
26
- fields: FormField[],
27
- state: FormRuntimeState,
28
- name: string,
29
- rawValue: unknown
30
- ): FormRuntimeState {
31
- const field = fields.find((f) => f.name === name);
32
- const normalizedValue = field ? normalizeFieldValue(field, rawValue) : rawValue;
33
-
34
- const values = {
35
- ...state.values,
36
- [name]: normalizedValue,
37
- };
38
-
39
- const error = validateFieldByName(fields, name, normalizedValue);
40
- const errors = {
41
- ...state.errors,
42
- [name]: error || '',
43
- };
44
-
45
- return {
46
- ...state,
47
- values,
48
- errors,
49
- };
50
- }
51
-
52
- export function applyFieldBlur(fields: FormField[], state: FormRuntimeState, name: string): FormRuntimeState {
53
- const error = validateFieldByName(fields, name, state.values[name]);
54
-
55
- return {
56
- ...state,
57
- errors: {
58
- ...state.errors,
59
- [name]: error || '',
60
- },
61
- };
62
- }
63
-
64
- export function runSubmitValidation(
65
- fields: FormField[],
66
- state: FormRuntimeState
67
- ): { state: FormRuntimeState; hasError: boolean } {
68
- const errors = validateForm(fields, state.values);
69
- const hasError = Object.keys(errors).length > 0;
70
-
71
- return {
72
- state: {
73
- ...state,
74
- errors,
75
- isSubmitting: false,
76
- },
77
- hasError,
78
- };
79
- }
@@ -1,3 +0,0 @@
1
- export type * from './types';
2
- export * from './utils';
3
- export * from './formState';
@@ -1,42 +0,0 @@
1
- export type FieldType = 'text' | 'number' | 'email' | 'password' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'date';
2
-
3
- export interface ValidationRule {
4
- type: 'required' | 'min' | 'max' | 'pattern' | 'email' | 'custom';
5
- value?: any;
6
- message?: string;
7
- validator?: (value: any) => boolean | string;
8
- }
9
-
10
- export interface Option {
11
- label: string;
12
- value: string | number;
13
- }
14
-
15
- export interface FormField {
16
- id: string;
17
- name: string;
18
- label: string;
19
- type: FieldType;
20
- placeholder?: string;
21
- description?: string;
22
- defaultValue?: any;
23
- options?: Option[]; // For select, radio, checkbox
24
- validations?: ValidationRule[];
25
- hidden?: boolean;
26
- disabled?: boolean;
27
- className?: string; // CSS class for custom styling
28
- }
29
-
30
- export interface FormSchema {
31
- title?: string;
32
- description?: string;
33
- fields: FormField[];
34
- submitButtonText?: string;
35
- }
36
-
37
- export interface FormState {
38
- values: Record<string, any>;
39
- errors: Record<string, string>;
40
- isSubmitting: boolean;
41
- isValid: boolean;
42
- }
@@ -1,104 +0,0 @@
1
- import type { FormField } from './types';
2
-
3
- function parseNumberish(value: unknown): number | null {
4
- if (typeof value === 'number') return Number.isNaN(value) ? null : value;
5
- if (typeof value !== 'string' || value.trim() === '') return null;
6
- const parsed = Number(value);
7
- return Number.isNaN(parsed) ? null : parsed;
8
- }
9
-
10
- export function normalizeFieldValue(field: FormField, value: unknown): unknown {
11
- if (field.type !== 'number') return value;
12
-
13
- if (value === '' || value === undefined || value === null) return '';
14
-
15
- const numericValue = parseNumberish(value);
16
- return numericValue === null ? value : numericValue;
17
- }
18
-
19
- export function validateField(value: any, field: FormField): string | null {
20
- if (!field.validations) return null;
21
-
22
- for (const rule of field.validations) {
23
- switch (rule.type) {
24
- case 'required':
25
- if (value === undefined || value === null || value === '' || (Array.isArray(value) && value.length === 0)) {
26
- return rule.message || `${field.label} is required`;
27
- }
28
- break;
29
- case 'min':
30
- if (field.type === 'number') {
31
- const numericValue = parseNumberish(value);
32
- if (numericValue !== null && numericValue < rule.value) {
33
- return rule.message || `${field.label} must be at least ${rule.value}`;
34
- }
35
- break;
36
- }
37
- if (typeof value === 'number' && value < rule.value) {
38
- return rule.message || `${field.label} must be at least ${rule.value}`;
39
- }
40
- if (typeof value === 'string' && value.length < rule.value) {
41
- return rule.message || `${field.label} must be at least ${rule.value} characters`;
42
- }
43
- break;
44
- case 'max':
45
- if (field.type === 'number') {
46
- const numericValue = parseNumberish(value);
47
- if (numericValue !== null && numericValue > rule.value) {
48
- return rule.message || `${field.label} must be at most ${rule.value}`;
49
- }
50
- break;
51
- }
52
- if (typeof value === 'number' && value > rule.value) {
53
- return rule.message || `${field.label} must be at most ${rule.value}`;
54
- }
55
- if (typeof value === 'string' && value.length > rule.value) {
56
- return rule.message || `${field.label} must be at most ${rule.value} characters`;
57
- }
58
- break;
59
- case 'email': {
60
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
61
- if (value && !emailRegex.test(value)) {
62
- return rule.message || 'Invalid email address';
63
- }
64
- break;
65
- }
66
- case 'pattern':
67
- if (value && rule.value && !new RegExp(rule.value).test(value)) {
68
- return rule.message || 'Invalid format';
69
- }
70
- break;
71
- case 'custom':
72
- if (rule.validator) {
73
- const result = rule.validator(value);
74
- if (typeof result === 'string') return result;
75
- if (!result) return rule.message || 'Invalid value';
76
- }
77
- break;
78
- }
79
- }
80
-
81
- return null;
82
- }
83
-
84
- export function validateFieldByName(fields: FormField[], name: string, value: unknown): string | null {
85
- const field = fields.find((f) => f.name === name);
86
- if (!field) return null;
87
- return validateField(value, field);
88
- }
89
-
90
- export function validateForm(fields: FormField[], values: Record<string, any>): Record<string, string> {
91
- const errors: Record<string, string> = {};
92
- for (const field of fields) {
93
- const error = validateField(values[field.name], field);
94
- if (error) errors[field.name] = error;
95
- }
96
- return errors;
97
- }
98
-
99
- export function getDefaultValues(fields: FormField[]): Record<string, any> {
100
- return fields.reduce((acc, field) => {
101
- acc[field.name] = field.defaultValue !== undefined ? field.defaultValue : (field.type === 'checkbox' ? [] : '');
102
- return acc;
103
- }, {} as Record<string, any>);
104
- }
@@ -1,71 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import {
3
- createFormRuntimeState,
4
- setSubmitting,
5
- applyFieldChange,
6
- applyFieldBlur,
7
- runSubmitValidation,
8
- } from '../src';
9
- import type { FormField } from '../src/types';
10
-
11
- const fields: FormField[] = [
12
- {
13
- id: 'age',
14
- name: 'age',
15
- label: 'Age',
16
- type: 'number',
17
- validations: [{ type: 'min', value: 18, message: 'Age must be at least 18' }],
18
- },
19
- {
20
- id: 'name',
21
- name: 'name',
22
- label: 'Name',
23
- type: 'text',
24
- validations: [{ type: 'required', message: 'Name is required' }],
25
- },
26
- ];
27
-
28
- describe('core formState helpers', () => {
29
- it('creates initial runtime state', () => {
30
- const state = createFormRuntimeState(fields);
31
- expect(state).toEqual({
32
- values: { age: '', name: '' },
33
- errors: {},
34
- isSubmitting: false,
35
- });
36
- });
37
-
38
- it('sets submitting state', () => {
39
- const state = createFormRuntimeState(fields);
40
- expect(setSubmitting(state, true).isSubmitting).toBe(true);
41
- });
42
-
43
- it('applies field change with normalization and inline validation', () => {
44
- const state = createFormRuntimeState(fields);
45
- const next = applyFieldChange(fields, state, 'age', '22');
46
-
47
- expect(next.values.age).toBe(22);
48
- expect(next.errors.age).toBe('');
49
- });
50
-
51
- it('applies blur validation', () => {
52
- const state = createFormRuntimeState(fields);
53
- const withInvalidName = applyFieldChange(fields, state, 'name', '');
54
- const onBlur = applyFieldBlur(fields, withInvalidName, 'name');
55
-
56
- expect(onBlur.errors.name).toBe('Name is required');
57
- });
58
-
59
- it('runs submit validation and returns hasError flag', () => {
60
- const state = createFormRuntimeState(fields);
61
- const dirty = applyFieldChange(fields, state, 'age', '16');
62
- const submitting = setSubmitting(dirty, true);
63
-
64
- const result = runSubmitValidation(fields, submitting);
65
-
66
- expect(result.hasError).toBe(true);
67
- expect(result.state.isSubmitting).toBe(false);
68
- expect(result.state.errors.age).toBe('Age must be at least 18');
69
- expect(result.state.errors.name).toBe('Name is required');
70
- });
71
- });