ObjectStackObjectStack

Validation

Validation protocol schemas

ObjectStack Validation Protocol

This module defines the validation schema protocol for ObjectStack, providing a comprehensive

type-safe validation system similar to Salesforce's validation rules but with enhanced capabilities.

Overview

Validation rules are applied at the data layer to ensure data integrity and enforce business logic.

The system supports multiple validation types:

  1. Script Validation: Formula-based validation using expressions

  2. Uniqueness Validation: Enforce unique constraints across fields

  3. State Machine Validation: Control allowed state transitions

  4. Format Validation: Validate field formats (email, URL, regex, etc.)

  5. Cross-Field Validation: Validate relationships between multiple fields

  6. Async Validation: Remote validation via API calls

  7. Custom Validation: User-defined validation functions

  8. Conditional Validation: Apply validations based on conditions

Salesforce Comparison

ObjectStack validation rules are inspired by Salesforce validation rules but enhanced:

  • Salesforce: Formula-based validation with Error Condition Formula

  • ObjectStack: Multiple validation types with composable rules

Example Salesforce validation rule:


Rule Name: Discount_Cannot_Exceed_40_Percent

Error Condition Formula: Discount_Percent__c > 0.40

Error Message: Discount cannot exceed 40%.

Equivalent ObjectStack rule:


\{

type: 'script',

name: 'discount_cannot_exceed_40_percent',

condition: 'discount_percent > 0.40',

message: 'Discount cannot exceed 40%',

severity: 'error'

\}

Source: packages/spec/src/data/validation.zod.ts

TypeScript Usage

import { AsyncValidation, ConditionalValidation, CrossFieldValidation, CustomValidator, FormatValidation, JSONValidation, ScriptValidation, StateMachineValidation, UniquenessValidation, ValidationRule } from '@objectstack/spec/data';
import type { AsyncValidation, ConditionalValidation, CrossFieldValidation, CustomValidator, FormatValidation, JSONValidation, ScriptValidation, StateMachineValidation, UniquenessValidation, ValidationRule } from '@objectstack/spec/data';

// Validate data
const result = AsyncValidation.parse(data);

AsyncValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstringField to validate
validatorUrlstringoptionalExternal API endpoint for validation
methodEnum<'GET' | 'POST'>HTTP method for external call
headersRecord<string, string>optionalCustom headers for the request
validatorFunctionstringoptionalReference to custom validator function
timeoutnumberTimeout in milliseconds
debouncenumberoptionalDebounce delay in milliseconds
paramsRecord<string, any>optionalAdditional parameters to pass to validator

ConditionalValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
whenstringCondition formula (e.g. "type = 'enterprise'")
thenObject | Object | Object | Object | Object | Object | Object | Object | [#](./#)Validation rule to apply when condition is true
otherwiseObject | Object | Object | Object | Object | Object | Object | Object | [#](./#)optionalValidation rule to apply when condition is false

CrossFieldValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
conditionstringFormula expression comparing fields (e.g. "end_date > start_date")
fieldsstring[]Fields involved in the validation

CustomValidator

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
handlerstringName of the custom validation function registered in the system
paramsRecord<string, any>optionalParameters passed to the custom handler

FormatValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstring
regexstringoptional
formatEnum<'email' | 'url' | 'phone' | 'json'>optional

JSONValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstringJSON field to validate
schemaRecord<string, any>JSON Schema object definition

ScriptValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
conditionstringFormula expression. If TRUE, validation fails. (e.g. amount < 0)

StateMachineValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstringState field (e.g. status)
transitionsRecord<string, string[]>Map of { OldState: [AllowedNewStates] }

UniquenessValidation

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldsstring[]Fields that must be combined unique
scopestringoptionalFormula condition for scope (e.g. active = true)
caseSensitiveboolean

ValidationRule

Union Options

This schema accepts one of the following structures:

Option 1

Type: script

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
conditionstringFormula expression. If TRUE, validation fails. (e.g. amount < 0)

Option 2

Type: unique

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldsstring[]Fields that must be combined unique
scopestringoptionalFormula condition for scope (e.g. active = true)
caseSensitiveboolean

Option 3

Type: state_machine

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstringState field (e.g. status)
transitionsRecord<string, string[]>Map of { OldState: [AllowedNewStates] }

Option 4

Type: format

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstring
regexstringoptional
formatEnum<'email' | 'url' | 'phone' | 'json'>optional

Option 5

Type: cross_field

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
conditionstringFormula expression comparing fields (e.g. "end_date > start_date")
fieldsstring[]Fields involved in the validation

Option 6

Type: json_schema

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstringJSON field to validate
schemaRecord<string, any>JSON Schema object definition

Option 7

Type: async

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
fieldstringField to validate
validatorUrlstringoptionalExternal API endpoint for validation
methodEnum<'GET' | 'POST'>HTTP method for external call
headersRecord<string, string>optionalCustom headers for the request
validatorFunctionstringoptionalReference to custom validator function
timeoutnumberTimeout in milliseconds
debouncenumberoptionalDebounce delay in milliseconds
paramsRecord<string, any>optionalAdditional parameters to pass to validator

Option 8

Type: custom

Properties

PropertyTypeRequiredDescription
namestringUnique rule name (snake_case)
labelstringoptionalHuman-readable label for the rule listing
descriptionstringoptionalAdministrative notes explaining the business reason
activeboolean
eventsEnum<'insert' | 'update' | 'delete'>[]Validation contexts
priorityintegerExecution priority (lower runs first, default: 100)
tagsstring[]optionalCategorization tags (e.g., "compliance", "billing")
severityEnum<'error' | 'warning' | 'info'>
messagestringError message to display to the user
typestring
handlerstringName of the custom validation function registered in the system
paramsRecord<string, any>optionalParameters passed to the custom handler

Option 9

Reference: __schema0



On this page