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,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
- });
@@ -1,178 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { validateField, validateFieldByName, validateForm, normalizeFieldValue, getDefaultValues } from '../src';
3
- import { FormField } from '../src/types';
4
-
5
- describe('core utils - validateField', () => {
6
- it('returns null if there are no validations', () => {
7
- const field: FormField = { name: 'f1', label: 'Field 1', type: 'text' };
8
- expect(validateField('any value', field)).toBeNull();
9
- });
10
-
11
- describe('required', () => {
12
- const field: FormField = { name: 'f1', label: 'Field 1', type: 'text', validations: [{ type: 'required', message: 'req' }] };
13
-
14
- it('fails on undefined, null, empty string, or empty array', () => {
15
- expect(validateField(undefined, field)).toBe('req');
16
- expect(validateField(null, field)).toBe('req');
17
- expect(validateField('', field)).toBe('req');
18
- expect(validateField([], field)).toBe('req');
19
- });
20
-
21
- it('passes on valid values', () => {
22
- expect(validateField('test', field)).toBeNull();
23
- expect(validateField(0, field)).toBeNull();
24
- expect(validateField(['a'], field)).toBeNull();
25
- });
26
- });
27
-
28
- describe('min/max', () => {
29
- const fieldStr: FormField = { name: 'f1', label: 'F1', type: 'text', validations: [{ type: 'min', value: 3 }, { type: 'max', value: 5 }] };
30
- const fieldNum: FormField = { name: 'f2', label: 'F2', type: 'number', validations: [{ type: 'min', value: 10 }, { type: 'max', value: 20 }] };
31
-
32
- it('validates string length', () => {
33
- expect(validateField('ab', fieldStr)).toBe('F1 must be at least 3 characters');
34
- expect(validateField('abc', fieldStr)).toBeNull();
35
- expect(validateField('abcdef', fieldStr)).toBe('F1 must be at most 5 characters');
36
- });
37
-
38
- it('validates number value', () => {
39
- expect(validateField(9, fieldNum)).toBe('F2 must be at least 10');
40
- expect(validateField(10, fieldNum)).toBeNull();
41
- expect(validateField(21, fieldNum)).toBe('F2 must be at most 20');
42
- });
43
-
44
- it('treats numeric strings as numbers for number fields', () => {
45
- expect(validateField('9', fieldNum)).toBe('F2 must be at least 10');
46
- expect(validateField('10', fieldNum)).toBeNull();
47
- expect(validateField('22', fieldNum)).toBe('F2 must be at most 20');
48
- });
49
- });
50
-
51
- describe('email', () => {
52
- const field: FormField = { name: 'e', label: 'E', type: 'text', validations: [{ type: 'email' }] };
53
-
54
- it('validates email format', () => {
55
- expect(validateField('invalid', field)).toBe('Invalid email address');
56
- expect(validateField('test@test.com', field)).toBeNull();
57
- expect(validateField(undefined, field)).toBeNull(); // Empty check is for required
58
- });
59
- });
60
-
61
- describe('pattern', () => {
62
- const field: FormField = { name: 'p', label: 'P', type: 'text', validations: [{ type: 'pattern', value: '^[0-9]+$' }] };
63
-
64
- it('validates regex', () => {
65
- expect(validateField('abc', field)).toBe('Invalid format');
66
- expect(validateField('123', field)).toBeNull();
67
- });
68
- });
69
-
70
- describe('custom', () => {
71
- const field: FormField = {
72
- name: 'c', label: 'C', type: 'text',
73
- validations: [{ type: 'custom', validator: (val) => val === 'magic' ? true : 'Not magic' }]
74
- };
75
-
76
- it('uses custom validator', () => {
77
- expect(validateField('test', field)).toBe('Not magic');
78
- expect(validateField('magic', field)).toBeNull();
79
- });
80
- });
81
-
82
- describe('rule defaults and edge cases', () => {
83
- it('uses default required message when custom message is absent', () => {
84
- const field: FormField = {
85
- name: 'title',
86
- label: 'Title',
87
- type: 'text',
88
- validations: [{ type: 'required' }],
89
- };
90
- expect(validateField('', field)).toBe('Title is required');
91
- });
92
-
93
- it('uses default min/max messages', () => {
94
- const field: FormField = {
95
- name: 'score',
96
- label: 'Score',
97
- type: 'number',
98
- validations: [{ type: 'min', value: 10 }, { type: 'max', value: 20 }],
99
- };
100
- expect(validateField(9, field)).toBe('Score must be at least 10');
101
- expect(validateField(21, field)).toBe('Score must be at most 20');
102
- });
103
-
104
- it('supports custom pattern message', () => {
105
- const field: FormField = {
106
- name: 'phone',
107
- label: 'Phone',
108
- type: 'text',
109
- validations: [{ type: 'pattern', value: '^\\d{11}$', message: 'Phone must be 11 digits' }],
110
- };
111
- expect(validateField('123', field)).toBe('Phone must be 11 digits');
112
- });
113
-
114
- it('uses fallback custom message when custom validator returns false', () => {
115
- const field: FormField = {
116
- name: 'code',
117
- label: 'Code',
118
- type: 'text',
119
- validations: [{ type: 'custom', message: 'Code invalid', validator: () => false }],
120
- };
121
- expect(validateField('anything', field)).toBe('Code invalid');
122
- });
123
- });
124
- });
125
-
126
- describe('core utils - normalizeFieldValue', () => {
127
- const numberField: FormField = { name: 'age', label: 'Age', type: 'number' };
128
- const textField: FormField = { name: 'name', label: 'Name', type: 'text' };
129
-
130
- it('coerces number field values', () => {
131
- expect(normalizeFieldValue(numberField, '22')).toBe(22);
132
- expect(normalizeFieldValue(numberField, 22)).toBe(22);
133
- expect(normalizeFieldValue(numberField, '')).toBe('');
134
- });
135
-
136
- it('keeps non-number fields unchanged', () => {
137
- expect(normalizeFieldValue(textField, 'abc')).toBe('abc');
138
- });
139
- });
140
-
141
- describe('core utils - validate helpers', () => {
142
- const fields: FormField[] = [
143
- { name: 'username', label: 'Username', type: 'text', validations: [{ type: 'required', message: 'Required' }] },
144
- { name: 'age', label: 'Age', type: 'number', validations: [{ type: 'min', value: 18, message: 'Age >= 18' }] },
145
- ];
146
-
147
- it('validates a field by name', () => {
148
- expect(validateFieldByName(fields, 'username', '')).toBe('Required');
149
- expect(validateFieldByName(fields, 'username', 'ok')).toBeNull();
150
- expect(validateFieldByName(fields, 'missing', 'x')).toBeNull();
151
- });
152
-
153
- it('validates entire form and returns keyed errors', () => {
154
- expect(validateForm(fields, { username: '', age: 17 })).toEqual({
155
- username: 'Required',
156
- age: 'Age >= 18',
157
- });
158
- expect(validateForm(fields, { username: 'ok', age: 18 })).toEqual({});
159
- });
160
- });
161
-
162
- describe('core utils - getDefaultValues', () => {
163
- it('returns correctly mapped default values', () => {
164
- const fields: FormField[] = [
165
- { name: 't1', label: 'T1', type: 'text', defaultValue: 'default' },
166
- { name: 't2', label: 'T2', type: 'text' },
167
- { name: 'cb1', label: 'CB1', type: 'checkbox' },
168
- { name: 'cb2', label: 'CB2', type: 'checkbox', defaultValue: ['opt1'] }
169
- ] as any;
170
-
171
- expect(getDefaultValues(fields)).toEqual({
172
- t1: 'default',
173
- t2: '',
174
- cb1: [],
175
- cb2: ['opt1']
176
- });
177
- });
178
- });
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": false,
4
- "target": "ESNext",
5
- "module": "ESNext",
6
- "moduleResolution": "bundler",
7
- "outDir": "./dist",
8
- "rootDir": "./src",
9
- "strict": true,
10
- "esModuleInterop": true,
11
- "skipLibCheck": true
12
- },
13
- "include": ["src/**/*.ts"],
14
- "exclude": ["node_modules", "dist", "**/*.test.ts"]
15
- }
@@ -1,9 +0,0 @@
1
- import { defineConfig } from 'tsup';
2
-
3
- export default defineConfig({
4
- entry: ['src/index.ts', 'src/types.ts', 'src/utils.ts', 'src/formState.ts', 'src/parser.ts'],
5
- format: ['cjs', 'esm'],
6
- dts: true,
7
- clean: true,
8
- tsconfig: './tsconfig.json'
9
- });
@@ -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