@buildnbuzz/buzzform 0.1.0 → 0.1.1
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/LICENSE +21 -21
- package/README.md +146 -138
- package/dist/{adapter-BT9v2OVg.d.mts → adapter-nQW28cyO.d.mts} +8 -2
- package/dist/{adapter-BT9v2OVg.d.ts → adapter-nQW28cyO.d.ts} +8 -2
- package/dist/chunk-63LF7K4O.mjs +171 -0
- package/dist/chunk-63LF7K4O.mjs.map +1 -0
- package/dist/chunk-HWDQN57Q.mjs +423 -0
- package/dist/chunk-HWDQN57Q.mjs.map +1 -0
- package/dist/{chunk-DDDGBPVU.mjs → chunk-IMJ5FRK5.mjs} +1 -1
- package/dist/chunk-IMJ5FRK5.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +95 -176
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12 -12
- package/dist/index.mjs.map +1 -1
- package/dist/rhf.d.mts +1 -1
- package/dist/rhf.d.ts +1 -1
- package/dist/rhf.js.map +1 -1
- package/dist/rhf.mjs +1 -1
- package/dist/rhf.mjs.map +1 -1
- package/dist/schema.d.mts +5 -32
- package/dist/schema.d.ts +5 -32
- package/dist/schema.js +160 -171
- package/dist/schema.js.map +1 -1
- package/dist/schema.mjs +18 -12
- package/dist/{utils-BgwyUFGB.d.mts → utils-CS2VrTJU.d.ts} +64 -51
- package/dist/{utils-DVLpbOoW.d.ts → utils-Dzp_68i3.d.mts} +64 -51
- package/dist/zod.d.mts +6 -24
- package/dist/zod.d.ts +6 -24
- package/dist/zod.js +151 -17
- package/dist/zod.js.map +1 -1
- package/dist/zod.mjs +69 -16
- package/dist/zod.mjs.map +1 -1
- package/package.json +4 -3
- package/dist/chunk-DDDGBPVU.mjs.map +0 -1
- package/dist/chunk-K42S5YX3.mjs +0 -599
- package/dist/chunk-K42S5YX3.mjs.map +0 -1
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/index.ts","../src/schema/fields-to-schema.ts","../src/schema/builders/text.ts","../src/schema/helpers.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","../src/utils/array.ts","../src/lib/utils.ts"],"sourcesContent":["/**\r\n * Schema utilities for BuzzForm.\r\n *\r\n * @example\r\n * import { createSchema } from '@buildnbuzz/buzzform';\r\n *\r\n * const loginSchema = createSchema([\r\n * { type: 'email', name: 'email', required: true },\r\n * { type: 'password', name: 'password', minLength: 8 },\r\n * ]);\r\n *\r\n * type LoginData = z.infer<typeof loginSchema>;\r\n */\r\n\r\n// =============================================================================\r\n// TYPES - Adapter Interface (no runtime code, just types)\r\n// =============================================================================\r\nexport type {\r\n FormState,\r\n SetValueOptions,\r\n FieldError,\r\n ResolverResult,\r\n Resolver,\r\n ArrayHelpers,\r\n AdapterOptions,\r\n FormAdapter,\r\n AdapterFactory,\r\n} from '../types';\r\n\r\n// =============================================================================\r\n// TYPES - Field Definitions\r\n// =============================================================================\r\nexport type {\r\n // Validation\r\n ValidationContext,\r\n ValidationResult,\r\n ValidationFn,\r\n\r\n // Conditional\r\n ConditionContext,\r\n FieldCondition,\r\n\r\n // Custom rendering\r\n FieldComponentProps,\r\n FieldInputProps,\r\n FieldInputRenderFn,\r\n\r\n // Styling\r\n FieldStyle,\r\n\r\n // Base\r\n BaseField,\r\n\r\n // Data fields\r\n TextField,\r\n EmailField,\r\n PasswordField,\r\n TextareaField,\r\n NumberField,\r\n DateField,\r\n DatetimeField,\r\n SelectOption,\r\n SelectField,\r\n CheckboxField,\r\n SwitchField,\r\n RadioField,\r\n TagsField,\r\n UploadField,\r\n\r\n // Layout fields\r\n GroupField,\r\n ArrayField,\r\n RowField,\r\n Tab,\r\n TabsField,\r\n CollapsibleField,\r\n\r\n // Union types\r\n Field,\r\n FieldType,\r\n DataField,\r\n LayoutField,\r\n} from '../types';\r\n\r\n// =============================================================================\r\n// TYPES - Form Configuration\r\n// =============================================================================\r\nexport type {\r\n BuzzFormSchema,\r\n FormSettings,\r\n FormConfig,\r\n UseFormOptions,\r\n} from '../types';\r\n\r\n// =============================================================================\r\n// TYPES - Schema Utilities\r\n// =============================================================================\r\nexport type {\r\n FieldToZod,\r\n FieldsToShape,\r\n SchemaBuilder,\r\n SchemaBuilderMap,\r\n InferSchema,\r\n} from '../types';\r\n\r\n// =============================================================================\r\n// SCHEMA\r\n// =============================================================================\r\nexport { createSchema } from './create-schema';\r\nexport { fieldsToZodSchema } from './fields-to-schema';\r\n\r\n// Re-export schema helpers for advanced usage (custom field builders)\r\nexport {\r\n extractValidationConfig,\r\n applyCustomValidation,\r\n makeOptional,\r\n coerceToNumber,\r\n coerceToDate,\r\n getPatternErrorMessage,\r\n isFileLike,\r\n isFileTypeAccepted,\r\n} from './helpers';\r\n\r\n// Individual builders for registry integration\r\nexport * from './builders';\r\n\r\n// =============================================================================\r\n// UTILITIES (Server-safe - no React imports)\r\n// =============================================================================\r\nexport { createArrayHelpers } from '../utils';\r\n\r\n// Add common utilities that registry components will need\r\nexport { generateFieldId, getNestedValue, setNestedValue, formatBytes } from '../lib';","import { z } from 'zod';\r\nimport type {\r\n Field,\r\n TabsField,\r\n TextField,\r\n EmailField,\r\n PasswordField,\r\n TextareaField,\r\n NumberField,\r\n DateField,\r\n DatetimeField,\r\n SelectField,\r\n RadioField,\r\n CheckboxField,\r\n SwitchField,\r\n UploadField,\r\n TagsField,\r\n ArrayField,\r\n GroupField,\r\n FieldsToShape,\r\n} from '../types';\r\nimport {\r\n createTextFieldSchema,\r\n createEmailFieldSchema,\r\n createPasswordFieldSchema,\r\n createNumberFieldSchema,\r\n createDateFieldSchema,\r\n createSelectFieldSchema,\r\n createRadioFieldSchema,\r\n createCheckboxFieldSchema,\r\n createSwitchFieldSchema,\r\n createUploadFieldSchema,\r\n createTagsFieldSchema,\r\n createArrayFieldSchema,\r\n createGroupFieldSchema,\r\n} from './builders';\r\n\r\n// =============================================================================\r\n// FIELD TO ZOD SCHEMA\r\n// =============================================================================\r\n\r\n/**\r\n * Converts a single field to a Zod schema.\r\n */\r\nfunction fieldToZod(field: Field): z.ZodTypeAny {\r\n // If field has a direct Zod schema override, use it\r\n if ('schema' in field && field.schema) {\r\n return field.schema as z.ZodTypeAny;\r\n }\r\n\r\n switch (field.type) {\r\n // Text-based fields\r\n case 'text':\r\n return createTextFieldSchema(field as TextField);\r\n case 'email':\r\n return createEmailFieldSchema(field as EmailField);\r\n case 'password':\r\n return createPasswordFieldSchema(field as PasswordField);\r\n case 'textarea':\r\n return createTextFieldSchema(field as TextareaField);\r\n\r\n // Number\r\n case 'number':\r\n return createNumberFieldSchema(field as NumberField);\r\n\r\n // Date\r\n case 'date':\r\n case 'datetime':\r\n return createDateFieldSchema(field as DateField | DatetimeField);\r\n\r\n // Selection\r\n case 'select':\r\n return createSelectFieldSchema(field as SelectField);\r\n case 'radio':\r\n return createRadioFieldSchema(field as RadioField);\r\n\r\n // Boolean\r\n case 'checkbox':\r\n return createCheckboxFieldSchema(field as CheckboxField);\r\n case 'switch':\r\n return createSwitchFieldSchema(field as SwitchField);\r\n\r\n // Upload\r\n case 'upload':\r\n return createUploadFieldSchema(field as UploadField);\r\n\r\n // Tags\r\n case 'tags':\r\n return createTagsFieldSchema(field as TagsField);\r\n\r\n // Composite (recursive)\r\n case 'array':\r\n return createArrayFieldSchema(field as ArrayField, fieldsToZodSchema);\r\n case 'group':\r\n return createGroupFieldSchema(field as GroupField, fieldsToZodSchema);\r\n\r\n // Layout fields don't produce schemas directly\r\n case 'row':\r\n case 'collapsible':\r\n case 'tabs':\r\n return z.any();\r\n\r\n default:\r\n return z.any();\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// TABS FIELD HANDLING\r\n// =============================================================================\r\n\r\n/**\r\n * Processes a tabs field to extract schema shape.\r\n * Named tabs create nested objects, unnamed tabs flatten.\r\n */\r\nfunction processTabsField(field: TabsField): Record<string, z.ZodTypeAny> {\r\n const shape: Record<string, z.ZodTypeAny> = {};\r\n\r\n for (const tab of field.tabs) {\r\n if (tab.name) {\r\n // Named tab: create nested object under tab.name\r\n const tabSchema = fieldsToZodSchema(tab.fields);\r\n shape[tab.name] = tabSchema;\r\n } else {\r\n // Unnamed tab: flatten fields into parent shape\r\n const tabFieldsSchema = fieldsToZodSchema(tab.fields);\r\n if (tabFieldsSchema instanceof z.ZodObject) {\r\n Object.assign(shape, tabFieldsSchema.shape);\r\n }\r\n }\r\n }\r\n\r\n return shape;\r\n}\r\n\r\n// =============================================================================\r\n// FIELDS TO ZOD SCHEMA\r\n// =============================================================================\r\n\r\n/**\r\n * Converts an array of field definitions to a Zod object schema.\r\n * Handles all field types including layouts and nested structures.\r\n */\r\nexport function fieldsToZodSchema<T extends readonly Field[]>(\r\n fields: T\r\n): z.ZodObject<FieldsToShape<T>> {\r\n const shape: Record<string, z.ZodTypeAny> = {};\r\n\r\n for (const field of fields) {\r\n if ('name' in field && field.name) {\r\n // Data field with name - add to schema\r\n shape[field.name] = fieldToZod(field);\r\n } else if (field.type === 'tabs') {\r\n // Named tabs create nested, unnamed flatten\r\n const tabsShape = processTabsField(field);\r\n Object.assign(shape, tabsShape);\r\n } else if (field.type === 'row' || field.type === 'collapsible') {\r\n // Layout fields: flatten nested fields into parent\r\n const nestedSchema = fieldsToZodSchema(field.fields);\r\n if (nestedSchema instanceof z.ZodObject) {\r\n Object.assign(shape, nestedSchema.shape);\r\n }\r\n }\r\n // Other layout fields without name are skipped\r\n }\r\n\r\n return z.object(shape) as z.ZodObject<FieldsToShape<T>>;\r\n}\r\n","import { z } from 'zod';\r\nimport type { TextField, EmailField, TextareaField, PasswordField } from '../../types';\r\nimport { makeOptional, getPatternErrorMessage, applyCustomValidation } from '../helpers';\r\n\r\n/**\r\n * Creates Zod schema for text fields.\r\n */\r\nexport function createTextFieldSchema(field: TextField | TextareaField): z.ZodTypeAny {\r\n let schema = z.string();\r\n\r\n // Pattern validation (only for TextField)\r\n if ('pattern' in field && field.pattern) {\r\n const pattern = typeof field.pattern === 'string'\r\n ? new RegExp(field.pattern)\r\n : field.pattern;\r\n\r\n schema = schema.regex(pattern, {\r\n message: getPatternErrorMessage(field.pattern),\r\n });\r\n }\r\n\r\n // Length constraints\r\n if (field.minLength) {\r\n schema = schema.min(field.minLength, {\r\n message: `Must be at least ${field.minLength} characters`,\r\n });\r\n }\r\n if (field.maxLength) {\r\n schema = schema.max(field.maxLength, {\r\n message: `Must be no more than ${field.maxLength} characters`,\r\n });\r\n }\r\n\r\n // Required (for strings, use min(1) instead of just required)\r\n if (field.required) {\r\n schema = schema.min(1, { message: 'This field is required' });\r\n }\r\n\r\n // Trim preprocessing (only for TextField)\r\n let finalSchema: z.ZodTypeAny = schema;\r\n if ('trim' in field && field.trim) {\r\n finalSchema = z.preprocess((val) => {\r\n return typeof val === 'string' ? val.trim() : val;\r\n }, schema);\r\n }\r\n\r\n // Apply custom validation\r\n finalSchema = applyCustomValidation(finalSchema, field, field.name);\r\n\r\n // Return optional if not required\r\n if (!field.required) {\r\n return makeOptional(finalSchema, field.type);\r\n }\r\n\r\n return finalSchema;\r\n}\r\n\r\n/**\r\n * Creates Zod schema for email fields.\r\n */\r\nexport function createEmailFieldSchema(field: EmailField): z.ZodTypeAny {\r\n let schema = z.string().email({ message: 'Invalid email address' });\r\n\r\n // Length constraints (rare for email but supported)\r\n if (field.minLength) {\r\n schema = schema.min(field.minLength, {\r\n message: `Must be at least ${field.minLength} characters`,\r\n });\r\n }\r\n if (field.maxLength) {\r\n schema = schema.max(field.maxLength, {\r\n message: `Must be no more than ${field.maxLength} characters`,\r\n });\r\n }\r\n\r\n // Required\r\n if (field.required) {\r\n schema = schema.min(1, { message: 'Email is required' });\r\n }\r\n\r\n // Apply custom validation\r\n const finalSchema: z.ZodTypeAny = applyCustomValidation(schema, field, field.name);\r\n\r\n if (!field.required) {\r\n return makeOptional(finalSchema, 'email');\r\n }\r\n\r\n return finalSchema;\r\n}\r\n\r\n/**\r\n * Creates Zod schema for password fields.\r\n */\r\nexport function createPasswordFieldSchema(field: PasswordField): z.ZodTypeAny {\r\n let schema = z.string();\r\n\r\n if (field.minLength) {\r\n schema = schema.min(field.minLength, {\r\n message: `Password must be at least ${field.minLength} characters`,\r\n });\r\n }\r\n if (field.maxLength) {\r\n schema = schema.max(field.maxLength, {\r\n message: `Password must be no more than ${field.maxLength} characters`,\r\n });\r\n }\r\n if (field.required) {\r\n schema = schema.min(1, { message: 'Password is required' });\r\n }\r\n\r\n const finalSchema: z.ZodTypeAny = applyCustomValidation(schema, field, field.name);\r\n\r\n if (!field.required) {\r\n return makeOptional(finalSchema, 'password');\r\n }\r\n\r\n return finalSchema;\r\n}\r\n","import { z } from 'zod';\r\nimport type { Field, FieldType, ValidationContext } from '../types';\r\n\r\n// =============================================================================\r\n// VALIDATION CONFIG EXTRACTION\r\n// =============================================================================\r\n\r\n/**\r\n * A validation function that can be extracted from a field.\r\n */\r\ntype ExtractableValidationFn = (\r\n value: unknown,\r\n context: ValidationContext\r\n) => true | string | Promise<true | string>;\r\n\r\nexport interface ExtractedValidationConfig {\r\n /** The validation function (if any) */\r\n fn?: ExtractableValidationFn;\r\n /** Whether this is a live validation */\r\n isLive: boolean;\r\n /** Debounce milliseconds for live validation */\r\n debounceMs?: number;\r\n}\r\n\r\n/**\r\n * Extracts validation function and config from the unified validate property.\r\n */\r\nexport function extractValidationConfig(\r\n validate?: unknown\r\n): ExtractedValidationConfig {\r\n if (!validate) {\r\n return { fn: undefined, isLive: false };\r\n }\r\n\r\n // Simple function case\r\n if (typeof validate === 'function') {\r\n return { fn: validate as ExtractableValidationFn, isLive: false };\r\n }\r\n\r\n // Object case with potential live config\r\n if (typeof validate === 'object' && 'fn' in validate) {\r\n const obj = validate as { fn?: unknown; live?: boolean | { debounceMs?: number } };\r\n const fn = typeof obj.fn === 'function' ? obj.fn as ExtractableValidationFn : undefined;\r\n\r\n if (!obj.live) {\r\n return { fn, isLive: false };\r\n }\r\n\r\n const debounceMs = typeof obj.live === 'object' ? obj.live.debounceMs : undefined;\r\n return { fn, isLive: true, debounceMs };\r\n }\r\n\r\n return { fn: undefined, isLive: false };\r\n}\r\n\r\n// =============================================================================\r\n// CUSTOM VALIDATION WRAPPER\r\n// =============================================================================\r\n\r\n/**\r\n * Applies custom validation from field.validate to a Zod schema.\r\n * Standardizes the pattern across all field types.\r\n */\r\nexport function applyCustomValidation(\r\n schema: z.ZodTypeAny,\r\n field: Field,\r\n fieldPath: string = ''\r\n): z.ZodTypeAny {\r\n // Only data fields have validate\r\n if (!('validate' in field)) {\r\n return schema;\r\n }\r\n\r\n const fieldWithValidate = field as { validate?: unknown };\r\n if (!fieldWithValidate.validate) {\r\n return schema;\r\n }\r\n\r\n const config = extractValidationConfig(fieldWithValidate.validate);\r\n if (!config.fn) {\r\n return schema;\r\n }\r\n\r\n return schema.superRefine(async (val, ctx) => {\r\n const result = await config.fn!(val, {\r\n data: {},\r\n siblingData: {},\r\n path: fieldPath.split('.'),\r\n });\r\n\r\n if (result !== true) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: typeof result === 'string' ? result : 'Validation failed',\r\n });\r\n }\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// OPTIONAL HANDLING\r\n// =============================================================================\r\n\r\n/**\r\n * Makes a schema optional based on field type.\r\n * Different field types have different \"empty\" representations.\r\n */\r\nexport function makeOptional(\r\n schema: z.ZodTypeAny,\r\n fieldType: FieldType\r\n): z.ZodTypeAny {\r\n switch (fieldType) {\r\n // String types: allow empty string\r\n case 'text':\r\n case 'textarea':\r\n case 'email':\r\n case 'password':\r\n return schema.optional().or(z.literal(''));\r\n\r\n // Nullable types\r\n case 'number':\r\n case 'date':\r\n case 'select':\r\n case 'radio':\r\n return schema.optional().nullable();\r\n\r\n // Boolean types: always have a value\r\n case 'checkbox':\r\n case 'switch':\r\n return schema; // Booleans are never \"optional\" in the traditional sense\r\n\r\n // Array types\r\n case 'tags':\r\n case 'array':\r\n return schema.optional().default([]);\r\n\r\n // Upload\r\n case 'upload':\r\n return schema.optional().nullable();\r\n\r\n // Default\r\n default:\r\n return schema.optional();\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// COERCION HELPERS\r\n// =============================================================================\r\n\r\n/**\r\n * Coerces a value to a number.\r\n * Empty/null/undefined → undefined, otherwise Number().\r\n */\r\nexport function coerceToNumber(val: unknown): number | undefined {\r\n if (val === '' || val === null || val === undefined) {\r\n return undefined;\r\n }\r\n const num = Number(val);\r\n return isNaN(num) ? undefined : num;\r\n}\r\n\r\n/**\r\n * Coerces a value to a Date.\r\n * Handles strings, numbers, and Date objects.\r\n */\r\nexport function coerceToDate(val: unknown): Date | undefined {\r\n if (val === '' || val === null || val === undefined) {\r\n return undefined;\r\n }\r\n if (val instanceof Date) {\r\n return isNaN(val.getTime()) ? undefined : val;\r\n }\r\n if (typeof val === 'string' || typeof val === 'number') {\r\n const d = new Date(val);\r\n return isNaN(d.getTime()) ? undefined : d;\r\n }\r\n return undefined;\r\n}\r\n\r\n// =============================================================================\r\n// PATTERN VALIDATION\r\n// =============================================================================\r\n\r\n/**\r\n * Common regex patterns with their error messages.\r\n */\r\nconst PATTERN_MESSAGES: Record<string, string> = {\r\n '^[a-zA-Z0-9_]+$': 'Only letters, numbers, and underscores allowed',\r\n '^[a-z0-9-]+$': 'Only lowercase letters, numbers, and hyphens allowed',\r\n '^\\\\S+@\\\\S+\\\\.\\\\S+$': 'Invalid email format',\r\n '^https?://': 'Must start with http:// or https://',\r\n};\r\n\r\n/**\r\n * Gets a human-readable error message for a regex pattern.\r\n */\r\nexport function getPatternErrorMessage(pattern: string | RegExp): string {\r\n const patternStr = typeof pattern === 'string' ? pattern : pattern.source;\r\n return PATTERN_MESSAGES[patternStr] || `Must match pattern: ${patternStr}`;\r\n}\r\n\r\n// =============================================================================\r\n// FILE VALIDATION HELPERS\r\n// =============================================================================\r\n\r\n/**\r\n * Checks if a value is a File-like object.\r\n */\r\nexport function isFileLike(value: unknown): value is File {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'name' in value &&\r\n 'size' in value &&\r\n 'type' in value\r\n );\r\n}\r\n\r\n/**\r\n * Validates file type against accept pattern.\r\n */\r\nexport function isFileTypeAccepted(\r\n file: File,\r\n accept: string\r\n): boolean {\r\n if (accept === '*' || !accept) return true;\r\n\r\n const acceptTypes = accept.split(',').map(t => t.trim().toLowerCase());\r\n const fileType = file.type.toLowerCase();\r\n const fileName = file.name.toLowerCase();\r\n\r\n return acceptTypes.some(acceptType => {\r\n // Wildcard: \"image/*\"\r\n if (acceptType.endsWith('/*')) {\r\n const category = acceptType.replace('/*', '');\r\n return fileType.startsWith(category + '/');\r\n }\r\n // Extension: \".pdf\"\r\n if (acceptType.startsWith('.')) {\r\n return fileName.endsWith(acceptType);\r\n }\r\n // Exact MIME type\r\n return fileType === acceptType;\r\n });\r\n}\r\n","import { z } from 'zod';\r\nimport type { NumberField } from '../../types';\r\nimport { coerceToNumber, makeOptional, applyCustomValidation } from '../helpers';\r\n\r\n/**\r\n * Creates Zod schema for number fields.\r\n */\r\nexport function createNumberFieldSchema(field: NumberField): z.ZodTypeAny {\r\n let numSchema = z.number({ invalid_type_error: 'Must be a number' });\r\n\r\n // Min/max constraints\r\n if (field.min !== undefined) {\r\n numSchema = numSchema.min(field.min, `Must be at least ${field.min}`);\r\n }\r\n if (field.max !== undefined) {\r\n numSchema = numSchema.max(field.max, `Must be at most ${field.max}`);\r\n }\r\n\r\n // Coercion: empty/null/undefined → undefined, otherwise Number()\r\n let schema: z.ZodTypeAny = z.preprocess(coerceToNumber, numSchema);\r\n\r\n // Apply custom validation\r\n schema = applyCustomValidation(schema, field, field.name);\r\n\r\n if (field.required) {\r\n return schema;\r\n }\r\n\r\n return makeOptional(schema, 'number');\r\n}\r\n","import { z } from 'zod';\r\nimport type { DateField, DatetimeField } from '../../types';\r\nimport { coerceToDate, makeOptional, applyCustomValidation } from '../helpers';\r\n\r\n/**\r\n * Parse a value to a Date object for constraint checking.\r\n */\r\nfunction toDate(value?: string | Date): Date | undefined {\r\n if (!value) return undefined;\r\n if (value instanceof Date) return isNaN(value.getTime()) ? undefined : value;\r\n const parsed = new Date(value);\r\n return isNaN(parsed.getTime()) ? undefined : parsed;\r\n}\r\n\r\n/**\r\n * Creates Zod schema for date and datetime fields.\r\n */\r\nexport function createDateFieldSchema(field: DateField | DatetimeField): z.ZodTypeAny {\r\n const isDatetime = field.type === 'datetime';\r\n\r\n // Parse min/max dates from field config\r\n const minDate = toDate(field.minDate);\r\n const maxDate = toDate(field.maxDate);\r\n\r\n // Build base date schema\r\n let dateSchema = z.date({ invalid_type_error: 'Please enter a valid date' });\r\n\r\n // Add min date constraint\r\n if (minDate) {\r\n const formattedDate = isDatetime ? minDate.toLocaleString() : minDate.toDateString();\r\n dateSchema = dateSchema.min(minDate, {\r\n message: `Date must be on or after ${formattedDate}`,\r\n });\r\n }\r\n\r\n // Add max date constraint\r\n if (maxDate) {\r\n const formattedDate = isDatetime ? maxDate.toLocaleString() : maxDate.toDateString();\r\n dateSchema = dateSchema.max(maxDate, {\r\n message: `Date must be on or before ${formattedDate}`,\r\n });\r\n }\r\n\r\n // Coercion from various input types\r\n let schema: z.ZodTypeAny = z.preprocess(coerceToDate, dateSchema);\r\n\r\n // Apply custom validation\r\n schema = applyCustomValidation(schema, field, field.name);\r\n\r\n if (field.required) {\r\n return schema.refine(\r\n (val) => val instanceof Date && !isNaN(val.getTime()),\r\n 'Date is required'\r\n );\r\n }\r\n\r\n return makeOptional(schema, 'date');\r\n}\r\n","import { z } from 'zod';\r\nimport type { SelectField, RadioField } from '../../types';\r\nimport { makeOptional, applyCustomValidation } from '../helpers';\r\n\r\n/**\r\n * Base schema for select/radio values.\r\n * Supports string, number, and boolean as per SelectOption.value type.\r\n */\r\nconst selectValueSchema = z.union([z.string(), z.number(), z.boolean()]);\r\n\r\n/**\r\n * Creates Zod schema for select fields.\r\n */\r\nexport function createSelectFieldSchema(field: SelectField): z.ZodTypeAny {\r\n // Handle hasMany (multi-select)\r\n if (field.hasMany) {\r\n let arraySchema = z.array(selectValueSchema);\r\n\r\n if (field.required) {\r\n arraySchema = arraySchema.min(1, 'Select at least one option');\r\n }\r\n\r\n const schema: z.ZodTypeAny = applyCustomValidation(arraySchema, field, field.name);\r\n\r\n if (!field.required) {\r\n return schema.optional().default([]);\r\n }\r\n return schema;\r\n }\r\n\r\n // Single select\r\n let schema: z.ZodTypeAny = selectValueSchema;\r\n\r\n if (field.required) {\r\n // For required fields, we need to ensure a value was selected\r\n schema = selectValueSchema.refine(\r\n (val) => val !== '' && val !== null && val !== undefined,\r\n 'Please select an option'\r\n );\r\n }\r\n\r\n schema = applyCustomValidation(schema, field, field.name);\r\n\r\n if (!field.required) {\r\n return makeOptional(schema, 'select');\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Creates Zod schema for radio fields.\r\n */\r\nexport function createRadioFieldSchema(field: RadioField): z.ZodTypeAny {\r\n let schema: z.ZodTypeAny = selectValueSchema;\r\n\r\n if (field.required) {\r\n schema = selectValueSchema.refine(\r\n (val) => val !== '' && val !== null && val !== undefined,\r\n 'Please select an option'\r\n );\r\n }\r\n\r\n schema = applyCustomValidation(schema, field, field.name);\r\n\r\n if (!field.required) {\r\n return makeOptional(schema, 'radio');\r\n }\r\n\r\n return schema;\r\n}\r\n","import { z } from 'zod';\r\nimport type { CheckboxField, SwitchField } from '../../types';\r\nimport { applyCustomValidation } from '../helpers';\r\n\r\n/**\r\n * Creates Zod schema for checkbox fields.\r\n */\r\nexport function createCheckboxFieldSchema(field: CheckboxField): z.ZodTypeAny {\r\n let schema: z.ZodTypeAny = z.boolean();\r\n\r\n // Required checkbox must be checked\r\n if (field.required) {\r\n schema = z.boolean().refine(val => val === true, {\r\n message: 'This field is required',\r\n });\r\n }\r\n\r\n return applyCustomValidation(schema, field, field.name);\r\n}\r\n\r\n/**\r\n * Creates Zod schema for switch fields.\r\n */\r\nexport function createSwitchFieldSchema(field: SwitchField): z.ZodTypeAny {\r\n let schema: z.ZodTypeAny = z.boolean();\r\n\r\n // Required switch must be on\r\n if (field.required) {\r\n schema = z.boolean().refine(val => val === true, {\r\n message: 'This field is required',\r\n });\r\n }\r\n\r\n return applyCustomValidation(schema, field, field.name);\r\n}\r\n","import { z } from 'zod';\r\nimport type { UploadField } from '../../types';\r\nimport { isFileLike, isFileTypeAccepted } from '../helpers';\r\n\r\n/**\r\n * Validates a single file against field constraints.\r\n */\r\nfunction validateSingleFile(\r\n value: unknown,\r\n field: UploadField\r\n): { valid: boolean; message?: string } {\r\n // Allow null/undefined for non-required fields\r\n if (value === null || value === undefined || value === '') {\r\n return { valid: true };\r\n }\r\n\r\n // Allow string URLs (for existing uploads)\r\n if (typeof value === 'string') {\r\n return { valid: true };\r\n }\r\n\r\n // Must be a File-like object\r\n if (!isFileLike(value)) {\r\n return { valid: false, message: 'Invalid file' };\r\n }\r\n\r\n // Validate max size\r\n if (field.maxSize && value.size > field.maxSize) {\r\n const sizeMB = (field.maxSize / 1024 / 1024).toFixed(1);\r\n return {\r\n valid: false,\r\n message: `File must be smaller than ${sizeMB}MB`,\r\n };\r\n }\r\n\r\n // Validate file type (accept attribute)\r\n const accept = field.ui?.accept;\r\n if (accept && accept !== '*') {\r\n if (!isFileTypeAccepted(value, accept)) {\r\n return {\r\n valid: false,\r\n message: `File type not allowed. Accepted: ${accept}`,\r\n };\r\n }\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Creates Zod schema for upload fields.\r\n * Supports both single file and hasMany (array) modes.\r\n */\r\nexport function createUploadFieldSchema(field: UploadField): z.ZodTypeAny {\r\n if (field.hasMany) {\r\n // Array mode\r\n const schema = z.array(z.any()).superRefine((files, ctx) => {\r\n // Validate each file\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n const result = validateSingleFile(file, field);\r\n if (!result.valid) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: result.message || 'Invalid file',\r\n path: [i],\r\n });\r\n }\r\n }\r\n\r\n // Validate required\r\n if (field.required) {\r\n const validFiles = files.filter(f => f !== null && f !== undefined);\r\n if (validFiles.length === 0) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: 'At least one file is required',\r\n });\r\n }\r\n }\r\n\r\n // Validate minFiles\r\n if (field.minFiles !== undefined && field.minFiles > 0) {\r\n const validFiles = files.filter(f => f !== null && f !== undefined);\r\n if (validFiles.length < field.minFiles) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: `At least ${field.minFiles} file(s) required`,\r\n });\r\n }\r\n }\r\n\r\n // Validate maxFiles\r\n if (field.maxFiles !== undefined) {\r\n const validFiles = files.filter(f => f !== null && f !== undefined);\r\n if (validFiles.length > field.maxFiles) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: `Maximum ${field.maxFiles} file(s) allowed`,\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (!field.required) {\r\n return schema.optional().default([]);\r\n }\r\n return schema;\r\n }\r\n\r\n // Single file mode\r\n const schema = z.any().superRefine((value, ctx) => {\r\n // Handle required\r\n if (field.required && (value === null || value === undefined || value === '')) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: 'File is required',\r\n });\r\n return;\r\n }\r\n\r\n // Skip further validation for empty non-required values\r\n if (value === null || value === undefined || value === '') {\r\n return;\r\n }\r\n\r\n const result = validateSingleFile(value, field);\r\n if (!result.valid) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: result.message || 'Invalid file',\r\n });\r\n }\r\n });\r\n\r\n if (!field.required) {\r\n return schema.optional().nullable();\r\n }\r\n\r\n return schema;\r\n}\r\n","import { z } from 'zod';\r\nimport type { TagsField } from '../../types';\r\nimport { applyCustomValidation } from '../helpers';\r\n\r\n/**\r\n * Creates Zod schema for tags fields.\r\n * Tags are always arrays of strings.\r\n */\r\nexport function createTagsFieldSchema(field: TagsField): z.ZodTypeAny {\r\n const tagSchema = z.string();\r\n let schema = z.array(tagSchema);\r\n\r\n // Min/max constraints (TagsField uses minTags/maxTags)\r\n if (field.minTags !== undefined) {\r\n schema = schema.min(field.minTags, `At least ${field.minTags} tag(s) required`);\r\n }\r\n if (field.maxTags !== undefined) {\r\n schema = schema.max(field.maxTags, `Maximum ${field.maxTags} tag(s) allowed`);\r\n }\r\n\r\n // Apply custom validation\r\n let finalSchema: z.ZodTypeAny = applyCustomValidation(schema, field, field.name);\r\n\r\n // Required: must have at least one tag\r\n if (field.required) {\r\n finalSchema = finalSchema.refine(\r\n (arr) => Array.isArray(arr) && arr.length > 0,\r\n 'At least one tag is required'\r\n );\r\n return finalSchema;\r\n }\r\n\r\n // Optional: default to empty array\r\n return finalSchema.optional().default([]);\r\n}\r\n","import { z } from 'zod';\r\nimport type { ArrayField, GroupField, Field } from '../../types';\r\n\r\n// Note: These import from the parent module to avoid circular deps\r\n// The fieldsToZodSchema function is passed as a parameter\r\n\r\ntype SchemaGenerator = (fields: readonly Field[]) => z.ZodObject<z.ZodRawShape>;\r\n\r\n/**\r\n * Creates Zod schema for array fields.\r\n * Uses passed-in schema generator to handle nested fields.\r\n */\r\nexport function createArrayFieldSchema(\r\n field: ArrayField,\r\n fieldsToZodSchema: SchemaGenerator\r\n): z.ZodTypeAny {\r\n const itemSchema = fieldsToZodSchema(field.fields);\r\n let schema = z.array(itemSchema);\r\n\r\n if (field.minRows !== undefined) {\r\n schema = schema.min(\r\n field.minRows,\r\n `At least ${field.minRows} row${field.minRows !== 1 ? 's' : ''} required`\r\n );\r\n }\r\n if (field.maxRows !== undefined) {\r\n schema = schema.max(\r\n field.maxRows,\r\n `Maximum ${field.maxRows} row${field.maxRows !== 1 ? 's' : ''} allowed`\r\n );\r\n }\r\n\r\n if (field.required) {\r\n return schema;\r\n }\r\n\r\n return schema.optional().default([]);\r\n}\r\n\r\n/**\r\n * Creates Zod schema for group fields.\r\n * Uses passed-in schema generator to handle nested fields.\r\n */\r\nexport function createGroupFieldSchema(\r\n field: GroupField,\r\n fieldsToZodSchema: SchemaGenerator\r\n): z.ZodTypeAny {\r\n const schema = fieldsToZodSchema(field.fields);\r\n\r\n if (!field.required) {\r\n return schema.optional();\r\n }\r\n\r\n return schema;\r\n}","import { type z } from 'zod';\r\nimport type { Field, FieldsToShape } from '../types';\r\nimport { fieldsToZodSchema } from './fields-to-schema';\r\n\r\n// =============================================================================\r\n// CREATE SCHEMA\r\n// =============================================================================\r\n\r\n/**\r\n * Creates a Zod schema from an array of field definitions.\r\n *\r\n * Provides full intellisense when writing field definitions inline.\r\n * The returned schema has `.fields` attached for use in rendering.\r\n *\r\n * @example\r\n * const loginSchema = createSchema([\r\n * { type: 'email', name: 'email', required: true }, // ← Full intellisense!\r\n * { type: 'password', name: 'password', minLength: 8 },\r\n * ]);\r\n *\r\n * type LoginData = z.infer<typeof loginSchema>;\r\n * // { email: string; password: string }\r\n *\r\n * // Use with useForm:\r\n * const form = useForm({ schema: loginSchema });\r\n *\r\n * // Access fields for rendering:\r\n * <FormRenderer fields={loginSchema.fields} />\r\n */\r\nexport function createSchema<const T extends readonly Field[]>(\r\n fields: [...{ [K in keyof T]: T[K] extends Field ? T[K] : Field }]\r\n): z.ZodObject<FieldsToShape<T>> & { fields: T } {\r\n const schema = fieldsToZodSchema(fields as T);\r\n\r\n // Attach fields to schema for rendering access\r\n return Object.assign(schema, { fields }) as z.ZodObject<FieldsToShape<T>> & { fields: T };\r\n}\r\n","import { nanoid } from 'nanoid';\r\nimport type { ArrayHelpers } from '../types';\r\n\r\n/**\r\n * Creates a standardized set of array field manipulation methods.\r\n * Abstracts the difference between getting/setting values in different form libraries.\r\n * \r\n * @param getArray - Function to get current array value at a path\r\n * @param setArray - Function to set array value at a path\r\n */\r\nexport function createArrayHelpers(\r\n getArray: (path: string) => unknown[],\r\n setArray: (path: string, value: unknown[]) => void\r\n): ArrayHelpers {\r\n return {\r\n fields: <T = unknown>(path: string): Array<T & { id: string }> => {\r\n const arr = getArray(path);\r\n if (!Array.isArray(arr)) return [];\r\n return arr.map((item, index) => ({\r\n id: (item as Record<string, unknown>)?.id as string || `${path}-${index}`,\r\n ...item as T,\r\n }));\r\n },\r\n\r\n append: (path: string, value: unknown) => {\r\n const current = getArray(path) || [];\r\n const itemWithId = ensureId(value);\r\n setArray(path, [...current, itemWithId]);\r\n },\r\n\r\n prepend: (path: string, value: unknown) => {\r\n const current = getArray(path) || [];\r\n const itemWithId = ensureId(value);\r\n setArray(path, [itemWithId, ...current]);\r\n },\r\n\r\n insert: (path: string, index: number, value: unknown) => {\r\n const current = [...(getArray(path) || [])];\r\n const itemWithId = ensureId(value);\r\n current.splice(index, 0, itemWithId);\r\n setArray(path, current);\r\n },\r\n\r\n remove: (path: string, index: number) => {\r\n const current = [...(getArray(path) || [])];\r\n current.splice(index, 1);\r\n setArray(path, current);\r\n },\r\n\r\n move: (path: string, from: number, to: number) => {\r\n const current = [...(getArray(path) || [])];\r\n const [item] = current.splice(from, 1);\r\n current.splice(to, 0, item);\r\n setArray(path, current);\r\n },\r\n\r\n swap: (path: string, indexA: number, indexB: number) => {\r\n const current = [...(getArray(path) || [])];\r\n const temp = current[indexA];\r\n current[indexA] = current[indexB];\r\n current[indexB] = temp;\r\n setArray(path, current);\r\n },\r\n\r\n replace: (path: string, values: unknown[]) => {\r\n const itemsWithIds = values.map(ensureId);\r\n setArray(path, itemsWithIds);\r\n },\r\n\r\n update: (path: string, index: number, value: unknown) => {\r\n const current = [...(getArray(path) || [])];\r\n // Preserve existing ID if present\r\n const existingId = (current[index] as Record<string, unknown>)?.id;\r\n current[index] = {\r\n ...(typeof value === 'object' && value !== null ? value : {}),\r\n id: existingId || nanoid(),\r\n };\r\n setArray(path, current);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Ensures an item has a unique ID for React keys.\r\n */\r\nfunction ensureId(value: unknown): unknown {\r\n if (typeof value === 'object' && value !== null) {\r\n const obj = value as Record<string, unknown>;\r\n if (!obj.id) {\r\n return { ...obj, id: nanoid() };\r\n }\r\n return obj;\r\n }\r\n return { value, id: nanoid() };\r\n}\r\n","// =============================================================================\r\n// COMMON UTILITIES\r\n// These are used by both the core package and registry field components.\r\n// =============================================================================\r\n\r\n/**\r\n * Generate a unique field ID from the field path.\r\n * Converts dot notation to dashes and prefixes with 'field-'.\r\n * Used for accessibility (htmlFor, id attributes).\r\n * \r\n * @example\r\n * generateFieldId('user.profile.email') => 'field-user-profile-email'\r\n * generateFieldId('items[0].name') => 'field-items-0-name'\r\n */\r\nexport function generateFieldId(path: string): string {\r\n return `field-${path.replace(/\\./g, \"-\").replace(/\\[/g, \"-\").replace(/\\]/g, \"\")}`;\r\n}\r\n\r\n/**\r\n * Safely retrieve a nested value from an object using a dot-notation path.\r\n * \r\n * @example\r\n * getNestedValue({ user: { name: 'John' } }, 'user.name') => 'John'\r\n * getNestedValue({ items: [{ id: 1 }] }, 'items.0.id') => 1\r\n */\r\nexport function getNestedValue(obj: unknown, path: string): unknown {\r\n if (!obj || !path) return undefined;\r\n return path.split(\".\").reduce<unknown>((acc: unknown, key: string) => {\r\n if (acc && typeof acc === \"object\" && acc !== null) {\r\n return (acc as Record<string, unknown>)[key];\r\n }\r\n return undefined;\r\n }, obj);\r\n}\r\n\r\n/**\r\n * Set a nested value in an object using a dot-notation path.\r\n * Creates intermediate objects/arrays as needed.\r\n * \r\n * @example\r\n * setNestedValue({}, 'user.name', 'John') => { user: { name: 'John' } }\r\n */\r\nexport function setNestedValue<T extends Record<string, unknown>>(\r\n obj: T,\r\n path: string,\r\n value: unknown\r\n): T {\r\n const keys = path.split(\".\");\r\n const result = { ...obj } as Record<string, unknown>;\r\n let current = result;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!(key in current) || typeof current[key] !== \"object\") {\r\n // Check if next key is numeric (array index)\r\n const nextKey = keys[i + 1];\r\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\r\n } else {\r\n current[key] = Array.isArray(current[key])\r\n ? [...(current[key] as unknown[])]\r\n : { ...(current[key] as Record<string, unknown>) };\r\n }\r\n current = current[key] as Record<string, unknown>;\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return result as T;\r\n}\r\n\r\n/**\r\n * Format bytes into a human-readable string.\r\n * \r\n * @example\r\n * formatBytes(1024) => '1 KB'\r\n * formatBytes(1234567) => '1.18 MB'\r\n */\r\nexport function formatBytes(bytes: number, decimals = 2): string {\r\n if (bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\r\n}\r\n\r\n/**\r\n * Flatten a nested object to dot-notation paths.\r\n * Useful for converting form library state (like dirtyFields, touchedFields)\r\n * to the flat format expected by FormState.\r\n * \r\n * @example\r\n * flattenNestedObject({ user: { name: true, email: true } })\r\n * // => { 'user.name': true, 'user.email': true }\r\n * \r\n * flattenNestedObject({ items: { 0: { title: true } } })\r\n * // => { 'items.0.title': true }\r\n */\r\nexport function flattenNestedObject(\r\n obj: Record<string, unknown>,\r\n prefix = ''\r\n): Record<string, boolean> {\r\n const result: Record<string, boolean> = {};\r\n\r\n for (const key in obj) {\r\n const path = prefix ? `${prefix}.${key}` : key;\r\n const value = obj[key];\r\n\r\n if (typeof value === 'boolean') {\r\n result[path] = value;\r\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\r\n Object.assign(result, flattenNestedObject(value as Record<string, unknown>, path));\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_zod","schema","import_zod","import_zod","schema","import_zod","import_zod","fieldsToZodSchema"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema/index.ts","../src/schema/fields-to-schema.ts","../src/schema/builders/text.ts","../src/schema/helpers.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","../src/utils/array.ts","../src/lib/utils.ts"],"sourcesContent":["/**\n * Schema utilities for BuzzForm.\n *\n * @example\n * import { createSchema } from '@buildnbuzz/buzzform';\n *\n * const loginSchema = createSchema([\n * { type: 'email', name: 'email', required: true },\n * { type: 'password', name: 'password', minLength: 8 },\n * ]);\n *\n * type LoginData = z.infer<typeof loginSchema>;\n */\n\n// =============================================================================\n// TYPES - Adapter Interface (no runtime code, just types)\n// =============================================================================\nexport type {\n FormState,\n SetValueOptions,\n FieldError,\n ResolverResult,\n Resolver,\n ArrayHelpers,\n AdapterOptions,\n FormAdapter,\n AdapterFactory,\n} from '../types';\n\n// =============================================================================\n// TYPES - Field Definitions\n// =============================================================================\nexport type {\n // Validation\n ValidationContext,\n ValidationResult,\n ValidationFn,\n\n // Conditional\n ConditionContext,\n FieldCondition,\n\n // Custom rendering\n FieldComponentProps,\n FieldInputProps,\n FieldInputRenderFn,\n\n // Styling\n FieldStyle,\n\n // Base\n BaseField,\n\n // Data fields\n TextField,\n EmailField,\n PasswordField,\n TextareaField,\n NumberField,\n DateField,\n DatetimeField,\n SelectOption,\n SelectField,\n CheckboxField,\n SwitchField,\n RadioField,\n TagsField,\n UploadField,\n\n // Layout fields\n GroupField,\n ArrayField,\n RowField,\n Tab,\n TabsField,\n CollapsibleField,\n\n // Union types\n Field,\n FieldType,\n DataField,\n LayoutField,\n} from '../types';\n\n// =============================================================================\n// TYPES - Form Configuration\n// =============================================================================\nexport type {\n BuzzFormSchema,\n FormSettings,\n FormConfig,\n UseFormOptions,\n} from '../types';\n\n// =============================================================================\n// TYPES - Schema Utilities\n// =============================================================================\nexport type {\n FieldToZod,\n FieldsToShape,\n SchemaBuilder,\n SchemaBuilderMap,\n InferSchema,\n} from '../types';\n\n// =============================================================================\n// SCHEMA\n// =============================================================================\nexport { createSchema } from './create-schema';\nexport { fieldsToZodSchema } from './fields-to-schema';\n\n// Re-export schema helpers for advanced usage (custom field builders)\nexport {\n extractValidationConfig,\n makeOptional,\n coerceToNumber,\n coerceToDate,\n getPatternErrorMessage,\n isFileLike,\n isFileTypeAccepted,\n // Helpers for cross-field validation (used by zodResolver)\n collectFieldValidators,\n getSiblingData,\n getValueByPath,\n type FieldValidator,\n} from './helpers';\n\n// Individual builders for registry integration\nexport * from './builders';\n\n// =============================================================================\n// UTILITIES (Server-safe - no React imports)\n// =============================================================================\nexport { createArrayHelpers } from '../utils';\n\n// Add common utilities that registry components will need\nexport { generateFieldId, getNestedValue, setNestedValue, formatBytes } from '../lib';","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 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 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 '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 { Field, FieldType, ValidationContext, ValidationFn } 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 { fn?: unknown; live?: boolean | { debounceMs?: number } };\n const fn = typeof obj.fn === 'function' ? obj.fn as ExtractableValidationFn : undefined;\n\n if (!obj.live) {\n return { fn, isLive: false };\n }\n\n const debounceMs = 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 ? `${basePath}.${tab.name}` : 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 '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(\n file: File,\n accept: string\n): 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","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 } from '../../types';\nimport { makeOptional } from '../helpers';\n\n// Base schema for select/radio values with user-friendly error messages\nconst selectValueSchema = z.union([\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], { error: 'Please select an option' });\n\nexport function createSelectFieldSchema(field: SelectField): z.ZodTypeAny {\n if (field.hasMany) {\n let arraySchema = z.array(selectValueSchema, { error: 'Invalid selection' });\n\n if (field.required) {\n arraySchema = arraySchema.min(1, 'Select at least one option');\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","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","import { nanoid } from 'nanoid';\nimport type { ArrayHelpers } from '../types';\n\n/**\n * Creates a standardized set of array field manipulation methods.\n * Abstracts the difference between getting/setting values in different form libraries.\n * \n * @param getArray - Function to get current array value at a path\n * @param setArray - Function to set array value at a path\n */\nexport function createArrayHelpers(\n getArray: (path: string) => unknown[],\n setArray: (path: string, value: unknown[]) => void\n): ArrayHelpers {\n return {\n fields: <T = unknown>(path: string): Array<T & { id: string }> => {\n const arr = getArray(path);\n if (!Array.isArray(arr)) return [];\n return arr.map((item, index) => ({\n id: (item as Record<string, unknown>)?.id as string || `${path}-${index}`,\n ...item as T,\n }));\n },\n\n append: (path: string, value: unknown) => {\n const current = getArray(path) || [];\n const itemWithId = ensureId(value);\n setArray(path, [...current, itemWithId]);\n },\n\n prepend: (path: string, value: unknown) => {\n const current = getArray(path) || [];\n const itemWithId = ensureId(value);\n setArray(path, [itemWithId, ...current]);\n },\n\n insert: (path: string, index: number, value: unknown) => {\n const current = [...(getArray(path) || [])];\n const itemWithId = ensureId(value);\n current.splice(index, 0, itemWithId);\n setArray(path, current);\n },\n\n remove: (path: string, index: number) => {\n const current = [...(getArray(path) || [])];\n current.splice(index, 1);\n setArray(path, current);\n },\n\n move: (path: string, from: number, to: number) => {\n const current = [...(getArray(path) || [])];\n const [item] = current.splice(from, 1);\n current.splice(to, 0, item);\n setArray(path, current);\n },\n\n swap: (path: string, indexA: number, indexB: number) => {\n const current = [...(getArray(path) || [])];\n const temp = current[indexA];\n current[indexA] = current[indexB];\n current[indexB] = temp;\n setArray(path, current);\n },\n\n replace: (path: string, values: unknown[]) => {\n const itemsWithIds = values.map(ensureId);\n setArray(path, itemsWithIds);\n },\n\n update: (path: string, index: number, value: unknown) => {\n const current = [...(getArray(path) || [])];\n // Preserve existing ID if present\n const existingId = (current[index] as Record<string, unknown>)?.id;\n current[index] = {\n ...(typeof value === 'object' && value !== null ? value : {}),\n id: existingId || nanoid(),\n };\n setArray(path, current);\n },\n };\n}\n\n/**\n * Ensures an item has a unique ID for React keys.\n */\nfunction ensureId(value: unknown): unknown {\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n if (!obj.id) {\n return { ...obj, id: nanoid() };\n }\n return obj;\n }\n return { value, id: nanoid() };\n}\n","// =============================================================================\n// COMMON UTILITIES\n// These are used by both the core package and registry field components.\n// =============================================================================\n\n/**\n * Generate a unique field ID from the field path.\n * Converts dot notation to dashes and prefixes with 'field-'.\n * Used for accessibility (htmlFor, id attributes).\n * \n * @example\n * generateFieldId('user.profile.email') => 'field-user-profile-email'\n * generateFieldId('items[0].name') => 'field-items-0-name'\n */\nexport function generateFieldId(path: string): string {\n return `field-${path.replace(/\\./g, \"-\").replace(/\\[/g, \"-\").replace(/\\]/g, \"\")}`;\n}\n\n/**\n * Safely retrieve a nested value from an object using a dot-notation path.\n * \n * @example\n * getNestedValue({ user: { name: 'John' } }, 'user.name') => 'John'\n * getNestedValue({ items: [{ id: 1 }] }, 'items.0.id') => 1\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || !path) return undefined;\n return path.split(\".\").reduce<unknown>((acc: unknown, key: string) => {\n if (acc && typeof acc === \"object\" && acc !== null) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Set a nested value in an object using a dot-notation path.\n * Creates intermediate objects/arrays as needed.\n * \n * @example\n * setNestedValue({}, 'user.name', 'John') => { user: { name: 'John' } }\n */\nexport function setNestedValue<T extends Record<string, unknown>>(\n obj: T,\n path: string,\n value: unknown\n): T {\n const keys = path.split(\".\");\n const result = { ...obj } as Record<string, unknown>;\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== \"object\") {\n // Check if next key is numeric (array index)\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n } else {\n current[key] = Array.isArray(current[key])\n ? [...(current[key] as unknown[])]\n : { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result as T;\n}\n\n/**\n * Format bytes into a human-readable string.\n * \n * @example\n * formatBytes(1024) => '1 KB'\n * formatBytes(1234567) => '1.18 MB'\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\n/**\n * Flatten a nested object to dot-notation paths.\n * Useful for converting form library state (like dirtyFields, touchedFields)\n * to the flat format expected by FormState.\n * \n * @example\n * flattenNestedObject({ user: { name: true, email: true } })\n * // => { 'user.name': true, 'user.email': true }\n * \n * flattenNestedObject({ items: { 0: { title: true } } })\n * // => { 'items.0.title': true }\n */\nexport function flattenNestedObject(\n obj: Record<string, unknown>,\n prefix = ''\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (typeof value === 'boolean') {\n result[path] = value;\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenNestedObject(value as Record<string, unknown>, path));\n }\n }\n\n return result;\n}\n\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","isFileTypeAccepted","import_zod","import_zod","fieldsToZodSchema"]}
|
package/dist/schema.mjs
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
applyCustomValidation,
|
|
3
|
-
coerceToDate,
|
|
4
|
-
coerceToNumber,
|
|
5
2
|
createArrayFieldSchema,
|
|
6
3
|
createCheckboxFieldSchema,
|
|
7
4
|
createDateFieldSchema,
|
|
@@ -16,24 +13,31 @@ import {
|
|
|
16
13
|
createTagsFieldSchema,
|
|
17
14
|
createTextFieldSchema,
|
|
18
15
|
createUploadFieldSchema,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
getPatternErrorMessage,
|
|
22
|
-
isFileLike,
|
|
23
|
-
isFileTypeAccepted,
|
|
24
|
-
makeOptional
|
|
25
|
-
} from "./chunk-K42S5YX3.mjs";
|
|
16
|
+
fieldsToZodSchema
|
|
17
|
+
} from "./chunk-HWDQN57Q.mjs";
|
|
26
18
|
import {
|
|
27
19
|
createArrayHelpers,
|
|
28
20
|
formatBytes,
|
|
29
21
|
generateFieldId,
|
|
30
22
|
getNestedValue,
|
|
31
23
|
setNestedValue
|
|
32
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-IMJ5FRK5.mjs";
|
|
25
|
+
import {
|
|
26
|
+
coerceToDate,
|
|
27
|
+
coerceToNumber,
|
|
28
|
+
collectFieldValidators,
|
|
29
|
+
extractValidationConfig,
|
|
30
|
+
getPatternErrorMessage,
|
|
31
|
+
getSiblingData,
|
|
32
|
+
getValueByPath,
|
|
33
|
+
isFileLike,
|
|
34
|
+
isFileTypeAccepted,
|
|
35
|
+
makeOptional
|
|
36
|
+
} from "./chunk-63LF7K4O.mjs";
|
|
33
37
|
export {
|
|
34
|
-
applyCustomValidation,
|
|
35
38
|
coerceToDate,
|
|
36
39
|
coerceToNumber,
|
|
40
|
+
collectFieldValidators,
|
|
37
41
|
createArrayFieldSchema,
|
|
38
42
|
createArrayHelpers,
|
|
39
43
|
createCheckboxFieldSchema,
|
|
@@ -55,6 +59,8 @@ export {
|
|
|
55
59
|
generateFieldId,
|
|
56
60
|
getNestedValue,
|
|
57
61
|
getPatternErrorMessage,
|
|
62
|
+
getSiblingData,
|
|
63
|
+
getValueByPath,
|
|
58
64
|
isFileLike,
|
|
59
65
|
isFileTypeAccepted,
|
|
60
66
|
makeOptional,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { F as Field, V as ValidationContext, K as FieldType, A as ArrayHelpers } from './adapter-
|
|
2
|
+
import { F as Field, T as TextField, E as EmailField, P as PasswordField, o as TextareaField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, s as CheckboxField, t as SwitchField, u as RadioField, w as TagsField, x as UploadField, G as GroupField, y as ArrayField, z as RowField, I as TabsField, J as CollapsibleField, V as ValidationContext, K as FieldType, i as ValidationFn, A as ArrayHelpers } from './adapter-nQW28cyO.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Maps a BuzzForm field definition to its corresponding Zod type.
|
|
@@ -105,85 +105,98 @@ type SchemaBuilderMap = {
|
|
|
105
105
|
type InferSchema<T extends z.ZodTypeAny> = z.infer<T>;
|
|
106
106
|
|
|
107
107
|
/**
|
|
108
|
-
*
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
* Strict field typing utilities for compile-time validation.
|
|
109
|
+
*/
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Maps field type literals to their corresponding interface.
|
|
113
|
+
*/
|
|
114
|
+
interface FieldTypeMap {
|
|
115
|
+
text: TextField;
|
|
116
|
+
email: EmailField;
|
|
117
|
+
password: PasswordField;
|
|
118
|
+
textarea: TextareaField;
|
|
119
|
+
number: NumberField;
|
|
120
|
+
date: DateField;
|
|
121
|
+
datetime: DatetimeField;
|
|
122
|
+
select: SelectField;
|
|
123
|
+
checkbox: CheckboxField;
|
|
124
|
+
switch: SwitchField;
|
|
125
|
+
radio: RadioField;
|
|
126
|
+
tags: TagsField;
|
|
127
|
+
upload: UploadField;
|
|
128
|
+
group: GroupField;
|
|
129
|
+
array: ArrayField;
|
|
130
|
+
row: RowField;
|
|
131
|
+
tabs: TabsField;
|
|
132
|
+
collapsible: CollapsibleField;
|
|
133
|
+
}
|
|
134
|
+
type FieldTypeLiteral = keyof FieldTypeMap;
|
|
135
|
+
/**
|
|
136
|
+
* Resolves a field object to its strict interface based on the `type` property.
|
|
137
|
+
*/
|
|
138
|
+
type StrictFieldByType<T> = T extends {
|
|
139
|
+
type: infer Type extends FieldTypeLiteral;
|
|
140
|
+
} ? FieldTypeMap[Type] : T extends Field ? T : never;
|
|
141
|
+
/**
|
|
142
|
+
* Validates an array of fields, ensuring each matches its declared type's interface.
|
|
143
|
+
*/
|
|
144
|
+
type StrictFieldArray<T extends readonly unknown[]> = {
|
|
145
|
+
[K in keyof T]: StrictFieldByType<T[K]>;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Creates a Zod schema from field definitions with strict type validation.
|
|
112
150
|
*
|
|
113
151
|
* @example
|
|
114
|
-
* const
|
|
115
|
-
* { type: 'email', name: 'email', required: true },
|
|
152
|
+
* const schema = createSchema([
|
|
153
|
+
* { type: 'email', name: 'email', required: true },
|
|
116
154
|
* { type: 'password', name: 'password', minLength: 8 },
|
|
117
155
|
* ]);
|
|
118
156
|
*
|
|
119
|
-
* type
|
|
120
|
-
* // { email: string; password: string }
|
|
121
|
-
*
|
|
122
|
-
* // Use with useForm:
|
|
123
|
-
* const form = useForm({ schema: loginSchema });
|
|
124
|
-
*
|
|
125
|
-
* // Access fields for rendering:
|
|
126
|
-
* <FormRenderer fields={loginSchema.fields} />
|
|
157
|
+
* type FormData = z.infer<typeof schema>;
|
|
127
158
|
*/
|
|
128
|
-
declare function createSchema<const T extends readonly Field[]>(fields:
|
|
129
|
-
[K in keyof T]: T[K] extends Field ? T[K] : Field;
|
|
130
|
-
}]): z.ZodObject<FieldsToShape<T>> & {
|
|
159
|
+
declare function createSchema<const T extends readonly Field[]>(fields: StrictFieldArray<T> & T): z.ZodObject<FieldsToShape<T>> & {
|
|
131
160
|
fields: T;
|
|
132
161
|
};
|
|
133
162
|
|
|
134
163
|
/**
|
|
135
|
-
* Converts
|
|
136
|
-
*
|
|
164
|
+
* Converts field definitions to a Zod schema.
|
|
165
|
+
*
|
|
166
|
+
* Note: Custom validation (field.validate) is handled by the zodResolver,
|
|
167
|
+
* not at the schema level. This ensures custom validators run even when
|
|
168
|
+
* other fields have errors.
|
|
137
169
|
*/
|
|
138
170
|
declare function fieldsToZodSchema<T extends readonly Field[]>(fields: T): z.ZodObject<FieldsToShape<T>>;
|
|
139
171
|
|
|
140
|
-
/**
|
|
141
|
-
* A validation function that can be extracted from a field.
|
|
142
|
-
*/
|
|
143
172
|
type ExtractableValidationFn = (value: unknown, context: ValidationContext) => true | string | Promise<true | string>;
|
|
144
173
|
interface ExtractedValidationConfig {
|
|
145
|
-
/** The validation function (if any) */
|
|
146
174
|
fn?: ExtractableValidationFn;
|
|
147
|
-
/** Whether this is a live validation */
|
|
148
175
|
isLive: boolean;
|
|
149
|
-
/** Debounce milliseconds for live validation */
|
|
150
176
|
debounceMs?: number;
|
|
151
177
|
}
|
|
152
|
-
/**
|
|
153
|
-
* Extracts validation function and config from the unified validate property.
|
|
154
|
-
*/
|
|
155
178
|
declare function extractValidationConfig(validate?: unknown): ExtractedValidationConfig;
|
|
179
|
+
interface FieldValidator {
|
|
180
|
+
path: string;
|
|
181
|
+
fn: ValidationFn;
|
|
182
|
+
}
|
|
156
183
|
/**
|
|
157
|
-
*
|
|
158
|
-
* Standardizes the pattern across all field types.
|
|
184
|
+
* Recursively collects all field validators from a field array.
|
|
159
185
|
*/
|
|
160
|
-
declare function
|
|
186
|
+
declare function collectFieldValidators(fields: readonly Field[], basePath?: string): FieldValidator[];
|
|
161
187
|
/**
|
|
162
|
-
*
|
|
163
|
-
* Different field types have different "empty" representations.
|
|
188
|
+
* Gets the parent object containing the field at the given path.
|
|
164
189
|
*/
|
|
165
|
-
declare function
|
|
190
|
+
declare function getSiblingData(data: Record<string, unknown>, path: string): Record<string, unknown>;
|
|
166
191
|
/**
|
|
167
|
-
*
|
|
168
|
-
* Empty/null/undefined → undefined, otherwise Number().
|
|
192
|
+
* Gets a value at a dot-notation path.
|
|
169
193
|
*/
|
|
194
|
+
declare function getValueByPath(data: Record<string, unknown>, path: string): unknown;
|
|
195
|
+
declare function makeOptional(schema: z.ZodTypeAny, fieldType: FieldType): z.ZodTypeAny;
|
|
170
196
|
declare function coerceToNumber(val: unknown): number | undefined;
|
|
171
|
-
/**
|
|
172
|
-
* Coerces a value to a Date.
|
|
173
|
-
* Handles strings, numbers, and Date objects.
|
|
174
|
-
*/
|
|
175
197
|
declare function coerceToDate(val: unknown): Date | undefined;
|
|
176
|
-
/**
|
|
177
|
-
* Gets a human-readable error message for a regex pattern.
|
|
178
|
-
*/
|
|
179
198
|
declare function getPatternErrorMessage(pattern: string | RegExp): string;
|
|
180
|
-
/**
|
|
181
|
-
* Checks if a value is a File-like object.
|
|
182
|
-
*/
|
|
183
199
|
declare function isFileLike(value: unknown): value is File;
|
|
184
|
-
/**
|
|
185
|
-
* Validates file type against accept pattern.
|
|
186
|
-
*/
|
|
187
200
|
declare function isFileTypeAccepted(file: File, accept: string): boolean;
|
|
188
201
|
|
|
189
202
|
/**
|
|
@@ -230,4 +243,4 @@ declare function setNestedValue<T extends Record<string, unknown>>(obj: T, path:
|
|
|
230
243
|
*/
|
|
231
244
|
declare function formatBytes(bytes: number, decimals?: number): string;
|
|
232
245
|
|
|
233
|
-
export { type FieldToZod as F, type InferSchema as I, type SchemaBuilder as S, type FieldsToShape as a, type SchemaBuilderMap as b, createSchema as c,
|
|
246
|
+
export { type FieldToZod as F, type InferSchema as I, type SchemaBuilder as S, type FieldsToShape as a, type SchemaBuilderMap as b, createSchema as c, coerceToNumber as d, extractValidationConfig as e, fieldsToZodSchema as f, coerceToDate as g, getPatternErrorMessage as h, isFileLike as i, isFileTypeAccepted as j, createArrayHelpers as k, generateFieldId as l, makeOptional as m, getNestedValue as n, formatBytes as o, collectFieldValidators as p, getSiblingData as q, getValueByPath as r, setNestedValue as s, type FieldValidator as t };
|