Skip to main content

Engine

Form engine.


store

Store instance.

protected store: Store;

cache

Cache client.

protected cache: CacheClient | null;

cacheKey

Key used to store and retrieve form data from the cache.

protected cacheKey: string;

cacheTimeout

Timer that dictates when the cached form data should be refreshed.

protected cacheTimeout: number | null;

configuration

Form engine configuration.

protected configuration: Configuration;

hooks

Contains all events hooks to trigger when events are fired.

protected hooks: Record<FormEvent, Hook<HookData>[]>;

loading

Whether next step is being loaded.

protected loading: boolean;

steps

All generated form steps.

protected steps: Step[];

currentStep

Reference to the current step, for quicker access.

protected currentStep: Step | null;

variables

User-defined variables that can be accessed at any point in the form.

protected variables: Variables;

mutationTimeout

Timer used to manage the delay before processing queued mutations.

protected mutationTimeout: number | null;

initialValues

Initial values used to prepopulate form fields upon loading.

protected initialValues: UserInputs;

userInputsQueue

Queue of user inputs that are pending processing.

protected userInputsQueue: Map<string, { data: unknown; configuration: FieldConfiguration; }>;

discardedUserInputs

Discarded user inputs list (related fields do not meet display conditions).

protected discardedUserInputs: Map<string, unknown>;

userInputs

List of both full and partial user inputs for all displayed fields.

protected userInputs: { full: UserInputs; partial: UserInputs; };

constructor

Class constructor.

public constructor();

Usage

const store = new Store();

generateSubscriptionId

Generates a unique subscription id.

protected generateSubscriptionId(): string;

Returns

The generated subscription id.

Usage

store.generateSubscriptionId(); // "3e81922906bd7b"

register

Registers a new module into the store registry.

public register<T>(id: string, module: Module<T>): string;

Parameters

  • id: Module's unique identifier in registry. Can be any string, although it is recommended to follow a tree-structure pattern, like /my_app/module_a/module_b.
  • module: Module to register.

Returns

Module id.

Throws

  • If a module with the same id already exists in registry.

Usage

store.register('my_module', {
state: { count: 0 },
mutations: {
ADD({ state }) {
return {
count: state.count + 1,
};
},
},
});

unregister

Unregisters module with id id from the global modules registry.

public unregister(id: string): void;

Parameters

  • id: Id of the module to unregister.

Returns

Module id.

Throws

  • If module with id id does not exist.
  • If module still has related user-defined combined modules.

Usage

store.unregister('my_module');

constructor

Class constructor.

constructor(configuration: Configuration);

Parameters

  • configuration: Form engine configuration.

Usage

const engine = new Engine({ ... });

areEqual

Checks whether firstInput and secondInput are equal, according to their type.

protected areEqual(
firstInput: unknown,
secondInput: unknown,
type: FieldConfiguration['type'],
): boolean;

Parameters

  • firstInput: First input to compare.
  • secondInput: Second input to compare.
  • type: Inputs type.

Returns

true if firstInput and secondInput are equal, false otherwise.

Usage

engine.areEqual('test', 'test2', 'string'); // false

coerce

Coerces input into its proper type.

protected coerce(input: unknown, type: FieldConfiguration['type']): unknown;

Parameters

  • input: User input to check and coerce.
  • type: Type to use for coercion and checking.

Returns

Coerced user input.

Throws

  • If input should be an object but is not.
  • If input should be an array but is not.

Usage

engine.coerce('12.5', 'float'); // 12.5

enqueueMutation

Adds the given mutation and related data into the queue. "Buffering" mutations is an optimization that prevents UI from being notified (and thus re-rendered) too many times per second, which would be unnecessary and not great UX-wise.

protected enqueueMutation(mutation: string, data: Step[] | boolean): void;

Parameters

  • mutation: Mutation name for the state module.
  • data: Mutation data.

Usage

engine.enqueueMutation('SET_LOADER', true);

createField

Generates field with path path from its configuration fieldConfiguration.

protected createField(path: string, configuration: FieldConfiguration): Field | null;

Parameters

  • path: Field path in the form.
  • configuration: Field configuration.

Returns

Generated field if it meets display condition, null otherwise.

Usage

// {
// path: 'root.0.field',
// type: 'string',
// error: null,
// value: undefined,
// required: false,
// status: 'initial',
// }
engine.createField('root.0.field', { type: 'string' });

toggleField

Manages field visibility and value assignment, based on its display condition and current user inputs. This function can be called in two different contexts (stages):

  • Stage one: simply toggles field and enqueues any extra user action that should be triggered
  • Stage two: assigns new value to each field, and computes both full and partial updates lists
protected toggleField(
path: string,
field: Field | null,
configuration: FieldConfiguration,
newValue: unknown,
initialValue: Exclude<unknown, undefined>,
newInputs?: { partial?: unknown; full?: unknown },
): Field | null;

Parameters

  • path: Field path in the form.
  • field: Field to toggle if it is already generated, null otherwise.
  • configuration: Field configuration.
  • newValue: New value to assign to the field. In the first stage of form processing, this is a single value. In the second stage, it is a map of all new fields values.
  • initialValue: Initial field value, used internally to compute updates to the form when user changes fields values.
  • newInputs: Holds current state of user inputs, including both partial and full updates. Used internally for form processing.

Returns

Existing or newly created field if it should be displayed, null otherwise.

Usage

// {
// path: 'root.0.field',
// type: 'string',
// error: null,
// value: undefined,
// required: false,
// status: 'initial',
// }
engine.toggleField('root.0.field', null, { type: 'string' }, 'test', null);

toggleFields

Toggles all fields and sub-fields for step, according to their display conditions.

protected toggleFields(step: Step | null, newFieldValues: Map<string, unknown>): void;

Parameters

  • step: Step to toggle fields for.
  • newFieldValues: New values to assign to the fields.

Usage

engine.toggleFields({ fields: [...] }, new Map());

validateField

Validates field, making sure that its value passes all validation rules.

protected validateField(
field: Field | null,
configuration: FieldConfiguration,
partial: boolean,
updatedFieldPaths: string[],
): Exclude<Field['status'], 'initial'>;

Parameters

  • field: Field to validate.
  • configuration: Field configuration.
  • partial: Whether to also validate empty fields.
  • updatedFieldPaths: List of updated fields paths (used for validation on submit only).

Returns

Field state ("progress", "success" or "error").

Usage

engine.validateField({
path: 'root.0.field',
type: 'string',
error: null,
value: 'test',
required: false,
status: 'initial',
}, { type: 'string' }, false, []); // "success"

validateFields

Validates current step, making sure that all its fields' values pass validation rules.

protected validateFields(updatedFieldPaths: string[], partial?: boolean): void;

Parameters

  • updatedFieldPaths: List of updated fields paths (used for validation on submit only).
  • partial: Whether to also validate empty fields. Defaults to false.

Usage

engine.validateFields([], false);

triggerHooks

Triggers hooks chain for the given event.

protected triggerHooks<T extends HookData>(
eventName: FormEvent,
data: T,
): Promise<T | null>;

Parameters

  • eventName: Event name.
  • data: Additional data to pass to the hooks chain.

Returns

Pending hooks chain.

Usage

await engine.triggerHooks('userAction', { path: 'root.0.field', data: 'test', type: 'input'});

processUserInputs

Processes user inputs in batch to optimize performance by preventing too many UI notifications and to enforce hooks consistency.

protected processUserInputs(): Promise<void>;

Usage

await engine.processUserInputs();

handleUserAction

Handles new user actions, applying core logic such as hooks triggering or next step generation.

protected handleUserAction(userAction: UserAction | null): Promise<void>;

Parameters

  • userAction: New state sent by userActions store module.

Throws

If user action path does not point to a valid field.

Usage

await engine.handleUserAction({ path: 'root.0.field', data: 'test', type: 'input'});

isEmpty

Checks whether input is considered as empty, according to its type.

public isEmpty(input: unknown, type: FieldConfiguration['type']): boolean;

Parameters

  • input: Input to check.
  • type: Input type.

Returns

true if input is empty, false otherwise.

Usage

engine.isEmpty('', 'string'); // true

createStep

Generates step with id stepId.

public createStep(stepId: string | null): Promise<void>;

Parameters

  • stepId: Step id.

Usage

await engine.createStep('root.0');

toggleLoader

Toggles a loader right after current step, indicating next step is/not being generated.

public toggleLoader(display: boolean): void;

Parameters

  • display: Whether to display step loader.

Usage

engine.toggleLoader(true);

getStore

Returns current store instance.

public getStore(): Store;

Returns

Current store instance.

Usage

engine.getStore();  // { ... }

notifyUI

Sends a new notification to all state module listeners.

public notifyUI(): void;

Usage

engine.notifyUI();

on

Registers a new hook for the given event.

public on(eventName: 'userAction' | 'afterUserAction', hook: Hook<UserAction | null>): void;
public on(eventName: 'step' | 'afterStep', hook: Hook<Step | null>): void;
public on(eventName: 'error', hook: Hook<Error | null>): void;
public on(eventName: 'submit', hook: Hook<UserInputs | null>): void;
public on(eventName: 'start', hook: Hook<boolean | null>): void;
public on(eventName: FormEvent, hook: Hook<Data>): void;

Parameters

  • eventName: Name of the event to register hook for.
  • hook: Hook to register.

Usage

engine.on('userAction', async (data, next) => {
await doSomethingWithData(data);
return next(data);
});

userAction

Triggers the given user action.

public userAction(userAction: UserAction): void;

Parameters

  • userAction: User action to trigger.

Usage

engine.userAction({ path: 'root.0.field', data: 'test', type: 'input'});

getUserInputs

Returns current partial or full user inputs.

public getUserInputs<T>(partial?: boolean): T;

Parameters

  • partial: Whether to return only partial user inputs. Defaults to false.

Returns

Current user inputs.

Usage

engine.getUserInputs(false); // { ... }

getConfiguration

Returns configuration for path. If no path is provided, the global form configuration is returned instead.

public getConfiguration(): Configuration;
public getConfiguration<T extends SubConfiguration>(path?: string): T;

Parameters

  • path: Field or step path to get configuration for.

Returns

Requested configuration.

Throws

If configuration does not exist for path.

Usage

// {
// path: 'root.0.field',
// type: 'string',
// error: null,
// value: undefined,
// required: false,
// status: 'initial',
// }
engine.getConfiguration('root.0.field');

getField

Returns the generated field at path.

public getField(path: string): Field | null;

Parameters

  • path: Field path in the form.

Returns

Generated field if it exists, null otherwise.

Usage

// {
// path: 'root.0.field',
// type: 'string',
// error: null,
// value: undefined,
// required: false,
// status: 'initial',
// }
engine.getField('root.0.field');

getSteps

Returns all generated steps.

public getSteps(): Step[];

Returns

Current step.

Usage

engine.getSteps() // [...];

getVariables

Retrieves current form variables.

public getVariables<T>(): T;

Returns

Form variables.

Usage

engine.getVariables(); // { ... }

setVariables

Adds or overrides the given form variables.

public setVariables(variables: Record<string, unknown>): Promise<void>;

Parameters

  • variables: Form variables to add or override.

Usage

await engine.setVariables({ key: 'value' });

clearCache

Clears current form cache.

public clearCache(): Promise<void>;

Usage

await engine.clearCache();

setInitialValues

Sets initial form values. This method is especially useful when you need to reset initial values for multiple partial submissions without re-creating the whole form each time.

public setInitialValues(initialValues: UserInputs): void;

Parameters

  • initialValues: New initial form values to apply.

Usage

engine.setInitialValues({ key: 'value' });