S
Documentation

Core Utilities — API Reference

Framework-agnostic functions and classes exported from react-minimal-survey-builder/core. Use these in any JavaScript or TypeScript project — no React required.

Import

import {
  parseSchema,
  getAllQuestions,
  findQuestion,
  generateId,
  SurveySchemaError,
  validateQuestion,
  validatePage,
  validateSurvey,
  evaluateCondition,
  getVisibleQuestionIds,
  getVisiblePages,
  getVisibleQuestionsForPage,
  SurveyStateManager,
  createSurveyManager,
} from 'react-minimal-survey-builder/core';

Schema Parser

parseSchema

parseSchematypescript
function parseSchema(schema: SurveySchema): SurveySchema;

// Validates and normalises a schema. Throws SurveySchemaError on invalid input.
const parsed = parseSchema(rawSchema);

getAllQuestions

getAllQuestionstypescript
function getAllQuestions(schema: SurveySchema): Question[];

// Flattens all questions from all pages into a single array.
const questions = getAllQuestions(schema);

findQuestion

findQuestiontypescript
function findQuestion(schema: SurveySchema, questionId: string): Question | undefined;

const q = findQuestion(schema, 'email');

generateId

generateIdtypescript
function generateId(): string;

// Generates a unique ID string for new questions or pages.
const id = generateId(); // e.g. "q_abc123"

SurveySchemaError

SurveySchemaErrortypescript
class SurveySchemaError extends Error {
  constructor(message: string);
}

// Thrown by parseSchema when the schema is invalid.
try {
  parseSchema(badSchema);
} catch (e) {
  if (e instanceof SurveySchemaError) {
    console.error('Invalid schema:', e.message);
  }
}

Validation Engine

validateQuestion

validateQuestiontypescript
function validateQuestion(
  question: Question,
  value: AnswerValue,
  answers?: SurveyAnswers
): ValidationError[];

const errors = validateQuestion(
  { id: 'name', type: 'text', label: 'Name', required: true },
  ''
);
// [{ questionId: 'name', message: 'This field is required', rule: 'required' }]

validatePage

validatePagetypescript
function validatePage(
  page: Page,
  answers: SurveyAnswers
): ValidationError[];

const errors = validatePage(schema.pages[0], { name: '' });

validateSurvey

validateSurveytypescript
function validateSurvey(
  schema: SurveySchema,
  answers: SurveyAnswers
): ValidationError[];

const allErrors = validateSurvey(schema, answers);

Condition Evaluator

evaluateCondition

evaluateConditiontypescript
function evaluateCondition(
  condition: string | undefined,
  answers: SurveyAnswers
): boolean;

evaluateCondition("{role} === 'admin'", { role: 'admin' });  // true
evaluateCondition("{age} >= 18", { age: 16 });                // false
evaluateCondition(undefined, {});                             // true (no condition)

getVisibleQuestionIds

getVisibleQuestionIdstypescript
function getVisibleQuestionIds(
  schema: SurveySchema,
  answers: SurveyAnswers
): Set<string>;

const visibleIds = getVisibleQuestionIds(schema, answers);
// Set { 'name', 'email', 'satisfaction' }

getVisiblePages

getVisiblePagestypescript
function getVisiblePages(
  schema: SurveySchema,
  answers: SurveyAnswers
): Page[];

const pages = getVisiblePages(schema, answers);

getVisibleQuestionsForPage

getVisibleQuestionsForPagetypescript
function getVisibleQuestionsForPage(
  page: Page,
  answers: SurveyAnswers
): Question[];

const questions = getVisibleQuestionsForPage(schema.pages[0], answers);

SurveyStateManager

A framework-agnostic class that manages the full survey lifecycle — answers, validation, navigation, visibility, and events:

SurveyStateManagertypescript
class SurveyStateManager {
  constructor(schema: SurveySchema, options?: SurveyOptions);

  // Getters
  getState(): SurveyState;
  getSchema(): SurveySchema;
  getAnswers(): SurveyAnswers;
  getCurrentPage(): Page | null;
  getCurrentPageIndex(): number;
  getTotalPages(): number;
  getErrors(): ValidationError[];
  isValid(): boolean;

  // Mutations
  setAnswer(id: string, value: AnswerValue): void;
  setAnswers(answers: SurveyAnswers): void;
  nextPage(): boolean;
  prevPage(): void;
  goToPage(index: number): boolean;
  validate(): boolean;
  validateCurrentPage(): boolean;
  submit(): Promise<void>;
  reset(): void;

  // Events
  on(event: SurveyEventType, handler: SurveyEventHandler): () => void;
  onStateChange(callback: (state: SurveyState) => void): () => void;
}

createSurveyManager

createSurveyManagertypescript
function createSurveyManager(
  schema: SurveySchema,
  options?: SurveyOptions
): SurveyStateManager;

// Factory function — equivalent to new SurveyStateManager(schema, options)
const manager = createSurveyManager(schema, {
  onSubmit: (answers) => console.log(answers),
});

// Set answers
manager.setAnswer('name', 'Alice');

// Navigate
manager.nextPage();

// Listen for events
const unsubscribe = manager.on('answerChanged', (event) => {
  console.log('Answer changed:', event.payload);
});

// Listen for state changes
manager.onStateChange((state) => {
  console.log('Current page:', state.currentPageIndex);
  console.log('Errors:', state.errors);
});

// Clean up
unsubscribe();

When to Use Core?

Use the core module when you need the survey engine outside of React — for example, in a Vue app, a Node.js server, or a vanilla JavaScript project. The React useSurvey hook is built on top of these same utilities.