pdyform 1.1.0 → 1.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 (70) hide show
  1. package/package.json +4 -1
  2. package/packages/core/node_modules/.bin/jiti +17 -0
  3. package/packages/core/node_modules/.bin/tsup +2 -2
  4. package/packages/core/node_modules/.bin/tsup-node +2 -2
  5. package/packages/core/node_modules/.vite/vitest/results.json +1 -1
  6. package/packages/core/test/utils.test.ts +93 -0
  7. package/packages/react/dist/index.cjs +375 -111
  8. package/packages/react/dist/index.d.cts +80 -4
  9. package/packages/react/dist/index.d.ts +80 -4
  10. package/packages/react/dist/index.js +347 -111
  11. package/packages/react/node_modules/.bin/jiti +17 -0
  12. package/packages/react/node_modules/.bin/tsup +2 -2
  13. package/packages/react/node_modules/.bin/tsup-node +2 -2
  14. package/packages/react/node_modules/.vite/vitest/results.json +1 -1
  15. package/packages/react/package.json +7 -2
  16. package/packages/react/postcss.config.mjs +6 -0
  17. package/packages/react/src/FormFieldRenderer.tsx +32 -112
  18. package/packages/react/src/components/Checkbox.tsx +28 -0
  19. package/packages/react/src/components/CheckboxRenderer.tsx +37 -0
  20. package/packages/react/src/components/Input.tsx +24 -0
  21. package/packages/react/src/components/InputRenderer.tsx +18 -0
  22. package/packages/react/src/components/Label.tsx +24 -0
  23. package/packages/react/src/components/RadioGroup.tsx +42 -0
  24. package/packages/react/src/components/RadioRenderer.tsx +29 -0
  25. package/packages/react/src/components/Select.tsx +93 -0
  26. package/packages/react/src/components/SelectRenderer.tsx +27 -0
  27. package/packages/react/src/components/Textarea.tsx +23 -0
  28. package/packages/react/src/components/TextareaRenderer.tsx +17 -0
  29. package/packages/react/src/components/index.ts +55 -0
  30. package/packages/react/src/components/types.ts +17 -0
  31. package/packages/react/src/index.tsx +1 -0
  32. package/packages/react/src/utils.ts +7 -0
  33. package/packages/react/tailwind.config.mjs +10 -0
  34. package/packages/react/test/FormFieldRenderer.test.tsx +117 -0
  35. package/packages/vue/dist/index.d.ts +33 -0
  36. package/packages/vue/dist/index.js +28 -1
  37. package/packages/vue/dist/index.mjs +6792 -142
  38. package/packages/vue/node_modules/.bin/tsc +2 -2
  39. package/packages/vue/node_modules/.bin/tsserver +2 -2
  40. package/packages/vue/node_modules/.bin/vite +2 -2
  41. package/packages/vue/node_modules/.bin/vitest +2 -2
  42. package/packages/vue/node_modules/.bin/vue-tsc +2 -2
  43. package/packages/vue/node_modules/.vite/vitest/results.json +1 -1
  44. package/packages/vue/package.json +4 -2
  45. package/packages/vue/postcss.config.mjs +6 -0
  46. package/packages/vue/src/FormFieldRenderer.vue +46 -90
  47. package/packages/vue/src/components/Checkbox.vue +28 -0
  48. package/packages/vue/src/components/CheckboxRenderer.vue +35 -0
  49. package/packages/vue/src/components/Input.vue +21 -0
  50. package/packages/vue/src/components/InputRenderer.vue +19 -0
  51. package/packages/vue/src/components/Label.vue +21 -0
  52. package/packages/vue/src/components/RadioGroup.vue +30 -0
  53. package/packages/vue/src/components/RadioGroupItem.vue +26 -0
  54. package/packages/vue/src/components/RadioRenderer.vue +24 -0
  55. package/packages/vue/src/components/Select.vue +40 -0
  56. package/packages/vue/src/components/SelectContent.vue +38 -0
  57. package/packages/vue/src/components/SelectItem.vue +43 -0
  58. package/packages/vue/src/components/SelectRenderer.vue +30 -0
  59. package/packages/vue/src/components/SelectTrigger.vue +27 -0
  60. package/packages/vue/src/components/Textarea.vue +19 -0
  61. package/packages/vue/src/components/TextareaRenderer.vue +18 -0
  62. package/packages/vue/src/components/index.ts +24 -0
  63. package/packages/vue/src/fieldComponentMap.ts +34 -0
  64. package/packages/vue/src/index.ts +2 -0
  65. package/packages/vue/src/utils.ts +6 -0
  66. package/packages/vue/tailwind.config.mjs +10 -0
  67. package/packages/vue/test/FormFieldRenderer.test.ts +122 -0
  68. package/packages/core/src/index.test.ts +0 -37
  69. /package/packages/react/{src → test}/DynamicForm.test.tsx +0 -0
  70. /package/packages/vue/{src → test}/DynamicForm.test.ts +0 -0
package/package.json CHANGED
@@ -36,18 +36,21 @@
36
36
  "@eslint/js": "^9.39.3",
37
37
  "@typescript-eslint/eslint-plugin": "^8.56.1",
38
38
  "@typescript-eslint/parser": "^8.56.1",
39
+ "autoprefixer": "^10.4.27",
39
40
  "eslint": "^9.39.3",
40
41
  "eslint-config-prettier": "^10.1.8",
41
42
  "eslint-plugin-react": "^7.37.5",
42
43
  "eslint-plugin-vue": "^10.8.0",
43
44
  "globals": "^15.15.0",
45
+ "postcss": "^8.5.8",
44
46
  "prettier": "^3.8.1",
47
+ "tailwindcss": "^3.4.0",
45
48
  "turbo": "latest",
46
49
  "typescript": "^5.0.0",
47
50
  "typescript-eslint": "^8.56.1",
48
51
  "vitest": "^1.0.0"
49
52
  },
50
- "version": "1.1.0",
53
+ "version": "1.2.0",
51
54
  "scripts": {
52
55
  "build:all": "turbo run build",
53
56
  "dev:all": "turbo run dev",
@@ -0,0 +1,17 @@
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
@@ -6,9 +6,9 @@ case `uname` in
6
6
  esac
7
7
 
8
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__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__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__postcss@8.5.8_typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
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
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__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__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__postcss@8.5.8_typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
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
12
  fi
13
13
  if [ -x "$basedir/node" ]; then
14
14
  exec "$basedir/node" "$basedir/../tsup/dist/cli-default.js" "$@"
@@ -6,9 +6,9 @@ case `uname` in
6
6
  esac
7
7
 
8
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__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__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__postcss@8.5.8_typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules"
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
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__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__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__postcss@8.5.8_typescript@5.9.3/node_modules:/Users/pidan/Work/Learn/dynamic-form/node_modules/.pnpm/node_modules:$NODE_PATH"
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
12
  fi
13
13
  if [ -x "$basedir/node" ]; then
14
14
  exec "$basedir/node" "$basedir/../tsup/dist/cli-node.js" "$@"
@@ -1 +1 @@
1
- {"version":"1.6.1","results":[[":src/index.test.ts",{"duration":2,"failed":false}]]}
1
+ {"version":"1.6.1","results":[[":test/utils.test.ts",{"duration":2,"failed":false}]]}
@@ -0,0 +1,93 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateField, 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
+
45
+ describe('email', () => {
46
+ const field: FormField = { name: 'e', label: 'E', type: 'text', validations: [{ type: 'email' }] };
47
+
48
+ it('validates email format', () => {
49
+ expect(validateField('invalid', field)).toBe('Invalid email address');
50
+ expect(validateField('test@test.com', field)).toBeNull();
51
+ expect(validateField(undefined, field)).toBeNull(); // Empty check is for required
52
+ });
53
+ });
54
+
55
+ describe('pattern', () => {
56
+ const field: FormField = { name: 'p', label: 'P', type: 'text', validations: [{ type: 'pattern', value: '^[0-9]+$' }] };
57
+
58
+ it('validates regex', () => {
59
+ expect(validateField('abc', field)).toBe('Invalid format');
60
+ expect(validateField('123', field)).toBeNull();
61
+ });
62
+ });
63
+
64
+ describe('custom', () => {
65
+ const field: FormField = {
66
+ name: 'c', label: 'C', type: 'text',
67
+ validations: [{ type: 'custom', validator: (val) => val === 'magic' ? true : 'Not magic' }]
68
+ };
69
+
70
+ it('uses custom validator', () => {
71
+ expect(validateField('test', field)).toBe('Not magic');
72
+ expect(validateField('magic', field)).toBeNull();
73
+ });
74
+ });
75
+ });
76
+
77
+ describe('core utils - getDefaultValues', () => {
78
+ it('returns correctly mapped default values', () => {
79
+ const fields: FormField[] = [
80
+ { name: 't1', label: 'T1', type: 'text', defaultValue: 'default' },
81
+ { name: 't2', label: 'T2', type: 'text' },
82
+ { name: 'cb1', label: 'CB1', type: 'checkbox' },
83
+ { name: 'cb2', label: 'CB2', type: 'checkbox', defaultValue: ['opt1'] }
84
+ ] as any;
85
+
86
+ expect(getDefaultValues(fields)).toEqual({
87
+ t1: 'default',
88
+ t2: '',
89
+ cb1: [],
90
+ cb2: ['opt1']
91
+ });
92
+ });
93
+ });