@formos/kernel 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state.ts","../src/steps.ts","../src/engine/init.ts","../src/validation.ts","../src/effects.ts","../src/conditionals.ts","../src/engine/helpers.ts","../src/engine/values.ts","../src/engine/validation-ops.ts","../src/engine/lifecycle.ts","../src/engine/factory.ts"],"sourcesContent":["/**\r\n * Internal state management for form engine\r\n * Tracks values, errors, touched fields, and dirty fields\r\n */\r\n\r\n/**\r\n * Internal form state container\r\n * All state is private to the engine\r\n */\r\nexport class FormState {\r\n /** Field values */\r\n private values: Map<string, unknown> = new Map();\r\n\r\n /** Field errors */\r\n private errors: Map<string, string | undefined> = new Map();\r\n\r\n /** Touched fields (user has interacted) */\r\n private touched: Set<string> = new Set();\r\n\r\n /** Dirty fields (value has changed from default) */\r\n private dirty: Set<string> = new Set();\r\n\r\n /** Current step index (for multi-step forms) */\r\n private currentStepIndex: number = 0;\r\n\r\n /** Initial values (for reset) */\r\n private initialValues: Map<string, unknown> = new Map();\r\n\r\n constructor(defaultValues?: Map<string, unknown>) {\r\n if (defaultValues) {\r\n this.values = new Map(defaultValues);\r\n this.initialValues = new Map(defaultValues);\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // VALUES\r\n // ========================================================================\r\n\r\n getValue(fieldName: string): unknown {\r\n return this.values.get(fieldName);\r\n }\r\n\r\n setValue(fieldName: string, value: unknown): void {\r\n this.values.set(fieldName, value);\r\n\r\n // Mark as dirty if value differs from initial\r\n const initialValue = this.initialValues.get(fieldName);\r\n if (value !== initialValue) {\r\n this.dirty.add(fieldName);\r\n } else {\r\n this.dirty.delete(fieldName);\r\n }\r\n }\r\n\r\n getAllValues(): ReadonlyMap<string, unknown> {\r\n return this.values;\r\n }\r\n\r\n // ========================================================================\r\n // ERRORS\r\n // ========================================================================\r\n\r\n getError(fieldName: string): string | undefined {\r\n return this.errors.get(fieldName);\r\n }\r\n\r\n setError(fieldName: string, error: string | undefined): void {\r\n if (error) {\r\n this.errors.set(fieldName, error);\r\n } else {\r\n this.errors.delete(fieldName);\r\n }\r\n }\r\n\r\n getAllErrors(): Record<string, string | undefined> {\r\n const errorObj: Record<string, string | undefined> = {};\r\n this.errors.forEach((error, fieldName) => {\r\n errorObj[fieldName] = error;\r\n });\r\n return errorObj;\r\n }\r\n\r\n clearError(fieldName: string): void {\r\n this.errors.delete(fieldName);\r\n }\r\n\r\n clearAllErrors(): void {\r\n this.errors.clear();\r\n }\r\n\r\n hasErrors(): boolean {\r\n return Array.from(this.errors.values()).some(Boolean);\r\n }\r\n\r\n // ========================================================================\r\n // TOUCHED\r\n // ========================================================================\r\n\r\n markTouched(fieldName: string): void {\r\n this.touched.add(fieldName);\r\n }\r\n\r\n isTouched(fieldName: string): boolean {\r\n return this.touched.has(fieldName);\r\n }\r\n\r\n // ========================================================================\r\n // DIRTY\r\n // ========================================================================\r\n\r\n isDirty(fieldName: string): boolean {\r\n return this.dirty.has(fieldName);\r\n }\r\n\r\n isFormDirty(): boolean {\r\n return this.dirty.size > 0;\r\n }\r\n\r\n // ========================================================================\r\n // STEP\r\n // ========================================================================\r\n\r\n getCurrentStepIndex(): number {\r\n return this.currentStepIndex;\r\n }\r\n\r\n setCurrentStepIndex(index: number): void {\r\n this.currentStepIndex = index;\r\n }\r\n\r\n // ========================================================================\r\n // RESET\r\n // ========================================================================\r\n\r\n reset(): void {\r\n // Restore initial values\r\n this.values = new Map(this.initialValues);\r\n\r\n // Clear all tracking\r\n this.errors.clear();\r\n this.touched.clear();\r\n this.dirty.clear();\r\n this.currentStepIndex = 0;\r\n }\r\n}\r\n","/**\r\n * Step flow controller\r\n * Manages navigation and validation for multi-step forms\r\n */\r\n\r\nimport type { NormalizedSchemaV1, NormalizedStepSchema } from \"@formos/schema\";\r\nimport type { FormState } from \"./state.js\";\r\n\r\n/**\r\n * Step flow controller for multi-step forms\r\n */\r\nexport class StepController {\r\n private schema: NormalizedSchemaV1;\r\n private state: FormState;\r\n\r\n constructor(schema: NormalizedSchemaV1, state: FormState) {\r\n this.schema = schema;\r\n this.state = state;\r\n }\r\n\r\n // ========================================================================\r\n // STEP QUERIES\r\n // ========================================================================\r\n\r\n /**\r\n * Check if this is a multi-step form\r\n */\r\n isMultiStep(): boolean {\r\n return this.schema?.isMultiStep ?? false;\r\n }\r\n\r\n /**\r\n * Get total number of steps\r\n */\r\n getTotalSteps(): number {\r\n return this.schema?.steps?.length ?? 1;\r\n }\r\n\r\n /**\r\n * Get current step index (0-based)\r\n */\r\n getCurrentStepIndex(): number {\r\n if (!this.isMultiStep()) {\r\n return 0;\r\n }\r\n return this.state.getCurrentStepIndex();\r\n }\r\n\r\n /**\r\n * Get current step ID\r\n */\r\n getCurrentStepId(): string | undefined {\r\n if (!this.isMultiStep()) {\r\n return undefined;\r\n }\r\n\r\n const currentIndex = this.getCurrentStepIndex();\r\n const step = this.schema?.steps?.[currentIndex];\r\n return step?.id;\r\n }\r\n\r\n /**\r\n * Get current step schema\r\n */\r\n getCurrentStep(): NormalizedStepSchema | undefined {\r\n if (!this.isMultiStep()) {\r\n return undefined;\r\n }\r\n\r\n const currentIndex = this.getCurrentStepIndex();\r\n return this.schema?.steps?.[currentIndex];\r\n }\r\n\r\n // ========================================================================\r\n // NAVIGATION\r\n // ========================================================================\r\n\r\n /**\r\n * Check if can navigate to next step\r\n */\r\n canGoNext(): boolean {\r\n if (!this.isMultiStep()) {\r\n return false;\r\n }\r\n\r\n const currentIndex = this.getCurrentStepIndex();\r\n const totalSteps = this.getTotalSteps();\r\n\r\n return currentIndex < totalSteps - 1;\r\n }\r\n\r\n /**\r\n * Check if can navigate to previous step\r\n */\r\n canGoPrev(): boolean {\r\n if (!this.isMultiStep()) {\r\n return false;\r\n }\r\n\r\n const currentIndex = this.getCurrentStepIndex();\r\n const currentStep = this.getCurrentStep();\r\n\r\n // Check if step allows going back\r\n if (currentStep?.allowBack === false) {\r\n return false;\r\n }\r\n\r\n return currentIndex > 0;\r\n }\r\n\r\n /**\r\n * Navigate to next step\r\n * Returns true if navigation succeeded\r\n */\r\n nextStep(): boolean {\r\n if (!this.canGoNext()) {\r\n return false;\r\n }\r\n\r\n const currentIndex = this.getCurrentStepIndex();\r\n this.state.setCurrentStepIndex(currentIndex + 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Navigate to previous step\r\n * Returns true if navigation succeeded\r\n */\r\n prevStep(): boolean {\r\n if (!this.canGoPrev()) {\r\n return false;\r\n }\r\n\r\n const currentIndex = this.getCurrentStepIndex();\r\n this.state.setCurrentStepIndex(currentIndex - 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Jump to specific step index\r\n */\r\n goToStep(index: number): boolean {\r\n if (!this.isMultiStep()) {\r\n return false;\r\n }\r\n\r\n const totalSteps = this.getTotalSteps();\r\n\r\n if (index < 0 || index >= totalSteps) {\r\n return false;\r\n }\r\n\r\n this.state.setCurrentStepIndex(index);\r\n return true;\r\n }\r\n\r\n // ========================================================================\r\n // VALIDATION\r\n // ========================================================================\r\n\r\n /**\r\n * Check if current step allows proceeding without validation\r\n */\r\n allowNextWithoutValidation(): boolean {\r\n const currentStep = this.getCurrentStep();\r\n return currentStep?.allowNextWithoutValidation ?? false;\r\n }\r\n\r\n /**\r\n * Check if current step is required\r\n */\r\n isCurrentStepRequired(): boolean {\r\n const currentStep = this.getCurrentStep();\r\n return currentStep?.required ?? true;\r\n }\r\n\r\n /**\r\n * Get fields for current step\r\n */\r\n getCurrentStepFields(): string[] {\r\n if (!this.isMultiStep()) {\r\n return this.schema?.fieldNames ?? [];\r\n }\r\n\r\n const currentStep = this.getCurrentStep();\r\n return currentStep?.fields ?? [];\r\n }\r\n}\r\n","/**\r\n * Engine initialization helpers\r\n * Functions for setting up form engine state and controllers\r\n */\r\n\r\nimport type { NormalizedSchemaV1 } from \"@formos/schema\";\r\nimport { FormState } from \"../state.js\";\r\nimport { StepController } from \"../steps.js\";\r\n\r\n/**\r\n * Initialize form state with default values from schema\r\n */\r\nexport function initializeFormState(schema: NormalizedSchemaV1): FormState {\r\n const defaultValues = new Map<string, unknown>();\r\n\r\n schema?.fields?.forEach((field) => {\r\n if (field?.defaultValue !== undefined) {\r\n defaultValues.set(field?.name, field.defaultValue);\r\n }\r\n });\r\n\r\n return new FormState(defaultValues);\r\n}\r\n\r\n/**\r\n * Initialize step controller from schema\r\n */\r\nexport function initializeStepController(\r\n schema: NormalizedSchemaV1,\r\n state: FormState\r\n): StepController | undefined {\r\n if (!schema?.steps || schema?.steps?.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return new StepController(schema, state);\r\n}\r\n\r\n/**\r\n * Check if form is dirty (has any changes)\r\n */\r\nexport function isDirty(state: FormState): boolean {\r\n const values = state.getAllValues();\r\n for (const fieldName of values.keys()) {\r\n if (state.isDirty(fieldName)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n","/**\r\n * Validation orchestrator\r\n * Coordinates validation execution based on schema and trigger\r\n */\r\n\r\nimport type {\r\n ValidationSchema,\r\n ValidationTrigger,\r\n NormalizedFieldSchema,\r\n} from \"@formos/schema\";\r\nimport { shouldValidateOnTrigger } from \"@formos/schema\";\r\nimport type { ValidatorExecutor, ValidationContext } from \"./types.js\";\r\n\r\n/**\r\n * Validation result for a field\r\n */\r\nexport interface ValidationResult {\r\n fieldName: string;\r\n isValid: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Validate a single field against its validation rules\r\n *\r\n * CRITICAL: Validation rules have ARRAY triggers.\r\n * This function filters rules based on the current trigger,\r\n * executing ALL rules where rule.triggers.includes(currentTrigger).\r\n *\r\n * @param field - Field schema with validation rules\r\n * @param value - Current field value\r\n * @param trigger - Current trigger (onChange, onBlur, onSubmit, manual)\r\n * @param validators - Map of validator executors\r\n * @param context - Validation context\r\n * @returns Validation result with first error found\r\n */\r\nexport async function validateField(\r\n field: NormalizedFieldSchema,\r\n value: unknown,\r\n trigger: ValidationTrigger | \"manual\",\r\n validators: Record<string, ValidatorExecutor>,\r\n context: ValidationContext\r\n): Promise<ValidationResult> {\r\n const validations = field?.validations ?? [];\r\n\r\n // Filter validations by trigger\r\n // Each validation has an array of triggers\r\n const relevantValidations = validations.filter(\r\n (validation: ValidationSchema) => {\r\n // Manual trigger runs all validations\r\n if (trigger === \"manual\") {\r\n return true;\r\n }\r\n\r\n // Check if this validation should run for the current trigger\r\n return shouldValidateOnTrigger(validation, trigger as ValidationTrigger);\r\n }\r\n );\r\n\r\n // Execute validations in order, stop at first error\r\n for (const validation of relevantValidations) {\r\n const error = await executeValidation(\r\n validation,\r\n value,\r\n validators,\r\n context\r\n );\r\n\r\n if (error) {\r\n return {\r\n fieldName: field?.name,\r\n isValid: false,\r\n error,\r\n };\r\n }\r\n }\r\n\r\n return {\r\n fieldName: field?.name,\r\n isValid: true,\r\n };\r\n}\r\n\r\n/**\r\n * Execute a single validation rule\r\n *\r\n * @param validation - Validation schema from field\r\n * @param value - Value to validate\r\n * @param validators - Map of validator executors\r\n * @param context - Validation context\r\n * @returns Error message or null\r\n */\r\nasync function executeValidation(\r\n validation: ValidationSchema,\r\n value: unknown,\r\n validators: Record<string, ValidatorExecutor>,\r\n context: ValidationContext\r\n): Promise<string | null> {\r\n const executor = validators?.[validation?.validator];\r\n\r\n if (!executor) {\r\n console.warn(\r\n `Validator \"${validation?.validator}\" not found. Skipping validation for field \"${context?.fieldName}\".`\r\n );\r\n return null;\r\n }\r\n\r\n try {\r\n // Execute the validator\r\n const result = await executor(value, validation?.rule, context);\r\n\r\n // Return custom message if provided and validation failed\r\n if (result && validation?.message) {\r\n return validation.message;\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n console.error(`Validation error for field \"${context?.fieldName}\":`, error);\r\n return \"Validation failed\";\r\n }\r\n}\r\n\r\n/**\r\n * Validate multiple fields\r\n *\r\n * @param fields - Fields to validate\r\n * @param values - Current form values\r\n * @param trigger - Current trigger\r\n * @param validators - Map of validator executors\r\n * @param getValue - Function to get field values\r\n * @returns Map of field errors\r\n */\r\nexport async function validateFields(\r\n fields: NormalizedFieldSchema[],\r\n values: Map<string, unknown>,\r\n trigger: ValidationTrigger | \"manual\",\r\n validators: Record<string, ValidatorExecutor>,\r\n getValue: (fieldName: string) => unknown\r\n): Promise<Map<string, string | undefined>> {\r\n const errors = new Map<string, string | undefined>();\r\n\r\n // Validate all fields in parallel\r\n const validationPromises = fields.map((field) => {\r\n const value = values.get(field?.name);\r\n const context: ValidationContext = {\r\n fieldName: field?.name,\r\n values,\r\n getValue,\r\n };\r\n\r\n return validateField(field, value, trigger, validators, context);\r\n });\r\n\r\n const results = await Promise.all(validationPromises);\r\n\r\n // Store errors\r\n results.forEach((result) => {\r\n if (!result?.isValid && result?.error && result?.fieldName) {\r\n errors.set(result.fieldName, result.error);\r\n }\r\n });\r\n\r\n return errors;\r\n}\r\n","/**\r\n * Effects engine\r\n * Executes side effects when field values change\r\n */\r\n\r\nimport type { EffectSchema } from \"@formos/schema\";\r\nimport type { EffectExecutor, EffectContext } from \"./types.js\";\r\nimport { evaluateConditional } from \"./conditionals.js\";\r\n\r\n/**\r\n * Execute effects for a field value change\r\n *\r\n * @param sourceField - Field that triggered the change\r\n * @param sourceValue - New value of source field\r\n * @param effects - Effects to potentially execute\r\n * @param effectExecutors - Map of effect executors\r\n * @param values - Current form values\r\n * @param getValue - Function to get field values\r\n * @param setValue - Function to set field values (for sync effects)\r\n */\r\nexport async function executeEffects(\r\n sourceField: string,\r\n sourceValue: unknown,\r\n effects: EffectSchema[],\r\n effectExecutors: Record<string, EffectExecutor>,\r\n values: ReadonlyMap<string, unknown>,\r\n getValue: (fieldName: string) => unknown,\r\n setValue: (fieldName: string, value: unknown) => void\r\n): Promise<void> {\r\n if (!effects || effects?.length === 0) {\r\n return;\r\n }\r\n\r\n // Filter effects for this source field\r\n const relevantEffects = effects.filter(\r\n (effect) => effect?.sourceField === sourceField\r\n );\r\n\r\n // Execute each effect\r\n for (const effect of relevantEffects) {\r\n await executeEffect(\r\n effect,\r\n sourceField,\r\n sourceValue,\r\n effectExecutors,\r\n values,\r\n getValue,\r\n setValue\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Execute a single effect\r\n */\r\nasync function executeEffect(\r\n effect: EffectSchema,\r\n sourceField: string,\r\n sourceValue: unknown,\r\n effectExecutors: Record<string, EffectExecutor>,\r\n values: ReadonlyMap<string, unknown>,\r\n getValue: (fieldName: string) => unknown,\r\n setValue: (fieldName: string, value: unknown) => void\r\n): Promise<void> {\r\n const { type, config, targetField } = effect;\r\n\r\n // Built-in sync effect (copy/transform values)\r\n if (type === \"sync\") {\r\n await executeSyncEffect(\r\n sourceValue,\r\n targetField,\r\n config,\r\n effectExecutors,\r\n values,\r\n getValue,\r\n setValue\r\n );\r\n return;\r\n }\r\n\r\n // Custom effects via adapters\r\n const executor = effectExecutors?.[type];\r\n\r\n if (!executor) {\r\n console.warn(`Effect executor \"${type}\" not found. Skipping effect.`);\r\n return;\r\n }\r\n\r\n const context: EffectContext = {\r\n sourceField,\r\n sourceValue,\r\n targetField,\r\n values,\r\n getValue,\r\n setValue,\r\n };\r\n\r\n try {\r\n await executor(config, context);\r\n } catch (error) {\r\n console.error(`Effect execution error for field \"${sourceField}\":`, error);\r\n }\r\n}\r\n\r\n/**\r\n * Execute built-in sync effect\r\n * Copies or transforms source value to target field\r\n */\r\nasync function executeSyncEffect(\r\n sourceValue: unknown,\r\n targetField: string | undefined,\r\n config: unknown,\r\n effectExecutors: Record<string, EffectExecutor>,\r\n values: ReadonlyMap<string, unknown>,\r\n getValue: (fieldName: string) => unknown,\r\n setValue: (fieldName: string, value: unknown) => void\r\n): Promise<void> {\r\n if (!targetField) {\r\n console.warn(\"Sync effect requires targetField\");\r\n return;\r\n }\r\n\r\n // Check if there's a custom sync transformer\r\n const syncExecutor = effectExecutors?.[\"sync\"];\r\n\r\n if (syncExecutor) {\r\n // Use custom transformer\r\n const context: EffectContext = {\r\n sourceField: \"\",\r\n sourceValue,\r\n targetField,\r\n values,\r\n getValue,\r\n setValue,\r\n };\r\n\r\n const transformedValue = await syncExecutor(config, context);\r\n setValue(targetField, transformedValue);\r\n } else {\r\n // Default: direct copy\r\n setValue(targetField, sourceValue);\r\n }\r\n}\r\n","/**\r\n * Conditional evaluation engine\r\n * Evaluates ConditionalRule and ConditionalGroup from schema\r\n */\r\n\r\nimport type {\r\n Conditional,\r\n ConditionalRule,\r\n ConditionalGroup,\r\n} from \"@formos/schema\";\r\n\r\n/**\r\n * Evaluate a conditional expression against current form values.\r\n *\r\n * Handles both single {@link ConditionalRule} and complex {@link ConditionalGroup}\r\n * with AND/OR logic. This is the core function for dynamic field behavior.\r\n *\r\n * @param conditional - Rule or group to evaluate\r\n * @param getValue - Function to retrieve field values by name\r\n * @returns True if the condition is satisfied\r\n *\r\n * @public\r\n * @stable\r\n *\r\n * @example\r\n * ```typescript\r\n * const condition: ConditionalRule = {\r\n * field: 'age',\r\n * operator: 'greaterThan',\r\n * value: 18\r\n * };\r\n *\r\n * const getValue = (name: string) => formValues[name];\r\n * const result = evaluateConditional(condition, getValue);\r\n * ```\r\n */\r\nexport function evaluateConditional(\r\n conditional: Conditional,\r\n getValue: (fieldName: string) => unknown,\r\n): boolean {\r\n // Check if it's a group (has logic property)\r\n if (\"logic\" in conditional) {\r\n return evaluateConditionalGroup(conditional, getValue);\r\n }\r\n\r\n // It's a single rule\r\n return evaluateConditionalRule(conditional, getValue);\r\n}\r\n\r\n/**\r\n * Evaluate a conditional group (AND/OR logic).\r\n *\r\n * @internal\r\n */\r\nfunction evaluateConditionalGroup(\r\n group: ConditionalGroup,\r\n getValue: (fieldName: string) => unknown,\r\n): boolean {\r\n const { logic, rules } = group;\r\n\r\n if (!rules || rules?.length === 0) {\r\n return true;\r\n }\r\n\r\n if (logic === \"and\") {\r\n // All rules must pass\r\n return rules.every((rule: Conditional) =>\r\n evaluateConditional(rule, getValue),\r\n );\r\n } else {\r\n // At least one rule must pass\r\n return rules.some((rule: Conditional) =>\r\n evaluateConditional(rule, getValue),\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Evaluate a single conditional rule\r\n */\r\nfunction evaluateConditionalRule(\r\n rule: ConditionalRule,\r\n getValue: (fieldName: string) => unknown,\r\n): boolean {\r\n const { field, operator, value } = rule;\r\n const fieldValue = getValue(field);\r\n\r\n switch (operator) {\r\n case \"equals\":\r\n return fieldValue === value;\r\n\r\n case \"notEquals\":\r\n return fieldValue !== value;\r\n\r\n case \"exists\":\r\n return (\r\n fieldValue !== undefined && fieldValue !== null && fieldValue !== \"\"\r\n );\r\n\r\n case \"notExists\":\r\n return (\r\n fieldValue === undefined || fieldValue === null || fieldValue === \"\"\r\n );\r\n\r\n case \"includes\":\r\n if (Array.isArray(fieldValue)) {\r\n return fieldValue.includes(value);\r\n }\r\n if (typeof fieldValue === \"string\" && typeof value === \"string\") {\r\n return fieldValue.includes(value);\r\n }\r\n return false;\r\n\r\n case \"notIncludes\":\r\n if (Array.isArray(fieldValue)) {\r\n return !fieldValue.includes(value);\r\n }\r\n if (typeof fieldValue === \"string\" && typeof value === \"string\") {\r\n return !fieldValue.includes(value);\r\n }\r\n return true;\r\n\r\n case \"greaterThan\":\r\n if (typeof fieldValue === \"number\" && typeof value === \"number\") {\r\n return fieldValue > value;\r\n }\r\n return false;\r\n\r\n case \"lessThan\":\r\n if (typeof fieldValue === \"number\" && typeof value === \"number\") {\r\n return fieldValue < value;\r\n }\r\n return false;\r\n\r\n default:\r\n // Unknown operator, treat as false\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a field should be visible based on its visibleWhen condition.\r\n *\r\n * Returns `true` if:\r\n * - Field has no `visibleWhen` property (always visible)\r\n * - The `visibleWhen` condition evaluates to `true`\r\n *\r\n * @param field - Field schema with optional visibleWhen property\r\n * @param getValue - Function to retrieve field values\r\n * @returns True if field should be visible\r\n *\r\n * @public\r\n * @stable\r\n *\r\n * @example\r\n * ```typescript\r\n * const field = {\r\n * name: 'ssn',\r\n * type: 'text',\r\n * visibleWhen: { field: 'country', operator: 'equals', value: 'US' }\r\n * };\r\n *\r\n * if (isFieldVisible(field, getValue)) {\r\n * // Render the field\r\n * }\r\n * ```\r\n */\r\nexport function isFieldVisible(\r\n field: { visibleWhen?: Conditional },\r\n getValue: (fieldName: string) => unknown,\r\n): boolean {\r\n if (!field?.visibleWhen) {\r\n return true; // No condition means always visible\r\n }\r\n\r\n return evaluateConditional(field.visibleWhen, getValue);\r\n}\r\n\r\n/**\r\n * Check if a field is required based on its required configuration.\r\n *\r\n * Handles three cases:\r\n * - `undefined`: Field is optional (returns `false`)\r\n * - `boolean`: Returns the boolean value directly\r\n * - `Conditional`: Evaluates the condition dynamically\r\n *\r\n * @param field - Field schema with optional required property\r\n * @param getValue - Function to retrieve field values\r\n * @returns True if field is required\r\n *\r\n * @public\r\n * @stable\r\n *\r\n * @example\r\n * ```typescript\r\n * const field = {\r\n * name: 'phone',\r\n * type: 'tel',\r\n * required: { field: 'contactMethod', operator: 'equals', value: 'phone' }\r\n * };\r\n *\r\n * if (isFieldRequired(field, getValue)) {\r\n * // Show required indicator\r\n * }\r\n * ```\r\n */\r\nexport function isFieldRequired(\r\n field: { required?: boolean | Conditional },\r\n getValue: (fieldName: string) => unknown,\r\n): boolean {\r\n if (field?.required === undefined) {\r\n return false; // No required config means optional\r\n }\r\n\r\n if (typeof field.required === \"boolean\") {\r\n return field.required;\r\n }\r\n\r\n // Conditional required\r\n return evaluateConditional(field.required, getValue);\r\n}\r\n","/**\r\n * Engine helper functions\r\n * Utility functions used by the form engine\r\n */\r\n\r\nimport type { NormalizedSchemaV1, NormalizedFieldSchema } from \"@formos/schema\";\r\nimport { isFieldVisible } from \"../conditionals.js\";\r\n\r\n/**\r\n * Get value helper factory\r\n * Creates a getValue function bound to form state\r\n */\r\nexport function createGetValueHelper(\r\n getValue: (fieldName: string) => unknown\r\n): (fieldName: string) => unknown {\r\n return getValue;\r\n}\r\n\r\n/**\r\n * Get visible fields from schema based on current values\r\n */\r\nexport function getVisibleFields(\r\n schema: NormalizedSchemaV1,\r\n getValue: (fieldName: string) => unknown\r\n): NormalizedFieldSchema[] {\r\n return (\r\n schema?.fields?.filter((field: any) => {\r\n return isFieldVisible(field, getValue);\r\n }) ?? []\r\n );\r\n}\r\n\r\n/**\r\n * Get field schema by name\r\n */\r\nexport function getFieldSchema(\r\n schema: NormalizedSchemaV1,\r\n fieldName: string\r\n): NormalizedFieldSchema | undefined {\r\n return schema?.fieldMap?.get(fieldName);\r\n}\r\n","/**\r\n * Value management operations\r\n * Handles getting and setting field values with validation and effects\r\n */\r\n\r\nimport type { ValidationTrigger } from \"@formos/schema\";\r\nimport type {\r\n ValidatorExecutor,\r\n EffectExecutor,\r\n ValidationContext,\r\n} from \"../types.js\";\r\nimport type { FormState } from \"../state.js\";\r\nimport { validateField } from \"../validation.js\";\r\nimport { executeEffects } from \"../effects.js\";\r\nimport { getFieldSchema } from \"./helpers.js\";\r\nimport type { NormalizedSchemaV1 } from \"@formos/schema\";\r\n\r\n/**\r\n * Options for setValue operation\r\n */\r\n/**\r\n * Options for setValue operations.\r\n *\r\n * @public\r\n * @stable\r\n */\r\nexport interface SetValueOptions {\r\n /** Validation trigger (default: \"onChange\") */\r\n trigger?: ValidationTrigger | \"manual\";\r\n /** If true, skip validation and effects */\r\n silent?: boolean;\r\n}\r\n\r\n/**\r\n * Get field value from state\r\n */\r\nexport function getValue(state: FormState, fieldName: string): unknown {\r\n return state.getValue(fieldName);\r\n}\r\n\r\n/**\r\n * Set field value with validation and effects\r\n */\r\nexport async function setValue(\r\n state: FormState,\r\n schema: NormalizedSchemaV1,\r\n fieldName: string,\r\n value: unknown,\r\n options: SetValueOptions,\r\n validators: Record<string, ValidatorExecutor>,\r\n effectExecutors: Record<string, EffectExecutor>,\r\n getValueHelper: (fieldName: string) => unknown,\r\n): Promise<void> {\r\n const { trigger = \"onChange\", silent = false } = options;\r\n\r\n // Set the value\r\n state.setValue(fieldName, value);\r\n\r\n if (silent) {\r\n return;\r\n }\r\n\r\n // Clear existing error\r\n state.clearError(fieldName);\r\n\r\n // Run validation for this field if trigger is provided\r\n if (trigger !== \"manual\") {\r\n const field = getFieldSchema(schema, fieldName);\r\n if (field) {\r\n const context: ValidationContext = {\r\n fieldName,\r\n values: state.getAllValues(),\r\n getValue: getValueHelper,\r\n };\r\n\r\n const result = await validateField(\r\n field,\r\n value,\r\n trigger,\r\n validators,\r\n context,\r\n );\r\n\r\n if (!result?.isValid && result?.error) {\r\n state.setError(fieldName, result?.error);\r\n }\r\n }\r\n }\r\n // Execute effects triggered by this field\r\n const field = getFieldSchema(schema, fieldName);\r\n const fieldEffects = field?.effects ?? [];\r\n const globalEffects = schema?.globalEffects ?? [];\r\n const allEffects = [...fieldEffects, ...globalEffects];\r\n\r\n await executeEffects(\r\n fieldName,\r\n value,\r\n allEffects,\r\n effectExecutors,\r\n state.getAllValues(),\r\n getValueHelper,\r\n (field, val) => state.setValue(field, val),\r\n );\r\n}\r\n","/**\r\n * Validation operations\r\n * Handles field and form validation logic\r\n */\r\n\r\nimport type { NormalizedSchemaV1, ValidationTrigger } from \"@formos/schema\";\r\nimport type { ValidatorExecutor, ValidationContext } from \"../types.js\";\r\nimport type { FormState } from \"../state.js\";\r\nimport { validateField, validateFields } from \"../validation.js\";\r\nimport { getFieldSchema, getVisibleFields } from \"./helpers.js\";\r\n\r\n/**\r\n * Check if form is valid (no errors)\r\n */\r\nexport function isValid(state: FormState): boolean {\r\n return !state.hasErrors();\r\n}\r\n\r\n/**\r\n * Get error for a specific field\r\n */\r\nexport function getError(\r\n state: FormState,\r\n fieldName: string\r\n): string | undefined {\r\n return state.getError(fieldName);\r\n}\r\n\r\n/**\r\n * Get all field errors\r\n */\r\nexport function getErrors(\r\n state: FormState\r\n): Record<string, string | undefined> {\r\n return state.getAllErrors();\r\n}\r\n\r\n/**\r\n * Validate a single field or all fields\r\n */\r\nexport async function validate(\r\n state: FormState,\r\n schema: NormalizedSchemaV1,\r\n validators: Record<string, ValidatorExecutor>,\r\n getValue: (fieldName: string) => unknown,\r\n fieldName?: string,\r\n trigger: ValidationTrigger | \"manual\" = \"manual\"\r\n): Promise<boolean> {\r\n if (fieldName) {\r\n // Validate single field\r\n const field = getFieldSchema(schema, fieldName);\r\n if (!field) {\r\n return true;\r\n }\r\n\r\n const value = state.getValue(fieldName);\r\n const context: ValidationContext = {\r\n fieldName,\r\n values: state.getAllValues(),\r\n getValue,\r\n };\r\n\r\n const result = await validateField(\r\n field,\r\n value,\r\n trigger,\r\n validators,\r\n context\r\n );\r\n\r\n if (result?.isValid) {\r\n state.clearError(fieldName);\r\n return true;\r\n } else {\r\n state.setError(fieldName, result?.error);\r\n return false;\r\n }\r\n } else {\r\n // Validate all visible fields\r\n const visibleFields = getVisibleFields(schema, getValue);\r\n\r\n state.clearAllErrors();\r\n\r\n const errors = await validateFields(\r\n visibleFields,\r\n state.getAllValues() as Map<string, unknown>,\r\n trigger,\r\n validators,\r\n getValue\r\n );\r\n\r\n // Store errors in state\r\n errors.forEach((error, field) => {\r\n if (error) {\r\n state.setError(field, error);\r\n }\r\n });\r\n\r\n return !Array.from(errors.values()).some(Boolean);\r\n }\r\n}\r\n","/**\r\n * Form lifecycle operations\r\n * Handles submit and reset operations\r\n */\r\n\r\nimport type { NormalizedSchemaV1 } from \"@formos/schema\";\r\nimport type { ValidatorExecutor } from \"../types.js\";\r\nimport type { FormState } from \"../state.js\";\r\nimport type { StepController } from \"../steps.js\";\r\nimport { getVisibleFields } from \"./helpers.js\";\r\nimport { validateFields } from \"../validation.js\";\r\n\r\n/**\r\n * Submit handler callback\r\n */\r\n/**\r\n * Callback invoked when form is successfully submitted.\r\n *\r\n * Only called if all validations pass. Receives all form values.\r\n *\r\n * @public\r\n * @stable\r\n *\r\n * @example\r\n * ```typescript\r\n * const onSubmit: SubmitHandler = async (values) => {\r\n * await fetch('/api/submit', {\r\n * method: 'POST',\r\n * body: JSON.stringify(values)\r\n * });\r\n * };\r\n * ```\r\n */\r\nexport type SubmitHandler = (\r\n values: Record<string, unknown>,\r\n) => void | Promise<void>;\r\n\r\n/**\r\n * Check if form is valid (no errors)\r\n */\r\nexport function isValid(state: FormState): boolean {\r\n return !state.hasErrors();\r\n}\r\n\r\n/**\r\n * Submit the form after validation\r\n */\r\nexport async function submit(\r\n state: FormState,\r\n schema: NormalizedSchemaV1,\r\n validators: Record<string, ValidatorExecutor>,\r\n getValue: (fieldName: string) => unknown,\r\n onSubmit?: SubmitHandler,\r\n): Promise<boolean> {\r\n // Validate all visible fields\r\n const visibleFields = getVisibleFields(schema, getValue);\r\n\r\n state.clearAllErrors();\r\n\r\n const errors = await validateFields(\r\n visibleFields,\r\n state.getAllValues() as Map<string, unknown>,\r\n \"onSubmit\",\r\n validators,\r\n getValue,\r\n );\r\n\r\n // Store errors in state\r\n errors.forEach((error, field) => {\r\n if (error) {\r\n state.setError(field, error);\r\n }\r\n });\r\n\r\n const hasErrors = Array.from(errors.values()).some(Boolean);\r\n\r\n if (!hasErrors && onSubmit) {\r\n const values: Record<string, unknown> = {};\r\n state.getAllValues().forEach((value, key) => {\r\n values[key] = value;\r\n });\r\n await onSubmit(values);\r\n return true;\r\n }\r\n\r\n return !hasErrors;\r\n}\r\n\r\n/**\r\n * Reset form to default values\r\n */\r\nexport function reset(\r\n state: FormState,\r\n stepController: StepController | undefined,\r\n schema: NormalizedSchemaV1,\r\n): void {\r\n // Reset state\r\n state.reset();\r\n\r\n // Reinitialize with default values\r\n schema?.fields?.forEach((field) => {\r\n if (field?.defaultValue !== undefined) {\r\n state.setValue(field?.name, field.defaultValue);\r\n }\r\n });\r\n\r\n // Reset step controller\r\n if (stepController) {\r\n stepController.goToStep(0);\r\n }\r\n}\r\n","/**\r\n * Form engine factory\r\n * Creates FormEngine instances with configuration\r\n */\r\n\r\nimport type { NormalizedSchemaV1 } from \"@formos/schema\";\r\nimport type { ValidatorExecutor, EffectExecutor } from \"../types.js\";\r\nimport type { FormState } from \"../state.js\";\r\nimport type { StepController } from \"../steps.js\";\r\nimport {\r\n initializeFormState,\r\n initializeStepController,\r\n isDirty as isDirtyHelper,\r\n} from \"./init.js\";\r\nimport { getValue, setValue, type SetValueOptions } from \"./values.js\";\r\nimport { validate, getError, getErrors, isValid } from \"./validation-ops.js\";\r\nimport { submit, reset, type SubmitHandler } from \"./lifecycle.js\";\r\n\r\n/**\r\n * Configuration options for creating a form engine.\r\n *\r\n * All options use the **adapter pattern** to remain framework-agnostic.\r\n * The kernel provides orchestration; adapters provide implementation.\r\n *\r\n * @public\r\n * @stable\r\n */\r\nexport interface FormEngineOptions {\r\n /** Custom validator executors */\r\n validators?: Record<string, ValidatorExecutor>;\r\n /** Custom effect executors */\r\n effectExecutors?: Record<string, EffectExecutor>;\r\n /** Submit handler */\r\n onSubmit?: SubmitHandler;\r\n}\r\n\r\n/**\r\n * Form engine interface - the primary API for interacting with forms.\r\n *\r\n * This headless engine manages all form logic:\r\n * - State management (values, errors, touched, dirty)\r\n * - Validation orchestration with pluggable validators\r\n * - Effect execution for field interactions\r\n * - Multi-step navigation with validation guards\r\n *\r\n * The engine is **completely UI-agnostic** - no React, no DOM.\r\n * UI packages consume this API to build interactive forms.\r\n *\r\n * @public\r\n * @stable\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createFormEngine } from '@formos/kernel';\r\n * import { normalizeSchema } from '@formos/schema';\r\n *\r\n * const normalized = normalizeSchema(mySchema);\r\n * const engine = createFormEngine(normalized, {\r\n * validators: { required: (value) => value ? null : 'Required' }\r\n * });\r\n *\r\n * // Get/set values\r\n * await engine.setValue('email', 'user@example.com');\r\n * const email = engine.getValue('email');\r\n *\r\n * // Validate\r\n * const isValid = await engine.validate();\r\n *\r\n * // Submit\r\n * const success = await engine.submit();\r\n * ```\r\n */\r\nexport interface FormEngine {\r\n // State accessors\r\n getValue(fieldName: string): unknown;\r\n getError(fieldName: string): string | undefined;\r\n getErrors(): Record<string, string | undefined>;\r\n isValid(): boolean;\r\n isDirty(fieldName?: string): boolean;\r\n isTouched(fieldName: string): boolean;\r\n\r\n // State mutators\r\n setValue(\r\n fieldName: string,\r\n value: unknown,\r\n options?: SetValueOptions,\r\n ): Promise<void>;\r\n setError(fieldName: string, error: string): void;\r\n clearError(fieldName: string): void;\r\n markTouched(fieldName: string): void;\r\n\r\n // Validation\r\n validate(\r\n fieldName?: string,\r\n trigger?: \"onChange\" | \"onBlur\" | \"onSubmit\" | \"manual\",\r\n ): Promise<boolean>;\r\n\r\n // Lifecycle\r\n submit(): Promise<boolean>;\r\n reset(): void;\r\n\r\n // Multi-step navigation (if applicable)\r\n getCurrentStep?(): number;\r\n getTotalSteps?(): number;\r\n nextStep?(): Promise<boolean>;\r\n prevStep?(): void;\r\n goToStep?(stepIndex: number): Promise<boolean>;\r\n canGoToStep?(stepIndex: number): boolean;\r\n}\r\n\r\n/**\r\n * Create a form engine instance from a normalized schema.\r\n *\r\n * This is the primary entry point for the kernel. It instantiates\r\n * a {@link FormEngine} that manages all form logic.\r\n *\r\n * The engine is stateful and mutable. Each call creates a new\r\n * independent form instance with its own state.\r\n *\r\n * @param schema - Normalized schema from {@link normalizeSchema}\r\n * @param options - Configuration with validators, effects, and submit handler\r\n * @returns Fully configured form engine instance\r\n *\r\n * @public\r\n * @stable\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createFormEngine } from '@formos/kernel';\r\n * import { normalizeSchema } from '@formos/schema';\r\n *\r\n * const schema = { version: 'v1', fields: [...] };\r\n * const normalized = normalizeSchema(schema);\r\n *\r\n * const engine = createFormEngine(normalized, {\r\n * validators: {\r\n * required: (value) => value ? null : 'Required',\r\n * email: (value) => /\\\\S+@\\\\S+/.test(value) ? null : 'Invalid'\r\n * },\r\n * onSubmit: async (values) => {\r\n * await api.post('/submit', values);\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function createFormEngine(\r\n schema: NormalizedSchemaV1,\r\n options: FormEngineOptions = {},\r\n): FormEngine {\r\n const { validators = {}, effectExecutors = {}, onSubmit } = options;\r\n\r\n // Initialize state\r\n const state: FormState = initializeFormState(schema);\r\n\r\n // Initialize step controller (if multi-step)\r\n const stepController: StepController | undefined = initializeStepController(\r\n schema,\r\n state,\r\n );\r\n\r\n // Helper to get value\r\n const getValueHelper = (fieldName: string) => getValue(state, fieldName);\r\n\r\n // Build engine interface\r\n const engine: FormEngine = {\r\n // State accessors\r\n getValue: (fieldName: string) => getValue(state, fieldName),\r\n getError: (fieldName: string) => getError(state, fieldName),\r\n getErrors: () => getErrors(state),\r\n isValid: () => isValid(state),\r\n isDirty: (fieldName?: string) =>\r\n fieldName ? state.isDirty(fieldName) : isDirtyHelper(state),\r\n isTouched: (fieldName: string) => state.isTouched(fieldName),\r\n\r\n // State mutators\r\n setValue: async (\r\n fieldName: string,\r\n value: unknown,\r\n opts?: SetValueOptions,\r\n ) => {\r\n await setValue(\r\n state,\r\n schema,\r\n fieldName,\r\n value,\r\n opts ?? {},\r\n validators,\r\n effectExecutors,\r\n getValueHelper,\r\n );\r\n },\r\n setError: (fieldName: string, error: string) => {\r\n state.setError(fieldName, error);\r\n },\r\n clearError: (fieldName: string) => {\r\n state.clearError(fieldName);\r\n },\r\n markTouched: (fieldName: string) => {\r\n state.markTouched(fieldName);\r\n },\r\n\r\n // Validation\r\n validate: async (fieldName?: string, trigger = \"manual\" as const) => {\r\n return validate(\r\n state,\r\n schema,\r\n validators,\r\n getValueHelper,\r\n fieldName,\r\n trigger,\r\n );\r\n },\r\n\r\n // Lifecycle\r\n submit: async () => {\r\n return submit(state, schema, validators, getValueHelper, onSubmit);\r\n },\r\n reset: () => {\r\n reset(state, stepController, schema);\r\n },\r\n };\r\n\r\n // Add step navigation if multi-step form\r\n if (stepController) {\r\n engine.getCurrentStep = () => stepController.getCurrentStepIndex();\r\n engine.getTotalSteps = () => stepController.getTotalSteps();\r\n engine.nextStep = async () => {\r\n if (!stepController.canGoNext()) {\r\n return false;\r\n }\r\n\r\n // Validate current step before proceeding\r\n const isCurrentStepValid = await validate(\r\n state,\r\n schema,\r\n validators,\r\n getValueHelper,\r\n );\r\n if (!isCurrentStepValid) {\r\n return false;\r\n }\r\n\r\n return stepController.nextStep();\r\n };\r\n engine.prevStep = () => {\r\n stepController.prevStep();\r\n };\r\n engine.goToStep = async (stepIndex: number) => {\r\n if (stepIndex === stepController.getCurrentStepIndex()) {\r\n return true;\r\n }\r\n\r\n // Validate before moving to new step\r\n const isCurrentStepValid = await validate(\r\n state,\r\n schema,\r\n validators,\r\n getValueHelper,\r\n );\r\n if (!isCurrentStepValid) {\r\n return false;\r\n }\r\n\r\n return stepController.goToStep(stepIndex);\r\n };\r\n engine.canGoToStep = (stepIndex: number) => {\r\n return stepIndex >= 0 && stepIndex < stepController.getTotalSteps();\r\n };\r\n }\r\n\r\n return engine;\r\n}\r\n"],"mappings":"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","names":["getValue","getValue","setValue","getValue","getValue","field","getValue","getValue"]}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@formos/kernel",
3
+ "version": "0.1.0",
4
+ "description": "Headless form engine for Formos - framework-agnostic state management, validation, and effects",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "keywords": [
23
+ "form",
24
+ "headless",
25
+ "validation",
26
+ "state-management",
27
+ "form-builder",
28
+ "framework-agnostic"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/yourusername/formos.git",
33
+ "directory": "packages/kernel"
34
+ },
35
+ "license": "MIT",
36
+ "devDependencies": {
37
+ "@types/jest": "^29.5.14",
38
+ "eslint": "^9.39.1",
39
+ "jest": "^29.7.0",
40
+ "ts-jest": "^29.4.6",
41
+ "@jest/globals": "^29.7.0",
42
+ "tsup": "^8.0.2",
43
+ "typescript": "5.9.2",
44
+ "@repo/eslint-config": "0.0.0",
45
+ "@repo/typescript-config": "0.0.0"
46
+ },
47
+ "dependencies": {
48
+ "@formos/schema": "0.1.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsup",
52
+ "dev": "tsup --watch",
53
+ "lint": "eslint . --max-warnings 0",
54
+ "check-types": "tsc --noEmit",
55
+ "test": "jest",
56
+ "test:watch": "jest --watch",
57
+ "test:coverage": "jest --coverage",
58
+ "publish:npm": "pnpm publish --access public"
59
+ }
60
+ }