import { createMachine, sendParent } from 'xstate'; import { validate } from '../../Validation'; import type { IFieldBase } from "$lib/Models"; export type ValidationContext = {}; export const validationMachine = createMachine( { initial: 'avalid', tsTypes: {} as import("./validationMachine.typegen").Typegen0, schema: { context: {} as ValidationContext, events: {} as { type: 'VALIDATE'; field: IFieldBase } | { type: 'VALIDATED'; value: any } | { type: 'INVALIDATED'; value: any } }, states: { avalid: { on: { VALIDATE: 'validating', VALIDATED: 'valid', INVALIDATED: 'invalid' } }, validating: { invoke: { id: 'validating', src: 'validation', onDone: { target: 'valid' }, onError: 'invalid' }, on: { VALIDATE: { internal: false }, VALIDATED: 'valid', INVALIDATED: 'invalid' } }, invalid: { entry: [ 'sendParentInvalid' ], on: { VALIDATE: 'validating' } }, valid: { entry: [ 'sendParentValid'] , on: { VALIDATE: 'validating' } } } }, { services: { validation: async ( context, event ) => { event.field.isValid = await validate( event.field.validation, event.field.value ); if(!event.field.isValid){ console.log("is invalid --> ", event.field); throw new Error('Did not validate IN MACHINE.'); } return event.field.isValid; } }, actions: { sendParentValid: sendParent('VALIDATED'), sendParentInvalid: sendParent('INVALIDATED') } } );