@buildnbuzz/buzzform 0.1.2 → 0.1.4
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.
- package/dist/{adapter-nQW28cyO.d.mts → adapter-u4raoNx9.d.mts} +76 -42
- package/dist/{adapter-nQW28cyO.d.ts → adapter-u4raoNx9.d.ts} +76 -42
- package/dist/{chunk-63LF7K4O.mjs → chunk-4SHWTNBE.mjs} +3 -1
- package/dist/chunk-4SHWTNBE.mjs.map +1 -0
- package/dist/{chunk-HWDQN57Q.mjs → chunk-ATZ2HTUS.mjs} +60 -11
- package/dist/chunk-ATZ2HTUS.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +76 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -16
- package/dist/index.mjs.map +1 -1
- package/dist/rhf.d.mts +1 -1
- package/dist/rhf.d.ts +1 -1
- package/dist/schema.d.mts +5 -4
- package/dist/schema.d.ts +5 -4
- package/dist/schema.js +61 -9
- package/dist/schema.js.map +1 -1
- package/dist/schema.mjs +4 -2
- package/dist/{utils-DgwUn6tN.d.ts → utils-C1Y-xfSp.d.mts} +9 -2
- package/dist/{utils-BRY27BLX.d.mts → utils-D7pdJb3-.d.ts} +9 -2
- package/dist/zod.d.mts +1 -1
- package/dist/zod.d.ts +1 -1
- package/dist/zod.js.map +1 -1
- package/dist/zod.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-63LF7K4O.mjs.map +0 -1
- package/dist/chunk-HWDQN57Q.mjs.map +0 -1
|
@@ -33,7 +33,7 @@ type ValidationFn<TValue = unknown, TData = Record<string, unknown>> = (value: T
|
|
|
33
33
|
*/
|
|
34
34
|
interface ConditionContext {
|
|
35
35
|
/** Current operation */
|
|
36
|
-
operation:
|
|
36
|
+
operation: "create" | "update" | "read";
|
|
37
37
|
/** Path segments to this field */
|
|
38
38
|
path: string[];
|
|
39
39
|
}
|
|
@@ -172,7 +172,7 @@ interface BaseField<TValue = unknown, TData = Record<string, unknown>> {
|
|
|
172
172
|
* Text field
|
|
173
173
|
*/
|
|
174
174
|
interface TextField extends BaseField<string> {
|
|
175
|
-
type:
|
|
175
|
+
type: "text";
|
|
176
176
|
/** Minimum length */
|
|
177
177
|
minLength?: number;
|
|
178
178
|
/** Maximum length */
|
|
@@ -191,7 +191,7 @@ interface TextField extends BaseField<string> {
|
|
|
191
191
|
* Email field
|
|
192
192
|
*/
|
|
193
193
|
interface EmailField extends BaseField<string> {
|
|
194
|
-
type:
|
|
194
|
+
type: "email";
|
|
195
195
|
/** Minimum length */
|
|
196
196
|
minLength?: number;
|
|
197
197
|
/** Maximum length */
|
|
@@ -210,7 +210,7 @@ interface EmailField extends BaseField<string> {
|
|
|
210
210
|
* Password field
|
|
211
211
|
*/
|
|
212
212
|
interface PasswordField extends BaseField<string> {
|
|
213
|
-
type:
|
|
213
|
+
type: "password";
|
|
214
214
|
/** Minimum length (default: 8) */
|
|
215
215
|
minLength?: number;
|
|
216
216
|
/** Maximum length */
|
|
@@ -238,7 +238,7 @@ interface PasswordField extends BaseField<string> {
|
|
|
238
238
|
* Textarea field
|
|
239
239
|
*/
|
|
240
240
|
interface TextareaField extends BaseField<string> {
|
|
241
|
-
type:
|
|
241
|
+
type: "textarea";
|
|
242
242
|
/** Minimum length */
|
|
243
243
|
minLength?: number;
|
|
244
244
|
/** Maximum length */
|
|
@@ -257,7 +257,7 @@ interface TextareaField extends BaseField<string> {
|
|
|
257
257
|
* Number field
|
|
258
258
|
*/
|
|
259
259
|
interface NumberField extends BaseField<number> {
|
|
260
|
-
type:
|
|
260
|
+
type: "number";
|
|
261
261
|
/** Minimum value */
|
|
262
262
|
min?: number;
|
|
263
263
|
/** Maximum value */
|
|
@@ -269,7 +269,7 @@ interface NumberField extends BaseField<number> {
|
|
|
269
269
|
/** Step increment */
|
|
270
270
|
step?: number;
|
|
271
271
|
/** Visual variant */
|
|
272
|
-
variant?:
|
|
272
|
+
variant?: "default" | "stacked" | "pill" | "plain";
|
|
273
273
|
/** Prefix (e.g., "$") */
|
|
274
274
|
prefix?: string;
|
|
275
275
|
/** Suffix (e.g., "%", "kg") */
|
|
@@ -286,7 +286,7 @@ interface NumberField extends BaseField<number> {
|
|
|
286
286
|
* Date field
|
|
287
287
|
*/
|
|
288
288
|
interface DateField extends BaseField<Date> {
|
|
289
|
-
type:
|
|
289
|
+
type: "date";
|
|
290
290
|
/** Minimum date */
|
|
291
291
|
minDate?: Date | string;
|
|
292
292
|
/** Maximum date */
|
|
@@ -308,7 +308,7 @@ interface DateField extends BaseField<Date> {
|
|
|
308
308
|
* Datetime field
|
|
309
309
|
*/
|
|
310
310
|
interface DatetimeField extends BaseField<Date> {
|
|
311
|
-
type:
|
|
311
|
+
type: "datetime";
|
|
312
312
|
/** Minimum date */
|
|
313
313
|
minDate?: Date | string;
|
|
314
314
|
/** Maximum date */
|
|
@@ -353,7 +353,7 @@ interface SelectOption {
|
|
|
353
353
|
* Select field
|
|
354
354
|
*/
|
|
355
355
|
interface SelectField extends BaseField<string | string[] | number | number[] | boolean> {
|
|
356
|
-
type:
|
|
356
|
+
type: "select";
|
|
357
357
|
/** Options (static, string array, or async with context for dependent dropdowns) */
|
|
358
358
|
options: SelectOption[] | string[] | ((context: ValidationContext) => Promise<SelectOption[]>);
|
|
359
359
|
/**
|
|
@@ -364,6 +364,10 @@ interface SelectField extends BaseField<string | string[] | number | number[] |
|
|
|
364
364
|
dependencies?: string[];
|
|
365
365
|
/** Allow multiple selections */
|
|
366
366
|
hasMany?: boolean;
|
|
367
|
+
/** Minimum number of selections (when hasMany is true) */
|
|
368
|
+
minSelected?: number;
|
|
369
|
+
/** Maximum number of selections (when hasMany is true) */
|
|
370
|
+
maxSelected?: number;
|
|
367
371
|
/** UI options */
|
|
368
372
|
ui?: {
|
|
369
373
|
/** Enable search */
|
|
@@ -378,17 +382,47 @@ interface SelectField extends BaseField<string | string[] | number | number[] |
|
|
|
378
382
|
loadingMessage?: string;
|
|
379
383
|
};
|
|
380
384
|
}
|
|
385
|
+
/**
|
|
386
|
+
* Checkbox group field - multiple selections from a list of options
|
|
387
|
+
*/
|
|
388
|
+
interface CheckboxGroupField extends BaseField<Array<string | number | boolean>> {
|
|
389
|
+
type: "checkbox-group";
|
|
390
|
+
/** Static array or async function for options */
|
|
391
|
+
options: SelectOption[] | string[] | ((context: ValidationContext) => Promise<SelectOption[]>);
|
|
392
|
+
/** Paths that trigger options refetch when changed */
|
|
393
|
+
dependencies?: string[];
|
|
394
|
+
/** Minimum number of selections */
|
|
395
|
+
minSelected?: number;
|
|
396
|
+
/** Maximum number of selections */
|
|
397
|
+
maxSelected?: number;
|
|
398
|
+
/** UI options */
|
|
399
|
+
ui?: {
|
|
400
|
+
/** Layout direction */
|
|
401
|
+
direction?: "vertical" | "horizontal";
|
|
402
|
+
/** Grid columns (responsive, 1 on mobile) */
|
|
403
|
+
columns?: 1 | 2 | 3 | 4;
|
|
404
|
+
/** Visual variant */
|
|
405
|
+
variant?: "default" | "card";
|
|
406
|
+
/** Card settings (for variant: 'card') */
|
|
407
|
+
card?: {
|
|
408
|
+
/** Size preset ('sm', 'md', 'lg') */
|
|
409
|
+
size?: "sm" | "md" | "lg";
|
|
410
|
+
/** Show border around cards */
|
|
411
|
+
bordered?: boolean;
|
|
412
|
+
};
|
|
413
|
+
};
|
|
414
|
+
}
|
|
381
415
|
/**
|
|
382
416
|
* Checkbox field
|
|
383
417
|
*/
|
|
384
418
|
interface CheckboxField extends BaseField<boolean> {
|
|
385
|
-
type:
|
|
419
|
+
type: "checkbox";
|
|
386
420
|
}
|
|
387
421
|
/**
|
|
388
422
|
* Switch field
|
|
389
423
|
*/
|
|
390
424
|
interface SwitchField extends BaseField<boolean> {
|
|
391
|
-
type:
|
|
425
|
+
type: "switch";
|
|
392
426
|
/** UI options */
|
|
393
427
|
ui?: {
|
|
394
428
|
/**
|
|
@@ -397,29 +431,29 @@ interface SwitchField extends BaseField<boolean> {
|
|
|
397
431
|
* - 'start': Switch on left, label on right
|
|
398
432
|
* - 'end': Label on left, switch on right
|
|
399
433
|
*/
|
|
400
|
-
alignment?:
|
|
434
|
+
alignment?: "start" | "end" | "between";
|
|
401
435
|
};
|
|
402
436
|
}
|
|
403
437
|
/**
|
|
404
438
|
* Radio field - single selection from a group of options
|
|
405
439
|
*/
|
|
406
440
|
interface RadioField extends BaseField<string | number | boolean> {
|
|
407
|
-
type:
|
|
441
|
+
type: "radio";
|
|
408
442
|
/** Static array or async function for options */
|
|
409
443
|
options: SelectOption[] | string[] | ((context: ValidationContext) => Promise<SelectOption[]>);
|
|
410
444
|
/** Paths that trigger options refetch when changed */
|
|
411
445
|
dependencies?: string[];
|
|
412
446
|
ui?: {
|
|
413
447
|
/** Visual variant ('default' or 'card') */
|
|
414
|
-
variant?:
|
|
448
|
+
variant?: "default" | "card";
|
|
415
449
|
/** Layout direction for 'default' variant */
|
|
416
|
-
direction?:
|
|
450
|
+
direction?: "vertical" | "horizontal";
|
|
417
451
|
/** Grid columns (responsive, 1 on mobile) */
|
|
418
452
|
columns?: 1 | 2 | 3 | 4;
|
|
419
453
|
/** Card settings (for variant: 'card') */
|
|
420
454
|
card?: {
|
|
421
455
|
/** Size preset ('sm', 'md', 'lg') */
|
|
422
|
-
size?:
|
|
456
|
+
size?: "sm" | "md" | "lg";
|
|
423
457
|
/** Show border around cards */
|
|
424
458
|
bordered?: boolean;
|
|
425
459
|
};
|
|
@@ -429,7 +463,7 @@ interface RadioField extends BaseField<string | number | boolean> {
|
|
|
429
463
|
* Tags field - chip-based multi-value string input
|
|
430
464
|
*/
|
|
431
465
|
interface TagsField extends BaseField<string[]> {
|
|
432
|
-
type:
|
|
466
|
+
type: "tags";
|
|
433
467
|
/** Minimum number of tags */
|
|
434
468
|
minTags?: number;
|
|
435
469
|
/** Maximum number of tags */
|
|
@@ -441,9 +475,9 @@ interface TagsField extends BaseField<string[]> {
|
|
|
441
475
|
/** UI options */
|
|
442
476
|
ui?: {
|
|
443
477
|
/** Keys that create a new tag (default: ['enter']) */
|
|
444
|
-
delimiters?: (
|
|
478
|
+
delimiters?: ("enter" | "comma" | "space" | "tab")[];
|
|
445
479
|
/** Visual variant */
|
|
446
|
-
variant?:
|
|
480
|
+
variant?: "chips" | "pills" | "inline";
|
|
447
481
|
/** Show copy button to copy all tags */
|
|
448
482
|
copyable?: boolean;
|
|
449
483
|
};
|
|
@@ -452,7 +486,7 @@ interface TagsField extends BaseField<string[]> {
|
|
|
452
486
|
* Upload field
|
|
453
487
|
*/
|
|
454
488
|
interface UploadField extends BaseField<File | File[] | string | string[]> {
|
|
455
|
-
type:
|
|
489
|
+
type: "upload";
|
|
456
490
|
/** Allow multiple files */
|
|
457
491
|
hasMany?: boolean;
|
|
458
492
|
/** Minimum files (when hasMany) */
|
|
@@ -466,11 +500,11 @@ interface UploadField extends BaseField<File | File[] | string | string[]> {
|
|
|
466
500
|
/** MIME type filter */
|
|
467
501
|
accept?: string;
|
|
468
502
|
/** Visual variant */
|
|
469
|
-
variant?:
|
|
503
|
+
variant?: "dropzone" | "avatar" | "inline" | "gallery";
|
|
470
504
|
/** Shape (for avatar) */
|
|
471
|
-
shape?:
|
|
505
|
+
shape?: "circle" | "square" | "rounded";
|
|
472
506
|
/** Size preset */
|
|
473
|
-
size?:
|
|
507
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
474
508
|
/** Enable cropping */
|
|
475
509
|
crop?: boolean | {
|
|
476
510
|
aspectRatio?: number;
|
|
@@ -486,15 +520,15 @@ interface UploadField extends BaseField<File | File[] | string | string[]> {
|
|
|
486
520
|
* Group field - wraps fields in a named object
|
|
487
521
|
*/
|
|
488
522
|
interface GroupField extends BaseField<Record<string, unknown>> {
|
|
489
|
-
type:
|
|
523
|
+
type: "group";
|
|
490
524
|
/** Nested fields */
|
|
491
525
|
fields: Field[];
|
|
492
526
|
/** UI options */
|
|
493
527
|
ui?: {
|
|
494
528
|
/** Visual variant ('card', 'flat', 'ghost', 'bordered') */
|
|
495
|
-
variant?:
|
|
529
|
+
variant?: "card" | "flat" | "ghost" | "bordered";
|
|
496
530
|
/** Spacing between fields ('sm', 'md', 'lg') */
|
|
497
|
-
spacing?:
|
|
531
|
+
spacing?: "sm" | "md" | "lg";
|
|
498
532
|
/** Start in collapsed state */
|
|
499
533
|
collapsed?: boolean;
|
|
500
534
|
/** Show error badge */
|
|
@@ -505,7 +539,7 @@ interface GroupField extends BaseField<Record<string, unknown>> {
|
|
|
505
539
|
* Array field - repeatable fields
|
|
506
540
|
*/
|
|
507
541
|
interface ArrayField extends BaseField<unknown[]> {
|
|
508
|
-
type:
|
|
542
|
+
type: "array";
|
|
509
543
|
/** Fields for each array item */
|
|
510
544
|
fields: Field[];
|
|
511
545
|
/** Minimum items */
|
|
@@ -536,7 +570,7 @@ interface ArrayField extends BaseField<unknown[]> {
|
|
|
536
570
|
* Row field - horizontal layout container
|
|
537
571
|
*/
|
|
538
572
|
interface RowField {
|
|
539
|
-
type:
|
|
573
|
+
type: "row";
|
|
540
574
|
/** Fields to display in a row */
|
|
541
575
|
fields: Field[];
|
|
542
576
|
/** Layout options */
|
|
@@ -544,13 +578,13 @@ interface RowField {
|
|
|
544
578
|
/** Gap between fields (e.g., 4, '1rem', '16px') */
|
|
545
579
|
gap?: number | string;
|
|
546
580
|
/** Vertical alignment */
|
|
547
|
-
align?:
|
|
581
|
+
align?: "start" | "center" | "end" | "stretch";
|
|
548
582
|
/** Horizontal distribution */
|
|
549
|
-
justify?:
|
|
583
|
+
justify?: "start" | "center" | "end" | "between";
|
|
550
584
|
/** Allow wrapping to next line */
|
|
551
585
|
wrap?: boolean;
|
|
552
586
|
/** Responsive behavior: 'stack' collapses to vertical on mobile */
|
|
553
|
-
responsive?: boolean |
|
|
587
|
+
responsive?: boolean | "stack";
|
|
554
588
|
};
|
|
555
589
|
}
|
|
556
590
|
/**
|
|
@@ -574,7 +608,7 @@ interface Tab {
|
|
|
574
608
|
* Tabs field - tabbed container
|
|
575
609
|
*/
|
|
576
610
|
interface TabsField {
|
|
577
|
-
type:
|
|
611
|
+
type: "tabs";
|
|
578
612
|
/** Tab definitions */
|
|
579
613
|
tabs: Tab[];
|
|
580
614
|
/** UI options */
|
|
@@ -584,16 +618,16 @@ interface TabsField {
|
|
|
584
618
|
/** Show error badge on tabs with validation errors */
|
|
585
619
|
showErrorBadge?: boolean;
|
|
586
620
|
/** Visual variant */
|
|
587
|
-
variant?:
|
|
621
|
+
variant?: "default" | "line";
|
|
588
622
|
/** Spacing between fields within tabs */
|
|
589
|
-
spacing?:
|
|
623
|
+
spacing?: "sm" | "md" | "lg";
|
|
590
624
|
};
|
|
591
625
|
}
|
|
592
626
|
/**
|
|
593
627
|
* Collapsible field - expandable container
|
|
594
628
|
*/
|
|
595
629
|
interface CollapsibleField {
|
|
596
|
-
type:
|
|
630
|
+
type: "collapsible";
|
|
597
631
|
/** Container label */
|
|
598
632
|
label: string;
|
|
599
633
|
/** Nested fields */
|
|
@@ -603,9 +637,9 @@ interface CollapsibleField {
|
|
|
603
637
|
/** UI options */
|
|
604
638
|
ui?: {
|
|
605
639
|
/** Visual variant ('card', 'flat', 'ghost', 'bordered') */
|
|
606
|
-
variant?:
|
|
640
|
+
variant?: "card" | "flat" | "ghost" | "bordered";
|
|
607
641
|
/** Spacing between fields ('sm', 'md', 'lg') */
|
|
608
|
-
spacing?:
|
|
642
|
+
spacing?: "sm" | "md" | "lg";
|
|
609
643
|
/** Show error badge */
|
|
610
644
|
showErrorBadge?: boolean;
|
|
611
645
|
/** Optional description */
|
|
@@ -619,15 +653,15 @@ interface CollapsibleField {
|
|
|
619
653
|
/**
|
|
620
654
|
* Union of all field types.
|
|
621
655
|
*/
|
|
622
|
-
type Field = TextField | EmailField | PasswordField | TextareaField | NumberField | DateField | DatetimeField | SelectField | CheckboxField | SwitchField | RadioField | TagsField | UploadField | GroupField | ArrayField | RowField | TabsField | CollapsibleField;
|
|
656
|
+
type Field = TextField | EmailField | PasswordField | TextareaField | NumberField | DateField | DatetimeField | SelectField | CheckboxGroupField | CheckboxField | SwitchField | RadioField | TagsField | UploadField | GroupField | ArrayField | RowField | TabsField | CollapsibleField;
|
|
623
657
|
/**
|
|
624
658
|
* Extract field type from a Field.
|
|
625
659
|
*/
|
|
626
|
-
type FieldType = Field[
|
|
660
|
+
type FieldType = Field["type"];
|
|
627
661
|
/**
|
|
628
662
|
* Data fields (fields that hold values).
|
|
629
663
|
*/
|
|
630
|
-
type DataField = TextField | EmailField | PasswordField | TextareaField | NumberField | DateField | DatetimeField | SelectField | CheckboxField | SwitchField | RadioField | TagsField | UploadField | GroupField | ArrayField;
|
|
664
|
+
type DataField = TextField | EmailField | PasswordField | TextareaField | NumberField | DateField | DatetimeField | SelectField | CheckboxGroupField | CheckboxField | SwitchField | RadioField | TagsField | UploadField | GroupField | ArrayField;
|
|
631
665
|
/**
|
|
632
666
|
* Layout fields (fields that organize other fields).
|
|
633
667
|
*/
|
|
@@ -1139,4 +1173,4 @@ type AdapterFactory<TData = Record<string, unknown>> = (options: AdapterOptions<
|
|
|
1139
1173
|
*/
|
|
1140
1174
|
declare function validateAdapter(adapter: FormAdapter, adapterName?: string): void;
|
|
1141
1175
|
|
|
1142
|
-
export { type ArrayHelpers as A, type BaseField as B, type ConditionContext as C, type DateField as D, type EmailField as E, type Field as F, type GroupField as G, type
|
|
1176
|
+
export { type ArrayHelpers as A, type BaseField as B, type ConditionContext as C, type DateField as D, type EmailField as E, type Field as F, type GroupField as G, type RowField as H, type Tab as I, type TabsField as J, type CollapsibleField as K, type FieldType as L, type DataField as M, type NumberField as N, type LayoutField as O, type PasswordField as P, type BuzzFormSchema as Q, type ResolverResult as R, type SetValueOptions as S, type TextField as T, type UseFormOptions as U, type ValidationContext as V, type FormSettings as W, type FormConfig as a, type FormAdapter as b, type FormState as c, type FieldError as d, type Resolver as e, type AdapterOptions as f, type AdapterFactory as g, type ValidationResult as h, type ValidationFn as i, type FieldCondition as j, type FieldComponentProps as k, type FieldInputProps as l, type FieldInputRenderFn as m, type FieldStyle as n, type TextareaField as o, type DatetimeField as p, type SelectOption as q, type SelectField as r, type CheckboxGroupField as s, type CheckboxField as t, type SwitchField as u, validateAdapter as v, type RadioField as w, type TagsField as x, type UploadField as y, type ArrayField as z };
|
|
@@ -97,6 +97,8 @@ function makeOptional(schema, fieldType) {
|
|
|
97
97
|
case "checkbox":
|
|
98
98
|
case "switch":
|
|
99
99
|
return schema;
|
|
100
|
+
case "checkbox-group":
|
|
101
|
+
return schema.optional().default([]);
|
|
100
102
|
case "tags":
|
|
101
103
|
case "array":
|
|
102
104
|
return schema.optional().default([]);
|
|
@@ -168,4 +170,4 @@ export {
|
|
|
168
170
|
isFileLike,
|
|
169
171
|
isFileTypeAccepted
|
|
170
172
|
};
|
|
171
|
-
//# sourceMappingURL=chunk-
|
|
173
|
+
//# sourceMappingURL=chunk-4SHWTNBE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema/helpers.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n Field,\n FieldType,\n ValidationContext,\n ValidationFn,\n} from \"../types\";\n\n// =============================================================================\n// VALIDATION CONFIG EXTRACTION\n// =============================================================================\n\ntype ExtractableValidationFn = (\n value: unknown,\n context: ValidationContext,\n) => true | string | Promise<true | string>;\n\nexport interface ExtractedValidationConfig {\n fn?: ExtractableValidationFn;\n isLive: boolean;\n debounceMs?: number;\n}\n\nexport function extractValidationConfig(\n validate?: unknown,\n): ExtractedValidationConfig {\n if (!validate) {\n return { fn: undefined, isLive: false };\n }\n\n if (typeof validate === \"function\") {\n return { fn: validate as ExtractableValidationFn, isLive: false };\n }\n\n if (typeof validate === \"object\" && \"fn\" in validate) {\n const obj = validate as {\n fn?: unknown;\n live?: boolean | { debounceMs?: number };\n };\n const fn =\n typeof obj.fn === \"function\"\n ? (obj.fn as ExtractableValidationFn)\n : undefined;\n\n if (!obj.live) {\n return { fn, isLive: false };\n }\n\n const debounceMs =\n typeof obj.live === \"object\" ? obj.live.debounceMs : undefined;\n return { fn, isLive: true, debounceMs };\n }\n\n return { fn: undefined, isLive: false };\n}\n\n// =============================================================================\n// FIELD VALIDATOR COLLECTION\n// =============================================================================\n\nexport interface FieldValidator {\n path: string;\n fn: ValidationFn;\n}\n\n/**\n * Recursively collects all field validators from a field array.\n */\nexport function collectFieldValidators(\n fields: readonly Field[],\n basePath: string = \"\",\n): FieldValidator[] {\n const validators: FieldValidator[] = [];\n\n for (const field of fields) {\n if (\"name\" in field && field.name) {\n const fieldPath = basePath ? `${basePath}.${field.name}` : field.name;\n\n if (\"validate\" in field && field.validate) {\n const config = extractValidationConfig(field.validate);\n if (config.fn) {\n validators.push({\n path: fieldPath,\n fn: config.fn as ValidationFn,\n });\n }\n }\n\n if (field.type === \"group\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, fieldPath));\n }\n }\n\n // Layout fields pass through without adding to path\n if (field.type === \"row\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, basePath));\n }\n if (field.type === \"collapsible\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, basePath));\n }\n if (field.type === \"tabs\" && \"tabs\" in field) {\n for (const tab of field.tabs) {\n const tabPath = tab.name\n ? basePath\n ? `${basePath}.${tab.name}`\n : tab.name\n : basePath;\n validators.push(...collectFieldValidators(tab.fields, tabPath));\n }\n }\n }\n\n return validators;\n}\n\n// =============================================================================\n// SIBLING DATA EXTRACTION\n// =============================================================================\n\n/**\n * Gets the parent object containing the field at the given path.\n */\nexport function getSiblingData(\n data: Record<string, unknown>,\n path: string,\n): Record<string, unknown> {\n const parts = path.split(\".\");\n\n if (parts.length <= 1) {\n return data;\n }\n\n const parentParts = parts.slice(0, -1);\n let current: unknown = data;\n\n for (const part of parentParts) {\n if (current && typeof current === \"object\" && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return {};\n }\n }\n\n if (current && typeof current === \"object\" && current !== null) {\n return current as Record<string, unknown>;\n }\n\n return {};\n}\n\n/**\n * Gets a value at a dot-notation path.\n */\nexport function getValueByPath(\n data: Record<string, unknown>,\n path: string,\n): unknown {\n const parts = path.split(\".\");\n let current: unknown = data;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Creates a superRefine that runs all field validators with full form context.\n */\nexport function createRootValidationRefinement(\n validators: FieldValidator[],\n): (data: Record<string, unknown>, ctx: z.RefinementCtx) => Promise<void> {\n return async (data, ctx) => {\n const validationPromises = validators.map(async ({ path, fn }) => {\n const value = getValueByPath(data, path);\n const siblingData = getSiblingData(data, path);\n\n try {\n const result = await fn(value, {\n data,\n siblingData,\n path: path.split(\".\"),\n });\n\n if (result !== true) {\n ctx.addIssue({\n code: \"custom\",\n path: path.split(\".\"),\n message: typeof result === \"string\" ? result : \"Validation failed\",\n });\n }\n } catch (error) {\n ctx.addIssue({\n code: \"custom\",\n path: path.split(\".\"),\n message: error instanceof Error ? error.message : \"Validation error\",\n });\n }\n });\n\n await Promise.all(validationPromises);\n };\n}\n\n// =============================================================================\n// OPTIONAL HANDLING\n// =============================================================================\n\nexport function makeOptional(\n schema: z.ZodTypeAny,\n fieldType: FieldType,\n): z.ZodTypeAny {\n switch (fieldType) {\n case \"text\":\n case \"textarea\":\n case \"email\":\n case \"password\":\n return schema.optional().or(z.literal(\"\"));\n\n case \"number\":\n case \"date\":\n case \"select\":\n case \"radio\":\n return schema.optional().nullable();\n\n case \"checkbox\":\n case \"switch\":\n return schema;\n\n case \"checkbox-group\":\n return schema.optional().default([]);\n\n case \"tags\":\n case \"array\":\n return schema.optional().default([]);\n\n case \"upload\":\n return schema.optional().nullable();\n\n default:\n return schema.optional();\n }\n}\n\n// =============================================================================\n// COERCION HELPERS\n// =============================================================================\n\nexport function coerceToNumber(val: unknown): number | undefined {\n if (val === \"\" || val === null || val === undefined) {\n return undefined;\n }\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n}\n\nexport function coerceToDate(val: unknown): Date | undefined {\n if (val === \"\" || val === null || val === undefined) {\n return undefined;\n }\n if (val instanceof Date) {\n return isNaN(val.getTime()) ? undefined : val;\n }\n if (typeof val === \"string\" || typeof val === \"number\") {\n const d = new Date(val);\n return isNaN(d.getTime()) ? undefined : d;\n }\n return undefined;\n}\n\n// =============================================================================\n// PATTERN VALIDATION\n// =============================================================================\n\nconst PATTERN_MESSAGES: Record<string, string> = {\n \"^[a-zA-Z0-9_]+$\": \"Only letters, numbers, and underscores allowed\",\n \"^[a-z0-9-]+$\": \"Only lowercase letters, numbers, and hyphens allowed\",\n \"^\\\\S+@\\\\S+\\\\.\\\\S+$\": \"Invalid email format\",\n \"^https?://\": \"Must start with http:// or https://\",\n};\n\nexport function getPatternErrorMessage(pattern: string | RegExp): string {\n const patternStr = typeof pattern === \"string\" ? pattern : pattern.source;\n return PATTERN_MESSAGES[patternStr] || `Must match pattern: ${patternStr}`;\n}\n\n// =============================================================================\n// FILE VALIDATION HELPERS\n// =============================================================================\n\nexport function isFileLike(value: unknown): value is File {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"size\" in value &&\n \"type\" in value\n );\n}\n\nexport function isFileTypeAccepted(file: File, accept: string): boolean {\n if (accept === \"*\" || !accept) return true;\n\n const acceptTypes = accept.split(\",\").map((t) => t.trim().toLowerCase());\n const fileType = file.type.toLowerCase();\n const fileName = file.name.toLowerCase();\n\n return acceptTypes.some((acceptType) => {\n if (acceptType.endsWith(\"/*\")) {\n const category = acceptType.replace(\"/*\", \"\");\n return fileType.startsWith(category + \"/\");\n }\n if (acceptType.startsWith(\".\")) {\n return fileName.endsWith(acceptType);\n }\n return fileType === acceptType;\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
coerceToNumber,
|
|
4
4
|
getPatternErrorMessage,
|
|
5
5
|
makeOptional
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-4SHWTNBE.mjs";
|
|
7
7
|
|
|
8
8
|
// src/schema/fields-to-schema.ts
|
|
9
9
|
import { z as z9 } from "zod";
|
|
@@ -137,17 +137,51 @@ function createDateFieldSchema(field) {
|
|
|
137
137
|
|
|
138
138
|
// src/schema/builders/select.ts
|
|
139
139
|
import { z as z4 } from "zod";
|
|
140
|
-
var selectValueSchema = z4.union(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
var selectValueSchema = z4.union(
|
|
141
|
+
[
|
|
142
|
+
z4.string({ error: "Please select an option" }),
|
|
143
|
+
z4.number({ error: "Please select an option" }),
|
|
144
|
+
z4.boolean({ error: "Please select an option" })
|
|
145
|
+
],
|
|
146
|
+
{ error: "Please select an option" }
|
|
147
|
+
);
|
|
148
|
+
function applyMultiSelectConstraints(schema, config) {
|
|
149
|
+
const { minSelected, maxSelected, required } = config;
|
|
150
|
+
let next = schema;
|
|
151
|
+
if (minSelected !== void 0 && minSelected > 0) {
|
|
152
|
+
const minMsg = `Select at least ${minSelected} option${minSelected !== 1 ? "s" : ""}`;
|
|
153
|
+
if (required) {
|
|
154
|
+
next = next.min(minSelected, minMsg);
|
|
155
|
+
} else {
|
|
156
|
+
next = next.refine(
|
|
157
|
+
(val) => val.length === 0 || val.length >= minSelected,
|
|
158
|
+
{
|
|
159
|
+
message: minMsg
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (required && (minSelected === void 0 || minSelected === 0)) {
|
|
165
|
+
next = next.min(1, "Select at least one option");
|
|
166
|
+
}
|
|
167
|
+
if (maxSelected !== void 0) {
|
|
168
|
+
next = next.max(
|
|
169
|
+
maxSelected,
|
|
170
|
+
`Select at most ${maxSelected} option${maxSelected !== 1 ? "s" : ""}`
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
return next;
|
|
174
|
+
}
|
|
145
175
|
function createSelectFieldSchema(field) {
|
|
146
176
|
if (field.hasMany) {
|
|
147
|
-
let arraySchema = z4.array(selectValueSchema, {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
177
|
+
let arraySchema = z4.array(selectValueSchema, {
|
|
178
|
+
error: "Invalid selection"
|
|
179
|
+
});
|
|
180
|
+
arraySchema = applyMultiSelectConstraints(arraySchema, {
|
|
181
|
+
minSelected: field.minSelected,
|
|
182
|
+
maxSelected: field.maxSelected,
|
|
183
|
+
required: field.required
|
|
184
|
+
});
|
|
151
185
|
if (!field.required) {
|
|
152
186
|
return arraySchema.optional().default([]);
|
|
153
187
|
}
|
|
@@ -178,6 +212,18 @@ function createRadioFieldSchema(field) {
|
|
|
178
212
|
}
|
|
179
213
|
return schema;
|
|
180
214
|
}
|
|
215
|
+
function createCheckboxGroupFieldSchema(field) {
|
|
216
|
+
let schema = z4.array(selectValueSchema, { error: "Invalid selection" });
|
|
217
|
+
schema = applyMultiSelectConstraints(schema, {
|
|
218
|
+
minSelected: field.minSelected,
|
|
219
|
+
maxSelected: field.maxSelected,
|
|
220
|
+
required: field.required
|
|
221
|
+
});
|
|
222
|
+
if (!field.required) {
|
|
223
|
+
return makeOptional(schema, "checkbox-group");
|
|
224
|
+
}
|
|
225
|
+
return schema;
|
|
226
|
+
}
|
|
181
227
|
|
|
182
228
|
// src/schema/builders/boolean.ts
|
|
183
229
|
import { z as z5 } from "zod";
|
|
@@ -342,6 +388,8 @@ function fieldToZod(field) {
|
|
|
342
388
|
return createDateFieldSchema(field);
|
|
343
389
|
case "select":
|
|
344
390
|
return createSelectFieldSchema(field);
|
|
391
|
+
case "checkbox-group":
|
|
392
|
+
return createCheckboxGroupFieldSchema(field);
|
|
345
393
|
case "radio":
|
|
346
394
|
return createRadioFieldSchema(field);
|
|
347
395
|
case "checkbox":
|
|
@@ -411,6 +459,7 @@ export {
|
|
|
411
459
|
createDateFieldSchema,
|
|
412
460
|
createSelectFieldSchema,
|
|
413
461
|
createRadioFieldSchema,
|
|
462
|
+
createCheckboxGroupFieldSchema,
|
|
414
463
|
createCheckboxFieldSchema,
|
|
415
464
|
createSwitchFieldSchema,
|
|
416
465
|
createUploadFieldSchema,
|
|
@@ -420,4 +469,4 @@ export {
|
|
|
420
469
|
fieldsToZodSchema,
|
|
421
470
|
createSchema
|
|
422
471
|
};
|
|
423
|
-
//# sourceMappingURL=chunk-
|
|
472
|
+
//# sourceMappingURL=chunk-ATZ2HTUS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema/fields-to-schema.ts","../src/schema/builders/text.ts","../src/schema/builders/number.ts","../src/schema/builders/date.ts","../src/schema/builders/select.ts","../src/schema/builders/boolean.ts","../src/schema/builders/upload.ts","../src/schema/builders/tags.ts","../src/schema/builders/composite.ts","../src/schema/create-schema.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n Field,\n TabsField,\n TextField,\n EmailField,\n PasswordField,\n TextareaField,\n NumberField,\n DateField,\n DatetimeField,\n SelectField,\n CheckboxGroupField,\n RadioField,\n CheckboxField,\n SwitchField,\n UploadField,\n TagsField,\n ArrayField,\n GroupField,\n FieldsToShape,\n} from \"../types\";\nimport {\n createTextFieldSchema,\n createEmailFieldSchema,\n createPasswordFieldSchema,\n createNumberFieldSchema,\n createDateFieldSchema,\n createSelectFieldSchema,\n createCheckboxGroupFieldSchema,\n createRadioFieldSchema,\n createCheckboxFieldSchema,\n createSwitchFieldSchema,\n createUploadFieldSchema,\n createTagsFieldSchema,\n createArrayFieldSchema,\n createGroupFieldSchema,\n} from \"./builders\";\n\nfunction fieldToZod(field: Field): z.ZodTypeAny {\n if (\"schema\" in field && field.schema) {\n return field.schema as z.ZodTypeAny;\n }\n\n switch (field.type) {\n case \"text\":\n return createTextFieldSchema(field as TextField);\n case \"email\":\n return createEmailFieldSchema(field as EmailField);\n case \"password\":\n return createPasswordFieldSchema(field as PasswordField);\n case \"textarea\":\n return createTextFieldSchema(field as TextareaField);\n case \"number\":\n return createNumberFieldSchema(field as NumberField);\n case \"date\":\n case \"datetime\":\n return createDateFieldSchema(field as DateField | DatetimeField);\n case \"select\":\n return createSelectFieldSchema(field as SelectField);\n case \"checkbox-group\":\n return createCheckboxGroupFieldSchema(field as CheckboxGroupField);\n case \"radio\":\n return createRadioFieldSchema(field as RadioField);\n case \"checkbox\":\n return createCheckboxFieldSchema(field as CheckboxField);\n case \"switch\":\n return createSwitchFieldSchema(field as SwitchField);\n case \"upload\":\n return createUploadFieldSchema(field as UploadField);\n case \"tags\":\n return createTagsFieldSchema(field as TagsField);\n case \"array\":\n return createArrayFieldSchema(field as ArrayField, fieldsToZodSchema);\n case \"group\":\n return createGroupFieldSchema(field as GroupField, fieldsToZodSchema);\n case \"row\":\n case \"collapsible\":\n case \"tabs\":\n return z.any();\n default:\n return z.any();\n }\n}\n\nfunction processTabsField(field: TabsField): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const tab of field.tabs) {\n if (tab.name) {\n const tabSchema = fieldsToZodSchema(tab.fields);\n shape[tab.name] = tabSchema;\n } else {\n const tabFieldsSchema = fieldsToZodSchema(tab.fields);\n if (tabFieldsSchema instanceof z.ZodObject) {\n Object.assign(shape, tabFieldsSchema.shape);\n }\n }\n }\n\n return shape;\n}\n\n/**\n * Converts field definitions to a Zod schema.\n *\n * Note: Custom validation (field.validate) is handled by the zodResolver,\n * not at the schema level. This ensures custom validators run even when\n * other fields have errors.\n */\nexport function fieldsToZodSchema<T extends readonly Field[]>(\n fields: T,\n): z.ZodObject<FieldsToShape<T>> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const field of fields) {\n if (\"name\" in field && field.name) {\n shape[field.name] = fieldToZod(field);\n } else if (field.type === \"tabs\") {\n const tabsShape = processTabsField(field);\n Object.assign(shape, tabsShape);\n } else if (field.type === \"row\" || field.type === \"collapsible\") {\n const nestedSchema = fieldsToZodSchema(field.fields);\n if (nestedSchema instanceof z.ZodObject) {\n Object.assign(shape, nestedSchema.shape);\n }\n }\n }\n\n return z.object(shape) as z.ZodObject<FieldsToShape<T>>;\n}\n","import { z } from 'zod';\nimport type { TextField, EmailField, TextareaField, PasswordField } from '../../types';\nimport { makeOptional, getPatternErrorMessage } from '../helpers';\n\nexport function createTextFieldSchema(field: TextField | TextareaField): z.ZodTypeAny {\n let schema = z.string({ error: 'This field is required' });\n\n if ('pattern' in field && field.pattern) {\n const pattern = typeof field.pattern === 'string'\n ? new RegExp(field.pattern)\n : field.pattern;\n\n schema = schema.regex(pattern, {\n error: getPatternErrorMessage(field.pattern),\n });\n }\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Must be no more than ${field.maxLength} characters`,\n });\n }\n\n if (field.required) {\n schema = schema.min(1, { error: 'This field is required' });\n }\n\n let finalSchema: z.ZodTypeAny = schema;\n if ('trim' in field && field.trim) {\n finalSchema = z.preprocess((val) => {\n return typeof val === 'string' ? val.trim() : val;\n }, schema);\n }\n\n if (!field.required) {\n return makeOptional(finalSchema, field.type);\n }\n\n return finalSchema;\n}\n\nexport function createEmailFieldSchema(field: EmailField): z.ZodTypeAny {\n // Zod v4: z.email() for email validation with custom error\n let schema = z.email({ error: 'Invalid email address' });\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Must be no more than ${field.maxLength} characters`,\n });\n }\n\n if (field.required) {\n schema = schema.min(1, { error: 'Email is required' });\n }\n\n if (!field.required) {\n return makeOptional(schema, 'email');\n }\n\n return schema;\n}\n\nexport function createPasswordFieldSchema(field: PasswordField): z.ZodTypeAny {\n // Zod v4: provide error message for invalid_type\n let schema = z.string({ error: 'Password is required' });\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Password must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Password must be no more than ${field.maxLength} characters`,\n });\n }\n if (field.required) {\n schema = schema.min(1, { error: 'Password is required' });\n }\n\n if (!field.required) {\n return makeOptional(schema, 'password');\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { NumberField } from '../../types';\nimport { coerceToNumber, makeOptional } from '../helpers';\n\n/**\n * Creates Zod schema for number fields.\n * Note: Custom validation (field.validate) is handled at root schema level.\n */\nexport function createNumberFieldSchema(field: NumberField): z.ZodTypeAny {\n let numSchema = z.number({ error: 'Must be a number' });\n\n // Min/max constraints\n if (field.min !== undefined) {\n numSchema = numSchema.min(field.min, `Must be at least ${field.min}`);\n }\n if (field.max !== undefined) {\n numSchema = numSchema.max(field.max, `Must be at most ${field.max}`);\n }\n\n // Coercion: empty/null/undefined → undefined, otherwise Number()\n const schema: z.ZodTypeAny = z.preprocess(coerceToNumber, numSchema);\n\n if (field.required) {\n return schema;\n }\n\n return makeOptional(schema, 'number');\n}\n","import { z } from 'zod';\nimport type { DateField, DatetimeField } from '../../types';\nimport { coerceToDate, makeOptional } from '../helpers';\n\n/**\n * Parse a value to a Date object for constraint checking.\n */\nfunction toDate(value?: string | Date): Date | undefined {\n if (!value) return undefined;\n if (value instanceof Date) return isNaN(value.getTime()) ? undefined : value;\n const parsed = new Date(value);\n return isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\n/**\n * Creates Zod schema for date and datetime fields.\n * Note: Custom validation (field.validate) is handled at root schema level.\n */\nexport function createDateFieldSchema(field: DateField | DatetimeField): z.ZodTypeAny {\n const isDatetime = field.type === 'datetime';\n\n // Parse min/max dates from field config\n const minDate = toDate(field.minDate);\n const maxDate = toDate(field.maxDate);\n\n // Build base date schema\n let dateSchema = z.date({ error: 'Please enter a valid date' });\n\n // Add min date constraint\n if (minDate) {\n const formattedDate = isDatetime ? minDate.toLocaleString() : minDate.toDateString();\n dateSchema = dateSchema.min(minDate, {\n error: `Date must be on or after ${formattedDate}`,\n });\n }\n\n // Add max date constraint\n if (maxDate) {\n const formattedDate = isDatetime ? maxDate.toLocaleString() : maxDate.toDateString();\n dateSchema = dateSchema.max(maxDate, {\n error: `Date must be on or before ${formattedDate}`,\n });\n }\n\n // Coercion from various input types\n const schema: z.ZodTypeAny = z.preprocess(coerceToDate, dateSchema);\n\n if (field.required) {\n return schema.refine(\n (val) => val instanceof Date && !isNaN(val.getTime()),\n 'Date is required'\n );\n }\n\n return makeOptional(schema, 'date');\n}\n","import { z } from \"zod\";\nimport type { SelectField, RadioField, CheckboxGroupField } from \"../../types\";\nimport { makeOptional } from \"../helpers\";\n\n// Base schema for select/radio values with user-friendly error messages\nconst selectValueSchema = z.union(\n [\n z.string({ error: \"Please select an option\" }),\n z.number({ error: \"Please select an option\" }),\n z.boolean({ error: \"Please select an option\" }),\n ],\n { error: \"Please select an option\" },\n);\n\ntype MultiSelectConfig = {\n minSelected?: number;\n maxSelected?: number;\n required?: boolean;\n};\n\nfunction applyMultiSelectConstraints(\n schema: z.ZodArray<typeof selectValueSchema>,\n config: MultiSelectConfig,\n): z.ZodArray<typeof selectValueSchema> {\n const { minSelected, maxSelected, required } = config;\n let next = schema;\n\n if (minSelected !== undefined && minSelected > 0) {\n const minMsg = `Select at least ${minSelected} option${minSelected !== 1 ? \"s\" : \"\"}`;\n if (required) {\n next = next.min(minSelected, minMsg);\n } else {\n // Optional multi-selects should allow no selection, but enforce min once user starts selecting.\n next = next.refine(\n (val) => val.length === 0 || val.length >= minSelected,\n {\n message: minMsg,\n },\n );\n }\n }\n\n if (required && (minSelected === undefined || minSelected === 0)) {\n next = next.min(1, \"Select at least one option\");\n }\n\n if (maxSelected !== undefined) {\n next = next.max(\n maxSelected,\n `Select at most ${maxSelected} option${maxSelected !== 1 ? \"s\" : \"\"}`,\n );\n }\n\n return next;\n}\n\nexport function createSelectFieldSchema(field: SelectField): z.ZodTypeAny {\n if (field.hasMany) {\n let arraySchema = z.array(selectValueSchema, {\n error: \"Invalid selection\",\n });\n arraySchema = applyMultiSelectConstraints(arraySchema, {\n minSelected: field.minSelected,\n maxSelected: field.maxSelected,\n required: field.required,\n });\n\n if (!field.required) {\n return arraySchema.optional().default([]);\n }\n return arraySchema;\n }\n\n let schema: z.ZodTypeAny = selectValueSchema;\n\n if (field.required) {\n schema = selectValueSchema.refine(\n (val) => val !== \"\" && val !== null && val !== undefined,\n \"Please select an option\",\n );\n }\n\n if (!field.required) {\n return makeOptional(schema, \"select\");\n }\n\n return schema;\n}\n\nexport function createRadioFieldSchema(field: RadioField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = selectValueSchema;\n\n if (field.required) {\n schema = selectValueSchema.refine(\n (val) => val !== \"\" && val !== null && val !== undefined,\n \"Please select an option\",\n );\n }\n\n if (!field.required) {\n return makeOptional(schema, \"radio\");\n }\n\n return schema;\n}\n\nexport function createCheckboxGroupFieldSchema(\n field: CheckboxGroupField,\n): z.ZodTypeAny {\n let schema = z.array(selectValueSchema, { error: \"Invalid selection\" });\n schema = applyMultiSelectConstraints(schema, {\n minSelected: field.minSelected,\n maxSelected: field.maxSelected,\n required: field.required,\n });\n\n if (!field.required) {\n return makeOptional(schema, \"checkbox-group\");\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { CheckboxField, SwitchField } from '../../types';\n\nexport function createCheckboxFieldSchema(field: CheckboxField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.boolean({ error: 'Invalid value' });\n\n if (field.required) {\n schema = z.boolean({ error: 'This field is required' }).refine(val => val === true, {\n error: 'This field is required',\n });\n }\n\n return schema;\n}\n\nexport function createSwitchFieldSchema(field: SwitchField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.boolean({ error: 'Invalid value' });\n\n if (field.required) {\n schema = z.boolean({ error: 'This field is required' }).refine(val => val === true, {\n error: 'This field is required',\n });\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { UploadField } from '../../types';\n\nfunction matchesMimePattern(fileType: string, pattern: string): boolean {\n const normalizedPattern = pattern.toLowerCase().trim();\n const normalizedType = fileType.toLowerCase();\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.replace('/*', '');\n return normalizedType.startsWith(category + '/');\n }\n\n if (normalizedPattern.startsWith('.')) {\n return true;\n }\n\n return normalizedType === normalizedPattern;\n}\n\nfunction isFileTypeAccepted(file: File, acceptPatterns: string[]): boolean {\n if (!file.type) return true;\n return acceptPatterns.some(pattern => matchesMimePattern(file.type, pattern));\n}\n\nexport function createUploadFieldSchema(field: UploadField): z.ZodTypeAny {\n let fileSchema: z.ZodTypeAny = z.file({ error: 'Please select a file' });\n\n if (field.maxSize) {\n const sizeMB = (field.maxSize / 1024 / 1024).toFixed(1);\n fileSchema = (fileSchema as z.ZodFile).max(field.maxSize, {\n error: `File must be smaller than ${sizeMB}MB`,\n });\n }\n\n const accept = field.ui?.accept;\n if (accept && accept !== '*') {\n const acceptPatterns = accept.split(',').map(t => t.trim());\n const hasWildcard = acceptPatterns.some(p => p.includes('*') || p.startsWith('.'));\n\n if (hasWildcard) {\n fileSchema = fileSchema.refine(\n (file) => isFileTypeAccepted(file as File, acceptPatterns),\n `File type not allowed. Accepted: ${accept}`\n );\n } else {\n fileSchema = (fileSchema as z.ZodFile).mime(acceptPatterns, {\n error: `File type not allowed. Accepted: ${accept}`,\n });\n }\n }\n\n const fileOrUrl = z.union([\n fileSchema,\n z.string({ error: 'Invalid file' }),\n ], { error: 'Please select a file' });\n\n if (field.hasMany) {\n let arraySchema = z.array(fileOrUrl, { error: 'Invalid files' });\n\n if (field.minFiles !== undefined && field.minFiles > 0) {\n arraySchema = arraySchema.min(field.minFiles, {\n error: `At least ${field.minFiles} file(s) required`,\n });\n }\n\n if (field.maxFiles !== undefined) {\n arraySchema = arraySchema.max(field.maxFiles, {\n error: `Maximum ${field.maxFiles} file(s) allowed`,\n });\n }\n\n if (field.required) {\n arraySchema = arraySchema.min(1, {\n error: 'At least one file is required',\n });\n return arraySchema;\n }\n\n return arraySchema.optional().default([]);\n }\n\n if (field.required) {\n return fileOrUrl;\n }\n\n return fileOrUrl.optional().nullable();\n}\n","import { z } from 'zod';\nimport type { TagsField } from '../../types';\n\nexport function createTagsFieldSchema(field: TagsField): z.ZodTypeAny {\n const tagSchema = z.string({ error: 'Invalid tag' });\n let schema = z.array(tagSchema, { error: 'Invalid tags' });\n\n if (field.minTags !== undefined) {\n schema = schema.min(field.minTags, `At least ${field.minTags} tag(s) required`);\n }\n if (field.maxTags !== undefined) {\n schema = schema.max(field.maxTags, `Maximum ${field.maxTags} tag(s) allowed`);\n }\n\n if (field.required) {\n return schema.refine(\n (arr) => Array.isArray(arr) && arr.length > 0,\n 'At least one tag is required'\n );\n }\n\n return schema.optional().default([]);\n}\n","import { z } from 'zod';\nimport type { ArrayField, GroupField, Field } from '../../types';\n\n// Note: These import from the parent module to avoid circular deps\n// The fieldsToZodSchema function is passed as a parameter\n\ntype SchemaGenerator = (fields: readonly Field[]) => z.ZodObject<z.ZodRawShape>;\n\n/**\n * Creates Zod schema for array fields.\n * Uses passed-in schema generator to handle nested fields.\n */\nexport function createArrayFieldSchema(\n field: ArrayField,\n fieldsToZodSchema: SchemaGenerator\n): z.ZodTypeAny {\n const itemSchema = fieldsToZodSchema(field.fields);\n let schema = z.array(itemSchema);\n\n if (field.minRows !== undefined) {\n schema = schema.min(\n field.minRows,\n `At least ${field.minRows} row${field.minRows !== 1 ? 's' : ''} required`\n );\n }\n if (field.maxRows !== undefined) {\n schema = schema.max(\n field.maxRows,\n `Maximum ${field.maxRows} row${field.maxRows !== 1 ? 's' : ''} allowed`\n );\n }\n\n if (field.required) {\n return schema;\n }\n\n return schema.optional().default([]);\n}\n\n/**\n * Creates Zod schema for group fields.\n * Uses passed-in schema generator to handle nested fields.\n */\nexport function createGroupFieldSchema(\n field: GroupField,\n fieldsToZodSchema: SchemaGenerator\n): z.ZodTypeAny {\n const schema = fieldsToZodSchema(field.fields);\n\n if (!field.required) {\n return schema.optional();\n }\n\n return schema;\n}","import { type z } from 'zod';\nimport type { Field, FieldsToShape } from '../types';\nimport type { StrictFieldArray } from '../types/strict-fields';\nimport { fieldsToZodSchema } from './fields-to-schema';\n\n/**\n * Creates a Zod schema from field definitions with strict type validation.\n *\n * @example\n * const schema = createSchema([\n * { type: 'email', name: 'email', required: true },\n * { type: 'password', name: 'password', minLength: 8 },\n * ]);\n *\n * type FormData = z.infer<typeof schema>;\n */\nexport function createSchema<const T extends readonly Field[]>(\n fields: StrictFieldArray<T> & T\n): z.ZodObject<FieldsToShape<T>> & { fields: T } {\n const schema = fieldsToZodSchema(fields as unknown as T);\n return Object.assign(schema, { fields }) as z.ZodObject<FieldsToShape<T>> & { fields: T };\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","fieldsToZodSchema","z"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { F as Field, a as FormConfig, U as UseFormOptions, b as FormAdapter } from './adapter-
|
|
2
|
-
export { g as AdapterFactory, f as AdapterOptions,
|
|
3
|
-
export { F as FieldToZod, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-
|
|
1
|
+
import { F as Field, a as FormConfig, U as UseFormOptions, b as FormAdapter } from './adapter-u4raoNx9.mjs';
|
|
2
|
+
export { g as AdapterFactory, f as AdapterOptions, z as ArrayField, A as ArrayHelpers, B as BaseField, Q as BuzzFormSchema, t as CheckboxField, s as CheckboxGroupField, K as CollapsibleField, C as ConditionContext, M as DataField, D as DateField, p as DatetimeField, E as EmailField, k as FieldComponentProps, j as FieldCondition, d as FieldError, l as FieldInputProps, m as FieldInputRenderFn, n as FieldStyle, L as FieldType, W as FormSettings, c as FormState, G as GroupField, O as LayoutField, N as NumberField, P as PasswordField, w as RadioField, e as Resolver, R as ResolverResult, H as RowField, r as SelectField, q as SelectOption, S as SetValueOptions, u as SwitchField, I as Tab, J as TabsField, x as TagsField, T as TextField, o as TextareaField, y as UploadField, V as ValidationContext, i as ValidationFn, h as ValidationResult, v as validateAdapter } from './adapter-u4raoNx9.mjs';
|
|
3
|
+
export { F as FieldToZod, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-C1Y-xfSp.mjs';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import React__default, { ReactNode } from 'react';
|
|
6
6
|
import 'zod';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { F as Field, a as FormConfig, U as UseFormOptions, b as FormAdapter } from './adapter-
|
|
2
|
-
export { g as AdapterFactory, f as AdapterOptions,
|
|
3
|
-
export { F as FieldToZod, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-
|
|
1
|
+
import { F as Field, a as FormConfig, U as UseFormOptions, b as FormAdapter } from './adapter-u4raoNx9.js';
|
|
2
|
+
export { g as AdapterFactory, f as AdapterOptions, z as ArrayField, A as ArrayHelpers, B as BaseField, Q as BuzzFormSchema, t as CheckboxField, s as CheckboxGroupField, K as CollapsibleField, C as ConditionContext, M as DataField, D as DateField, p as DatetimeField, E as EmailField, k as FieldComponentProps, j as FieldCondition, d as FieldError, l as FieldInputProps, m as FieldInputRenderFn, n as FieldStyle, L as FieldType, W as FormSettings, c as FormState, G as GroupField, O as LayoutField, N as NumberField, P as PasswordField, w as RadioField, e as Resolver, R as ResolverResult, H as RowField, r as SelectField, q as SelectOption, S as SetValueOptions, u as SwitchField, I as Tab, J as TabsField, x as TagsField, T as TextField, o as TextareaField, y as UploadField, V as ValidationContext, i as ValidationFn, h as ValidationResult, v as validateAdapter } from './adapter-u4raoNx9.js';
|
|
3
|
+
export { F as FieldToZod, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-D7pdJb3-.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import React__default, { ReactNode } from 'react';
|
|
6
6
|
import 'zod';
|