@formality-ui/core 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -93
- package/dist/index.cjs +245 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +111 -16
- package/dist/index.d.ts +111 -16
- package/dist/index.js +245 -26
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/expression/context.ts","../src/expression/evaluate.ts","../src/expression/infer.ts","../src/conditions/evaluate.ts","../src/validation/validate.ts","../src/validation/messages.ts","../src/transform/pipeline.ts","../src/config/merge.ts","../src/config/defaults.ts","../src/labels/resolve.ts"],"names":["left","leftValue","jsep","pattern"],"mappings":"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","file":"index.cjs","sourcesContent":["// @formality-ui/core - Expression Context Building\n// Implements the Dual Context Mapping pattern for expression evaluation\n\nimport type { FormState, FieldState, FieldError } from '../types';\n\n/**\n * Qualified prefixes that should NOT be auto-transformed\n */\nexport const QUALIFIED_PREFIXES = [\n 'fields',\n 'record',\n 'errors',\n 'defaultValues',\n 'touchedFields',\n 'dirtyFields',\n 'props',\n] as const;\n\n/**\n * JavaScript keywords to skip during field inference\n */\nexport const KEYWORDS = [\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'typeof',\n 'instanceof',\n 'new',\n 'this',\n 'if',\n 'else',\n 'return',\n] as const;\n\n/**\n * Known field state properties that should be accessed directly on the field state\n */\nconst FIELD_STATE_PROPERTIES = new Set([\n 'value',\n 'isTouched',\n 'isDirty',\n 'isValidating',\n 'error',\n 'invalid',\n]);\n\n/**\n * Symbol to identify field state proxies for unwrapping in expressions\n */\nexport const FIELD_PROXY_MARKER = Symbol.for('formality.fieldProxy');\n\n/**\n * Symbol to get the raw value from a field proxy\n */\nexport const FIELD_PROXY_VALUE = Symbol.for('formality.fieldProxyValue');\n\n/**\n * Create a proxy for a field state that:\n * - Returns field state properties (isTouched, isDirty, etc.) when accessed\n * - Delegates unknown properties to value[prop] for object values\n * - Coerces to the value for primitive operations\n *\n * This allows both:\n * - `client` and `client.value` to return the same thing\n * - `client.isTouched` to return the touched state\n * - `client.id` to return value.id (for object values)\n */\nexport function createFieldStateProxy(fieldState: FieldState | { value: unknown }): unknown {\n // If value is null/undefined or primitive, we still need the proxy for metadata access\n const proxy = new Proxy(fieldState as object, {\n get(target: FieldState | { value: unknown }, prop: string | symbol) {\n // Marker to identify this as a field proxy\n if (prop === FIELD_PROXY_MARKER) {\n return true;\n }\n\n // Allow extracting raw value for expression evaluation\n if (prop === FIELD_PROXY_VALUE) {\n return target.value;\n }\n\n // Symbol.toPrimitive for type coercion (comparisons, string concat, etc.)\n if (prop === Symbol.toPrimitive) {\n return (_hint: string) => target.value;\n }\n\n // Known field state properties - return from field state\n if (typeof prop === 'string' && FIELD_STATE_PROPERTIES.has(prop)) {\n return (target as Record<string, unknown>)[prop];\n }\n\n // Unknown property - delegate to value\n const value = target.value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n return (value as Record<string, unknown>)[prop as string];\n }\n\n return undefined;\n },\n });\n\n return proxy;\n}\n\n/**\n * Check if a value is a field state proxy\n */\nexport function isFieldProxy(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as Record<symbol, unknown>)[FIELD_PROXY_MARKER] === true\n );\n}\n\n/**\n * Unwrap a field proxy to get its primitive value for boolean/comparison contexts\n */\nexport function unwrapFieldProxy(value: unknown): unknown {\n if (isFieldProxy(value)) {\n return (value as Record<symbol, unknown>)[FIELD_PROXY_VALUE];\n }\n return value;\n}\n\n/**\n * Build evaluation context for form-level expressions\n *\n * Implements Dual Context Mapping:\n * - Provides field values at BOTH qualified (fields.client.value) AND unqualified (client) levels\n * - Qualified paths take precedence on name collision\n *\n * @param fields - Map of field names to field states\n * @param record - Original record passed to form\n * @param errors - Map of field names to errors\n * @param defaultValues - Initial/default values for fields\n * @param touchedFields - Map of touched field names\n * @param dirtyFields - Map of dirty field names\n * @returns Evaluation context object\n */\nexport function buildFormContext(\n fields: Record<string, FieldState>,\n record?: Record<string, unknown>,\n errors?: Record<string, FieldError | undefined>,\n defaultValues?: Record<string, unknown>,\n touchedFields?: Record<string, boolean>,\n dirtyFields?: Record<string, boolean>\n): Record<string, unknown> {\n const context: Record<string, unknown> = {};\n\n // Add qualified paths first (these take precedence)\n context.fields = fields;\n context.record = record ?? {};\n context.errors = errors ?? {};\n context.defaultValues = defaultValues ?? {};\n context.touchedFields = touchedFields ?? {};\n context.dirtyFields = dirtyFields ?? {};\n\n // Add unqualified shortcuts as proxies\n // This allows:\n // - \"client\" to resolve to the value (via proxy unwrapping)\n // - \"client.value\" to also resolve to the value\n // - \"client.isTouched\" to resolve to field state metadata\n // - \"client.id\" to resolve to value.id (for object values)\n for (const [fieldName, fieldState] of Object.entries(fields)) {\n // Don't override qualified prefixes\n if (!(fieldName in context)) {\n context[fieldName] = createFieldStateProxy(fieldState);\n }\n }\n\n return context;\n}\n\n/**\n * Build evaluation context for field-level expressions\n *\n * Extends form context with field-specific props (including field name).\n * This enables expressions like \"props.name\" to resolve to the current field name.\n *\n * @param formState - Complete form state\n * @param fieldName - Current field name (added to props.name)\n * @param additionalProps - Additional props to merge\n * @returns Evaluation context object\n */\nexport function buildFieldContext(\n formState: FormState,\n fieldName: string,\n additionalProps?: Record<string, unknown>\n): Record<string, unknown> {\n const context = buildFormContext(\n formState.fields,\n formState.record,\n formState.errors,\n formState.defaultValues,\n formState.touchedFields,\n formState.dirtyFields\n );\n\n // Add field-specific props\n context.props = {\n name: fieldName,\n ...additionalProps,\n };\n\n return context;\n}\n\n/**\n * Field state input for building evaluation context\n */\ninterface FieldStateForContext {\n value: unknown;\n isTouched?: boolean;\n isDirty?: boolean;\n isValidating?: boolean;\n error?: unknown;\n invalid?: boolean;\n}\n\n/**\n * Build a minimal evaluation context from field values\n *\n * Used when you only have raw values (not full FieldState objects).\n * Useful for condition evaluation with watched values.\n *\n * @param fieldValues - Map of field names to their current values\n * @param record - Optional record for record.* access\n * @param props - Optional props for props.* access\n * @param fieldStates - Optional full field states with metadata (isTouched, isDirty, etc.)\n * @returns Evaluation context object\n */\nexport function buildEvaluationContext(\n fieldValues: Record<string, unknown>,\n record?: Record<string, unknown>,\n props?: Record<string, unknown>,\n fieldStates?: Record<string, FieldStateForContext>\n): Record<string, unknown> {\n const context: Record<string, unknown> = {};\n\n // Build fields object - use full field states if available, otherwise just values\n const fields: Record<string, FieldStateForContext> = {};\n for (const [name, value] of Object.entries(fieldValues)) {\n if (fieldStates && fieldStates[name]) {\n // Use full field state with metadata\n fields[name] = fieldStates[name];\n } else {\n // Fall back to minimal state with just value\n fields[name] = { value };\n }\n }\n\n // Add qualified paths\n context.fields = fields;\n context.record = record ?? {};\n context.props = props ?? {};\n\n // Add unqualified shortcuts as proxies\n // Proxies enable accessing both value and metadata (isTouched, isDirty, etc.)\n for (const [fieldName] of Object.entries(fieldValues)) {\n if (!(fieldName in context)) {\n context[fieldName] = createFieldStateProxy(fields[fieldName]);\n }\n }\n\n return context;\n}\n","// @formality-ui/core - Expression Evaluation\n// Uses jsep for parsing and custom evaluation for safe expression execution\n\nimport jsep from 'jsep';\nimport { unwrapFieldProxy } from './context';\n\n// jsep AST node types\ntype Expression = jsep.Expression;\ntype Identifier = jsep.Identifier;\ntype Literal = jsep.Literal;\ntype MemberExpression = jsep.MemberExpression;\ntype BinaryExpression = jsep.BinaryExpression;\n// LogicalExpression uses the same type as BinaryExpression in newer jsep versions\ntype LogicalExpression = jsep.BinaryExpression;\ntype UnaryExpression = jsep.UnaryExpression;\ntype ConditionalExpression = jsep.ConditionalExpression;\ntype CallExpression = jsep.CallExpression;\ntype ArrayExpression = jsep.ArrayExpression;\ntype Compound = jsep.Compound;\n\n/**\n * Evaluation context type\n */\nexport type EvaluationContext = Record<string, unknown>;\n\n/**\n * Get a property from an object safely\n */\nfunction getProperty(obj: unknown, key: string): unknown {\n if (obj === null || obj === undefined) {\n return undefined;\n }\n if (typeof obj === 'object') {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n}\n\n/**\n * Evaluate an AST node against a context\n */\nfunction evaluateNode(node: Expression, context: EvaluationContext): unknown {\n switch (node.type) {\n case 'Literal':\n return (node as Literal).value;\n\n case 'Identifier':\n return context[(node as Identifier).name];\n\n case 'MemberExpression': {\n const memberNode = node as MemberExpression;\n const object = evaluateNode(memberNode.object, context);\n if (memberNode.computed) {\n // bracket notation: obj[expr]\n const property = evaluateNode(memberNode.property, context);\n return getProperty(object, String(property));\n } else {\n // dot notation: obj.prop\n return getProperty(object, (memberNode.property as Identifier).name);\n }\n }\n\n case 'BinaryExpression': {\n const binaryNode = node as BinaryExpression;\n\n // Logical operators need short-circuit evaluation\n // (newer jsep versions treat these as BinaryExpression)\n switch (binaryNode.operator) {\n case '&&': {\n const left = evaluateNode(binaryNode.left, context);\n // Unwrap proxy for truthiness check\n const leftValue = unwrapFieldProxy(left);\n return leftValue ? evaluateNode(binaryNode.right, context) : leftValue;\n }\n case '||': {\n const left = evaluateNode(binaryNode.left, context);\n // Unwrap proxy for truthiness check\n const leftValue = unwrapFieldProxy(left);\n return leftValue ? leftValue : evaluateNode(binaryNode.right, context);\n }\n case '??': {\n const left = evaluateNode(binaryNode.left, context);\n // Unwrap proxy for null/undefined check\n const leftValue = unwrapFieldProxy(left);\n return leftValue !== null && leftValue !== undefined\n ? leftValue\n : evaluateNode(binaryNode.right, context);\n }\n }\n\n // Non-short-circuit operators evaluate both sides\n const left = evaluateNode(binaryNode.left, context);\n const right = evaluateNode(binaryNode.right, context);\n // Unwrap proxies for comparison/arithmetic operations\n const leftValue = unwrapFieldProxy(left);\n const rightValue = unwrapFieldProxy(right);\n\n switch (binaryNode.operator) {\n case '+':\n return (leftValue as number) + (rightValue as number);\n case '-':\n return (leftValue as number) - (rightValue as number);\n case '*':\n return (leftValue as number) * (rightValue as number);\n case '/':\n return (leftValue as number) / (rightValue as number);\n case '%':\n return (leftValue as number) % (rightValue as number);\n case '===':\n return leftValue === rightValue;\n case '!==':\n return leftValue !== rightValue;\n case '==':\n // eslint-disable-next-line eqeqeq\n return leftValue == rightValue;\n case '!=':\n // eslint-disable-next-line eqeqeq\n return leftValue != rightValue;\n case '<':\n return (leftValue as number) < (rightValue as number);\n case '>':\n return (leftValue as number) > (rightValue as number);\n case '<=':\n return (leftValue as number) <= (rightValue as number);\n case '>=':\n return (leftValue as number) >= (rightValue as number);\n default:\n throw new Error(`Unknown binary operator: ${binaryNode.operator}`);\n }\n }\n\n case 'LogicalExpression': {\n const logicalNode = node as LogicalExpression;\n const left = evaluateNode(logicalNode.left, context);\n // Unwrap proxy for truthiness/null checks\n const leftValue = unwrapFieldProxy(left);\n\n switch (logicalNode.operator) {\n case '&&':\n // Short-circuit: only evaluate right if left is truthy\n return leftValue ? evaluateNode(logicalNode.right, context) : leftValue;\n case '||':\n // Short-circuit: only evaluate right if left is falsy\n return leftValue ? leftValue : evaluateNode(logicalNode.right, context);\n case '??':\n // Nullish coalescing: only evaluate right if left is null/undefined\n return leftValue !== null && leftValue !== undefined\n ? leftValue\n : evaluateNode(logicalNode.right, context);\n default:\n throw new Error(`Unknown logical operator: ${logicalNode.operator}`);\n }\n }\n\n case 'UnaryExpression': {\n const unaryNode = node as UnaryExpression;\n const argument = evaluateNode(unaryNode.argument, context);\n // Unwrap proxy for unary operations\n const argValue = unwrapFieldProxy(argument);\n\n switch (unaryNode.operator) {\n case '!':\n return !argValue;\n case '-':\n return -(argValue as number);\n case '+':\n return +(argValue as number);\n case 'typeof':\n return typeof argValue;\n default:\n throw new Error(`Unknown unary operator: ${unaryNode.operator}`);\n }\n }\n\n case 'ConditionalExpression': {\n const condNode = node as ConditionalExpression;\n const test = evaluateNode(condNode.test, context);\n // Unwrap proxy for truthiness check\n const testValue = unwrapFieldProxy(test);\n return testValue\n ? evaluateNode(condNode.consequent, context)\n : evaluateNode(condNode.alternate, context);\n }\n\n case 'ArrayExpression': {\n const arrayNode = node as ArrayExpression;\n return arrayNode.elements.map((element) =>\n element ? evaluateNode(element, context) : undefined\n );\n }\n\n case 'CallExpression': {\n // We don't allow function calls for security\n throw new Error('Function calls are not allowed in expressions');\n }\n\n case 'Compound': {\n // Compound expressions (multiple statements) - evaluate last one\n const compoundNode = node as Compound;\n let result: unknown;\n for (const bodyNode of compoundNode.body) {\n result = evaluateNode(bodyNode, context);\n }\n return result;\n }\n\n default:\n throw new Error(`Unknown node type: ${node.type}`);\n }\n}\n\n/**\n * Parse and cache expression ASTs\n */\nconst astCache = new Map<string, Expression>();\n\nfunction parseExpression(expr: string): Expression {\n const cached = astCache.get(expr);\n if (cached) {\n return cached;\n }\n\n const ast = jsep(expr);\n astCache.set(expr, ast);\n return ast;\n}\n\n/**\n * Evaluate a string expression against a context object\n *\n * @param expr - Expression string (e.g., \"client.id\", \"client && signed\")\n * @param context - Evaluation context with field values\n * @returns The evaluated result\n *\n * @example\n * evaluate(\"client.id\", { client: { id: 5 } }) // → 5\n * evaluate(\"client && signed\", { client: { id: 5 }, signed: true }) // → true\n * evaluate(\"signed ? 'Yes' : 'No'\", { signed: true }) // → 'Yes'\n */\nexport function evaluate(expr: string, context: EvaluationContext): unknown {\n try {\n const ast = parseExpression(expr);\n const result = evaluateNode(ast, context);\n // Unwrap proxy to return raw value\n const unwrapped = unwrapFieldProxy(result);\n return unwrapped;\n } catch (error) {\n // Log error in development, return undefined in production\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Expression evaluation error for \"${expr}\":`, error);\n }\n return undefined;\n }\n}\n\n/**\n * Evaluate a SelectValue descriptor\n *\n * Handles string expressions, objects with nested expressions, and arrays.\n * Does NOT handle functions - those must be handled by the framework adapter.\n *\n * @param descriptor - The SelectValue to evaluate\n * @param context - Evaluation context\n * @returns The evaluated result\n */\nexport function evaluateDescriptor(\n descriptor: unknown,\n context: EvaluationContext\n): unknown {\n // String: evaluate as expression\n if (typeof descriptor === 'string') {\n return evaluate(descriptor, context);\n }\n\n // Function: return as-is (framework adapter handles this)\n if (typeof descriptor === 'function') {\n return descriptor;\n }\n\n // Array: evaluate each element\n if (Array.isArray(descriptor)) {\n return descriptor.map((item) => evaluateDescriptor(item, context));\n }\n\n // Object: evaluate each value\n if (descriptor !== null && typeof descriptor === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(descriptor)) {\n result[key] = evaluateDescriptor(value, context);\n }\n return result;\n }\n\n // Primitive values: return as-is\n return descriptor;\n}\n\n/**\n * Clear the expression AST cache\n * Useful for testing or memory management\n */\nexport function clearExpressionCache(): void {\n astCache.clear();\n}\n","// @formality-ui/core - Field Dependency Inference\n// Extracts field dependencies from expressions for automatic subscription\n\nimport { QUALIFIED_PREFIXES, KEYWORDS } from './context';\n\n/**\n * Regular expression to match valid JavaScript identifiers\n */\nconst IDENTIFIER_REGEX = /\\b([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g;\n\n/**\n * Set of JavaScript keywords to skip\n */\nconst KEYWORD_SET = new Set<string>(KEYWORDS);\n\n/**\n * Set of qualified prefixes that may or may not be field names\n */\nconst QUALIFIED_PREFIX_SET = new Set<string>(QUALIFIED_PREFIXES);\n\n/**\n * Extract field names from an expression string\n *\n * Scans the expression for unqualified identifiers that represent field names.\n * Skips JavaScript keywords. Qualified prefixes (fields, record, props, etc.)\n * are only skipped when followed by a dot.\n *\n * @param expr - Expression string to analyze\n * @returns Array of unique field names referenced\n *\n * @example\n * inferFieldsFromExpression(\"client.id\") // → [\"client\"]\n * inferFieldsFromExpression(\"client && signed\") // → [\"client\", \"signed\"]\n * inferFieldsFromExpression(\"record.name\") // → [] (qualified path)\n * inferFieldsFromExpression(\"true && false\") // → [] (keywords)\n * inferFieldsFromExpression(\"fields === null\") // → [\"fields\"] (not followed by dot)\n */\nexport function inferFieldsFromExpression(expr: string): string[] {\n const fields: string[] = [];\n let match: RegExpExecArray | null;\n\n // Reset regex state\n IDENTIFIER_REGEX.lastIndex = 0;\n\n while ((match = IDENTIFIER_REGEX.exec(expr)) !== null) {\n const identifier = match[1];\n\n // Skip JavaScript keywords\n if (KEYWORD_SET.has(identifier)) {\n continue;\n }\n\n // Check if this identifier is a property access (e.g., .id in client.id)\n // by looking at what comes before it in the string\n const beforeMatch = expr.slice(0, match.index);\n const lastNonWhitespace = beforeMatch.trimEnd().slice(-1);\n\n // If preceded by '.', it's a property access, skip it\n if (lastNonWhitespace === '.') {\n continue;\n }\n\n // Check if this is a qualified prefix followed by a dot\n // (e.g., \"fields\" in \"fields.client\" - skip it)\n // But \"fields\" NOT followed by a dot is a field reference\n const afterMatch = expr.slice(match.index + identifier.length);\n if (afterMatch.startsWith('.') && QUALIFIED_PREFIX_SET.has(identifier)) {\n continue;\n }\n\n fields.push(identifier);\n }\n\n // Return unique field names\n return [...new Set(fields)];\n}\n\n/**\n * Extract field dependencies from a SelectValue descriptor\n *\n * Recursively processes string expressions, objects, and arrays.\n * Does NOT analyze function bodies - those require explicit subscribesTo.\n *\n * @param descriptor - SelectValue to analyze (string, object, array, or function)\n * @returns Array of unique field names referenced\n *\n * @example\n * inferFieldsFromDescriptor(\"client.id\") // → [\"client\"]\n * inferFieldsFromDescriptor({ queryParams: \"client.id\", filter: \"signed\" }) // → [\"client\", \"signed\"]\n * inferFieldsFromDescriptor([\"client\", \"contact.name\"]) // → [\"client\", \"contact\"]\n * inferFieldsFromDescriptor(() => {}) // → [] (functions need explicit subscribesTo)\n */\nexport function inferFieldsFromDescriptor(descriptor: unknown): string[] {\n // String: extract fields from expression\n if (typeof descriptor === 'string') {\n return inferFieldsFromExpression(descriptor);\n }\n\n // Function: cannot analyze, return empty (needs explicit subscribesTo)\n if (typeof descriptor === 'function') {\n return [];\n }\n\n // Array: collect fields from all elements\n if (Array.isArray(descriptor)) {\n const allFields: string[] = [];\n for (const item of descriptor) {\n allFields.push(...inferFieldsFromDescriptor(item));\n }\n return [...new Set(allFields)];\n }\n\n // Object: collect fields from all values\n if (descriptor !== null && typeof descriptor === 'object') {\n const allFields: string[] = [];\n for (const value of Object.values(descriptor)) {\n allFields.push(...inferFieldsFromDescriptor(value));\n }\n return [...new Set(allFields)];\n }\n\n // Primitive values: no fields\n return [];\n}\n","// @formality-ui/core - Condition Evaluation\n// Pure functions for evaluating conditions against form state\n// ZERO framework dependencies\n\nimport type { ConditionDescriptor, ConditionResult } from '../types';\nimport { evaluate, evaluateDescriptor } from '../expression/evaluate';\nimport { buildEvaluationContext, unwrapFieldProxy } from '../expression/context';\nimport { inferFieldsFromDescriptor } from '../expression/infer';\n\n/**\n * Field state with metadata for expression evaluation\n */\nexport interface FieldStateInput {\n value: unknown;\n isTouched?: boolean;\n isDirty?: boolean;\n isValidating?: boolean;\n error?: unknown;\n invalid?: boolean;\n}\n\n/**\n * Input for condition evaluation\n */\nexport interface EvaluateConditionsInput {\n /** Array of conditions to evaluate */\n conditions: ConditionDescriptor[];\n\n /** Map of field names to their current values */\n fieldValues: Record<string, unknown>;\n\n /** Optional: Full field states with metadata (isTouched, isDirty, etc.) */\n fieldStates?: Record<string, FieldStateInput>;\n\n /** Original record passed to form */\n record?: Record<string, unknown>;\n\n /** Additional props for expression context */\n props?: Record<string, unknown>;\n}\n\n/**\n * Check if a condition matches based on its trigger and matchers\n *\n * Handles both 'when' (field reference) and 'selectWhen' (expression) triggers,\n * and applies 'is' (exact match) or 'truthy' (boolean check) matchers.\n *\n * @param condition - The condition to check\n * @param context - Evaluation context with field values\n * @param fieldValues - Direct field values map for 'when' lookup\n * @returns true if the condition matches, false otherwise\n */\nfunction evaluateConditionMatch(\n condition: ConditionDescriptor,\n context: Record<string, unknown>,\n fieldValues: Record<string, unknown>\n): boolean {\n let triggerValue: unknown;\n\n // Determine trigger value\n if (condition.when !== undefined) {\n // Simple field reference: look up field value directly\n triggerValue = fieldValues[condition.when];\n } else if (condition.selectWhen !== undefined) {\n // Expression or function trigger\n if (typeof condition.selectWhen === 'string') {\n triggerValue = evaluate(condition.selectWhen, context);\n } else if (typeof condition.selectWhen === 'function') {\n // Functions are evaluated by the framework adapter\n // Core returns the function as-is for the adapter to call\n return false; // Framework adapter handles this case\n } else {\n // Object/array descriptor\n triggerValue = evaluateDescriptor(condition.selectWhen, context);\n }\n } else {\n // No trigger defined - condition doesn't match\n return false;\n }\n\n // Apply matchers\n if (condition.is !== undefined) {\n // Exact value match\n return triggerValue === condition.is;\n }\n\n if (condition.truthy !== undefined) {\n // Boolean truthiness check\n const isTruthy = Boolean(triggerValue);\n return condition.truthy ? isTruthy : !isTruthy;\n }\n\n // Default: truthy check if no matcher specified\n return Boolean(triggerValue);\n}\n\n/**\n * Evaluate all conditions for a field/group\n *\n * Implements the condition evaluation rules:\n * - disabled: OR logic (any true = true)\n * - visible: AND logic (any false = false)\n * - setValue: last matching condition wins\n *\n * @param input - Evaluation input with conditions and state\n * @returns Result with resolved disabled, visible, and setValue states\n *\n * @example\n * const result = evaluateConditions({\n * conditions: [\n * { when: 'signed', is: false, disabled: true },\n * { when: 'archived', truthy: true, visible: false },\n * ],\n * fieldValues: { signed: false, archived: true },\n * });\n * // result.disabled === true (signed is false, matches first condition)\n * // result.visible === false (archived is truthy, matches second condition)\n */\nexport function evaluateConditions(\n input: EvaluateConditionsInput\n): ConditionResult {\n const { conditions, fieldValues, fieldStates, record, props } = input;\n\n // Build evaluation context for expressions\n // Pass fieldStates to enable access to isTouched, isDirty, etc.\n const context = buildEvaluationContext(fieldValues, record, props, fieldStates);\n\n // Initialize result tracking\n let disabled: boolean | undefined;\n let visible: boolean | undefined;\n let setValue: unknown | undefined;\n let hasDisabledCondition = false;\n let hasVisibleCondition = false;\n let hasSetCondition = false;\n\n // Evaluate each condition in order\n for (const condition of conditions) {\n const isMatched = evaluateConditionMatch(condition, context, fieldValues);\n\n if (!isMatched) {\n continue;\n }\n\n // Apply disabled action (OR logic: any true = true)\n if (condition.disabled !== undefined) {\n hasDisabledCondition = true;\n disabled = (disabled ?? false) || condition.disabled;\n }\n\n // Apply visible action (AND logic: any false = false)\n if (condition.visible !== undefined) {\n hasVisibleCondition = true;\n // Start with true on first visible condition, then AND subsequent values\n visible = visible === undefined ? condition.visible : visible && condition.visible;\n }\n\n // Apply setValue action (last matching wins)\n if (condition.set !== undefined) {\n hasSetCondition = true;\n setValue = condition.set;\n } else if (condition.selectSet !== undefined) {\n hasSetCondition = true;\n if (typeof condition.selectSet === 'string') {\n // Unwrap proxy to get raw value for setting\n setValue = unwrapFieldProxy(evaluate(condition.selectSet, context));\n } else if (typeof condition.selectSet === 'function') {\n // Function must be handled by framework adapter\n // Store the function for the adapter to call\n setValue = condition.selectSet;\n } else {\n // Unwrap proxy to get raw value for setting\n setValue = unwrapFieldProxy(evaluateDescriptor(condition.selectSet, context));\n }\n }\n }\n\n return {\n disabled: hasDisabledCondition ? disabled : undefined,\n visible: hasVisibleCondition ? visible : undefined,\n setValue: hasSetCondition ? setValue : undefined,\n hasDisabledCondition,\n hasVisibleCondition,\n hasSetCondition,\n };\n}\n\n/**\n * Evaluate a single condition's match (without applying actions)\n *\n * Useful for checking if a condition would match without computing results.\n *\n * @param condition - The condition to check\n * @param fieldValues - Map of field names to their current values\n * @param record - Optional record for expression context\n * @param props - Optional props for expression context\n * @returns true if the condition matches\n */\nexport function conditionMatches(\n condition: ConditionDescriptor,\n fieldValues: Record<string, unknown>,\n record?: Record<string, unknown>,\n props?: Record<string, unknown>\n): boolean {\n const context = buildEvaluationContext(fieldValues, record, props);\n return evaluateConditionMatch(condition, context, fieldValues);\n}\n\n/**\n * Merge condition results from multiple sources (e.g., group + field)\n *\n * Follows the same cumulative logic:\n * - disabled: OR logic\n * - visible: AND logic\n * - setValue: later source wins\n *\n * @param results - Array of condition results to merge\n * @returns Merged result\n */\nexport function mergeConditionResults(\n results: ConditionResult[]\n): ConditionResult {\n let disabled: boolean | undefined;\n let visible: boolean | undefined;\n let setValue: unknown | undefined;\n let hasDisabledCondition = false;\n let hasVisibleCondition = false;\n let hasSetCondition = false;\n\n for (const result of results) {\n // disabled: OR logic\n if (result.hasDisabledCondition) {\n hasDisabledCondition = true;\n disabled = (disabled ?? false) || (result.disabled ?? false);\n }\n\n // visible: AND logic\n if (result.hasVisibleCondition) {\n hasVisibleCondition = true;\n visible = visible === undefined ? result.visible : visible && (result.visible ?? true);\n }\n\n // setValue: later source wins\n if (result.hasSetCondition) {\n hasSetCondition = true;\n setValue = result.setValue;\n }\n }\n\n return {\n disabled: hasDisabledCondition ? disabled : undefined,\n visible: hasVisibleCondition ? visible : undefined,\n setValue: hasSetCondition ? setValue : undefined,\n hasDisabledCondition,\n hasVisibleCondition,\n hasSetCondition,\n };\n}\n\n/**\n * Extract field dependencies from an array of conditions\n *\n * Collects 'when' field references and infers dependencies from\n * 'selectWhen' and 'selectSet' expressions. Used for automatic subscription.\n *\n * @param conditions - Array of condition descriptors\n * @returns Array of unique field names referenced\n *\n * @example\n * inferFieldsFromConditions([\n * { when: 'client', disabled: true },\n * { selectWhen: 'signed && approved', visible: true },\n * ])\n * // → ['client', 'signed', 'approved']\n */\nexport function inferFieldsFromConditions(\n conditions: ConditionDescriptor[]\n): string[] {\n const fields: string[] = [];\n\n for (const condition of conditions) {\n // Add 'when' field reference\n if (condition.when !== undefined) {\n fields.push(condition.when);\n }\n\n // Infer fields from 'selectWhen' expression\n if (condition.selectWhen !== undefined) {\n fields.push(...inferFieldsFromDescriptor(condition.selectWhen));\n }\n\n // Infer fields from 'selectSet' expression\n if (condition.selectSet !== undefined) {\n fields.push(...inferFieldsFromDescriptor(condition.selectSet));\n }\n\n // Add explicit subscribesTo if specified\n if (condition.subscribesTo !== undefined) {\n fields.push(...condition.subscribesTo);\n }\n }\n\n // Return unique field names\n return [...new Set(fields)];\n}\n","// @formality-ui/core - Validation Pipeline\n// Pure functions for running validators against field values\n// ZERO framework dependencies\n\nimport type {\n ValidationResult,\n ValidatorSpec,\n ValidatorFunction,\n ValidatorsConfig,\n} from '../types';\n\n/**\n * Run a single validator against a value\n *\n * Handles both sync and async validators uniformly.\n *\n * @param validator - The validator function to run\n * @param value - The value to validate\n * @param formValues - All form values for cross-field validation\n * @returns Validation result (may be a Promise for async validators)\n */\nfunction runSingleValidator(\n validator: ValidatorFunction,\n value: unknown,\n formValues: Record<string, unknown>\n): ValidationResult | Promise<ValidationResult> {\n try {\n return validator(value, formValues);\n } catch (error) {\n // If validator throws, treat as validation failure\n return {\n type: 'validation_error',\n message: error instanceof Error ? error.message : 'Validation error',\n };\n }\n}\n\n/**\n * Resolve a named validator from the validators config\n *\n * @param name - Validator name\n * @param validators - Named validators config\n * @returns The validator function or undefined if not found\n */\nfunction resolveNamedValidator(\n name: string,\n validators: ValidatorsConfig\n): ValidatorFunction | undefined {\n const validator = validators[name];\n\n if (typeof validator === 'function') {\n // Check if it's a factory (takes args and returns a function)\n // We detect this by checking if calling with no args returns a function\n // For simple validators, they return ValidationResult directly\n // This is a best-effort heuristic\n return validator as ValidatorFunction;\n }\n\n return undefined;\n}\n\n/**\n * Run a validator specification against a value\n *\n * Supports:\n * - string: Named validator lookup\n * - function: Inline validator\n * - array: Multiple validators in sequence (short-circuits on first failure)\n *\n * @param spec - Validator specification\n * @param value - Value to validate\n * @param formValues - All form values for cross-field validation\n * @param namedValidators - Named validators config from provider\n * @returns Validation result (may be a Promise)\n *\n * @example\n * // Named validator\n * runValidator('required', '', {}, validators)\n *\n * // Inline validator\n * runValidator((val) => val ? true : 'Required', '', {})\n *\n * // Multiple validators\n * runValidator(['required', 'email'], '', {}, validators)\n */\nexport async function runValidator(\n spec: ValidatorSpec,\n value: unknown,\n formValues: Record<string, unknown>,\n namedValidators?: ValidatorsConfig\n): Promise<ValidationResult> {\n // Handle array of validators - run in sequence\n if (Array.isArray(spec)) {\n for (const item of spec) {\n const result = await runValidator(item, value, formValues, namedValidators);\n // Short-circuit on first failure\n if (!isValid(result)) {\n return result;\n }\n }\n return true; // All passed\n }\n\n // Handle string (named validator)\n if (typeof spec === 'string') {\n if (!namedValidators) {\n console.warn(`Named validator \"${spec}\" requested but no validators provided`);\n return true; // Pass if no validators configured\n }\n\n const validator = resolveNamedValidator(spec, namedValidators);\n if (!validator) {\n console.warn(`Validator \"${spec}\" not found in validators config`);\n return true; // Pass if validator not found\n }\n\n const result = runSingleValidator(validator, value, formValues);\n return Promise.resolve(result);\n }\n\n // Handle function (inline validator)\n if (typeof spec === 'function') {\n const result = runSingleValidator(spec, value, formValues);\n return Promise.resolve(result);\n }\n\n // Unknown spec type - pass\n return true;\n}\n\n/**\n * Run validator synchronously (for validators known to be sync)\n *\n * @param spec - Validator specification\n * @param value - Value to validate\n * @param formValues - All form values\n * @param namedValidators - Named validators config\n * @returns Validation result\n */\nexport function runValidatorSync(\n spec: ValidatorSpec,\n value: unknown,\n formValues: Record<string, unknown>,\n namedValidators?: ValidatorsConfig\n): ValidationResult {\n // Handle array of validators\n if (Array.isArray(spec)) {\n for (const item of spec) {\n const result = runValidatorSync(item, value, formValues, namedValidators);\n if (!isValid(result)) {\n return result;\n }\n }\n return true;\n }\n\n // Handle string (named validator)\n if (typeof spec === 'string') {\n if (!namedValidators) {\n return true;\n }\n\n const validator = resolveNamedValidator(spec, namedValidators);\n if (!validator) {\n return true;\n }\n\n const result = validator(value, formValues);\n // If it returns a Promise, this will fail at runtime\n // Use runValidator for async support\n return result as ValidationResult;\n }\n\n // Handle function\n if (typeof spec === 'function') {\n const result = spec(value, formValues);\n return result as ValidationResult;\n }\n\n return true;\n}\n\n/**\n * Check if a validation result indicates success\n *\n * @param result - Validation result to check\n * @returns true if valid, false if invalid\n */\nexport function isValid(result: ValidationResult): boolean {\n if (result === true || result === undefined) {\n return true;\n }\n return false;\n}\n\n/**\n * Combine multiple validators into a single validator function\n *\n * @param validators - Array of validator specs to combine\n * @param namedValidators - Named validators config\n * @returns Combined validator function\n */\nexport function composeValidators(\n validators: ValidatorSpec[],\n namedValidators?: ValidatorsConfig\n): ValidatorFunction {\n return async (value: unknown, formValues: Record<string, unknown>) => {\n for (const spec of validators) {\n const result = await runValidator(spec, value, formValues, namedValidators);\n if (!isValid(result)) {\n return result;\n }\n }\n return true;\n };\n}\n\n/**\n * Create a required validator\n *\n * @returns Validator function that checks for non-empty values\n */\nexport function required(): ValidatorFunction {\n return (value: unknown) => {\n if (value === undefined || value === null || value === '') {\n return { type: 'required', message: 'This field is required' };\n }\n if (Array.isArray(value) && value.length === 0) {\n return { type: 'required', message: 'This field is required' };\n }\n return true;\n };\n}\n\n/**\n * Create a minLength validator factory\n *\n * @param length - Minimum length\n * @returns Validator function\n */\nexport function minLength(length: number): ValidatorFunction {\n return (value: unknown) => {\n if (typeof value !== 'string') {\n return true; // Skip non-strings\n }\n if (value.length < length) {\n return {\n type: 'minLength',\n message: `Must be at least ${length} characters`,\n };\n }\n return true;\n };\n}\n\n/**\n * Create a maxLength validator factory\n *\n * @param length - Maximum length\n * @returns Validator function\n */\nexport function maxLength(length: number): ValidatorFunction {\n return (value: unknown) => {\n if (typeof value !== 'string') {\n return true;\n }\n if (value.length > length) {\n return {\n type: 'maxLength',\n message: `Must be at most ${length} characters`,\n };\n }\n return true;\n };\n}\n\n/**\n * Create a pattern validator factory\n *\n * @param pattern - RegExp pattern to match\n * @param message - Custom error message\n * @returns Validator function\n */\nexport function pattern(pattern: RegExp, message?: string): ValidatorFunction {\n return (value: unknown) => {\n if (typeof value !== 'string') {\n return true;\n }\n if (!pattern.test(value)) {\n return {\n type: 'pattern',\n message: message ?? 'Invalid format',\n };\n }\n return true;\n };\n}\n","// @formality-ui/core - Error Message Resolution\n// Pure functions for resolving validation error messages\n// ZERO framework dependencies\n\nimport type { ValidationResult, ErrorMessagesConfig } from '../types';\n\n/**\n * Resolve an error message from a validation result\n *\n * Handles all ValidationResult types:\n * - true/undefined → undefined (valid, no message)\n * - false → lookup 'invalid' in errorMessages or use default\n * - string → use string directly as message\n * - { type, message? } → use message or lookup type in errorMessages\n *\n * @param result - Validation result to resolve\n * @param errorMessages - Error message templates by type key\n * @returns Error message string or undefined if valid\n *\n * @example\n * resolveErrorMessage(false, {}) // → 'Invalid value'\n * resolveErrorMessage('Custom error', {}) // → 'Custom error'\n * resolveErrorMessage({ type: 'required' }, { required: 'This is required' }) // → 'This is required'\n */\nexport function resolveErrorMessage(\n result: ValidationResult,\n errorMessages?: ErrorMessagesConfig\n): string | undefined {\n // Valid results - no error message\n if (result === true || result === undefined) {\n return undefined;\n }\n\n // String result - use directly as message\n if (typeof result === 'string') {\n return result;\n }\n\n // False result - generic invalid message\n if (result === false) {\n return errorMessages?.['invalid'] ?? 'Invalid value';\n }\n\n // Object result with type and optional message\n if (typeof result === 'object' && result !== null) {\n // Use provided message if available\n if (result.message) {\n return result.message;\n }\n\n // Lookup message by type\n if (result.type && errorMessages?.[result.type]) {\n return errorMessages[result.type];\n }\n\n // Fallback to type as message\n if (result.type) {\n return formatTypeAsMessage(result.type);\n }\n\n return 'Invalid value';\n }\n\n return 'Invalid value';\n}\n\n/**\n * Format a validation type key into a human-readable message\n *\n * @param type - Type key (e.g., 'required', 'minLength')\n * @returns Formatted message\n *\n * @example\n * formatTypeAsMessage('required') // → 'Required'\n * formatTypeAsMessage('minLength') // → 'Min length'\n * formatTypeAsMessage('maxLength') // → 'Max length'\n */\nexport function formatTypeAsMessage(type: string): string {\n // Convert camelCase/snake_case to words\n const words = type\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → camel Case\n .replace(/_/g, ' ') // snake_case → snake case\n .toLowerCase();\n\n // Capitalize first letter\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Create an error messages config with default messages\n *\n * @param overrides - Custom error messages to merge with defaults\n * @returns Complete error messages config\n */\nexport function createErrorMessages(\n overrides?: ErrorMessagesConfig\n): ErrorMessagesConfig {\n const defaults: ErrorMessagesConfig = {\n required: 'This field is required',\n invalid: 'Invalid value',\n minLength: 'Too short',\n maxLength: 'Too long',\n pattern: 'Invalid format',\n min: 'Value is too small',\n max: 'Value is too large',\n email: 'Invalid email address',\n url: 'Invalid URL',\n number: 'Must be a number',\n integer: 'Must be a whole number',\n positive: 'Must be positive',\n negative: 'Must be negative',\n date: 'Invalid date',\n phone: 'Invalid phone number',\n unique: 'Must be unique',\n match: 'Fields do not match',\n validate: 'Validation failed',\n };\n\n return {\n ...defaults,\n ...overrides,\n };\n}\n\n/**\n * Extract error type from a validation result\n *\n * @param result - Validation result\n * @returns Error type string or undefined if valid\n */\nexport function getErrorType(result: ValidationResult): string | undefined {\n if (result === true || result === undefined) {\n return undefined;\n }\n\n if (result === false) {\n return 'invalid';\n }\n\n if (typeof result === 'string') {\n return 'validate';\n }\n\n if (typeof result === 'object' && result !== null) {\n return result.type || 'validate';\n }\n\n return 'validate';\n}\n\n/**\n * Create a validation error object\n *\n * @param type - Error type\n * @param message - Error message (optional, will be resolved from errorMessages)\n * @param errorMessages - Error messages config\n * @returns Error object with type and message\n */\nexport function createValidationError(\n type: string,\n message?: string,\n errorMessages?: ErrorMessagesConfig\n): { type: string; message: string } {\n const resolvedMessage =\n message ??\n errorMessages?.[type] ??\n formatTypeAsMessage(type);\n\n return {\n type,\n message: resolvedMessage,\n };\n}\n","// @formality-ui/core - Value Transformation Pipeline\n// Pure functions for parsing and formatting field values\n// ZERO framework dependencies\n\n/**\n * Parser function type\n * Transforms user input into form value\n */\nexport type ParserFunction = (value: unknown) => unknown;\n\n/**\n * Formatter function type\n * Transforms form value into display value\n */\nexport type FormatterFunction = (value: unknown) => unknown;\n\n/**\n * Parser specification - can be a named parser or inline function\n */\nexport type ParserSpec = string | ParserFunction;\n\n/**\n * Formatter specification - can be a named formatter or inline function\n */\nexport type FormatterSpec = string | FormatterFunction;\n\n/**\n * Named parsers configuration\n */\nexport type ParsersConfig = Record<string, ParserFunction>;\n\n/**\n * Named formatters configuration\n */\nexport type FormattersConfig = Record<string, FormatterFunction>;\n\n/**\n * Parse an input value using a parser specification\n *\n * Used on onChange to transform user input into form value.\n *\n * @param value - Raw input value from component\n * @param parserSpec - Parser specification (name or function)\n * @param namedParsers - Named parsers config from provider\n * @returns Parsed value for form state\n *\n * @example\n * // Named parser\n * parse(\"42.69\", \"float\", { float: v => parseFloat(String(v)) || 0 })\n * // → 42.69\n *\n * // Inline parser\n * parse(\"42.69\", v => parseFloat(String(v)) || 0)\n * // → 42.69\n */\nexport function parse(\n value: unknown,\n parserSpec?: ParserSpec,\n namedParsers?: ParsersConfig\n): unknown {\n // No parser - return value as-is\n if (parserSpec === undefined) {\n return value;\n }\n\n // Named parser\n if (typeof parserSpec === 'string') {\n const parser = namedParsers?.[parserSpec];\n if (!parser) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Parser \"${parserSpec}\" not found in parsers config`);\n }\n return value;\n }\n try {\n return parser(value);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Parser \"${parserSpec}\" threw error:`, error);\n }\n return value;\n }\n }\n\n // Inline parser function\n if (typeof parserSpec === 'function') {\n try {\n return parserSpec(value);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Inline parser threw error:', error);\n }\n return value;\n }\n }\n\n return value;\n}\n\n/**\n * Format a form value using a formatter specification\n *\n * Used on render to transform form value into display value.\n *\n * @param value - Form state value\n * @param formatterSpec - Formatter specification (name or function)\n * @param namedFormatters - Named formatters config from provider\n * @returns Formatted value for display\n *\n * @example\n * // Named formatter\n * format(42.69, \"float\", { float: v => typeof v === 'number' ? v.toFixed(2) : '' })\n * // → \"42.69\"\n *\n * // Inline formatter\n * format(42.69, v => typeof v === 'number' ? v.toFixed(2) : '')\n * // → \"42.69\"\n */\nexport function format(\n value: unknown,\n formatterSpec?: FormatterSpec,\n namedFormatters?: FormattersConfig\n): unknown {\n // No formatter - return value as-is\n if (formatterSpec === undefined) {\n return value;\n }\n\n // Named formatter\n if (typeof formatterSpec === 'string') {\n const formatter = namedFormatters?.[formatterSpec];\n if (!formatter) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Formatter \"${formatterSpec}\" not found in formatters config`);\n }\n return value;\n }\n try {\n return formatter(value);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Formatter \"${formatterSpec}\" threw error:`, error);\n }\n return value;\n }\n }\n\n // Inline formatter function\n if (typeof formatterSpec === 'function') {\n try {\n return formatterSpec(value);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Inline formatter threw error:', error);\n }\n return value;\n }\n }\n\n return value;\n}\n\n/**\n * Extract the actual value from a complex object using valueField\n *\n * Used for autocomplete/select components that store objects but need to\n * extract a specific property for submission.\n *\n * @param value - Complex value (object or primitive)\n * @param valueField - Property name to extract\n * @returns Extracted value or original value if not applicable\n *\n * @example\n * extractValueField({ id: 5, name: \"Acme\" }, \"id\")\n * // → 5\n *\n * extractValueField(\"simple\", \"id\")\n * // → \"simple\" (no extraction needed)\n */\nexport function extractValueField(\n value: unknown,\n valueField?: string\n): unknown {\n // No valueField - return as-is\n if (!valueField) {\n return value;\n }\n\n // Value is null/undefined - return as-is\n if (value === null || value === undefined) {\n return value;\n }\n\n // Value is not an object - return as-is\n if (typeof value !== 'object') {\n return value;\n }\n\n // Extract the field\n return (value as Record<string, unknown>)[valueField];\n}\n\n/**\n * Transform a field name for submission\n *\n * Used for fields that need a different name in the submitted data.\n * Example: \"client\" field with getSubmitField → \"clientId\"\n *\n * @param fieldName - Original field name\n * @param getSubmitField - Transform function\n * @returns Transformed field name\n *\n * @example\n * transformFieldName(\"client\", name => `${name}Id`)\n * // → \"clientId\"\n */\nexport function transformFieldName(\n fieldName: string,\n getSubmitField?: (name: string) => string\n): string {\n if (!getSubmitField) {\n return fieldName;\n }\n return getSubmitField(fieldName);\n}\n\n/**\n * Create a float parser with configurable behavior\n *\n * @param fallback - Value to return on parse failure (default: 0)\n * @returns Parser function\n */\nexport function createFloatParser(fallback: number = 0): ParserFunction {\n return (value: unknown) => {\n const parsed = parseFloat(String(value));\n return isNaN(parsed) ? fallback : parsed;\n };\n}\n\n/**\n * Create a float formatter with configurable precision\n *\n * @param precision - Number of decimal places (default: 2)\n * @returns Formatter function\n */\nexport function createFloatFormatter(precision: number = 2): FormatterFunction {\n return (value: unknown) => {\n if (typeof value !== 'number' || isNaN(value)) {\n return '';\n }\n return value.toFixed(precision);\n };\n}\n\n/**\n * Create an integer parser\n *\n * @param fallback - Value to return on parse failure (default: 0)\n * @returns Parser function\n */\nexport function createIntParser(fallback: number = 0): ParserFunction {\n return (value: unknown) => {\n const parsed = parseInt(String(value), 10);\n return isNaN(parsed) ? fallback : parsed;\n };\n}\n\n/**\n * Create a trim parser that removes whitespace\n *\n * @returns Parser function\n */\nexport function createTrimParser(): ParserFunction {\n return (value: unknown) => {\n if (typeof value !== 'string') {\n return value;\n }\n return value.trim();\n };\n}\n\n/**\n * Create default parsers config\n *\n * @returns Standard parsers config\n */\nexport function createDefaultParsers(): ParsersConfig {\n return {\n float: createFloatParser(),\n int: createIntParser(),\n integer: createIntParser(),\n trim: createTrimParser(),\n string: (value) => String(value ?? ''),\n };\n}\n\n/**\n * Create default formatters config\n *\n * @returns Standard formatters config\n */\nexport function createDefaultFormatters(): FormattersConfig {\n return {\n float: createFloatFormatter(2),\n float2: createFloatFormatter(2),\n float3: createFloatFormatter(3),\n float4: createFloatFormatter(4),\n percent: createFloatFormatter(2),\n percent3: createFloatFormatter(3),\n integer: (value) => {\n if (typeof value !== 'number' || isNaN(value)) {\n return '';\n }\n return Math.round(value).toString();\n },\n string: (value) => String(value ?? ''),\n };\n}\n","// @formality-ui/core - Configuration Merging\n// Pure functions for merging configuration layers\n// ZERO framework dependencies\n\nimport type {\n InputConfig,\n FieldConfig,\n FormConfig,\n FormalityProviderConfig,\n} from '../types';\n\n/**\n * Deep merge two objects, with the second object taking precedence\n *\n * @param base - Base object\n * @param override - Override object (takes precedence)\n * @returns Merged object\n */\nexport function deepMerge<T extends object>(\n base: T,\n override: Partial<T> | undefined\n): T {\n if (!override) {\n return base;\n }\n\n const result = { ...base } as T;\n\n for (const key in override) {\n const baseValue = base[key as keyof T];\n const overrideValue = override[key as keyof T];\n\n if (overrideValue === undefined) {\n continue;\n }\n\n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n typeof overrideValue === 'object' &&\n overrideValue !== null &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n // Recursively merge objects\n result[key as keyof T] = deepMerge(\n baseValue as object,\n overrideValue as object\n ) as T[keyof T];\n } else {\n // Override value takes precedence\n result[key as keyof T] = overrideValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Merge input configurations from multiple sources\n *\n * Priority order (highest to lowest):\n * 1. Form-level inputs\n * 2. Provider-level inputs\n *\n * @param providerInputs - Provider input configs\n * @param formInputs - Form input configs (or function to transform)\n * @returns Merged input configs\n */\nexport function mergeInputConfigs(\n providerInputs: Record<string, InputConfig>,\n formInputs?: FormConfig['inputs']\n): Record<string, InputConfig> {\n // No form inputs - return provider inputs\n if (!formInputs) {\n return providerInputs;\n }\n\n // Function form - allow form to transform all inputs\n if (typeof formInputs === 'function') {\n const transformed = formInputs(providerInputs);\n return mergeInputConfigs(providerInputs, transformed);\n }\n\n // Object form - merge each input config\n const result = { ...providerInputs };\n\n for (const [type, overrides] of Object.entries(formInputs)) {\n if (result[type]) {\n result[type] = deepMerge(result[type], overrides);\n } else {\n result[type] = overrides as InputConfig;\n }\n }\n\n return result;\n}\n\n/**\n * Resolve input config for a specific type\n *\n * @param type - Input type key\n * @param inputs - Merged input configs\n * @param defaultType - Default type if specified type not found\n * @returns Input config or undefined\n */\nexport function resolveInputConfig(\n type: string,\n inputs: Record<string, InputConfig>,\n defaultType: string = 'textField'\n): InputConfig | undefined {\n return inputs[type] ?? inputs[defaultType];\n}\n\n/**\n * Resolve field type from multiple sources\n *\n * Priority order (highest to lowest):\n * 1. Component prop type\n * 2. Field config type\n * 3. Default type ('textField')\n *\n * @param componentType - Type from component props\n * @param fieldConfig - Field configuration\n * @param defaultType - Default type\n * @returns Resolved type\n */\nexport function resolveFieldType(\n componentType?: string,\n fieldConfig?: FieldConfig,\n defaultType: string = 'textField'\n): string {\n return componentType ?? fieldConfig?.type ?? defaultType;\n}\n\n/**\n * Merge static props from multiple configuration layers\n *\n * Priority order (highest to lowest):\n * 1. Component props (from JSX)\n * 2. Field config selectProps (evaluated separately)\n * 3. Field config props\n * 4. Input config props\n * 5. Form-level selectDefaultFieldProps (evaluated separately)\n * 6. Form-level defaultFieldProps\n * 7. Provider-level selectDefaultFieldProps (evaluated separately)\n * 8. Provider-level defaultFieldProps\n *\n * NOTE: This function only merges STATIC props. Dynamic props (selectProps,\n * selectDefaultFieldProps) must be evaluated and merged separately.\n *\n * @param layers - Configuration layers from lowest to highest priority\n * @returns Merged static props\n */\nexport function mergeStaticProps(\n ...layers: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const layer of layers) {\n if (layer) {\n Object.assign(result, layer);\n }\n }\n\n return result;\n}\n\n/**\n * Merge all field props following the priority order\n *\n * This is the main props merging function that combines:\n * - Static props from config layers\n * - Evaluated dynamic props\n * - Core field props\n *\n * @param options - All props sources\n * @returns Final merged props\n */\nexport function mergeFieldProps(options: {\n providerDefaultFieldProps?: Record<string, unknown>;\n providerSelectDefaultFieldProps?: Record<string, unknown>;\n formDefaultFieldProps?: Record<string, unknown>;\n formSelectDefaultFieldProps?: Record<string, unknown>;\n inputProps?: Record<string, unknown>;\n fieldConfigProps?: Record<string, unknown>;\n selectProps?: Record<string, unknown>;\n componentProps?: Record<string, unknown>;\n coreProps?: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n providerDefaultFieldProps,\n providerSelectDefaultFieldProps,\n formDefaultFieldProps,\n formSelectDefaultFieldProps,\n inputProps,\n fieldConfigProps,\n selectProps,\n componentProps,\n coreProps,\n } = options;\n\n // Merge in priority order (later overrides earlier)\n return mergeStaticProps(\n providerDefaultFieldProps,\n providerSelectDefaultFieldProps,\n formDefaultFieldProps,\n formSelectDefaultFieldProps,\n inputProps,\n fieldConfigProps,\n selectProps,\n componentProps,\n coreProps // Core props always win (name, value, onChange, etc.)\n );\n}\n\n/**\n * Create a merged configuration context\n *\n * Combines provider and form configs into a single context object\n * for use during field rendering.\n *\n * @param providerConfig - Provider configuration\n * @param formConfig - Form configuration\n * @returns Merged configuration context\n */\nexport function createConfigContext(\n providerConfig: FormalityProviderConfig,\n formConfig?: FormConfig\n): {\n inputs: Record<string, InputConfig>;\n formatters: Record<string, (value: unknown) => unknown>;\n parsers: Record<string, (value: unknown) => unknown>;\n validators: Record<string, unknown>;\n errorMessages: Record<string, string>;\n defaultFieldProps: Record<string, unknown>;\n selectDefaultFieldProps: unknown;\n} {\n const mergedInputs = mergeInputConfigs(\n providerConfig.inputs,\n formConfig?.inputs\n );\n\n return {\n inputs: mergedInputs,\n formatters: providerConfig.formatters ?? {},\n parsers: providerConfig.parsers ?? {},\n validators: providerConfig.validators ?? {},\n errorMessages: providerConfig.errorMessages ?? {},\n defaultFieldProps: mergeStaticProps(\n providerConfig.defaultFieldProps,\n formConfig?.defaultFieldProps\n ),\n selectDefaultFieldProps:\n formConfig?.selectDefaultFieldProps ??\n providerConfig.selectDefaultFieldProps,\n };\n}\n","// @formality-ui/core - Default Value Resolution\n// Pure functions for resolving initial/default values\n// ZERO framework dependencies\n\nimport type { FieldConfig, InputConfig } from '../types';\n\n/**\n * Resolve the initial value for a field\n *\n * Priority order (highest to lowest):\n * 1. defaultValues[fieldName] (from Form props)\n * 2. record[recordKey] (using recordKey if specified, else fieldName)\n * 3. inputConfig.defaultValue (from input type definition)\n *\n * @param fieldName - Field name\n * @param fieldConfig - Field configuration\n * @param inputConfig - Input type configuration\n * @param record - Record data passed to form\n * @param defaultValues - Default values passed to form\n * @returns Resolved initial value\n *\n * @example\n * // Field with recordKey mapping\n * resolveInitialValue(\n * 'client',\n * { recordKey: 'selectedClient' },\n * { defaultValue: null },\n * { selectedClient: { id: 5 } },\n * {}\n * )\n * // → { id: 5 }\n *\n * // Field with explicit defaultValue\n * resolveInitialValue(\n * 'status',\n * {},\n * { defaultValue: 'pending' },\n * {},\n * { status: 'active' }\n * )\n * // → 'active' (defaultValues takes precedence)\n */\nexport function resolveInitialValue(\n fieldName: string,\n fieldConfig?: FieldConfig,\n inputConfig?: InputConfig,\n record?: Record<string, unknown>,\n defaultValues?: Record<string, unknown>\n): unknown {\n // Priority 1: Explicit default value for this field\n if (defaultValues && fieldName in defaultValues) {\n return defaultValues[fieldName];\n }\n\n // Priority 2: Record value (using recordKey if specified)\n const recordKey = fieldConfig?.recordKey ?? fieldName;\n if (record && recordKey in record) {\n return record[recordKey];\n }\n\n // Priority 3: Input type default value\n if (inputConfig?.defaultValue !== undefined) {\n return inputConfig.defaultValue;\n }\n\n // No default - return undefined\n return undefined;\n}\n\n/**\n * Resolve initial values for all fields in a configuration\n *\n * @param fieldConfigs - Map of field names to configurations\n * @param inputs - Map of input types to configurations\n * @param record - Record data passed to form\n * @param defaultValues - Default values passed to form\n * @returns Map of field names to initial values\n */\nexport function resolveAllInitialValues(\n fieldConfigs: Record<string, FieldConfig>,\n inputs: Record<string, InputConfig>,\n record?: Record<string, unknown>,\n defaultValues?: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {\n const type = fieldConfig.type ?? 'textField';\n const inputConfig = inputs[type];\n\n const value = resolveInitialValue(\n fieldName,\n fieldConfig,\n inputConfig,\n record,\n defaultValues\n );\n\n if (value !== undefined) {\n result[fieldName] = value;\n }\n }\n\n // Also include any explicit default values not in config\n if (defaultValues) {\n for (const [fieldName, value] of Object.entries(defaultValues)) {\n if (!(fieldName in result)) {\n result[fieldName] = value;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if a value is considered \"empty\" for default value purposes\n *\n * @param value - Value to check\n * @returns true if value is empty\n */\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null) {\n return true;\n }\n if (value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Get the default value for an input type\n *\n * Falls back to common defaults based on type name if not specified.\n *\n * @param inputConfig - Input configuration\n * @param typeName - Input type name (for fallback logic)\n * @returns Default value\n */\nexport function getInputDefaultValue(\n inputConfig?: InputConfig,\n typeName?: string\n): unknown {\n // Explicit default value\n if (inputConfig?.defaultValue !== undefined) {\n return inputConfig.defaultValue;\n }\n\n // Type-based defaults\n if (typeName) {\n switch (typeName) {\n case 'switch':\n case 'checkbox':\n return false;\n case 'number':\n case 'decimal':\n case 'integer':\n return 0;\n case 'select':\n case 'autocomplete':\n return null;\n case 'multiSelect':\n case 'checkboxGroup':\n return [];\n case 'textField':\n case 'text':\n case 'textarea':\n case 'email':\n case 'password':\n default:\n return '';\n }\n }\n\n return '';\n}\n\n/**\n * Merge record data with form default values\n *\n * Record values take precedence over defaults for non-empty values.\n *\n * @param record - Record data (may have partial data)\n * @param defaults - Default values\n * @returns Merged values\n */\nexport function mergeRecordWithDefaults(\n record?: Record<string, unknown>,\n defaults?: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Start with defaults\n if (defaults) {\n Object.assign(result, defaults);\n }\n\n // Override with record values (including empty values to preserve intentional nulls)\n if (record) {\n for (const [key, value] of Object.entries(record)) {\n // Only override if the key exists in record (preserves intentional nulls/empty)\n result[key] = value;\n }\n }\n\n return result;\n}\n","// @formality-ui/core - Label Resolution\n// Pure functions for resolving field labels\n// ZERO framework dependencies\n\nimport type { FieldConfig } from '../types';\n\n/**\n * Convert a camelCase or PascalCase field name to a human-readable label\n *\n * @param fieldName - The field name to humanize\n * @returns Human-readable label\n *\n * @example\n * humanizeLabel(\"clientContact\") // → \"Client Contact\"\n * humanizeLabel(\"minGrossMarginPercent\") // → \"Min Gross Margin Percent\"\n * humanizeLabel(\"CCIP/CCOP\") // → \"CCIP/CCOP\" (preserved)\n * humanizeLabel(\"firstName\") // → \"First Name\"\n * humanizeLabel(\"HTMLParser\") // → \"Html Parser\"\n * humanizeLabel(\"userID\") // → \"User Id\"\n */\nexport function humanizeLabel(fieldName: string): string {\n // Empty string\n if (!fieldName) {\n return '';\n }\n\n // Handle special characters (preserve as-is with first letter capitalized)\n if (/[^a-zA-Z0-9]/.test(fieldName)) {\n // Contains special chars - might be intentional (e.g., \"CCIP/CCOP\")\n // Just capitalize first letter if needed\n return fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n }\n\n // Split on camelCase boundaries\n // \"clientContact\" → [\"client\", \"Contact\"]\n // \"HTMLParser\" → [\"HTML\", \"Parser\"]\n const words = fieldName\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase: clientContact → client Contact\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') // acronyms: HTMLParser → HTML Parser\n .split(' ');\n\n // Capitalize each word\n return words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n\n/**\n * Resolve the label for a field\n *\n * Priority order (highest to lowest):\n * 1. Component prop (label from JSX props)\n * 2. Field config props.label\n * 3. Evaluated selectProps.label\n * 4. Field config label\n * 5. Field config title (legacy alias)\n * 6. Auto-generated from field name\n *\n * @param fieldName - Field name\n * @param fieldConfig - Field configuration\n * @param evaluatedSelectProps - Pre-evaluated selectProps\n * @param componentProps - Props from JSX\n * @returns Resolved label string\n */\nexport function resolveLabel(\n fieldName: string,\n fieldConfig?: FieldConfig,\n evaluatedSelectProps?: Record<string, unknown>,\n componentProps?: Record<string, unknown>\n): string {\n // Priority 1: Component prop\n if (componentProps?.label !== undefined) {\n return String(componentProps.label);\n }\n\n // Priority 2: Field config props.label\n if (fieldConfig?.props?.label !== undefined) {\n return String(fieldConfig.props.label);\n }\n\n // Priority 3: Evaluated selectProps.label\n if (evaluatedSelectProps?.label !== undefined) {\n return String(evaluatedSelectProps.label);\n }\n\n // Priority 4: Field config label\n if (fieldConfig?.label !== undefined) {\n return fieldConfig.label;\n }\n\n // Priority 5: Field config title (legacy alias)\n if (fieldConfig?.title !== undefined) {\n return fieldConfig.title;\n }\n\n // Priority 6: Auto-generate from field name\n return humanizeLabel(fieldName);\n}\n\n/**\n * Resolve the title for a form\n *\n * @param formTitle - Static form title\n * @param evaluatedSelectTitle - Pre-evaluated selectTitle\n * @returns Resolved title string or undefined\n */\nexport function resolveFormTitle(\n formTitle?: string,\n evaluatedSelectTitle?: unknown\n): string | undefined {\n // Evaluated selectTitle takes precedence\n if (evaluatedSelectTitle !== undefined && evaluatedSelectTitle !== null) {\n return String(evaluatedSelectTitle);\n }\n\n // Static title\n return formTitle;\n}\n\n/**\n * Check if a label is auto-generated (matches the humanized field name)\n *\n * @param fieldName - Field name\n * @param label - Current label\n * @returns true if label appears to be auto-generated\n */\nexport function isAutoGeneratedLabel(fieldName: string, label: string): boolean {\n return humanizeLabel(fieldName) === label;\n}\n\n/**\n * Create a label with a unit suffix\n *\n * @param baseLabel - Base label text\n * @param unit - Unit to append (e.g., '%', '$', 'kg')\n * @returns Label with unit in parentheses\n *\n * @example\n * createLabelWithUnit(\"Min Gross Margin\", \"%\") // → \"Min Gross Margin (%)\"\n * createLabelWithUnit(\"Weight\", \"kg\") // → \"Weight (kg)\"\n */\nexport function createLabelWithUnit(baseLabel: string, unit: string): string {\n return `${baseLabel} (${unit})`;\n}\n\n/**\n * Extract the base label and unit from a label with unit suffix\n *\n * @param label - Label potentially containing unit\n * @returns Object with base label and optional unit\n *\n * @example\n * parseLabelWithUnit(\"Min Gross Margin (%)\") // → { base: \"Min Gross Margin\", unit: \"%\" }\n * parseLabelWithUnit(\"Client Contact\") // → { base: \"Client Contact\", unit: undefined }\n */\nexport function parseLabelWithUnit(label: string): {\n base: string;\n unit?: string;\n} {\n const match = label.match(/^(.+)\\s*\\(([^)]+)\\)$/);\n if (match) {\n return {\n base: match[1].trim(),\n unit: match[2],\n };\n }\n return { base: label };\n}\n\n/**\n * Sort fields by their order property\n *\n * @param fieldNames - Array of field names\n * @param fieldConfigs - Map of field configs\n * @returns Sorted array of field names\n */\nexport function sortFieldsByOrder(\n fieldNames: string[],\n fieldConfigs: Record<string, FieldConfig>\n): string[] {\n return [...fieldNames].sort((a, b) => {\n const orderA = fieldConfigs[a]?.order ?? Infinity;\n const orderB = fieldConfigs[b]?.order ?? Infinity;\n return orderA - orderB;\n });\n}\n\n/**\n * Get fields that are not in the declared set\n *\n * @param allFields - All field names from config\n * @param declaredFields - Set of explicitly declared field names\n * @returns Array of unused field names\n */\nexport function getUnusedFields(\n allFields: string[],\n declaredFields: Set<string>\n): string[] {\n return allFields.filter((name) => !declaredFields.has(name));\n}\n\n/**\n * Get ordered unused fields\n *\n * @param allFields - All field names from config\n * @param declaredFields - Set of explicitly declared field names\n * @param fieldConfigs - Map of field configs\n * @returns Sorted array of unused field names\n */\nexport function getOrderedUnusedFields(\n allFields: string[],\n declaredFields: Set<string>,\n fieldConfigs: Record<string, FieldConfig>\n): string[] {\n const unused = getUnusedFields(allFields, declaredFields);\n return sortFieldsByOrder(unused, fieldConfigs);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/expression/context.ts","../src/expression/evaluate.ts","../src/expression/infer.ts","../src/conditions/evaluate.ts","../src/validation/validate.ts","../src/validation/messages.ts","../src/transform/pipeline.ts","../src/config/merge.ts","../src/config/defaults.ts","../src/labels/resolve.ts"],"names":["jsep","left","leftValue","pattern"],"mappings":"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","file":"index.cjs","sourcesContent":["// @formality-ui/core - Expression Context Building\n// Implements the Dual Context Mapping pattern for expression evaluation\n\nimport type { FormState, FieldState, FieldError } from \"../types\";\n\n/**\n * Qualified prefixes that should NOT be auto-transformed\n */\nexport const QUALIFIED_PREFIXES = [\n \"fields\",\n \"record\",\n \"errors\",\n \"defaultValues\",\n \"touchedFields\",\n \"dirtyFields\",\n \"props\",\n] as const;\n\n/**\n * JavaScript keywords to skip during field inference\n */\nexport const KEYWORDS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"typeof\",\n \"instanceof\",\n \"new\",\n \"this\",\n \"if\",\n \"else\",\n \"return\",\n] as const;\n\n/**\n * Known field state properties that should be accessed directly on the field state\n */\nconst FIELD_STATE_PROPERTIES = new Set([\n \"value\",\n \"isTouched\",\n \"isDirty\",\n \"isValidating\",\n \"error\",\n \"invalid\",\n \"disabled\",\n]);\n\n/**\n * Symbol to identify field state proxies for unwrapping in expressions\n */\nexport const FIELD_PROXY_MARKER = Symbol.for(\"formality.fieldProxy\");\n\n/**\n * Symbol to get the raw value from a field proxy\n */\nexport const FIELD_PROXY_VALUE = Symbol.for(\"formality.fieldProxyValue\");\n\n/**\n * Create a proxy for a field state that:\n * - Returns field state properties (isTouched, isDirty, etc.) when accessed\n * - Delegates unknown properties to value[prop] for object values\n * - Coerces to the value for primitive operations\n *\n * This allows both:\n * - `client` and `client.value` to return the same thing\n * - `client.isTouched` to return the touched state\n * - `client.id` to return value.id (for object values)\n */\nexport function createFieldStateProxy(\n fieldState: FieldState | { value: unknown },\n): unknown {\n // If value is null/undefined or primitive, we still need the proxy for metadata access\n const proxy = new Proxy(fieldState as object, {\n get(target: FieldState | { value: unknown }, prop: string | symbol) {\n // Marker to identify this as a field proxy\n if (prop === FIELD_PROXY_MARKER) {\n return true;\n }\n\n // Allow extracting raw value for expression evaluation\n if (prop === FIELD_PROXY_VALUE) {\n return target.value;\n }\n\n // Symbol.toPrimitive for type coercion (comparisons, string concat, etc.)\n if (prop === Symbol.toPrimitive) {\n return (_hint: string) => target.value;\n }\n\n // Known field state properties - return from field state\n if (typeof prop === \"string\" && FIELD_STATE_PROPERTIES.has(prop)) {\n return (target as Record<string, unknown>)[prop];\n }\n\n // Unknown property - delegate to value\n const value = target.value;\n if (value !== null && value !== undefined && typeof value === \"object\") {\n return (value as Record<string, unknown>)[prop as string];\n }\n\n return undefined;\n },\n });\n\n return proxy;\n}\n\n/**\n * Check if a value is a field state proxy\n */\nexport function isFieldProxy(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[FIELD_PROXY_MARKER] === true\n );\n}\n\n/**\n * Unwrap a field proxy to get its primitive value for boolean/comparison contexts\n */\nexport function unwrapFieldProxy(value: unknown): unknown {\n if (isFieldProxy(value)) {\n return (value as Record<symbol, unknown>)[FIELD_PROXY_VALUE];\n }\n return value;\n}\n\n/**\n * Build evaluation context for form-level expressions\n *\n * Implements Dual Context Mapping:\n * - Provides field values at BOTH qualified (fields.client.value) AND unqualified (client) levels\n * - Qualified paths take precedence on name collision\n *\n * @param fields - Map of field names to field states\n * @param record - Original record passed to form\n * @param errors - Map of field names to errors\n * @param defaultValues - Initial/default values for fields\n * @param touchedFields - Map of touched field names\n * @param dirtyFields - Map of dirty field names\n * @returns Evaluation context object\n */\nexport function buildFormContext(\n fields: Record<string, FieldState>,\n record?: Record<string, unknown>,\n errors?: Record<string, FieldError | undefined>,\n defaultValues?: Record<string, unknown>,\n touchedFields?: Record<string, boolean>,\n dirtyFields?: Record<string, boolean>,\n): Record<string, unknown> {\n const context: Record<string, unknown> = {};\n\n // Add qualified paths first (these take precedence)\n context.fields = fields;\n context.record = record ?? {};\n context.errors = errors ?? {};\n context.defaultValues = defaultValues ?? {};\n context.touchedFields = touchedFields ?? {};\n context.dirtyFields = dirtyFields ?? {};\n\n // Add unqualified shortcuts as proxies\n // This allows:\n // - \"client\" to resolve to the value (via proxy unwrapping)\n // - \"client.value\" to also resolve to the value\n // - \"client.isTouched\" to resolve to field state metadata\n // - \"client.id\" to resolve to value.id (for object values)\n for (const [fieldName, fieldState] of Object.entries(fields)) {\n // Don't override qualified prefixes\n if (!(fieldName in context)) {\n context[fieldName] = createFieldStateProxy(fieldState);\n }\n }\n\n return context;\n}\n\n/**\n * Build evaluation context for field-level expressions\n *\n * Extends form context with field-specific props (including field name).\n * This enables expressions like \"props.name\" to resolve to the current field name.\n *\n * @param formState - Complete form state\n * @param fieldName - Current field name (added to props.name)\n * @param additionalProps - Additional props to merge\n * @returns Evaluation context object\n */\nexport function buildFieldContext(\n formState: FormState,\n fieldName: string,\n additionalProps?: Record<string, unknown>,\n): Record<string, unknown> {\n const context = buildFormContext(\n formState.fields,\n formState.record,\n formState.errors,\n formState.defaultValues,\n formState.touchedFields,\n formState.dirtyFields,\n );\n\n // Add field-specific props\n context.props = {\n name: fieldName,\n ...additionalProps,\n };\n\n return context;\n}\n\n/**\n * Field state input for building evaluation context\n */\ninterface FieldStateForContext {\n value: unknown;\n isTouched?: boolean;\n isDirty?: boolean;\n isValidating?: boolean;\n error?: unknown;\n invalid?: boolean;\n disabled?: boolean;\n}\n\n/**\n * Build a minimal evaluation context from field values\n *\n * Used when you only have raw values (not full FieldState objects).\n * Useful for condition evaluation with watched values.\n *\n * @param fieldValues - Map of field names to their current values\n * @param record - Optional record for record.* access\n * @param props - Optional props for props.* access\n * @param fieldStates - Optional full field states with metadata (isTouched, isDirty, etc.)\n * @returns Evaluation context object\n */\nexport function buildEvaluationContext(\n fieldValues: Record<string, unknown>,\n record?: Record<string, unknown>,\n props?: Record<string, unknown>,\n fieldStates?: Record<string, FieldStateForContext>,\n): Record<string, unknown> {\n const context: Record<string, unknown> = {};\n\n // Build fields object - use full field states if available, otherwise just values\n const fields: Record<string, FieldStateForContext> = {};\n for (const [name, value] of Object.entries(fieldValues)) {\n if (fieldStates && fieldStates[name]) {\n // Use full field state with metadata\n fields[name] = fieldStates[name];\n } else {\n // Fall back to minimal state with just value\n fields[name] = { value };\n }\n }\n\n // Add qualified paths\n context.fields = fields;\n context.record = record ?? {};\n context.props = props ?? {};\n\n // Add unqualified shortcuts as proxies\n // Proxies enable accessing both value and metadata (isTouched, isDirty, etc.)\n for (const [fieldName] of Object.entries(fieldValues)) {\n if (!(fieldName in context)) {\n context[fieldName] = createFieldStateProxy(fields[fieldName]);\n }\n }\n\n return context;\n}\n","// @formality-ui/core - Expression Evaluation\n// Uses jsep for parsing and custom evaluation for safe expression execution\n\nimport jsep from \"jsep\";\nimport { unwrapFieldProxy } from \"./context\";\n\n// Add typeof as a unary operator to JSEP\n// JSEP doesn't support typeof by default, so we add it\njsep.addUnaryOp(\"typeof\");\n\n// jsep AST node types\ntype Expression = jsep.Expression;\ntype Identifier = jsep.Identifier;\ntype Literal = jsep.Literal;\ntype MemberExpression = jsep.MemberExpression;\ntype BinaryExpression = jsep.BinaryExpression;\n// LogicalExpression uses the same type as BinaryExpression in newer jsep versions\ntype LogicalExpression = jsep.BinaryExpression;\ntype UnaryExpression = jsep.UnaryExpression;\ntype ConditionalExpression = jsep.ConditionalExpression;\ntype ArrayExpression = jsep.ArrayExpression;\ntype Compound = jsep.Compound;\n\n/**\n * Evaluation context type\n */\nexport type EvaluationContext = Record<string, unknown>;\n\n/**\n * Type guard to check if a value is safe for arithmetic operations\n *\n * Excludes: null, undefined, NaN, Infinity, -Infinity, and non-numeric types\n *\n * @param value - The value to check\n * @returns True if the value is a safe finite number (not null, undefined, NaN, or Infinity)\n *\n * @example\n * isSafeNumber(42); // → true\n * isSafeNumber(0); // → true\n * isSafeNumber(-3.14); // → true\n * isSafeNumber(null); // → false (explicitly excluded)\n * isSafeNumber(undefined); // → false (explicitly excluded)\n * isSafeNumber(NaN); // → false\n * isSafeNumber(Infinity); // → false\n * isSafeNumber('42'); // → false\n * isSafeNumber({}); // → false\n */\nfunction isSafeNumber(value: unknown): value is number {\n // Explicitly check for null and undefined first\n if (value === null || value === undefined) {\n return false;\n }\n // Then check for valid finite number\n return (\n typeof value === \"number\" && !Number.isNaN(value) && Number.isFinite(value)\n );\n}\n\n/**\n * Get a property from an object safely\n */\nfunction getProperty(obj: unknown, key: string): unknown {\n if (obj === null || obj === undefined) {\n return undefined;\n }\n if (typeof obj === \"object\") {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n}\n\n/**\n * Evaluate an AST node against a context\n */\nfunction evaluateNode(node: Expression, context: EvaluationContext): unknown {\n switch (node.type) {\n case \"Literal\":\n return (node as Literal).value;\n\n case \"Identifier\":\n return context[(node as Identifier).name];\n\n case \"MemberExpression\": {\n const memberNode = node as MemberExpression;\n const object = evaluateNode(memberNode.object, context);\n if (memberNode.computed) {\n // bracket notation: obj[expr]\n const property = evaluateNode(memberNode.property, context);\n return getProperty(object, String(property));\n } else {\n // dot notation: obj.prop\n return getProperty(object, (memberNode.property as Identifier).name);\n }\n }\n\n case \"BinaryExpression\": {\n const binaryNode = node as BinaryExpression;\n\n // Logical operators need short-circuit evaluation\n // (newer jsep versions treat these as BinaryExpression)\n switch (binaryNode.operator) {\n case \"&&\": {\n const left = evaluateNode(binaryNode.left, context);\n // Unwrap proxy for truthiness check\n const leftValue = unwrapFieldProxy(left);\n return leftValue\n ? evaluateNode(binaryNode.right, context)\n : leftValue;\n }\n case \"||\": {\n const left = evaluateNode(binaryNode.left, context);\n // Unwrap proxy for truthiness check\n const leftValue = unwrapFieldProxy(left);\n return leftValue\n ? leftValue\n : evaluateNode(binaryNode.right, context);\n }\n case \"??\": {\n const left = evaluateNode(binaryNode.left, context);\n // Unwrap proxy for null/undefined check\n const leftValue = unwrapFieldProxy(left);\n return leftValue !== null && leftValue !== undefined\n ? leftValue\n : evaluateNode(binaryNode.right, context);\n }\n }\n\n // Non-short-circuit operators evaluate both sides\n const left = evaluateNode(binaryNode.left, context);\n const right = evaluateNode(binaryNode.right, context);\n // Unwrap proxies for comparison/arithmetic operations\n const leftValue = unwrapFieldProxy(left);\n const rightValue = unwrapFieldProxy(right);\n\n // Handle string concatenation and numeric addition for +\n if (binaryNode.operator === \"+\") {\n // If either operand is a string or array (converts to string), do string concatenation\n const leftIsString = typeof leftValue === \"string\";\n const rightIsString = typeof rightValue === \"string\";\n const leftIsArray = Array.isArray(leftValue);\n const rightIsArray = Array.isArray(rightValue);\n\n if (leftIsString || rightIsString || leftIsArray || rightIsArray) {\n // Convert arrays to strings for concatenation\n const leftStr = leftIsArray\n ? (leftValue as unknown[]).join(\",\")\n : String(leftValue ?? \"\");\n const rightStr = rightIsArray\n ? (rightValue as unknown[]).join(\",\")\n : String(rightValue ?? \"\");\n return leftStr + rightStr;\n }\n // For numeric addition, validate both are safe numbers\n if (!isSafeNumber(leftValue) || !isSafeNumber(rightValue)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Formality Expression] Type error: ` +\n `Invalid operands for + (null/undefined not allowed): ` +\n `left=${typeof leftValue}, right=${typeof rightValue}`,\n );\n }\n return undefined;\n }\n // Safe numeric addition\n const result = (leftValue as number) + (rightValue as number);\n if (!Number.isFinite(result)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Formality Expression] Arithmetic overflow: ` +\n `${leftValue} + ${rightValue} produced ${result}`,\n );\n }\n return undefined;\n }\n return result;\n }\n\n // Other arithmetic operators need strict type guard validation\n const arithmeticOps = [\"-\", \"*\", \"/\", \"%\"];\n if (arithmeticOps.includes(binaryNode.operator as string)) {\n // Validate operands are safe numbers\n if (!isSafeNumber(leftValue) || !isSafeNumber(rightValue)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Formality Expression] Type error: ` +\n `Invalid operands for ${binaryNode.operator} (null/undefined not allowed): ` +\n `left=${typeof leftValue}, right=${typeof rightValue}`,\n );\n }\n return undefined;\n }\n\n // Type guard confirmed both are numbers, safe to assert\n const l = leftValue as number;\n const r = rightValue as number;\n\n // Special handling for division/modulo by zero\n if (binaryNode.operator === \"/\" || binaryNode.operator === \"%\") {\n if (r === 0) {\n if (process.env.NODE_ENV !== \"production\") {\n const opName =\n binaryNode.operator === \"/\" ? \"Division\" : \"Modulo\";\n console.warn(`[Formality Expression] ${opName} by zero`);\n }\n return undefined;\n }\n }\n\n // Perform arithmetic operation\n let result: number;\n switch (binaryNode.operator) {\n case \"-\":\n result = l - r;\n break;\n case \"*\":\n result = l * r;\n break;\n case \"/\":\n result = l / r;\n break;\n case \"%\":\n result = l % r;\n break;\n default:\n throw new Error(`Unknown operator: ${binaryNode.operator}`);\n }\n\n // Validate result (catch overflow to Infinity)\n if (!Number.isFinite(result)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Formality Expression] Arithmetic overflow: ` +\n `${l} ${binaryNode.operator} ${r} produced ${result}`,\n );\n }\n return undefined;\n }\n\n return result;\n }\n\n // Comparison operators (existing code, unchanged)\n switch (binaryNode.operator) {\n case \"===\":\n return leftValue === rightValue;\n case \"!==\":\n return leftValue !== rightValue;\n case \"==\":\n // eslint-disable-next-line eqeqeq\n return leftValue == rightValue;\n case \"!=\":\n // eslint-disable-next-line eqeqeq\n return leftValue != rightValue;\n case \"<\":\n return (leftValue as number) < (rightValue as number);\n case \">\":\n return (leftValue as number) > (rightValue as number);\n case \"<=\":\n return (leftValue as number) <= (rightValue as number);\n case \">=\":\n return (leftValue as number) >= (rightValue as number);\n default:\n throw new Error(`Unknown binary operator: ${binaryNode.operator}`);\n }\n }\n\n case \"LogicalExpression\": {\n const logicalNode = node as LogicalExpression;\n const left = evaluateNode(logicalNode.left, context);\n // Unwrap proxy for truthiness/null checks\n const leftValue = unwrapFieldProxy(left);\n\n switch (logicalNode.operator) {\n case \"&&\":\n // Short-circuit: only evaluate right if left is truthy\n return leftValue\n ? evaluateNode(logicalNode.right, context)\n : leftValue;\n case \"||\":\n // Short-circuit: only evaluate right if left is falsy\n return leftValue\n ? leftValue\n : evaluateNode(logicalNode.right, context);\n case \"??\":\n // Nullish coalescing: only evaluate right if left is null/undefined\n return leftValue !== null && leftValue !== undefined\n ? leftValue\n : evaluateNode(logicalNode.right, context);\n default:\n throw new Error(`Unknown logical operator: ${logicalNode.operator}`);\n }\n }\n\n case \"UnaryExpression\": {\n const unaryNode = node as UnaryExpression;\n const argument = evaluateNode(unaryNode.argument, context);\n // Unwrap proxy for unary operations\n const argValue = unwrapFieldProxy(argument);\n\n switch (unaryNode.operator) {\n case \"!\":\n return !argValue;\n case \"-\":\n return -(argValue as number);\n case \"+\":\n return +(argValue as number);\n case \"typeof\":\n return typeof argValue;\n default:\n throw new Error(`Unknown unary operator: ${unaryNode.operator}`);\n }\n }\n\n case \"ConditionalExpression\": {\n const condNode = node as ConditionalExpression;\n const test = evaluateNode(condNode.test, context);\n // Unwrap proxy for truthiness check\n const testValue = unwrapFieldProxy(test);\n return testValue\n ? evaluateNode(condNode.consequent, context)\n : evaluateNode(condNode.alternate, context);\n }\n\n case \"ArrayExpression\": {\n const arrayNode = node as ArrayExpression;\n return arrayNode.elements.map((element) =>\n element ? evaluateNode(element, context) : undefined,\n );\n }\n\n case \"CallExpression\": {\n // We don't allow function calls for security\n throw new Error(\"Function calls are not allowed in expressions\");\n }\n\n case \"Compound\": {\n // Compound expressions (multiple statements) - evaluate last one\n const compoundNode = node as Compound;\n let result: unknown;\n for (const bodyNode of compoundNode.body) {\n result = evaluateNode(bodyNode, context);\n }\n return result;\n }\n\n default:\n throw new Error(`Unknown node type: ${node.type}`);\n }\n}\n\n/**\n * Parse and cache expression ASTs\n */\nconst astCache = new Map<string, Expression>();\n\nfunction parseExpression(expr: string): Expression {\n const cached = astCache.get(expr);\n if (cached) {\n return cached;\n }\n\n const ast = jsep(expr);\n astCache.set(expr, ast);\n return ast;\n}\n\n/**\n * Evaluate a string expression against a context object\n *\n * @param expr - Expression string (e.g., \"client.id\", \"client && signed\")\n * @param context - Evaluation context with field values\n * @returns The evaluated result\n *\n * @example\n * evaluate(\"client.id\", { client: { id: 5 } }) // → 5\n * evaluate(\"client && signed\", { client: { id: 5 }, signed: true }) // → true\n * evaluate(\"signed ? 'Yes' : 'No'\", { signed: true }) // → 'Yes'\n */\nexport function evaluate(expr: string, context: EvaluationContext): unknown {\n try {\n const ast = parseExpression(expr);\n const result = evaluateNode(ast, context);\n // Unwrap proxy to return raw value\n const unwrapped = unwrapFieldProxy(result);\n return unwrapped;\n } catch (error) {\n // Log error in development, return undefined in production\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Expression evaluation error for \"${expr}\":`, error);\n }\n return undefined;\n }\n}\n\n/**\n * Evaluate a SelectValue descriptor\n *\n * Handles string expressions, objects with nested expressions, and arrays.\n * Does NOT handle functions - those must be handled by the framework adapter.\n *\n * @param descriptor - The SelectValue to evaluate\n * @param context - Evaluation context\n * @returns The evaluated result\n */\nexport function evaluateDescriptor(\n descriptor: unknown,\n context: EvaluationContext,\n): unknown {\n // String: evaluate as expression\n if (typeof descriptor === \"string\") {\n return evaluate(descriptor, context);\n }\n\n // Function: return as-is (framework adapter handles this)\n if (typeof descriptor === \"function\") {\n return descriptor;\n }\n\n // Array: evaluate each element\n if (Array.isArray(descriptor)) {\n return descriptor.map((item) => evaluateDescriptor(item, context));\n }\n\n // Object: evaluate each value\n if (descriptor !== null && typeof descriptor === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(descriptor)) {\n result[key] = evaluateDescriptor(value, context);\n }\n return result;\n }\n\n // Primitive values: return as-is\n return descriptor;\n}\n\n/**\n * Clear the expression AST cache\n * Useful for testing or memory management\n */\nexport function clearExpressionCache(): void {\n astCache.clear();\n}\n","// @formality-ui/core - Field Dependency Inference\n// Extracts field dependencies from expressions for automatic subscription\n\nimport { QUALIFIED_PREFIXES, KEYWORDS } from \"./context\";\n\n/**\n * Regular expression to match valid JavaScript identifiers\n */\nconst IDENTIFIER_REGEX = /\\b([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g;\n\n/**\n * Set of JavaScript keywords to skip\n */\nconst KEYWORD_SET = new Set<string>(KEYWORDS);\n\n/**\n * Set of qualified prefixes that may or may not be field names\n */\nconst QUALIFIED_PREFIX_SET = new Set<string>(QUALIFIED_PREFIXES);\n\n/**\n * Extract field names from an expression string\n *\n * Scans the expression for unqualified identifiers that represent field names.\n * Skips JavaScript keywords and identifiers inside string literals.\n * Qualified prefixes (fields, record, props, etc.) are only skipped when followed by a dot.\n *\n * @param expr - Expression string to analyze\n * @returns Array of unique field names referenced\n *\n * @example\n * inferFieldsFromExpression(\"client.id\") // → [\"client\"]\n * inferFieldsFromExpression(\"client && signed\") // → [\"client\", \"signed\"]\n * inferFieldsFromExpression(\"record.name\") // → [] (qualified path)\n * inferFieldsFromExpression(\"true && false\") // → [] (keywords)\n * inferFieldsFromExpression(\"fields === null\") // → [\"fields\"] (not followed by dot)\n * inferFieldsFromExpression('signed ? \"target-on\" : \"target-off\"') // → [\"signed\"] (string contents skipped)\n */\nexport function inferFieldsFromExpression(expr: string): string[] {\n const fields: string[] = [];\n let match: RegExpExecArray | null;\n\n // Reset regex state\n IDENTIFIER_REGEX.lastIndex = 0;\n\n while ((match = IDENTIFIER_REGEX.exec(expr)) !== null) {\n const identifier = match[1];\n const matchIndex = match.index;\n\n // Check if this match is inside a string literal\n let inString = false;\n let stringChar = \"\";\n let escapeNext = false;\n\n for (let i = 0; i < matchIndex; i++) {\n const char = expr[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escapeNext = true;\n continue;\n }\n\n if (!inString && (char === '\"' || char === \"'\" || char === \"`\")) {\n inString = true;\n stringChar = char;\n continue;\n }\n\n if (inString && char === stringChar) {\n inString = false;\n stringChar = \"\";\n continue;\n }\n }\n\n // Skip if inside a string literal\n if (inString) {\n continue;\n }\n\n // Skip JavaScript keywords\n if (KEYWORD_SET.has(identifier)) {\n continue;\n }\n\n // Check if this identifier is a property access (e.g., .id in client.id)\n // by looking at what comes before it in the string\n const beforeMatch = expr.slice(0, matchIndex);\n const lastNonWhitespace = beforeMatch.trimEnd().slice(-1);\n\n // If preceded by '.', it's a property access, skip it\n if (lastNonWhitespace === \".\") {\n continue;\n }\n\n // Check if this is a qualified prefix followed by a dot\n // (e.g., \"fields\" in \"fields.client\" - skip it)\n // But \"fields\" NOT followed by a dot is a field reference\n const afterMatch = expr.slice(matchIndex + identifier.length);\n if (afterMatch.startsWith(\".\") && QUALIFIED_PREFIX_SET.has(identifier)) {\n continue;\n }\n\n fields.push(identifier);\n }\n\n // Return unique field names\n return [...new Set(fields)];\n}\n\n/**\n * Extract field dependencies from a SelectValue descriptor\n *\n * Recursively processes string expressions, objects, and arrays.\n * Does NOT analyze function bodies - those require explicit subscribesTo.\n *\n * @param descriptor - SelectValue to analyze (string, object, array, or function)\n * @returns Array of unique field names referenced\n *\n * @example\n * inferFieldsFromDescriptor(\"client.id\") // → [\"client\"]\n * inferFieldsFromDescriptor({ queryParams: \"client.id\", filter: \"signed\" }) // → [\"client\", \"signed\"]\n * inferFieldsFromDescriptor([\"client\", \"contact.name\"]) // → [\"client\", \"contact\"]\n * inferFieldsFromDescriptor(() => {}) // → [] (functions need explicit subscribesTo)\n */\nexport function inferFieldsFromDescriptor(descriptor: unknown): string[] {\n // String: extract fields from expression\n if (typeof descriptor === \"string\") {\n return inferFieldsFromExpression(descriptor);\n }\n\n // Function: cannot analyze, return empty (needs explicit subscribesTo)\n if (typeof descriptor === \"function\") {\n return [];\n }\n\n // Array: collect fields from all elements\n if (Array.isArray(descriptor)) {\n const allFields: string[] = [];\n for (const item of descriptor) {\n allFields.push(...inferFieldsFromDescriptor(item));\n }\n return [...new Set(allFields)];\n }\n\n // Object: collect fields from all values\n if (descriptor !== null && typeof descriptor === \"object\") {\n const allFields: string[] = [];\n for (const value of Object.values(descriptor)) {\n allFields.push(...inferFieldsFromDescriptor(value));\n }\n return [...new Set(allFields)];\n }\n\n // Primitive values: no fields\n return [];\n}\n","// @formality-ui/core - Condition Evaluation\n// Pure functions for evaluating conditions against form state\n// ZERO framework dependencies\n\nimport type {\n ConditionDescriptor,\n ConditionResult,\n FieldMatcher,\n} from \"../types\";\nimport { evaluate, evaluateDescriptor } from \"../expression/evaluate\";\nimport {\n buildEvaluationContext,\n unwrapFieldProxy,\n} from \"../expression/context\";\nimport { inferFieldsFromDescriptor } from \"../expression/infer\";\n\n/**\n * Field state with metadata for expression evaluation\n */\nexport interface FieldStateInput {\n value: unknown;\n isTouched?: boolean;\n isDirty?: boolean;\n isValidating?: boolean;\n error?: unknown;\n invalid?: boolean;\n disabled?: boolean;\n}\n\n/**\n * Input for condition evaluation\n */\nexport interface EvaluateConditionsInput {\n /** Array of conditions to evaluate */\n conditions: ConditionDescriptor[];\n\n /** Map of field names to their current values */\n fieldValues: Record<string, unknown>;\n\n /** Optional: Full field states with metadata (isTouched, isDirty, etc.) */\n fieldStates?: Record<string, FieldStateInput>;\n\n /** Original record passed to form */\n record?: Record<string, unknown>;\n\n /** Additional props for expression context */\n props?: Record<string, unknown>;\n}\n\n/**\n * Check if a single field matches its matchers\n *\n * @param fieldName - The field name to check\n * @param matcher - The matchers to apply\n * @param fieldValues - Map of field values\n * @param fieldStates - Optional field states for state-based matchers\n * @returns true if all matchers pass, false otherwise\n */\nfunction evaluateFieldMatcher(\n fieldName: string,\n matcher: FieldMatcher,\n fieldValues: Record<string, unknown>,\n fieldStates?: Record<string, FieldStateInput>,\n): boolean {\n const fieldValue = fieldValues[fieldName];\n const fieldState = fieldStates?.[fieldName];\n\n // Handle primitive value matchers (shorthand for exact match)\n // When matcher is a primitive (number, string, boolean), treat it as { is: matcher }\n if (typeof matcher !== \"object\" || matcher === null) {\n return fieldValue === matcher;\n }\n\n // Check isValid matcher\n if (matcher.isValid !== undefined) {\n const isFieldValid = fieldState\n ? !fieldState.invalid && !fieldState.error\n : true; // No state = assume valid\n if (matcher.isValid !== isFieldValid) {\n return false;\n }\n }\n\n // Check isDisabled matcher\n if (matcher.isDisabled !== undefined) {\n const isFieldDisabled = fieldState?.disabled ?? false;\n if (matcher.isDisabled !== isFieldDisabled) {\n return false;\n }\n }\n\n // Check exact value match\n if (matcher.is !== undefined) {\n if (fieldValue !== matcher.is) {\n return false;\n }\n }\n\n // Check truthy/isTruthy (they're aliases)\n const truthyCheck = matcher.truthy ?? matcher.isTruthy;\n if (truthyCheck !== undefined) {\n const isTruthy = Boolean(fieldValue);\n if (truthyCheck !== isTruthy) {\n return false;\n }\n }\n\n // If no matchers specified, default to truthy check\n const hasAnyMatcher =\n matcher.is !== undefined ||\n matcher.truthy !== undefined ||\n matcher.isTruthy !== undefined ||\n matcher.isValid !== undefined ||\n matcher.isDisabled !== undefined;\n\n if (!hasAnyMatcher) {\n return Boolean(fieldValue);\n }\n\n return true;\n}\n\n/**\n * Type guard to check if a value is a FieldMatcher object with state matchers\n *\n * Distinguishes between value matchers and field state matchers:\n * - Primitives (5, \"a\", true): Value matchers - excluded from isDisabled check\n * - Objects with value matchers (is, truthy, isTruthy): Excluded from isDisabled check\n * - Objects with state matchers (isValid, isDisabled): Included in isDisabled check\n *\n * @param value - The value to check\n * @returns true if the value is a FieldMatcher with state matchers\n */\nfunction isStateFieldMatcher(value: unknown): value is FieldMatcher {\n // Primitives are always value matchers, not state matchers\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n // Check for state matcher properties\n return \"isValid\" in value || \"isDisabled\" in value;\n}\n\n/**\n * Check if a condition matches based on its trigger and matchers\n *\n * Handles triggers:\n * - 'when' as string: Single field reference\n * - 'when' as object: Multi-field with per-field matchers (AND logic)\n * - 'selectWhen': Expression or function trigger\n *\n * Applies matchers:\n * - 'is' (exact match) or 'truthy' (boolean check) for value matching\n * - 'isValid' and 'isDisabled' for field state matching\n *\n * When multiple matchers are specified, ALL must pass (AND logic).\n *\n * @param condition - The condition to check\n * @param context - Evaluation context with field values\n * @param fieldValues - Direct field values map for 'when' lookup\n * @param fieldStates - Optional field states for state-based matchers\n * @returns true if the condition matches, false otherwise\n */\nfunction evaluateConditionMatch(\n condition: ConditionDescriptor,\n context: Record<string, unknown>,\n fieldValues: Record<string, unknown>,\n fieldStates?: Record<string, FieldStateInput>,\n): boolean {\n // Handle multi-field 'when' (object form)\n if (condition.when !== undefined && typeof condition.when === \"object\") {\n // All field conditions must match (AND logic)\n for (const [fieldName, matcher] of Object.entries(condition.when)) {\n if (!evaluateFieldMatcher(fieldName, matcher, fieldValues, fieldStates)) {\n return false;\n }\n }\n\n // Check top-level isDisabled matcher for object when\n // Only check fields that use field state matchers (object values)\n // Skip fields with value matchers (primitive values)\n if (condition.isDisabled !== undefined) {\n // Without fieldStates, we can't verify disabled state - condition doesn't match\n if (!fieldStates) {\n return false;\n }\n\n // Filter to only fields with field state matchers (isValid, isDisabled)\n // Skip fields with value matchers (is, truthy, isTruthy)\n const fieldsWithStateMatchers = Object.entries(condition.when)\n .filter(([, matcher]) => isStateFieldMatcher(matcher))\n .map(([fieldName]) => fieldName);\n\n // Backward compatibility: If no state matchers exist, check all fields\n // This preserves existing behavior for pure value matcher conditions\n // New behavior: When state matchers are present, only check those fields\n const fieldsToCheck =\n fieldsWithStateMatchers.length > 0\n ? fieldsWithStateMatchers\n : Object.keys(condition.when);\n\n // Check if all fields match the expected disabled state\n const allFieldsMatchDisabled = fieldsToCheck.every(\n (fieldName) =>\n fieldStates[fieldName]?.disabled === condition.isDisabled,\n );\n\n if (!allFieldsMatchDisabled) {\n return false;\n }\n }\n\n return true;\n }\n\n let triggerValue: unknown;\n\n // Determine trigger value for single-field or expression triggers\n if (typeof condition.when === \"string\") {\n // Simple field reference: look up field value directly\n triggerValue = fieldValues[condition.when];\n } else if (condition.selectWhen !== undefined) {\n // Expression or function trigger\n if (typeof condition.selectWhen === \"string\") {\n triggerValue = evaluate(condition.selectWhen, context);\n } else if (typeof condition.selectWhen === \"function\") {\n // Functions are evaluated by the framework adapter\n // Core returns the function as-is for the adapter to call\n return false; // Framework adapter handles this case\n } else {\n // Object/array descriptor\n triggerValue = evaluateDescriptor(condition.selectWhen, context);\n }\n } else {\n // No trigger defined - condition doesn't match\n return false;\n }\n\n // Apply field state matchers (isValid, isDisabled)\n // NOTE: These matchers require string 'when' trigger to identify which field to check\n // For object 'when', use field-level matchers in the WhenMultiField object\n if (typeof condition.when === \"string\" && fieldStates) {\n const fieldState = fieldStates[condition.when];\n\n // Check isValid matcher\n if (condition.isValid !== undefined) {\n // Field is valid if not invalid and has no error\n const isFieldValid = fieldState\n ? !fieldState.invalid && !fieldState.error\n : true; // No state = assume valid\n if (condition.isValid !== isFieldValid) {\n return false;\n }\n }\n\n // Check isDisabled matcher\n if (condition.isDisabled !== undefined) {\n const isFieldDisabled = fieldState?.disabled ?? false;\n if (condition.isDisabled !== isFieldDisabled) {\n return false;\n }\n }\n }\n\n // Apply value matchers\n if (condition.is !== undefined) {\n // Exact value match\n return triggerValue === condition.is;\n }\n\n if (condition.truthy !== undefined) {\n // Boolean truthiness check\n const isTruthy = Boolean(triggerValue);\n return condition.truthy ? isTruthy : !isTruthy;\n }\n\n // If only state matchers were specified (isValid/isDisabled), we've already checked them\n if (condition.isValid !== undefined || condition.isDisabled !== undefined) {\n return true;\n }\n\n // Default: truthy check if no matcher specified\n return Boolean(triggerValue);\n}\n\n/**\n * Evaluate all conditions for a field/group\n *\n * Implements the condition evaluation rules:\n * - disabled: OR logic (any true = true)\n * - visible: AND logic (any false = false)\n * - setValue: last matching condition wins\n *\n * @param input - Evaluation input with conditions and state\n * @returns Result with resolved disabled, visible, and setValue states\n *\n * @example\n * const result = evaluateConditions({\n * conditions: [\n * { when: 'signed', is: false, disabled: true },\n * { when: 'archived', truthy: true, visible: false },\n * ],\n * fieldValues: { signed: false, archived: true },\n * });\n * // result.disabled === true (signed is false, matches first condition)\n * // result.visible === false (archived is truthy, matches second condition)\n */\nexport function evaluateConditions(\n input: EvaluateConditionsInput,\n): ConditionResult {\n const { conditions, fieldValues, fieldStates, record, props } = input;\n\n // Build evaluation context for expressions\n // Pass fieldStates to enable access to isTouched, isDirty, etc.\n const context = buildEvaluationContext(\n fieldValues,\n record,\n props,\n fieldStates,\n );\n\n // Initialize result tracking\n let disabled: boolean | undefined;\n let visible: boolean | undefined;\n let setValue: unknown | undefined;\n let hasDisabledCondition = false;\n let hasVisibleCondition = false;\n let hasSetCondition = false;\n\n // Evaluate each condition in order\n for (const condition of conditions) {\n const isMatched = evaluateConditionMatch(\n condition,\n context,\n fieldValues,\n fieldStates,\n );\n\n if (!isMatched) {\n continue;\n }\n\n // Apply disabled action (OR logic: any true = true)\n if (condition.disabled !== undefined) {\n hasDisabledCondition = true;\n disabled = (disabled ?? false) || condition.disabled;\n }\n\n // Apply visible action (AND logic: any false = false)\n if (condition.visible !== undefined) {\n hasVisibleCondition = true;\n // Start with true on first visible condition, then AND subsequent values\n visible =\n visible === undefined\n ? condition.visible\n : visible && condition.visible;\n }\n\n // Apply setValue action (last matching wins)\n if (condition.set !== undefined) {\n hasSetCondition = true;\n setValue = condition.set;\n } else if (condition.selectSet !== undefined) {\n hasSetCondition = true;\n if (typeof condition.selectSet === \"string\") {\n // Unwrap proxy to get raw value for setting\n setValue = unwrapFieldProxy(evaluate(condition.selectSet, context));\n } else if (typeof condition.selectSet === \"function\") {\n // Function must be handled by framework adapter\n // Store the function for the adapter to call\n setValue = condition.selectSet;\n } else {\n // Unwrap proxy to get raw value for setting\n setValue = unwrapFieldProxy(\n evaluateDescriptor(condition.selectSet, context),\n );\n }\n }\n }\n\n return {\n disabled: hasDisabledCondition ? disabled : undefined,\n visible: hasVisibleCondition ? visible : undefined,\n setValue: hasSetCondition ? setValue : undefined,\n hasDisabledCondition,\n hasVisibleCondition,\n hasSetCondition,\n };\n}\n\n/**\n * Evaluate a single condition's match (without applying actions)\n *\n * Useful for checking if a condition would match without computing results.\n *\n * @param condition - The condition to check\n * @param fieldValues - Map of field names to their current values\n * @param record - Optional record for expression context\n * @param props - Optional props for expression context\n * @param fieldStates - Optional field states for state-based matchers\n * @returns true if the condition matches\n */\nexport function conditionMatches(\n condition: ConditionDescriptor,\n fieldValues: Record<string, unknown>,\n record?: Record<string, unknown>,\n props?: Record<string, unknown>,\n fieldStates?: Record<string, FieldStateInput>,\n): boolean {\n const context = buildEvaluationContext(\n fieldValues,\n record,\n props,\n fieldStates,\n );\n return evaluateConditionMatch(condition, context, fieldValues, fieldStates);\n}\n\n/**\n * Merge condition results from multiple sources (e.g., group + field)\n *\n * Follows the same cumulative logic:\n * - disabled: OR logic\n * - visible: AND logic\n * - setValue: later source wins\n *\n * @param results - Array of condition results to merge\n * @returns Merged result\n */\nexport function mergeConditionResults(\n results: ConditionResult[],\n): ConditionResult {\n let disabled: boolean | undefined;\n let visible: boolean | undefined;\n let setValue: unknown | undefined;\n let hasDisabledCondition = false;\n let hasVisibleCondition = false;\n let hasSetCondition = false;\n\n for (const result of results) {\n // disabled: OR logic\n if (result.hasDisabledCondition) {\n hasDisabledCondition = true;\n disabled = (disabled ?? false) || (result.disabled ?? false);\n }\n\n // visible: AND logic\n if (result.hasVisibleCondition) {\n hasVisibleCondition = true;\n visible =\n visible === undefined\n ? result.visible\n : visible && (result.visible ?? true);\n }\n\n // setValue: later source wins\n if (result.hasSetCondition) {\n hasSetCondition = true;\n setValue = result.setValue;\n }\n }\n\n return {\n disabled: hasDisabledCondition ? disabled : undefined,\n visible: hasVisibleCondition ? visible : undefined,\n setValue: hasSetCondition ? setValue : undefined,\n hasDisabledCondition,\n hasVisibleCondition,\n hasSetCondition,\n };\n}\n\n/**\n * Extract field dependencies from an array of conditions\n *\n * Collects 'when' field references and infers dependencies from\n * 'selectWhen' and 'selectSet' expressions. Used for automatic subscription.\n *\n * @param conditions - Array of condition descriptors\n * @returns Array of unique field names referenced\n *\n * @example\n * inferFieldsFromConditions([\n * { when: 'client', disabled: true },\n * { selectWhen: 'signed && approved', visible: true },\n * ])\n * // → ['client', 'signed', 'approved']\n */\nexport function inferFieldsFromConditions(\n conditions: ConditionDescriptor[],\n): string[] {\n const fields: string[] = [];\n\n for (const condition of conditions) {\n // Add 'when' field reference(s)\n if (condition.when !== undefined) {\n if (typeof condition.when === \"string\") {\n fields.push(condition.when);\n } else {\n // Multi-field object: add all field names\n fields.push(...Object.keys(condition.when));\n }\n }\n\n // Infer fields from 'selectWhen' expression\n if (condition.selectWhen !== undefined) {\n fields.push(...inferFieldsFromDescriptor(condition.selectWhen));\n }\n\n // Infer fields from 'selectSet' expression\n if (condition.selectSet !== undefined) {\n fields.push(...inferFieldsFromDescriptor(condition.selectSet));\n }\n\n // Add explicit subscribesTo if specified\n if (condition.subscribesTo !== undefined) {\n fields.push(...condition.subscribesTo);\n }\n }\n\n // Return unique field names\n return [...new Set(fields)];\n}\n","// @formality-ui/core - Validation Pipeline\n// Pure functions for running validators against field values\n// ZERO framework dependencies\n\nimport type {\n ValidationResult,\n ValidatorSpec,\n ValidatorFunction,\n ValidatorsConfig,\n} from \"../types\";\n\n/**\n * Run a single validator against a value\n *\n * Handles both sync and async validators uniformly.\n *\n * @param validator - The validator function to run\n * @param value - The value to validate\n * @param formValues - All form values for cross-field validation\n * @returns Validation result (may be a Promise for async validators)\n */\nfunction runSingleValidator(\n validator: ValidatorFunction,\n value: unknown,\n formValues: Record<string, unknown>,\n): ValidationResult | Promise<ValidationResult> {\n try {\n return validator(value, formValues);\n } catch (error) {\n // If validator throws, treat as validation failure\n return {\n type: \"validation_error\",\n message: error instanceof Error ? error.message : \"Validation error\",\n };\n }\n}\n\n/**\n * Resolve a named validator from the validators config\n *\n * @param name - Validator name\n * @param validators - Named validators config\n * @returns The validator function or undefined if not found\n */\nfunction resolveNamedValidator(\n name: string,\n validators: ValidatorsConfig,\n): ValidatorFunction | undefined {\n const validator = validators[name];\n\n if (typeof validator === \"function\") {\n // Check if it's a factory (takes args and returns a function)\n // We detect this by checking if calling with no args returns a function\n // For simple validators, they return ValidationResult directly\n // This is a best-effort heuristic\n return validator as ValidatorFunction;\n }\n\n return undefined;\n}\n\n/**\n * Run a validator specification against a value\n *\n * Supports:\n * - string: Named validator lookup\n * - function: Inline validator\n * - array: Multiple validators in sequence (short-circuits on first failure)\n *\n * @param spec - Validator specification\n * @param value - Value to validate\n * @param formValues - All form values for cross-field validation\n * @param namedValidators - Named validators config from provider\n * @returns Validation result (may be a Promise)\n *\n * @example\n * // Named validator\n * runValidator('required', '', {}, validators)\n *\n * // Inline validator\n * runValidator((val) => val ? true : 'Required', '', {})\n *\n * // Multiple validators\n * runValidator(['required', 'email'], '', {}, validators)\n */\nexport async function runValidator(\n spec: ValidatorSpec,\n value: unknown,\n formValues: Record<string, unknown>,\n namedValidators?: ValidatorsConfig,\n): Promise<ValidationResult> {\n // Handle array of validators - run in sequence\n if (Array.isArray(spec)) {\n for (const item of spec) {\n const result = await runValidator(\n item,\n value,\n formValues,\n namedValidators,\n );\n // Short-circuit on first failure\n if (!isValid(result)) {\n return result;\n }\n }\n return true; // All passed\n }\n\n // Handle string (named validator)\n if (typeof spec === \"string\") {\n if (!namedValidators) {\n console.warn(\n `Named validator \"${spec}\" requested but no validators provided`,\n );\n return true; // Pass if no validators configured\n }\n\n const validator = resolveNamedValidator(spec, namedValidators);\n if (!validator) {\n console.warn(`Validator \"${spec}\" not found in validators config`);\n return true; // Pass if validator not found\n }\n\n const result = runSingleValidator(validator, value, formValues);\n return Promise.resolve(result);\n }\n\n // Handle function (inline validator)\n if (typeof spec === \"function\") {\n const result = runSingleValidator(spec, value, formValues);\n return Promise.resolve(result);\n }\n\n // Unknown spec type - pass\n return true;\n}\n\n/**\n * Run validator synchronously (for validators known to be sync)\n *\n * @param spec - Validator specification\n * @param value - Value to validate\n * @param formValues - All form values\n * @param namedValidators - Named validators config\n * @returns Validation result\n */\nexport function runValidatorSync(\n spec: ValidatorSpec,\n value: unknown,\n formValues: Record<string, unknown>,\n namedValidators?: ValidatorsConfig,\n): ValidationResult {\n // Handle array of validators\n if (Array.isArray(spec)) {\n for (const item of spec) {\n const result = runValidatorSync(item, value, formValues, namedValidators);\n if (!isValid(result)) {\n return result;\n }\n }\n return true;\n }\n\n // Handle string (named validator)\n if (typeof spec === \"string\") {\n if (!namedValidators) {\n return true;\n }\n\n const validator = resolveNamedValidator(spec, namedValidators);\n if (!validator) {\n return true;\n }\n\n const result = validator(value, formValues);\n // If it returns a Promise, this will fail at runtime\n // Use runValidator for async support\n return result as ValidationResult;\n }\n\n // Handle function\n if (typeof spec === \"function\") {\n const result = spec(value, formValues);\n return result as ValidationResult;\n }\n\n return true;\n}\n\n/**\n * Check if a validation result indicates success\n *\n * @param result - Validation result to check\n * @returns true if valid, false if invalid\n */\nexport function isValid(result: ValidationResult): boolean {\n if (result === true || result === undefined) {\n return true;\n }\n return false;\n}\n\n/**\n * Combine multiple validators into a single validator function\n *\n * @param validators - Array of validator specs to combine\n * @param namedValidators - Named validators config\n * @returns Combined validator function\n */\nexport function composeValidators(\n validators: ValidatorSpec[],\n namedValidators?: ValidatorsConfig,\n): ValidatorFunction {\n return async (value: unknown, formValues: Record<string, unknown>) => {\n for (const spec of validators) {\n const result = await runValidator(\n spec,\n value,\n formValues,\n namedValidators,\n );\n if (!isValid(result)) {\n return result;\n }\n }\n return true;\n };\n}\n\n/**\n * Create a required validator\n *\n * @returns Validator function that checks for non-empty values\n */\nexport function required(): ValidatorFunction {\n return (value: unknown) => {\n if (value === undefined || value === null || value === \"\") {\n return { type: \"required\", message: \"This field is required\" };\n }\n if (Array.isArray(value) && value.length === 0) {\n return { type: \"required\", message: \"This field is required\" };\n }\n return true;\n };\n}\n\n/**\n * Create a minLength validator factory\n *\n * @param length - Minimum length\n * @returns Validator function\n */\nexport function minLength(length: number): ValidatorFunction {\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return true; // Skip non-strings\n }\n if (value.length < length) {\n return {\n type: \"minLength\",\n message: `Must be at least ${length} characters`,\n };\n }\n return true;\n };\n}\n\n/**\n * Create a maxLength validator factory\n *\n * @param length - Maximum length\n * @returns Validator function\n */\nexport function maxLength(length: number): ValidatorFunction {\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return true;\n }\n if (value.length > length) {\n return {\n type: \"maxLength\",\n message: `Must be at most ${length} characters`,\n };\n }\n return true;\n };\n}\n\n/**\n * Create a pattern validator factory\n *\n * @param pattern - RegExp pattern to match\n * @param message - Custom error message\n * @returns Validator function\n */\nexport function pattern(pattern: RegExp, message?: string): ValidatorFunction {\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return true;\n }\n if (!pattern.test(value)) {\n return {\n type: \"pattern\",\n message: message ?? \"Invalid format\",\n };\n }\n return true;\n };\n}\n","// @formality-ui/core - Error Message Resolution\n// Pure functions for resolving validation error messages\n// ZERO framework dependencies\n\nimport type { ValidationResult, ErrorMessagesConfig } from \"../types\";\n\n/**\n * Resolve an error message from a validation result\n *\n * Handles all ValidationResult types:\n * - true/undefined → undefined (valid, no message)\n * - false → lookup 'invalid' in errorMessages or use default\n * - string → use string directly as message\n * - { type, message? } → use message or lookup type in errorMessages\n *\n * @param result - Validation result to resolve\n * @param errorMessages - Error message templates by type key\n * @returns Error message string or undefined if valid\n *\n * @example\n * resolveErrorMessage(false, {}) // → 'Invalid value'\n * resolveErrorMessage('Custom error', {}) // → 'Custom error'\n * resolveErrorMessage({ type: 'required' }, { required: 'This is required' }) // → 'This is required'\n */\nexport function resolveErrorMessage(\n result: ValidationResult,\n errorMessages?: ErrorMessagesConfig,\n): string | undefined {\n // Valid results - no error message\n if (result === true || result === undefined) {\n return undefined;\n }\n\n // String result - use directly as message\n if (typeof result === \"string\") {\n return result;\n }\n\n // False result - generic invalid message\n if (result === false) {\n return errorMessages?.[\"invalid\"] ?? \"Invalid value\";\n }\n\n // Object result with type and optional message\n if (typeof result === \"object\" && result !== null) {\n // Use provided message if available\n if (result.message) {\n return result.message;\n }\n\n // Lookup message by type\n if (result.type && errorMessages?.[result.type]) {\n return errorMessages[result.type];\n }\n\n // Fallback to type as message\n if (result.type) {\n return formatTypeAsMessage(result.type);\n }\n\n return \"Invalid value\";\n }\n\n return \"Invalid value\";\n}\n\n/**\n * Format a validation type key into a human-readable message\n *\n * @param type - Type key (e.g., 'required', 'minLength')\n * @returns Formatted message\n *\n * @example\n * formatTypeAsMessage('required') // → 'Required'\n * formatTypeAsMessage('minLength') // → 'Min length'\n * formatTypeAsMessage('maxLength') // → 'Max length'\n */\nexport function formatTypeAsMessage(type: string): string {\n // Convert camelCase/snake_case to words\n const words = type\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase → camel Case\n .replace(/_/g, \" \") // snake_case → snake case\n .toLowerCase();\n\n // Capitalize first letter\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Create an error messages config with default messages\n *\n * @param overrides - Custom error messages to merge with defaults\n * @returns Complete error messages config\n */\nexport function createErrorMessages(\n overrides?: ErrorMessagesConfig,\n): ErrorMessagesConfig {\n const defaults: ErrorMessagesConfig = {\n required: \"This field is required\",\n invalid: \"Invalid value\",\n minLength: \"Too short\",\n maxLength: \"Too long\",\n pattern: \"Invalid format\",\n min: \"Value is too small\",\n max: \"Value is too large\",\n email: \"Invalid email address\",\n url: \"Invalid URL\",\n number: \"Must be a number\",\n integer: \"Must be a whole number\",\n positive: \"Must be positive\",\n negative: \"Must be negative\",\n date: \"Invalid date\",\n phone: \"Invalid phone number\",\n unique: \"Must be unique\",\n match: \"Fields do not match\",\n validate: \"Validation failed\",\n };\n\n return {\n ...defaults,\n ...overrides,\n };\n}\n\n/**\n * Extract error type from a validation result\n *\n * @param result - Validation result\n * @returns Error type string or undefined if valid\n */\nexport function getErrorType(result: ValidationResult): string | undefined {\n if (result === true || result === undefined) {\n return undefined;\n }\n\n if (result === false) {\n return \"invalid\";\n }\n\n if (typeof result === \"string\") {\n return \"validate\";\n }\n\n if (typeof result === \"object\" && result !== null) {\n return result.type || \"validate\";\n }\n\n return \"validate\";\n}\n\n/**\n * Create a validation error object\n *\n * @param type - Error type\n * @param message - Error message (optional, will be resolved from errorMessages)\n * @param errorMessages - Error messages config\n * @returns Error object with type and message\n */\nexport function createValidationError(\n type: string,\n message?: string,\n errorMessages?: ErrorMessagesConfig,\n): { type: string; message: string } {\n const resolvedMessage =\n message ?? errorMessages?.[type] ?? formatTypeAsMessage(type);\n\n return {\n type,\n message: resolvedMessage,\n };\n}\n","// @formality-ui/core - Value Transformation Pipeline\n// Pure functions for parsing and formatting field values\n// ZERO framework dependencies\n\n/**\n * Parser function type\n * Transforms user input into form value\n */\nexport type ParserFunction = (value: unknown) => unknown;\n\n/**\n * Formatter function type\n * Transforms form value into display value\n */\nexport type FormatterFunction = (value: unknown) => unknown;\n\n/**\n * Parser specification - can be a named parser or inline function\n */\nexport type ParserSpec = string | ParserFunction;\n\n/**\n * Formatter specification - can be a named formatter or inline function\n */\nexport type FormatterSpec = string | FormatterFunction;\n\n/**\n * Named parsers configuration\n */\nexport type ParsersConfig = Record<string, ParserFunction>;\n\n/**\n * Named formatters configuration\n */\nexport type FormattersConfig = Record<string, FormatterFunction>;\n\n/**\n * Parse an input value using a parser specification\n *\n * Used on onChange to transform user input into form value.\n *\n * @param value - Raw input value from component\n * @param parserSpec - Parser specification (name or function)\n * @param namedParsers - Named parsers config from provider\n * @returns Parsed value for form state\n *\n * @example\n * // Named parser\n * parse(\"42.69\", \"float\", { float: v => parseFloat(String(v)) || 0 })\n * // → 42.69\n *\n * // Inline parser\n * parse(\"42.69\", v => parseFloat(String(v)) || 0)\n * // → 42.69\n */\nexport function parse(\n value: unknown,\n parserSpec?: ParserSpec,\n namedParsers?: ParsersConfig,\n): unknown {\n // No parser - return value as-is\n if (parserSpec === undefined) {\n return value;\n }\n\n // Named parser\n if (typeof parserSpec === \"string\") {\n const parser = namedParsers?.[parserSpec];\n if (!parser) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Parser \"${parserSpec}\" not found in parsers config`);\n }\n return value;\n }\n try {\n return parser(value);\n } catch (error) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Parser \"${parserSpec}\" threw error:`, error);\n }\n return value;\n }\n }\n\n // Inline parser function\n if (typeof parserSpec === \"function\") {\n try {\n return parserSpec(value);\n } catch (error) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"Inline parser threw error:\", error);\n }\n return value;\n }\n }\n\n return value;\n}\n\n/**\n * Format a form value using a formatter specification\n *\n * Used on render to transform form value into display value.\n *\n * @param value - Form state value\n * @param formatterSpec - Formatter specification (name or function)\n * @param namedFormatters - Named formatters config from provider\n * @returns Formatted value for display\n *\n * @example\n * // Named formatter\n * format(42.69, \"float\", { float: v => typeof v === 'number' ? v.toFixed(2) : '' })\n * // → \"42.69\"\n *\n * // Inline formatter\n * format(42.69, v => typeof v === 'number' ? v.toFixed(2) : '')\n * // → \"42.69\"\n */\nexport function format(\n value: unknown,\n formatterSpec?: FormatterSpec,\n namedFormatters?: FormattersConfig,\n): unknown {\n // No formatter - return value as-is\n if (formatterSpec === undefined) {\n return value;\n }\n\n // Named formatter\n if (typeof formatterSpec === \"string\") {\n const formatter = namedFormatters?.[formatterSpec];\n if (!formatter) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `Formatter \"${formatterSpec}\" not found in formatters config`,\n );\n }\n return value;\n }\n try {\n return formatter(value);\n } catch (error) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Formatter \"${formatterSpec}\" threw error:`, error);\n }\n return value;\n }\n }\n\n // Inline formatter function\n if (typeof formatterSpec === \"function\") {\n try {\n return formatterSpec(value);\n } catch (error) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"Inline formatter threw error:\", error);\n }\n return value;\n }\n }\n\n return value;\n}\n\n/**\n * Extract the actual value from a complex object using valueField\n *\n * Used for autocomplete/select components that store objects but need to\n * extract a specific property for submission.\n *\n * @param value - Complex value (object or primitive)\n * @param valueField - Property name to extract\n * @returns Extracted value or original value if not applicable\n *\n * @example\n * extractValueField({ id: 5, name: \"Acme\" }, \"id\")\n * // → 5\n *\n * extractValueField(\"simple\", \"id\")\n * // → \"simple\" (no extraction needed)\n */\nexport function extractValueField(\n value: unknown,\n valueField?: string,\n): unknown {\n // No valueField - return as-is\n if (!valueField) {\n return value;\n }\n\n // Value is null/undefined - return as-is\n if (value === null || value === undefined) {\n return value;\n }\n\n // Value is not an object - return as-is\n if (typeof value !== \"object\") {\n return value;\n }\n\n // Extract the field\n return (value as Record<string, unknown>)[valueField];\n}\n\n/**\n * Transform a field name for submission\n *\n * Used for fields that need a different name in the submitted data.\n * Example: \"client\" field with getSubmitField → \"clientId\"\n *\n * @param fieldName - Original field name\n * @param getSubmitField - Transform function\n * @returns Transformed field name\n *\n * @example\n * transformFieldName(\"client\", name => `${name}Id`)\n * // → \"clientId\"\n */\nexport function transformFieldName(\n fieldName: string,\n getSubmitField?: (name: string) => string,\n): string {\n if (!getSubmitField) {\n return fieldName;\n }\n return getSubmitField(fieldName);\n}\n\n/**\n * Create a float parser with configurable behavior\n *\n * @param fallback - Value to return on parse failure (default: 0)\n * @returns Parser function\n */\nexport function createFloatParser(fallback: number = 0): ParserFunction {\n return (value: unknown) => {\n const parsed = parseFloat(String(value));\n return isNaN(parsed) ? fallback : parsed;\n };\n}\n\n/**\n * Create a float formatter with configurable precision\n *\n * @param precision - Number of decimal places (default: 2)\n * @returns Formatter function\n */\nexport function createFloatFormatter(precision: number = 2): FormatterFunction {\n return (value: unknown) => {\n if (typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n return value.toFixed(precision);\n };\n}\n\n/**\n * Create an integer parser\n *\n * @param fallback - Value to return on parse failure (default: 0)\n * @returns Parser function\n */\nexport function createIntParser(fallback: number = 0): ParserFunction {\n return (value: unknown) => {\n const parsed = parseInt(String(value), 10);\n return isNaN(parsed) ? fallback : parsed;\n };\n}\n\n/**\n * Create a trim parser that removes whitespace\n *\n * @returns Parser function\n */\nexport function createTrimParser(): ParserFunction {\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return value;\n }\n return value.trim();\n };\n}\n\n/**\n * Create default parsers config\n *\n * @returns Standard parsers config\n */\nexport function createDefaultParsers(): ParsersConfig {\n return {\n float: createFloatParser(),\n int: createIntParser(),\n integer: createIntParser(),\n trim: createTrimParser(),\n string: (value) => String(value ?? \"\"),\n };\n}\n\n/**\n * Create default formatters config\n *\n * @returns Standard formatters config\n */\nexport function createDefaultFormatters(): FormattersConfig {\n return {\n float: createFloatFormatter(2),\n float2: createFloatFormatter(2),\n float3: createFloatFormatter(3),\n float4: createFloatFormatter(4),\n percent: createFloatFormatter(2),\n percent3: createFloatFormatter(3),\n integer: (value) => {\n if (typeof value !== \"number\" || isNaN(value)) {\n return \"\";\n }\n return Math.round(value).toString();\n },\n string: (value) => String(value ?? \"\"),\n };\n}\n","// @formality-ui/core - Configuration Merging\n// Pure functions for merging configuration layers\n// ZERO framework dependencies\n\nimport type {\n InputConfig,\n FieldConfig,\n FormConfig,\n FormalityProviderConfig,\n} from \"../types\";\n\n/**\n * Deep merge two objects, with the second object taking precedence\n *\n * @param base - Base object\n * @param override - Override object (takes precedence)\n * @returns Merged object\n */\nexport function deepMerge<T extends object>(\n base: T,\n override: Partial<T> | undefined,\n): T {\n if (!override) {\n return base;\n }\n\n const result = { ...base } as T;\n\n for (const key in override) {\n const baseValue = base[key as keyof T];\n const overrideValue = override[key as keyof T];\n\n if (overrideValue === undefined) {\n continue;\n }\n\n if (\n typeof baseValue === \"object\" &&\n baseValue !== null &&\n typeof overrideValue === \"object\" &&\n overrideValue !== null &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n // Recursively merge objects\n result[key as keyof T] = deepMerge(\n baseValue as object,\n overrideValue as object,\n ) as T[keyof T];\n } else {\n // Override value takes precedence\n result[key as keyof T] = overrideValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Merge input configurations from multiple sources\n *\n * Priority order (highest to lowest):\n * 1. Form-level inputs\n * 2. Provider-level inputs\n *\n * @param providerInputs - Provider input configs\n * @param formInputs - Form input configs (or function to transform)\n * @returns Merged input configs\n */\nexport function mergeInputConfigs(\n providerInputs: Record<string, InputConfig>,\n formInputs?: FormConfig[\"inputs\"],\n): Record<string, InputConfig> {\n // No form inputs - return provider inputs\n if (!formInputs) {\n return providerInputs;\n }\n\n // Function form - allow form to transform all inputs\n if (typeof formInputs === \"function\") {\n const transformed = formInputs(providerInputs);\n return mergeInputConfigs(providerInputs, transformed);\n }\n\n // Object form - merge each input config\n const result = { ...providerInputs };\n\n for (const [type, overrides] of Object.entries(formInputs)) {\n if (result[type]) {\n result[type] = deepMerge(result[type], overrides);\n } else {\n result[type] = overrides as InputConfig;\n }\n }\n\n return result;\n}\n\n/**\n * Resolve input config for a specific type\n *\n * @param type - Input type key\n * @param inputs - Merged input configs\n * @param defaultType - Default type if specified type not found\n * @returns Input config or undefined\n */\nexport function resolveInputConfig(\n type: string,\n inputs: Record<string, InputConfig>,\n defaultType: string = \"textField\",\n): InputConfig | undefined {\n return inputs[type] ?? inputs[defaultType];\n}\n\n/**\n * Resolve field type from multiple sources\n *\n * Priority order (highest to lowest):\n * 1. Component prop type\n * 2. Field config type\n * 3. Default type ('textField')\n *\n * @param componentType - Type from component props\n * @param fieldConfig - Field configuration\n * @param defaultType - Default type\n * @returns Resolved type\n */\nexport function resolveFieldType(\n componentType?: string,\n fieldConfig?: FieldConfig,\n defaultType: string = \"textField\",\n): string {\n return componentType ?? fieldConfig?.type ?? defaultType;\n}\n\n/**\n * Merge static props from multiple configuration layers\n *\n * Priority order (highest to lowest):\n * 1. Component props (from JSX)\n * 2. Field config selectProps (evaluated separately)\n * 3. Field config props\n * 4. Input config props\n * 5. Form-level selectDefaultFieldProps (evaluated separately)\n * 6. Form-level defaultFieldProps\n * 7. Provider-level selectDefaultFieldProps (evaluated separately)\n * 8. Provider-level defaultFieldProps\n *\n * NOTE: This function only merges STATIC props. Dynamic props (selectProps,\n * selectDefaultFieldProps) must be evaluated and merged separately.\n *\n * @param layers - Configuration layers from lowest to highest priority\n * @returns Merged static props\n */\nexport function mergeStaticProps(\n ...layers: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const layer of layers) {\n if (layer) {\n Object.assign(result, layer);\n }\n }\n\n return result;\n}\n\n/**\n * Merge all field props following the priority order\n *\n * This is the main props merging function that combines:\n * - Static props from config layers\n * - Evaluated dynamic props\n * - Core field props\n *\n * @param options - All props sources\n * @returns Final merged props\n */\nexport function mergeFieldProps(options: {\n providerDefaultFieldProps?: Record<string, unknown>;\n providerSelectDefaultFieldProps?: Record<string, unknown>;\n formDefaultFieldProps?: Record<string, unknown>;\n formSelectDefaultFieldProps?: Record<string, unknown>;\n inputProps?: Record<string, unknown>;\n fieldConfigProps?: Record<string, unknown>;\n selectProps?: Record<string, unknown>;\n componentProps?: Record<string, unknown>;\n coreProps?: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n providerDefaultFieldProps,\n providerSelectDefaultFieldProps,\n formDefaultFieldProps,\n formSelectDefaultFieldProps,\n inputProps,\n fieldConfigProps,\n selectProps,\n componentProps,\n coreProps,\n } = options;\n\n // Merge in priority order (later overrides earlier)\n return mergeStaticProps(\n providerDefaultFieldProps,\n providerSelectDefaultFieldProps,\n formDefaultFieldProps,\n formSelectDefaultFieldProps,\n inputProps,\n fieldConfigProps,\n selectProps,\n componentProps,\n coreProps, // Core props always win (name, value, onChange, etc.)\n );\n}\n\n/**\n * Create a merged configuration context\n *\n * Combines provider and form configs into a single context object\n * for use during field rendering.\n *\n * @param providerConfig - Provider configuration\n * @param formConfig - Form configuration\n * @returns Merged configuration context\n */\nexport function createConfigContext(\n providerConfig: FormalityProviderConfig,\n formConfig?: FormConfig,\n): {\n inputs: Record<string, InputConfig>;\n formatters: Record<string, (value: unknown) => unknown>;\n parsers: Record<string, (value: unknown) => unknown>;\n validators: Record<string, unknown>;\n errorMessages: Record<string, string>;\n defaultFieldProps: Record<string, unknown>;\n selectDefaultFieldProps: unknown;\n} {\n const mergedInputs = mergeInputConfigs(\n providerConfig.inputs,\n formConfig?.inputs,\n );\n\n return {\n inputs: mergedInputs,\n formatters: providerConfig.formatters ?? {},\n parsers: providerConfig.parsers ?? {},\n validators: providerConfig.validators ?? {},\n errorMessages: providerConfig.errorMessages ?? {},\n defaultFieldProps: mergeStaticProps(\n providerConfig.defaultFieldProps,\n formConfig?.defaultFieldProps,\n ),\n selectDefaultFieldProps:\n formConfig?.selectDefaultFieldProps ??\n providerConfig.selectDefaultFieldProps,\n };\n}\n","// @formality-ui/core - Default Value Resolution\n// Pure functions for resolving initial/default values\n// ZERO framework dependencies\n\nimport type { FieldConfig, InputConfig } from \"../types\";\n\n/**\n * Resolve the initial value for a field\n *\n * Priority order (highest to lowest):\n * 1. defaultValues[fieldName] (from Form props)\n * 2. record[recordKey] (using recordKey if specified, else fieldName)\n * 3. inputConfig.defaultValue (from input type definition)\n *\n * @param fieldName - Field name\n * @param fieldConfig - Field configuration\n * @param inputConfig - Input type configuration\n * @param record - Record data passed to form\n * @param defaultValues - Default values passed to form\n * @returns Resolved initial value\n *\n * @example\n * // Field with recordKey mapping\n * resolveInitialValue(\n * 'client',\n * { recordKey: 'selectedClient' },\n * { defaultValue: null },\n * { selectedClient: { id: 5 } },\n * {}\n * )\n * // → { id: 5 }\n *\n * // Field with explicit defaultValue\n * resolveInitialValue(\n * 'status',\n * {},\n * { defaultValue: 'pending' },\n * {},\n * { status: 'active' }\n * )\n * // → 'active' (defaultValues takes precedence)\n */\nexport function resolveInitialValue(\n fieldName: string,\n fieldConfig?: FieldConfig,\n inputConfig?: InputConfig,\n record?: Record<string, unknown>,\n defaultValues?: Record<string, unknown>,\n): unknown {\n // Priority 1: Explicit default value for this field\n if (defaultValues && fieldName in defaultValues) {\n return defaultValues[fieldName];\n }\n\n // Priority 2: Record value (using recordKey if specified)\n const recordKey = fieldConfig?.recordKey ?? fieldName;\n if (record && recordKey in record) {\n return record[recordKey];\n }\n\n // Priority 3: Input type default value\n if (inputConfig?.defaultValue !== undefined) {\n return inputConfig.defaultValue;\n }\n\n // No default - return undefined\n return undefined;\n}\n\n/**\n * Resolve initial values for all fields in a configuration\n *\n * @param fieldConfigs - Map of field names to configurations\n * @param inputs - Map of input types to configurations\n * @param record - Record data passed to form\n * @param defaultValues - Default values passed to form\n * @returns Map of field names to initial values\n */\nexport function resolveAllInitialValues(\n fieldConfigs: Record<string, FieldConfig>,\n inputs: Record<string, InputConfig>,\n record?: Record<string, unknown>,\n defaultValues?: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [fieldName, fieldConfig] of Object.entries(fieldConfigs)) {\n const type = fieldConfig.type ?? \"textField\";\n const inputConfig = inputs[type];\n\n const value = resolveInitialValue(\n fieldName,\n fieldConfig,\n inputConfig,\n record,\n defaultValues,\n );\n\n if (value !== undefined) {\n result[fieldName] = value;\n }\n }\n\n // Also include any explicit default values not in config\n if (defaultValues) {\n for (const [fieldName, value] of Object.entries(defaultValues)) {\n if (!(fieldName in result)) {\n result[fieldName] = value;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if a value is considered \"empty\" for default value purposes\n *\n * @param value - Value to check\n * @returns true if value is empty\n */\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null) {\n return true;\n }\n if (value === \"\") {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Get the default value for an input type\n *\n * Falls back to common defaults based on type name if not specified.\n *\n * @param inputConfig - Input configuration\n * @param typeName - Input type name (for fallback logic)\n * @returns Default value\n */\nexport function getInputDefaultValue(\n inputConfig?: InputConfig,\n typeName?: string,\n): unknown {\n // Explicit default value\n if (inputConfig?.defaultValue !== undefined) {\n return inputConfig.defaultValue;\n }\n\n // Type-based defaults\n if (typeName) {\n switch (typeName) {\n case \"switch\":\n case \"checkbox\":\n return false;\n case \"number\":\n case \"decimal\":\n case \"integer\":\n return 0;\n case \"select\":\n case \"autocomplete\":\n return null;\n case \"multiSelect\":\n case \"checkboxGroup\":\n return [];\n case \"textField\":\n case \"text\":\n case \"textarea\":\n case \"email\":\n case \"password\":\n default:\n return \"\";\n }\n }\n\n return \"\";\n}\n\n/**\n * Merge record data with form default values\n *\n * Record values take precedence over defaults for non-empty values.\n *\n * @param record - Record data (may have partial data)\n * @param defaults - Default values\n * @returns Merged values\n */\nexport function mergeRecordWithDefaults(\n record?: Record<string, unknown>,\n defaults?: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Start with defaults\n if (defaults) {\n Object.assign(result, defaults);\n }\n\n // Override with record values (including empty values to preserve intentional nulls)\n if (record) {\n for (const [key, value] of Object.entries(record)) {\n // Only override if the key exists in record (preserves intentional nulls/empty)\n result[key] = value;\n }\n }\n\n return result;\n}\n","// @formality-ui/core - Label Resolution\n// Pure functions for resolving field labels\n// ZERO framework dependencies\n\nimport type { FieldConfig } from \"../types\";\n\n/**\n * Convert a camelCase or PascalCase field name to a human-readable label\n *\n * @param fieldName - The field name to humanize\n * @returns Human-readable label\n *\n * @example\n * humanizeLabel(\"clientContact\") // → \"Client Contact\"\n * humanizeLabel(\"minGrossMarginPercent\") // → \"Min Gross Margin Percent\"\n * humanizeLabel(\"CCIP/CCOP\") // → \"CCIP/CCOP\" (preserved)\n * humanizeLabel(\"firstName\") // → \"First Name\"\n * humanizeLabel(\"HTMLParser\") // → \"Html Parser\"\n * humanizeLabel(\"userID\") // → \"User Id\"\n */\nexport function humanizeLabel(fieldName: string): string {\n // Empty string\n if (!fieldName) {\n return \"\";\n }\n\n // Handle special characters (preserve as-is with first letter capitalized)\n if (/[^a-zA-Z0-9]/.test(fieldName)) {\n // Contains special chars - might be intentional (e.g., \"CCIP/CCOP\")\n // Just capitalize first letter if needed\n return fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n }\n\n // Split on camelCase boundaries\n // \"clientContact\" → [\"client\", \"Contact\"]\n // \"HTMLParser\" → [\"HTML\", \"Parser\"]\n const words = fieldName\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase: clientContact → client Contact\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\") // acronyms: HTMLParser → HTML Parser\n .split(\" \");\n\n // Capitalize each word\n return words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n\n/**\n * Resolve the label for a field\n *\n * Priority order (highest to lowest):\n * 1. Component prop (label from JSX props)\n * 2. Field config props.label\n * 3. Evaluated selectProps.label\n * 4. Field config label\n * 5. Field config title (legacy alias)\n * 6. Auto-generated from field name\n *\n * @param fieldName - Field name\n * @param fieldConfig - Field configuration\n * @param evaluatedSelectProps - Pre-evaluated selectProps\n * @param componentProps - Props from JSX\n * @returns Resolved label string\n */\nexport function resolveLabel(\n fieldName: string,\n fieldConfig?: FieldConfig,\n evaluatedSelectProps?: Record<string, unknown>,\n componentProps?: Record<string, unknown>,\n): string {\n // Priority 1: Component prop\n if (componentProps?.label !== undefined) {\n return String(componentProps.label);\n }\n\n // Priority 2: Field config props.label\n if (fieldConfig?.props?.label !== undefined) {\n return String(fieldConfig.props.label);\n }\n\n // Priority 3: Evaluated selectProps.label\n if (evaluatedSelectProps?.label !== undefined) {\n return String(evaluatedSelectProps.label);\n }\n\n // Priority 4: Field config label\n if (fieldConfig?.label !== undefined) {\n return fieldConfig.label;\n }\n\n // Priority 5: Field config title (legacy alias)\n if (fieldConfig?.title !== undefined) {\n return fieldConfig.title;\n }\n\n // Priority 6: Auto-generate from field name\n return humanizeLabel(fieldName);\n}\n\n/**\n * Resolve the title for a form\n *\n * @param formTitle - Static form title\n * @param evaluatedSelectTitle - Pre-evaluated selectTitle\n * @returns Resolved title string or undefined\n */\nexport function resolveFormTitle(\n formTitle?: string,\n evaluatedSelectTitle?: unknown,\n): string | undefined {\n // Evaluated selectTitle takes precedence\n if (evaluatedSelectTitle !== undefined && evaluatedSelectTitle !== null) {\n return String(evaluatedSelectTitle);\n }\n\n // Static title\n return formTitle;\n}\n\n/**\n * Check if a label is auto-generated (matches the humanized field name)\n *\n * @param fieldName - Field name\n * @param label - Current label\n * @returns true if label appears to be auto-generated\n */\nexport function isAutoGeneratedLabel(\n fieldName: string,\n label: string,\n): boolean {\n return humanizeLabel(fieldName) === label;\n}\n\n/**\n * Create a label with a unit suffix\n *\n * @param baseLabel - Base label text\n * @param unit - Unit to append (e.g., '%', '$', 'kg')\n * @returns Label with unit in parentheses\n *\n * @example\n * createLabelWithUnit(\"Min Gross Margin\", \"%\") // → \"Min Gross Margin (%)\"\n * createLabelWithUnit(\"Weight\", \"kg\") // → \"Weight (kg)\"\n */\nexport function createLabelWithUnit(baseLabel: string, unit: string): string {\n return `${baseLabel} (${unit})`;\n}\n\n/**\n * Extract the base label and unit from a label with unit suffix\n *\n * @param label - Label potentially containing unit\n * @returns Object with base label and optional unit\n *\n * @example\n * parseLabelWithUnit(\"Min Gross Margin (%)\") // → { base: \"Min Gross Margin\", unit: \"%\" }\n * parseLabelWithUnit(\"Client Contact\") // → { base: \"Client Contact\", unit: undefined }\n */\nexport function parseLabelWithUnit(label: string): {\n base: string;\n unit?: string;\n} {\n const match = label.match(/^(.+)\\s*\\(([^)]+)\\)$/);\n if (match) {\n return {\n base: match[1].trim(),\n unit: match[2],\n };\n }\n return { base: label };\n}\n\n/**\n * Sort fields by their order property\n *\n * @param fieldNames - Array of field names\n * @param fieldConfigs - Map of field configs\n * @returns Sorted array of field names\n */\nexport function sortFieldsByOrder(\n fieldNames: string[],\n fieldConfigs: Record<string, FieldConfig>,\n): string[] {\n return [...fieldNames].sort((a, b) => {\n const orderA = fieldConfigs[a]?.order ?? Infinity;\n const orderB = fieldConfigs[b]?.order ?? Infinity;\n return orderA - orderB;\n });\n}\n\n/**\n * Get fields that are not in the declared set\n *\n * @param allFields - All field names from config\n * @param declaredFields - Set of explicitly declared field names\n * @returns Array of unused field names\n */\nexport function getUnusedFields(\n allFields: string[],\n declaredFields: Set<string>,\n): string[] {\n return allFields.filter((name) => !declaredFields.has(name));\n}\n\n/**\n * Get ordered unused fields\n *\n * @param allFields - All field names from config\n * @param declaredFields - Set of explicitly declared field names\n * @param fieldConfigs - Map of field configs\n * @returns Sorted array of unused field names\n */\nexport function getOrderedUnusedFields(\n allFields: string[],\n declaredFields: Set<string>,\n fieldConfigs: Record<string, FieldConfig>,\n): string[] {\n const unused = getUnusedFields(allFields, declaredFields);\n return sortFieldsByOrder(unused, fieldConfigs);\n}\n"]}
|