Question Types
19 question types are declared, each checked against the Postgres question_type enum, the
TS SurveyQuestionType enum, and every platform’s renderer/router — one canonical set, not
per-platform lists that happen to agree:
| Type | Notes |
|---|---|
MULTIPLE_CHOICE_SINGLE | |
MULTIPLE_CHOICE_MULTI | |
TEXT_SHORT | |
TEXT_LONG | |
NPS | |
RATING_STAR | |
RATING_SCALE | |
NUMBER_INPUT | |
BINARY | |
SLIDER | |
IMAGE_SELECTION | |
RANKING | |
CONTINUOUS_SUM | |
MATRIX_CHOICE_SINGLE | Matrix; empty column list if config.columns is missing (no numeric fallback). |
MATRIX_CHOICE_MULTI | Same as above. |
MATRIX_RATING_SCALE | Derives numeric columns from config.min/config.max when config.columns is absent. |
MATRIX_STAR_RATING | Derives numeric columns from config.max when config.columns is absent. |
EMAIL_INPUT | |
DATE_TIME |
Every platform’s router also asserts the negative direction — that nothing outside this
set resolves successfully. DROPDOWN is not a real type: it’s guarded against explicitly as a
stray alias, so a re-introduced DROPDOWN branch in any renderer fails the gate instead of
silently working again. If you see it referenced in older material, it never shipped.
FILE_UPLOAD was removed (not merely unimplemented) after it turned out the web renderer had
no multipart endpoint to receive uploads and mobile had no renderer at all — implementing it
would have made three platforms consistent at collecting something that goes nowhere.
Randomization
config.randomizeOptions shuffles the option list for the types where that makes sense
(choice-based and matrix types); it’s a no-op for types like CONTINUOUS_SUM that aren’t in
the randomizable set, regardless of the flag.