headless-survey-engine 0.0.0-stage → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,1514 @@
1
+ import { MAX_SURVEY_EXPRESSION_LENGTH, checkSurveyExpression, runSurveyExpression, toSurveyLogicAnswer, toSurveyLogicAnswers } from "survey-expression";
2
+ import { z } from "zod";
3
+ import { checkIsDeepEqual, createRecordSchema, createUniqueArraySchema, exhaustiveGuard, getResult, normalizeString, takeOne } from "@esposter/shared";
4
+ import { NO_BLOCK_SLOTS, createAcceptedTypesError, createBlockDocumentSchema, getBlockPropPointer } from "headless-block-editor";
5
+ import { RE2JS } from "re2js";
6
+ // src/models/SurveyAnswerValidationMode.ts
7
+ let SurveyAnswerValidationMode = /* @__PURE__ */ function(SurveyAnswerValidationMode) {
8
+ SurveyAnswerValidationMode["Draft"] = "draft";
9
+ SurveyAnswerValidationMode["Submit"] = "submit";
10
+ return SurveyAnswerValidationMode;
11
+ }({});
12
+ // src/models/SurveyBooleanDisplayStyle.ts
13
+ let SurveyBooleanDisplayStyle = /* @__PURE__ */ function(SurveyBooleanDisplayStyle) {
14
+ SurveyBooleanDisplayStyle["Checkbox"] = "checkbox";
15
+ SurveyBooleanDisplayStyle["Radio"] = "radio";
16
+ SurveyBooleanDisplayStyle["Switch"] = "switch";
17
+ return SurveyBooleanDisplayStyle;
18
+ }({});
19
+ // src/services/constants.ts
20
+ const MAX_SURVEY_QUESTION_NAME_LENGTH = 256;
21
+ const MAX_SURVEY_QUESTION_COUNT = 1e3;
22
+ const MAX_SURVEY_NODE_COUNT = 1500;
23
+ const MAX_SURVEY_CHOICE_COUNT = 200;
24
+ const MAX_SURVEY_MULTIPLE_TEXT_ITEM_COUNT = 50;
25
+ const MAX_SURVEY_COMMENT_ROW_COUNT = 20;
26
+ const MAX_SURVEY_PANEL_COUNT = 20;
27
+ const MAX_SURVEY_MATRIX_COLUMN_COUNT = 50;
28
+ const MAX_SURVEY_MATRIX_ROW_COUNT = 100;
29
+ const MAX_SURVEY_TEXT_LENGTH = 1e3;
30
+ const MAX_SURVEY_IMAGE_SIZE = 2048;
31
+ const MAX_SURVEY_HTML_LENGTH = 2e4;
32
+ const MAX_SURVEY_ID_LENGTH = 64;
33
+ const MAX_SURVEY_VALIDATOR_COUNT = 20;
34
+ const MAX_SURVEY_CALCULATED_VALUE_COUNT = 100;
35
+ const MAX_SURVEY_PATTERN_LENGTH = 200;
36
+ const MAX_SURVEY_URL_LENGTH = 2048;
37
+ const MAX_SURVEY_ANSWER_LENGTH = 1e4;
38
+ const MAX_SURVEY_ANSWER_ENTRY_COUNT = 200;
39
+ // src/services/surveyExpressionSchema.ts
40
+ const surveyExpressionSchema = z.string().min(1).max(MAX_SURVEY_EXPRESSION_LENGTH);
41
+ // src/models/SurveyValidator.ts
42
+ const surveyValidatorSchema = z.object({
43
+ expression: surveyExpressionSchema,
44
+ text: z.string().min(1).max(MAX_SURVEY_TEXT_LENGTH)
45
+ });
46
+ // src/services/surveyConditionSchema.ts
47
+ const surveyConditionSchema = z.string().max(MAX_SURVEY_EXPRESSION_LENGTH).default("");
48
+ // src/services/surveyNameSchema.ts
49
+ const surveyNameSchema = z.string().max(256).regex(/^[^{}]+$/u);
50
+ // src/models/SurveyQuestionBaseProps.ts
51
+ const surveyQuestionBasePropsShape = {
52
+ description: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
53
+ enableIf: surveyConditionSchema,
54
+ isRequired: z.boolean().default(false),
55
+ name: surveyNameSchema,
56
+ requiredErrorText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
57
+ requiredIf: surveyConditionSchema,
58
+ title: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
59
+ validators: z.array(surveyValidatorSchema).max(20).default([]),
60
+ visibleIf: surveyConditionSchema
61
+ };
62
+ // src/models/SurveyBooleanNodeProps.ts
63
+ const SURVEY_BOOLEAN_DISPLAY_STYLE_OPTIONS = [
64
+ "switch",
65
+ "checkbox",
66
+ "radio"
67
+ ];
68
+ const surveyBooleanNodePropsSchema = z.object({
69
+ ...surveyQuestionBasePropsShape,
70
+ displayStyle: z.enum(SURVEY_BOOLEAN_DISPLAY_STYLE_OPTIONS).default("switch"),
71
+ labelFalse: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
72
+ labelTrue: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
73
+ });
74
+ // src/models/SurveyChoice.ts
75
+ const surveyChoiceSchema = z.object({
76
+ text: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
77
+ value: z.union([z.string().max(MAX_SURVEY_TEXT_LENGTH), z.number()])
78
+ });
79
+ // src/models/SurveyChoicesProps.ts
80
+ const surveyChoicesPropsShape = { choices: createUniqueArraySchema(surveyChoiceSchema, "value").max(200).default([]) };
81
+ // src/models/SurveyButtonGroupNodeProps.ts
82
+ const surveyButtonGroupNodePropsSchema = z.object({
83
+ ...surveyQuestionBasePropsShape,
84
+ ...surveyChoicesPropsShape
85
+ });
86
+ // src/models/SurveyCalculatedValue.ts
87
+ const surveyCalculatedValueSchema = z.object({
88
+ expression: surveyExpressionSchema,
89
+ includeIntoResult: z.boolean().default(false),
90
+ name: surveyNameSchema
91
+ });
92
+ // src/models/SurveyChoicesOrder.ts
93
+ let SurveyChoicesOrder = /* @__PURE__ */ function(SurveyChoicesOrder) {
94
+ SurveyChoicesOrder["Ascending"] = "asc";
95
+ SurveyChoicesOrder["Descending"] = "desc";
96
+ SurveyChoicesOrder["None"] = "none";
97
+ SurveyChoicesOrder["Random"] = "random";
98
+ return SurveyChoicesOrder;
99
+ }({});
100
+ // src/models/SurveyChoiceOptionsProps.ts
101
+ const surveyChoiceOptionsPropsShape = {
102
+ ...surveyChoicesPropsShape,
103
+ choicesOrder: z.enum(SurveyChoicesOrder).default("none"),
104
+ hasOther: z.boolean().default(false),
105
+ otherText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
106
+ };
107
+ // src/models/SurveyNoneChoiceProps.ts
108
+ const surveyNoneChoicePropsShape = {
109
+ hasNone: z.boolean().default(false),
110
+ noneText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
111
+ };
112
+ // src/models/SurveyCheckboxNodeProps.ts
113
+ const surveyCheckboxNodePropsSchema = z.object({
114
+ ...surveyQuestionBasePropsShape,
115
+ ...surveyChoiceOptionsPropsShape,
116
+ ...surveyNoneChoicePropsShape,
117
+ hasSelectAll: z.boolean().default(false),
118
+ maxSelected: z.int().positive().optional(),
119
+ minSelected: z.int().positive().optional(),
120
+ selectAllText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
121
+ });
122
+ // src/models/SurveyCommentNodeProps.ts
123
+ const surveyCommentNodePropsSchema = z.object({
124
+ ...surveyQuestionBasePropsShape,
125
+ maxLength: z.int().positive().optional(),
126
+ placeholder: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
127
+ rows: z.int().min(1).max(20).default(4)
128
+ });
129
+ // src/models/SurveyContainerBaseProps.ts
130
+ const surveyContainerBasePropsShape = {
131
+ description: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
132
+ title: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
133
+ visibleIf: surveyConditionSchema
134
+ };
135
+ // src/models/SurveyDropdownNodeProps.ts
136
+ const surveyDropdownNodePropsSchema = z.object({
137
+ ...surveyQuestionBasePropsShape,
138
+ ...surveyChoiceOptionsPropsShape,
139
+ placeholder: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
140
+ });
141
+ // src/models/SurveyExpressionDisplayFormat.ts
142
+ let SurveyExpressionDisplayFormat = /* @__PURE__ */ function(SurveyExpressionDisplayFormat) {
143
+ SurveyExpressionDisplayFormat["Decimal"] = "decimal";
144
+ SurveyExpressionDisplayFormat["None"] = "none";
145
+ SurveyExpressionDisplayFormat["Percent"] = "percent";
146
+ return SurveyExpressionDisplayFormat;
147
+ }({});
148
+ // src/models/SurveyExpressionNodeProps.ts
149
+ const MIN_SURVEY_FRACTION_DIGITS = 0;
150
+ const MAX_SURVEY_FRACTION_DIGITS = 10;
151
+ const surveyExpressionNodePropsSchema = z.object({
152
+ ...surveyQuestionBasePropsShape,
153
+ displayFormat: z.enum(SurveyExpressionDisplayFormat).default("none"),
154
+ expression: surveyConditionSchema,
155
+ maxFractionDigits: z.int().min(MIN_SURVEY_FRACTION_DIGITS).max(MAX_SURVEY_FRACTION_DIGITS).default(2)
156
+ });
157
+ // src/models/SurveyHtmlNodeProps.ts
158
+ const surveyHtmlNodePropsSchema = z.object({
159
+ html: z.string().max(MAX_SURVEY_HTML_LENGTH).default(""),
160
+ name: surveyNameSchema,
161
+ visibleIf: surveyConditionSchema
162
+ });
163
+ // src/models/SurveyImageFit.ts
164
+ let SurveyImageFit = /* @__PURE__ */ function(SurveyImageFit) {
165
+ SurveyImageFit["Contain"] = "contain";
166
+ SurveyImageFit["Cover"] = "cover";
167
+ SurveyImageFit["Fill"] = "fill";
168
+ SurveyImageFit["None"] = "none";
169
+ return SurveyImageFit;
170
+ }({});
171
+ // src/models/SurveyImageBoxProps.ts
172
+ const surveyImageBoxPropsShape = {
173
+ imageFit: z.enum(SurveyImageFit).default("contain"),
174
+ imageHeight: z.int().positive().max(MAX_SURVEY_IMAGE_SIZE).optional(),
175
+ imageWidth: z.int().positive().max(MAX_SURVEY_IMAGE_SIZE).optional()
176
+ };
177
+ // src/models/SurveyImageChoice.ts
178
+ const surveyImageChoiceSchema = z.object({
179
+ ...surveyChoiceSchema.shape,
180
+ imageLink: z.string().min(1).max(MAX_SURVEY_URL_LENGTH)
181
+ });
182
+ // src/models/SurveyImageNodeProps.ts
183
+ const surveyImageNodePropsSchema = z.object({
184
+ ...surveyImageBoxPropsShape,
185
+ altText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
186
+ imageLink: z.string().max(MAX_SURVEY_URL_LENGTH).default(""),
187
+ name: surveyNameSchema,
188
+ visibleIf: surveyConditionSchema
189
+ });
190
+ // src/models/SurveyImagePickerNodeProps.ts
191
+ const surveyImagePickerNodePropsSchema = z.object({
192
+ ...surveyQuestionBasePropsShape,
193
+ ...surveyImageBoxPropsShape,
194
+ choices: createUniqueArraySchema(surveyImageChoiceSchema, "value").max(200).default([]),
195
+ isLabelVisible: z.boolean().default(true),
196
+ multiSelect: z.boolean().default(false)
197
+ });
198
+ // src/models/SurveyMatrixCellType.ts
199
+ let SurveyMatrixCellType = /* @__PURE__ */ function(SurveyMatrixCellType) {
200
+ SurveyMatrixCellType["Boolean"] = "boolean";
201
+ SurveyMatrixCellType["Checkbox"] = "checkbox";
202
+ SurveyMatrixCellType["Comment"] = "comment";
203
+ SurveyMatrixCellType["Dropdown"] = "dropdown";
204
+ SurveyMatrixCellType["Rating"] = "rating";
205
+ SurveyMatrixCellType["Text"] = "text";
206
+ return SurveyMatrixCellType;
207
+ }({});
208
+ // src/models/SurveyMatrixColumn.ts
209
+ const surveyMatrixColumnSchema = z.object({
210
+ cellType: z.enum(SurveyMatrixCellType),
211
+ choices: createUniqueArraySchema(surveyChoiceSchema, "value").max(200).default([]),
212
+ isRequired: z.boolean().default(false),
213
+ name: surveyNameSchema,
214
+ title: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
215
+ });
216
+ // src/models/SurveyMatrixDynamicNodeProps.ts
217
+ const surveyMatrixDynamicNodePropsSchema = z.object({
218
+ ...surveyQuestionBasePropsShape,
219
+ addRowText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
220
+ columns: createUniqueArraySchema(surveyMatrixColumnSchema, "name").max(50).default([]),
221
+ maxRowCount: z.int().min(1).max(100).default(100),
222
+ minRowCount: z.int().min(0).max(100).default(0),
223
+ removeRowText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
224
+ rowCount: z.int().min(0).max(100).default(2)
225
+ });
226
+ // src/models/SurveyMatrixNodeProps.ts
227
+ const surveyMatrixNodePropsSchema = z.object({
228
+ ...surveyQuestionBasePropsShape,
229
+ columns: createUniqueArraySchema(surveyChoiceSchema, "value").max(200).default([]),
230
+ isAllRowRequired: z.boolean().default(false),
231
+ rows: createUniqueArraySchema(surveyChoiceSchema, "value").max(200).default([])
232
+ });
233
+ // src/models/SurveyMultipleTextItemInputType.ts
234
+ let SurveyMultipleTextItemInputType = /* @__PURE__ */ function(SurveyMultipleTextItemInputType) {
235
+ SurveyMultipleTextItemInputType["Email"] = "email";
236
+ SurveyMultipleTextItemInputType["Number"] = "number";
237
+ SurveyMultipleTextItemInputType["Text"] = "text";
238
+ return SurveyMultipleTextItemInputType;
239
+ }({});
240
+ // src/models/SurveyMultipleTextItem.ts
241
+ const surveyMultipleTextItemSchema = z.object({
242
+ inputType: z.enum(SurveyMultipleTextItemInputType),
243
+ isRequired: z.boolean().default(false),
244
+ name: surveyNameSchema,
245
+ title: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
246
+ });
247
+ // src/models/SurveyMultipleTextNodeProps.ts
248
+ const surveyMultipleTextNodePropsSchema = z.object({
249
+ ...surveyQuestionBasePropsShape,
250
+ items: createUniqueArraySchema(surveyMultipleTextItemSchema, "name").max(50).default([])
251
+ });
252
+ // src/models/SurveyNodeType.ts
253
+ let SurveyNodeType = /* @__PURE__ */ function(SurveyNodeType) {
254
+ SurveyNodeType["Boolean"] = "boolean";
255
+ SurveyNodeType["ButtonGroup"] = "buttongroup";
256
+ SurveyNodeType["Checkbox"] = "checkbox";
257
+ SurveyNodeType["Comment"] = "comment";
258
+ SurveyNodeType["Dropdown"] = "dropdown";
259
+ SurveyNodeType["Expression"] = "expression";
260
+ SurveyNodeType["Html"] = "html";
261
+ SurveyNodeType["Image"] = "image";
262
+ SurveyNodeType["ImagePicker"] = "imagepicker";
263
+ SurveyNodeType["Matrix"] = "matrix";
264
+ SurveyNodeType["MatrixDynamic"] = "matrixdynamic";
265
+ SurveyNodeType["MultipleText"] = "multipletext";
266
+ SurveyNodeType["Page"] = "page";
267
+ SurveyNodeType["Panel"] = "panel";
268
+ SurveyNodeType["PanelDynamic"] = "paneldynamic";
269
+ SurveyNodeType["RadioGroup"] = "radiogroup";
270
+ SurveyNodeType["Ranking"] = "ranking";
271
+ SurveyNodeType["Rating"] = "rating";
272
+ SurveyNodeType["Slider"] = "slider";
273
+ SurveyNodeType["TagBox"] = "tagbox";
274
+ SurveyNodeType["Text"] = "text";
275
+ return SurveyNodeType;
276
+ }({});
277
+ // src/models/SurveyPageNodeProps.ts
278
+ const surveyPageNodePropsSchema = z.object({ ...surveyContainerBasePropsShape });
279
+ // src/models/SurveyPanelDynamicNodeProps.ts
280
+ const surveyPanelDynamicNodePropsSchema = z.object({
281
+ ...surveyQuestionBasePropsShape,
282
+ addPanelText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
283
+ maxPanelCount: z.int().min(1).max(20).default(20),
284
+ minPanelCount: z.int().min(0).max(20).default(0),
285
+ panelCount: z.int().min(0).max(20).default(1),
286
+ removePanelText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
287
+ });
288
+ // src/models/SurveyPanelNodeProps.ts
289
+ const surveyPanelNodePropsSchema = z.object({
290
+ ...surveyContainerBasePropsShape,
291
+ enableIf: surveyConditionSchema
292
+ });
293
+ // src/models/SurveyProgressBarPlacement.ts
294
+ let SurveyProgressBarPlacement = /* @__PURE__ */ function(SurveyProgressBarPlacement) {
295
+ SurveyProgressBarPlacement["Bottom"] = "bottom";
296
+ SurveyProgressBarPlacement["Off"] = "off";
297
+ SurveyProgressBarPlacement["Top"] = "top";
298
+ return SurveyProgressBarPlacement;
299
+ }({});
300
+ // src/models/SurveyRadioGroupNodeProps.ts
301
+ const surveyRadioGroupNodePropsSchema = z.object({
302
+ ...surveyQuestionBasePropsShape,
303
+ ...surveyChoiceOptionsPropsShape,
304
+ ...surveyNoneChoicePropsShape
305
+ });
306
+ // src/models/SurveyRankingNodeProps.ts
307
+ const surveyRankingNodePropsSchema = z.object({
308
+ ...surveyQuestionBasePropsShape,
309
+ ...surveyChoicesPropsShape
310
+ });
311
+ // src/models/SurveyRatingType.ts
312
+ let SurveyRatingType = /* @__PURE__ */ function(SurveyRatingType) {
313
+ SurveyRatingType["Labels"] = "labels";
314
+ SurveyRatingType["Smileys"] = "smileys";
315
+ SurveyRatingType["Stars"] = "stars";
316
+ return SurveyRatingType;
317
+ }({});
318
+ // src/models/SurveyRatingNodeProps.ts
319
+ const MIN_SURVEY_RATE_COUNT = 2;
320
+ const MAX_SURVEY_RATE_COUNT = 20;
321
+ const surveyRatingNodePropsSchema = z.object({
322
+ ...surveyQuestionBasePropsShape,
323
+ maxRateDescription: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
324
+ minRateDescription: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
325
+ rateCount: z.int().min(MIN_SURVEY_RATE_COUNT).max(MAX_SURVEY_RATE_COUNT).default(5),
326
+ rateType: z.enum(SurveyRatingType).default("labels")
327
+ });
328
+ // src/models/SurveyRootProps.ts
329
+ const HEX_COLOR_REGEX = /^(?:#[\da-f]{6})?$/iu;
330
+ const surveyRootPropsSchema = z.strictObject({
331
+ accentColor: z.string().regex(HEX_COLOR_REGEX).default(""),
332
+ backgroundColor: z.string().regex(HEX_COLOR_REGEX).default(""),
333
+ calculatedValues: createUniqueArraySchema(surveyCalculatedValueSchema, "name").max(100).default([]),
334
+ completedHtml: z.string().max(MAX_SURVEY_HTML_LENGTH).default(""),
335
+ completeText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
336
+ description: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
337
+ isQuestionNumbersVisible: z.boolean().default(false),
338
+ logo: z.string().max(MAX_SURVEY_URL_LENGTH).default(""),
339
+ pageNextText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
340
+ pagePrevText: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
341
+ showProgressBar: z.enum(SurveyProgressBarPlacement).default("off"),
342
+ title: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
343
+ });
344
+ // src/models/SurveySliderNodeProps.ts
345
+ const surveySliderNodePropsSchema = z.object({
346
+ ...surveyQuestionBasePropsShape,
347
+ isValueVisible: z.boolean().default(true),
348
+ max: z.number().default(100),
349
+ min: z.number().default(0),
350
+ step: z.number().positive().default(1)
351
+ });
352
+ // src/models/SurveyTagBoxNodeProps.ts
353
+ const surveyTagBoxNodePropsSchema = z.object({
354
+ ...surveyQuestionBasePropsShape,
355
+ ...surveyChoiceOptionsPropsShape,
356
+ maxSelected: z.int().positive().optional(),
357
+ placeholder: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
358
+ });
359
+ // src/models/SurveyTextInputType.ts
360
+ let SurveyTextInputType = /* @__PURE__ */ function(SurveyTextInputType) {
361
+ SurveyTextInputType["Date"] = "date";
362
+ SurveyTextInputType["DatetimeLocal"] = "datetime-local";
363
+ SurveyTextInputType["Email"] = "email";
364
+ SurveyTextInputType["Number"] = "number";
365
+ SurveyTextInputType["Password"] = "password";
366
+ SurveyTextInputType["Tel"] = "tel";
367
+ SurveyTextInputType["Text"] = "text";
368
+ SurveyTextInputType["Time"] = "time";
369
+ SurveyTextInputType["Url"] = "url";
370
+ return SurveyTextInputType;
371
+ }({});
372
+ // src/models/SurveyTextNodeProps.ts
373
+ const surveyTextNodePropsSchema = z.object({
374
+ ...surveyQuestionBasePropsShape,
375
+ inputType: z.enum(SurveyTextInputType).default("text"),
376
+ max: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
377
+ maxLength: z.int().nonnegative().optional(),
378
+ min: z.string().max(MAX_SURVEY_TEXT_LENGTH).default(""),
379
+ minLength: z.int().nonnegative().optional(),
380
+ pattern: z.string().max(200).default(""),
381
+ placeholder: z.string().max(MAX_SURVEY_TEXT_LENGTH).default("")
382
+ });
383
+ // src/services/boundedChildren.ts
384
+ const boundedChildren = (schema) => z.array(schema).max(MAX_SURVEY_NODE_COUNT);
385
+ // src/services/checkSurveyExpressionField.ts
386
+ const checkSurveyExpressionField = (source, label, pointer, issues) => {
387
+ const expressionError = checkSurveyExpression(source);
388
+ if (expressionError === void 0) return;
389
+ issues.push({
390
+ message: `The ${label} does not parse: ${expressionError.message} (at position ${expressionError.position})`,
391
+ pointer
392
+ });
393
+ };
394
+ // src/services/checkSurveyCalculatedValues.ts
395
+ const checkSurveyCalculatedValues = (calculatedValues, listPointer, names, issues) => {
396
+ for (const [index, calculatedValue] of calculatedValues.entries()) {
397
+ const calculatedValuePointer = `${listPointer}/${index}`;
398
+ if (names.has(calculatedValue.name)) issues.push({
399
+ message: `The name "${calculatedValue.name}" is already used by a question or an earlier calculated value`,
400
+ pointer: `${calculatedValuePointer}/name`
401
+ });
402
+ names.add(calculatedValue.name);
403
+ checkSurveyExpressionField(calculatedValue.expression, "calculated value expression", `${calculatedValuePointer}/expression`, issues);
404
+ }
405
+ };
406
+ // src/services/checkSurveyMinimumWithinMaximum.ts
407
+ const checkSurveyMinimumWithinMaximum = (minimum, maximum, minimumPointer, issues) => {
408
+ if (minimum !== void 0 && maximum !== void 0 && minimum > maximum) issues.push({
409
+ message: `The minimum ${minimum} is above the maximum ${maximum}, so no answer could meet both`,
410
+ pointer: minimumPointer
411
+ });
412
+ };
413
+ // src/services/runner/constants.ts
414
+ const SURVEY_REQUIRED_MESSAGE = "Please answer this question.";
415
+ const SURVEY_INVALID_ANSWER_MESSAGE = "This answer is not valid.";
416
+ const SURVEY_TOO_SHORT_MESSAGE = "This answer is too short.";
417
+ const SURVEY_TOO_LONG_MESSAGE = "This answer is too long.";
418
+ const SURVEY_TOO_FEW_SELECTED_MESSAGE = "Select more choices.";
419
+ const SURVEY_TOO_MANY_SELECTED_MESSAGE = "Select fewer choices.";
420
+ const SURVEY_OUT_OF_RANGE_MESSAGE = "This answer is out of range.";
421
+ const SURVEY_NOT_A_CHOICE_MESSAGE = "This answer is not one of the choices.";
422
+ const SURVEY_WRONG_COUNT_MESSAGE = "This answer has the wrong number of rows or panels.";
423
+ const MATRIX_CELL_RATING_COUNT = 5;
424
+ const SURVEY_NONE_ANSWER = "none";
425
+ const SURVEY_UNKNOWN_QUESTION_MESSAGE = "Unknown question";
426
+ const SURVEY_NOT_SHOWN_MESSAGE = "This question is not shown";
427
+ // src/services/checkSurveyNoneChoice.ts
428
+ const checkSurveyNoneChoice = (props, nodePointer, issues) => {
429
+ if (props.hasNone && props.choices.some(({ value }) => value === "none")) issues.push({
430
+ message: `A choice may not take the value "${SURVEY_NONE_ANSWER}", since the question offers none under it`,
431
+ pointer: getBlockPropPointer(nodePointer, "choices")
432
+ });
433
+ };
434
+ // src/services/checkSurveyOptionalExpression.ts
435
+ const checkSurveyOptionalExpression = (source, label, pointer, issues) => {
436
+ if (source === "") return;
437
+ checkSurveyExpressionField(source, label, pointer, issues);
438
+ };
439
+ // src/services/checkSurveyQuestion.ts
440
+ const checkSurveyQuestion = (props, nodePointer, names, issues) => {
441
+ if (names.has(props.name)) issues.push({
442
+ message: `The name "${props.name}" is already used by an earlier question`,
443
+ pointer: getBlockPropPointer(nodePointer, "name")
444
+ });
445
+ else names.add(props.name);
446
+ checkSurveyOptionalExpression(props.visibleIf, "visibility condition", getBlockPropPointer(nodePointer, "visibleIf"), issues);
447
+ checkSurveyOptionalExpression(props.enableIf, "enable condition", getBlockPropPointer(nodePointer, "enableIf"), issues);
448
+ checkSurveyOptionalExpression(props.requiredIf, "required condition", getBlockPropPointer(nodePointer, "requiredIf"), issues);
449
+ const validatorsPointer = getBlockPropPointer(nodePointer, "validators");
450
+ for (const [index, validator] of props.validators.entries()) checkSurveyExpressionField(validator.expression, "validator expression", `${validatorsPointer}/${index}/expression`, issues);
451
+ };
452
+ // src/services/checkSurveyNodes.ts
453
+ const checkSurveyNodes = (nodes, listPointer, names, issues) => {
454
+ for (const [index, node] of nodes.entries()) {
455
+ const nodePointer = `${listPointer}/${index}`;
456
+ if (node.type === "radiogroup" || node.type === "checkbox") checkSurveyNoneChoice(node.props, nodePointer, issues);
457
+ if (node.type === "checkbox") checkSurveyMinimumWithinMaximum(node.props.minSelected, node.props.maxSelected, getBlockPropPointer(nodePointer, "minSelected"), issues);
458
+ if (node.type === "matrixdynamic") checkSurveyMinimumWithinMaximum(node.props.minRowCount, node.props.maxRowCount, getBlockPropPointer(nodePointer, "minRowCount"), issues);
459
+ switch (node.type) {
460
+ case "expression":
461
+ checkSurveyQuestion(node.props, nodePointer, names, issues);
462
+ checkSurveyOptionalExpression(node.props.expression, "expression", getBlockPropPointer(nodePointer, "expression"), issues);
463
+ break;
464
+ case "html":
465
+ case "image":
466
+ checkSurveyOptionalExpression(node.props.visibleIf, "visibility condition", getBlockPropPointer(nodePointer, "visibleIf"), issues);
467
+ break;
468
+ case "page":
469
+ checkSurveyOptionalExpression(node.props.visibleIf, "visibility condition", getBlockPropPointer(nodePointer, "visibleIf"), issues);
470
+ checkSurveyNodes(node.props.children, getBlockPropPointer(nodePointer, "children"), names, issues);
471
+ break;
472
+ case "panel":
473
+ checkSurveyOptionalExpression(node.props.visibleIf, "visibility condition", getBlockPropPointer(nodePointer, "visibleIf"), issues);
474
+ checkSurveyOptionalExpression(node.props.enableIf, "enable condition", getBlockPropPointer(nodePointer, "enableIf"), issues);
475
+ checkSurveyNodes(node.props.children, getBlockPropPointer(nodePointer, "children"), names, issues);
476
+ break;
477
+ case "paneldynamic":
478
+ checkSurveyQuestion(node.props, nodePointer, names, issues);
479
+ checkSurveyNodes(node.props.template, getBlockPropPointer(nodePointer, "template"), /* @__PURE__ */ new Set(), issues);
480
+ break;
481
+ default: checkSurveyQuestion(node.props, nodePointer, names, issues);
482
+ }
483
+ }
484
+ };
485
+ // src/services/checkSurveyDocument.ts
486
+ const checkSurveyDocument = (document) => {
487
+ const issues = [];
488
+ const names = /* @__PURE__ */ new Set();
489
+ checkSurveyNodes(document.content, "/content", names, issues);
490
+ checkSurveyCalculatedValues(document.root.props.calculatedValues, "/root/props/calculatedValues", names, issues);
491
+ return issues;
492
+ };
493
+ // src/services/createSeededRandom.ts
494
+ const createSeededRandom = (seed) => {
495
+ let state = seed;
496
+ return () => {
497
+ state = state + 1831565813 >>> 0;
498
+ let value = Math.imul(state ^ state >>> 15, 1 | state);
499
+ value ^= value + Math.imul(value ^ value >>> 7, 61 | value);
500
+ return ((value ^ value >>> 14) >>> 0) / 4294967296;
501
+ };
502
+ };
503
+ // src/services/surveyNodeTypeLists.ts
504
+ const SURVEY_ROOT_NODE_TYPES = ["page"];
505
+ const SURVEY_PLACEABLE_NODE_TYPES = Object.values(SurveyNodeType).filter((type) => type !== "page");
506
+ const SURVEY_TEMPLATE_NODE_TYPES = SURVEY_PLACEABLE_NODE_TYPES.filter((type) => type !== "panel" && type !== "paneldynamic");
507
+ // src/services/surveyPageNodeType.ts
508
+ const surveyPageNodeType = {
509
+ createDefaultProps: () => surveyPageNodePropsSchema.parse({}),
510
+ formSchema: surveyPageNodePropsSchema,
511
+ label: "Page",
512
+ propsSchema: surveyPageNodePropsSchema,
513
+ slots: { children: SURVEY_PLACEABLE_NODE_TYPES },
514
+ type: "page"
515
+ };
516
+ // src/services/createSurveyDocument.ts
517
+ const createSurveyDocument = () => {
518
+ return {
519
+ content: [{
520
+ props: {
521
+ ...surveyPageNodeType.createDefaultProps(),
522
+ children: [],
523
+ id: crypto.randomUUID()
524
+ },
525
+ type: "page"
526
+ }],
527
+ root: { props: surveyRootPropsSchema.parse({}) }
528
+ };
529
+ };
530
+ // src/services/flattenSurveyQuestions.ts
531
+ const flattenSurveyQuestions = (nodes) => nodes.flatMap((node) => node.type === "page" || node.type === "panel" ? flattenSurveyQuestions(node.props.children) : [node]);
532
+ // src/services/getSurveyChoiceText.ts
533
+ const getSurveyChoiceText = ({ text, value }) => text || String(value);
534
+ // src/services/hashSurveySeed.ts
535
+ const hashSurveySeed = (seed) => {
536
+ let hash = 2166136261;
537
+ for (const character of seed) {
538
+ hash ^= character.codePointAt(0) ?? 0;
539
+ hash = Math.imul(hash, 16777619);
540
+ }
541
+ return hash >>> 0;
542
+ };
543
+ // src/services/getSurveyOrderedChoices.ts
544
+ const getSurveyOrderedChoices = (choices, choicesOrder, seed) => {
545
+ switch (choicesOrder) {
546
+ case "asc": return choices.toSorted((firstChoice, secondChoice) => getSurveyChoiceText(firstChoice).localeCompare(getSurveyChoiceText(secondChoice)));
547
+ case "desc": return choices.toSorted((firstChoice, secondChoice) => getSurveyChoiceText(secondChoice).localeCompare(getSurveyChoiceText(firstChoice)));
548
+ case "none": return choices;
549
+ case "random": {
550
+ const random = createSeededRandom(hashSurveySeed(seed));
551
+ const shuffled = [];
552
+ let remaining = choices;
553
+ while (remaining.length > 0) {
554
+ const index = Math.floor(random() * remaining.length);
555
+ shuffled.push(takeOne(remaining, index));
556
+ remaining = remaining.toSpliced(index, 1);
557
+ }
558
+ return shuffled;
559
+ }
560
+ default: return exhaustiveGuard(choicesOrder);
561
+ }
562
+ };
563
+ // src/services/runner/answer/createSurveyBooleanAnswerSchema.ts
564
+ const createSurveyBooleanAnswerSchema = () => z.boolean({ error: SURVEY_INVALID_ANSWER_MESSAGE });
565
+ // src/services/runner/answer/createSurveyStringAnswerSchema.ts
566
+ const createSurveyStringAnswerSchema = ({ maxLength, minLength }) => {
567
+ const bounded = z.string({ error: SURVEY_INVALID_ANSWER_MESSAGE }).max(MAX_SURVEY_ANSWER_LENGTH, { error: SURVEY_TOO_LONG_MESSAGE });
568
+ const minBounded = minLength === void 0 ? bounded : bounded.min(minLength, { error: SURVEY_TOO_SHORT_MESSAGE });
569
+ return maxLength === void 0 ? minBounded : minBounded.max(maxLength, { error: SURVEY_TOO_LONG_MESSAGE });
570
+ };
571
+ // src/services/runner/answer/createSurveyChoiceValueSchema.ts
572
+ const createSurveyChoiceValueSchema = ({ choices, hasNone = false, hasOther = false }) => {
573
+ const options = [
574
+ ...choices.map((choice) => z.literal(choice.value, { error: SURVEY_NOT_A_CHOICE_MESSAGE })),
575
+ ...hasNone ? [z.literal(SURVEY_NONE_ANSWER, { error: SURVEY_NOT_A_CHOICE_MESSAGE })] : [],
576
+ ...hasOther ? [createSurveyStringAnswerSchema({}).min(1, { error: SURVEY_REQUIRED_MESSAGE })] : []
577
+ ];
578
+ return options.length === 0 ? z.never({ error: SURVEY_NOT_A_CHOICE_MESSAGE }) : z.union(options, { error: SURVEY_NOT_A_CHOICE_MESSAGE });
579
+ };
580
+ // src/services/runner/answer/createSurveyButtonGroupAnswerSchema.ts
581
+ const createSurveyButtonGroupAnswerSchema = (node) => createSurveyChoiceValueSchema({ choices: node.props.choices });
582
+ // src/services/runner/answer/createSurveySelectionAnswerSchema.ts
583
+ const createSurveySelectionAnswerSchema = ({ choices, hasNone = false, hasOther = false, maxSelected, minSelected }) => createUniqueArraySchema(createSurveyChoiceValueSchema({
584
+ choices,
585
+ hasNone,
586
+ hasOther
587
+ })).min(minSelected ?? 0, { error: SURVEY_TOO_FEW_SELECTED_MESSAGE }).max(maxSelected ?? 200, { error: SURVEY_TOO_MANY_SELECTED_MESSAGE }).refine((selected) => !hasNone || !selected.includes("none") || selected.length === 1, { error: SURVEY_INVALID_ANSWER_MESSAGE });
588
+ // src/services/runner/answer/createSurveyCheckboxAnswerSchema.ts
589
+ const createSurveyCheckboxAnswerSchema = (node) => createSurveySelectionAnswerSchema({
590
+ choices: node.props.choices,
591
+ hasNone: node.props.hasNone,
592
+ hasOther: node.props.hasOther,
593
+ maxSelected: node.props.maxSelected,
594
+ minSelected: node.props.minSelected
595
+ });
596
+ // src/services/runner/answer/createSurveyCommentAnswerSchema.ts
597
+ const createSurveyCommentAnswerSchema = (node) => createSurveyStringAnswerSchema({ maxLength: node.props.maxLength });
598
+ // src/services/runner/answer/createSurveyDropdownAnswerSchema.ts
599
+ const createSurveyDropdownAnswerSchema = (node) => createSurveyChoiceValueSchema({
600
+ choices: node.props.choices,
601
+ hasOther: node.props.hasOther
602
+ });
603
+ // src/services/runner/answer/createSurveyNumberAnswerSchema.ts
604
+ const createSurveyNumberAnswerSchema = ({ max, min }) => {
605
+ const bounded = z.number({ error: SURVEY_INVALID_ANSWER_MESSAGE });
606
+ const minBounded = min === void 0 ? bounded : bounded.min(min, { error: SURVEY_OUT_OF_RANGE_MESSAGE });
607
+ return max === void 0 ? minBounded : minBounded.max(max, { error: SURVEY_OUT_OF_RANGE_MESSAGE });
608
+ };
609
+ // src/services/runner/surveyAnswerScalarSchema.ts
610
+ const surveyAnswerScalarSchema = z.union([
611
+ createSurveyStringAnswerSchema({}),
612
+ createSurveyNumberAnswerSchema({}),
613
+ createSurveyBooleanAnswerSchema()
614
+ ], { error: SURVEY_INVALID_ANSWER_MESSAGE });
615
+ // src/services/runner/answer/createSurveyExpressionAnswerSchema.ts
616
+ const createSurveyExpressionAnswerSchema = () => surveyAnswerScalarSchema;
617
+ // src/services/runner/answer/createSurveyImagePickerAnswerSchema.ts
618
+ const createSurveyImagePickerAnswerSchema = (node) => node.props.multiSelect ? createSurveySelectionAnswerSchema({ choices: node.props.choices }) : createSurveyChoiceValueSchema({ choices: node.props.choices });
619
+ // src/services/runner/checkSurveyAnswerEmpty.ts
620
+ const checkSurveyAnswerEmpty = (value) => value === void 0 || typeof value === "string" && normalizeString(value) === "" || Array.isArray(value) && value.length === 0;
621
+ // src/services/runner/answer/createSurveyNamedAnswerSchema.ts
622
+ const createSurveyNamedAnswerSchema = (fields) => z.strictObject(Object.fromEntries(fields.map((field) => [field.name, z.preprocess((value) => checkSurveyAnswerEmpty(value) ? void 0 : value, field.schema.optional())])), { error: SURVEY_INVALID_ANSWER_MESSAGE }).superRefine((answer, ctx) => {
623
+ for (const field of fields) if (field.isRequired && checkSurveyAnswerEmpty(answer[field.name])) ctx.addIssue({
624
+ code: "custom",
625
+ message: SURVEY_REQUIRED_MESSAGE,
626
+ path: [field.name]
627
+ });
628
+ });
629
+ // src/services/runner/answer/createSurveyMatrixAnswerSchema.ts
630
+ const createSurveyMatrixAnswerSchema = (node) => {
631
+ const column = createSurveyChoiceValueSchema({ choices: node.props.columns });
632
+ return createSurveyNamedAnswerSchema(node.props.rows.map((row) => ({
633
+ isRequired: node.props.isAllRowRequired,
634
+ name: `${row.value}`,
635
+ schema: column
636
+ })));
637
+ };
638
+ // src/services/runner/answer/createSurveyRatingValueSchema.ts
639
+ const MIN_SURVEY_RATING = 1;
640
+ const createSurveyRatingValueSchema = (rateCount) => z.int({ error: SURVEY_INVALID_ANSWER_MESSAGE }).min(MIN_SURVEY_RATING, { error: SURVEY_OUT_OF_RANGE_MESSAGE }).max(rateCount, { error: SURVEY_OUT_OF_RANGE_MESSAGE });
641
+ // src/services/runner/answer/createSurveyMatrixCellAnswerSchema.ts
642
+ const createSurveyMatrixCellAnswerSchema = (column) => {
643
+ switch (column.cellType) {
644
+ case "boolean": return createSurveyBooleanAnswerSchema();
645
+ case "checkbox": return createSurveySelectionAnswerSchema({ choices: column.choices });
646
+ case "comment":
647
+ case "text": return createSurveyStringAnswerSchema({});
648
+ case "dropdown": return createSurveyChoiceValueSchema({ choices: column.choices });
649
+ case "rating": return createSurveyRatingValueSchema(5);
650
+ default: return exhaustiveGuard(column.cellType);
651
+ }
652
+ };
653
+ // src/services/runner/answer/createSurveyMatrixDynamicAnswerSchema.ts
654
+ const createSurveyMatrixDynamicAnswerSchema = (node) => {
655
+ const row = createSurveyNamedAnswerSchema(node.props.columns.map((column) => ({
656
+ isRequired: column.isRequired,
657
+ name: column.name,
658
+ schema: createSurveyMatrixCellAnswerSchema(column)
659
+ })));
660
+ return z.array(row, { error: SURVEY_INVALID_ANSWER_MESSAGE }).min(node.props.minRowCount, { error: SURVEY_WRONG_COUNT_MESSAGE }).max(node.props.maxRowCount, { error: SURVEY_WRONG_COUNT_MESSAGE });
661
+ };
662
+ // src/services/runner/answer/createSurveyMultipleTextAnswerSchema.ts
663
+ const createSurveyMultipleTextAnswerSchema = (node) => createSurveyNamedAnswerSchema(node.props.items.map((item) => ({
664
+ isRequired: item.isRequired,
665
+ name: item.name,
666
+ schema: item.inputType === "email" ? z.email({ error: SURVEY_INVALID_ANSWER_MESSAGE }) : createSurveyStringAnswerSchema({})
667
+ })));
668
+ // src/services/runner/checkIsSurveyAnsweringNode.ts
669
+ const NON_ANSWERING_NODE_TYPES = /* @__PURE__ */ new Set([
670
+ "html",
671
+ "image",
672
+ "page",
673
+ "panel"
674
+ ]);
675
+ const checkIsSurveyAnsweringNode = (node) => !NON_ANSWERING_NODE_TYPES.has(node.type);
676
+ // src/services/runner/checkSurveyExpressionHolds.ts
677
+ const checkSurveyExpressionHolds = (source, values, now, scopes = {}) => runSurveyExpression(source, {
678
+ now,
679
+ scopes,
680
+ values
681
+ }).map((value) => value === true).unwrapOr(false);
682
+ // src/services/runner/checkSurveyNodeEnabled.ts
683
+ const checkSurveyNodeEnabled = (node, values, now, scopes = {}) => {
684
+ if (node.type === "expression") return false;
685
+ if (node.type !== "page" && node.type !== "panel" && !checkIsSurveyAnsweringNode(node)) return false;
686
+ const enableIf = "enableIf" in node.props ? node.props.enableIf : "";
687
+ return enableIf === "" || checkSurveyExpressionHolds(enableIf, values, now, scopes);
688
+ };
689
+ // src/services/runner/checkSurveyNodeRequired.ts
690
+ const checkSurveyNodeRequired = (node, values, now, scopes = {}) => {
691
+ if ("isRequired" in node.props && node.props.isRequired) return true;
692
+ const requiredIf = "requiredIf" in node.props ? node.props.requiredIf : "";
693
+ return requiredIf !== "" && checkSurveyExpressionHolds(requiredIf, values, now, scopes);
694
+ };
695
+ // src/services/runner/checkSurveyNodeVisible.ts
696
+ const checkSurveyNodeVisible = (node, values, now, scopes = {}) => node.props.visibleIf === "" || checkSurveyExpressionHolds(node.props.visibleIf, values, now, scopes);
697
+ // src/services/runner/toSurveyPanelScope.ts
698
+ const toSurveyPanelScope = (row) => {
699
+ const scope = {};
700
+ for (const [name, answer] of Object.entries(row)) if (answer !== void 0) scope[name] = toSurveyLogicAnswer(answer);
701
+ return scope;
702
+ };
703
+ // src/services/runner/getSurveyPanelRowViews.ts
704
+ const getSurveyPanelRowViews = (node, row, values, now) => {
705
+ const scopes = { panel: toSurveyPanelScope(row) };
706
+ return node.props.template.flatMap((question) => checkSurveyNodeVisible(question, values, now, scopes) ? [{
707
+ isEnabled: checkSurveyNodeEnabled(question, values, now, scopes),
708
+ isRequired: checkSurveyNodeRequired(question, values, now, scopes),
709
+ node: question
710
+ }] : []);
711
+ };
712
+ // src/services/runner/createSurveyNestedAnswerSchema.ts
713
+ const createSurveyNestedAnswerSchema = (inner) => z.union([
714
+ surveyAnswerScalarSchema,
715
+ z.array(inner, { error: SURVEY_INVALID_ANSWER_MESSAGE }).max(200, { error: SURVEY_INVALID_ANSWER_MESSAGE }),
716
+ createRecordSchema(z.string().max(MAX_SURVEY_ANSWER_LENGTH), inner, 200)
717
+ ], { error: SURVEY_INVALID_ANSWER_MESSAGE });
718
+ const surveyAnswerValueSchema = createSurveyNestedAnswerSchema(createSurveyNestedAnswerSchema(createSurveyNestedAnswerSchema(surveyAnswerScalarSchema)));
719
+ // src/services/runner/answer/createSurveyPanelDynamicAnswerSchema.ts
720
+ const createSurveyPanelDynamicAnswerSchema = (node, createTemplateAnswerSchema, values, now) => {
721
+ const templateFields = node.props.template.map((question) => ({
722
+ name: question.props.name,
723
+ schema: createTemplateAnswerSchema(question)
724
+ }));
725
+ const rowShapeSchema = z.strictObject(Object.fromEntries(templateFields.map(({ name }) => [name, surveyAnswerValueSchema.optional()])), { error: SURVEY_INVALID_ANSWER_MESSAGE });
726
+ return z.array(rowShapeSchema, { error: SURVEY_INVALID_ANSWER_MESSAGE }).min(node.props.minPanelCount, { error: SURVEY_WRONG_COUNT_MESSAGE }).max(node.props.maxPanelCount, { error: SURVEY_WRONG_COUNT_MESSAGE }).superRefine((rows, ctx) => {
727
+ for (const [index, row] of rows.entries()) {
728
+ const views = getSurveyPanelRowViews(node, row, values, now);
729
+ const result = createSurveyNamedAnswerSchema(templateFields.map(({ name, schema }) => {
730
+ const view = views.find((item) => item.node.props.name === name);
731
+ return view?.isEnabled ? {
732
+ isRequired: view.isRequired,
733
+ name,
734
+ schema
735
+ } : {
736
+ isRequired: false,
737
+ name,
738
+ schema: z.unknown()
739
+ };
740
+ })).safeParse(row);
741
+ if (!result.success) for (const issue of result.error.issues) ctx.addIssue({
742
+ code: "custom",
743
+ message: issue.message,
744
+ path: [index, ...issue.path]
745
+ });
746
+ }
747
+ });
748
+ };
749
+ // src/services/runner/answer/createSurveyPatternAnswerSchema.ts
750
+ const createSurveyPatternAnswerSchema = (schema, pattern) => getResult(() => RE2JS.compile(pattern, RE2JS.LOOKBEHINDS)).map((regex) => schema.refine((value) => regex.matcher(value).find(), { error: SURVEY_INVALID_ANSWER_MESSAGE })).unwrapOr(schema);
751
+ // src/services/runner/answer/createSurveyRadioGroupAnswerSchema.ts
752
+ const createSurveyRadioGroupAnswerSchema = (node) => createSurveyChoiceValueSchema({
753
+ choices: node.props.choices,
754
+ hasNone: node.props.hasNone,
755
+ hasOther: node.props.hasOther
756
+ });
757
+ // src/services/runner/answer/createSurveyRankingAnswerSchema.ts
758
+ const createSurveyRankingAnswerSchema = (node) => createSurveySelectionAnswerSchema({ choices: node.props.choices });
759
+ // src/services/runner/answer/createSurveyRatingAnswerSchema.ts
760
+ const createSurveyRatingAnswerSchema = (node) => createSurveyRatingValueSchema(node.props.rateCount);
761
+ // src/services/runner/answer/createSurveySliderAnswerSchema.ts
762
+ const SURVEY_SLIDER_STEP_TOLERANCE = 1e-9;
763
+ const createSurveySliderAnswerSchema = (node) => createSurveyNumberAnswerSchema({
764
+ max: node.props.max,
765
+ min: node.props.min
766
+ }).refine((value) => {
767
+ const steps = (value - node.props.min) / node.props.step;
768
+ return Math.abs(steps - Math.round(steps)) < SURVEY_SLIDER_STEP_TOLERANCE;
769
+ }, { error: SURVEY_INVALID_ANSWER_MESSAGE });
770
+ // src/services/runner/answer/createSurveyStringRangeAnswerSchema.ts
771
+ const createSurveyStringRangeAnswerSchema = ({ max, min }) => createSurveyStringAnswerSchema({}).min(1, { error: SURVEY_REQUIRED_MESSAGE }).refine((value) => min === "" || value >= min, { error: SURVEY_OUT_OF_RANGE_MESSAGE }).refine((value) => max === "" || value <= max, { error: SURVEY_OUT_OF_RANGE_MESSAGE });
772
+ // src/services/runner/answer/createSurveyTagBoxAnswerSchema.ts
773
+ const createSurveyTagBoxAnswerSchema = (node) => createSurveySelectionAnswerSchema({
774
+ choices: node.props.choices,
775
+ hasOther: node.props.hasOther,
776
+ maxSelected: node.props.maxSelected
777
+ });
778
+ // src/services/runner/answer/parseSurveyNumberBound.ts
779
+ const parseSurveyNumberBound = (bound) => {
780
+ const value = Number(bound);
781
+ return normalizeString(bound) !== "" && Number.isFinite(value) ? value : void 0;
782
+ };
783
+ // src/services/runner/answer/createSurveyTextAnswerSchema.ts
784
+ const createSurveyTextAnswerSchema = (node) => {
785
+ switch (node.props.inputType) {
786
+ case "date":
787
+ case "datetime-local":
788
+ case "time": return createSurveyPatternAnswerSchema(createSurveyStringRangeAnswerSchema({
789
+ max: node.props.max,
790
+ min: node.props.min
791
+ }), node.props.pattern);
792
+ case "email": return createSurveyPatternAnswerSchema(z.email({ error: SURVEY_INVALID_ANSWER_MESSAGE }), node.props.pattern);
793
+ case "number": return createSurveyNumberAnswerSchema({
794
+ max: parseSurveyNumberBound(node.props.max),
795
+ min: parseSurveyNumberBound(node.props.min)
796
+ });
797
+ case "password":
798
+ case "tel":
799
+ case "text": return createSurveyPatternAnswerSchema(createSurveyStringAnswerSchema({
800
+ maxLength: node.props.maxLength,
801
+ minLength: node.props.minLength
802
+ }), node.props.pattern);
803
+ case "url": return createSurveyPatternAnswerSchema(z.url({ error: SURVEY_INVALID_ANSWER_MESSAGE }), node.props.pattern);
804
+ default: return exhaustiveGuard(node.props.inputType);
805
+ }
806
+ };
807
+ // src/services/runner/getSurveyExpressionNodes.ts
808
+ const getSurveyExpressionNodes = (document) => flattenSurveyQuestions(document.content).filter((node) => node.type === "expression");
809
+ // src/services/runner/getSurveyRunnerValues.ts
810
+ const MAX_SURVEY_RUNNER_PASSES = 5;
811
+ const getSurveyRunnerValues = (document, answers, now) => {
812
+ const values = toSurveyLogicAnswers(answers);
813
+ const calculations = [...document.root.props.calculatedValues, ...getSurveyExpressionNodes(document).map((node) => node.props)].filter(({ name }) => !Object.hasOwn(answers, name));
814
+ let changedNames = [];
815
+ for (let pass = 0; pass < MAX_SURVEY_RUNNER_PASSES; pass++) {
816
+ changedNames = [];
817
+ for (const { expression, name } of calculations) {
818
+ const previous = values[name];
819
+ const next = runSurveyExpression(expression, {
820
+ now,
821
+ scopes: {},
822
+ values
823
+ }).unwrapOr(void 0);
824
+ if (next === void 0) delete values[name];
825
+ else values[name] = next;
826
+ if (!checkIsDeepEqual(previous, values[name])) changedNames.push(name);
827
+ }
828
+ if (changedNames.length === 0) return values;
829
+ }
830
+ for (const name of changedNames) delete values[name];
831
+ return values;
832
+ };
833
+ // src/services/runner/getSurveyElementViews.ts
834
+ const getSurveyElementViews = (nodes, listPointer, values, now, isParentEnabled) => nodes.flatMap((node, index) => {
835
+ const pointer = `${listPointer}/${index}`;
836
+ if (!checkSurveyNodeVisible(node, values, now)) return [];
837
+ const isEnabled = isParentEnabled && checkSurveyNodeEnabled(node, values, now);
838
+ const children = node.type === "panel" ? getSurveyElementViews(node.props.children, getBlockPropPointer(pointer, "children"), values, now, isEnabled) : [];
839
+ if (node.type === "panel" && children.length === 0) return [];
840
+ return [{
841
+ children,
842
+ isEnabled,
843
+ isRequired: checkSurveyNodeRequired(node, values, now),
844
+ node,
845
+ pointer
846
+ }];
847
+ });
848
+ // src/services/runner/getSurveyPageViews.ts
849
+ const getSurveyPageViews = (document, pageIndex, values, now) => {
850
+ const page = document.content.at(pageIndex);
851
+ if (page?.type !== "page" || !checkSurveyNodeVisible(page, values, now)) return [];
852
+ return getSurveyElementViews(page.props.children, getBlockPropPointer(`/content/${pageIndex}`, "children"), values, now, true);
853
+ };
854
+ // src/services/runner/getSurveyVisiblePageIndexesFromValues.ts
855
+ const getSurveyVisiblePageIndexesFromValues = (document, values, now) => document.content.flatMap((_node, index) => getSurveyPageViews(document, index, values, now).length > 0 ? [index] : []);
856
+ // src/services/runner/getSurveyVisiblePageIndexes.ts
857
+ const getSurveyVisiblePageIndexes = (document, answers, now) => getSurveyVisiblePageIndexesFromValues(document, getSurveyRunnerValues(document, answers, now), now);
858
+ // src/services/runner/checkIsLastSurveyPage.ts
859
+ const checkIsLastSurveyPage = (document, state, now) => !getSurveyVisiblePageIndexes(document, state.answers, now).some((pageIndex) => pageIndex > state.pageIndex);
860
+ // src/services/runner/flattenSurveyElementViews.ts
861
+ const flattenSurveyElementViews = (views) => views.flatMap((view) => [view, ...flattenSurveyElementViews(view.children)]);
862
+ // src/services/runner/createSurveyAnswerSchema.ts
863
+ const createSurveyAnswerSchema = (node, values, now) => {
864
+ switch (node.type) {
865
+ case "boolean": return createSurveyBooleanAnswerSchema();
866
+ case "buttongroup": return createSurveyButtonGroupAnswerSchema(node);
867
+ case "checkbox": return createSurveyCheckboxAnswerSchema(node);
868
+ case "comment": return createSurveyCommentAnswerSchema(node);
869
+ case "dropdown": return createSurveyDropdownAnswerSchema(node);
870
+ case "expression": return createSurveyExpressionAnswerSchema();
871
+ case "html":
872
+ case "image": return z.undefined({ error: SURVEY_INVALID_ANSWER_MESSAGE });
873
+ case "imagepicker": return createSurveyImagePickerAnswerSchema(node);
874
+ case "matrix": return createSurveyMatrixAnswerSchema(node);
875
+ case "matrixdynamic": return createSurveyMatrixDynamicAnswerSchema(node);
876
+ case "multipletext": return createSurveyMultipleTextAnswerSchema(node);
877
+ case "paneldynamic": return createSurveyPanelDynamicAnswerSchema(node, (question) => createSurveyAnswerSchema(question, values, now), values, now);
878
+ case "radiogroup": return createSurveyRadioGroupAnswerSchema(node);
879
+ case "ranking": return createSurveyRankingAnswerSchema(node);
880
+ case "rating": return createSurveyRatingAnswerSchema(node);
881
+ case "slider": return createSurveySliderAnswerSchema(node);
882
+ case "tagbox": return createSurveyTagBoxAnswerSchema(node);
883
+ case "text": return createSurveyTextAnswerSchema(node);
884
+ default: return exhaustiveGuard(node);
885
+ }
886
+ };
887
+ // src/services/runner/getSurveyQuestionErrors.ts
888
+ const getSurveyQuestionErrors = (view, answers, values, now) => {
889
+ const { node, pointer } = view;
890
+ if (!view.isEnabled || !checkIsSurveyAnsweringNode(node)) return [];
891
+ const { name } = node.props;
892
+ const answer = answers[name];
893
+ if (answer === void 0 || checkSurveyAnswerEmpty(answer)) {
894
+ const holdsRequiredItem = node.type === "multipletext" && node.props.items.some((item) => item.isRequired);
895
+ if (!view.isRequired && !holdsRequiredItem) return [];
896
+ return [{
897
+ message: node.props.requiredErrorText === "" ? SURVEY_REQUIRED_MESSAGE : node.props.requiredErrorText,
898
+ name,
899
+ pointer
900
+ }];
901
+ }
902
+ const result = createSurveyAnswerSchema(node, values, now).safeParse(answer);
903
+ if (!result.success) return [{
904
+ message: result.error.issues[0]?.message ?? "This answer is not valid.",
905
+ name,
906
+ pointer
907
+ }];
908
+ const value = toSurveyLogicAnswer(answer);
909
+ return node.props.validators.filter((validator) => !checkSurveyExpressionHolds(validator.expression, {
910
+ ...values,
911
+ value
912
+ }, now)).map((validator) => ({
913
+ message: validator.text,
914
+ name,
915
+ pointer
916
+ }));
917
+ };
918
+ // src/services/runner/getSurveyPageErrors.ts
919
+ const getSurveyPageErrors = (document, pageIndex, answers, values, now) => flattenSurveyElementViews(getSurveyPageViews(document, pageIndex, values, now)).flatMap((view) => getSurveyQuestionErrors(view, answers, values, now));
920
+ // src/services/runner/getSurveyPanelRowAnswers.ts
921
+ const getSurveyPanelRowAnswers = (node, row, values, now) => {
922
+ const shownNames = new Set(getSurveyPanelRowViews(node, row, values, now).map((view) => view.node.props.name));
923
+ return Object.fromEntries(Object.entries(row).filter(([name]) => shownNames.has(name)));
924
+ };
925
+ // src/services/runner/toSurveyAnswerValue.ts
926
+ const toSurveyAnswerValue = (value) => {
927
+ if (value === void 0) return void 0;
928
+ if (typeof value !== "object") return value;
929
+ if (Array.isArray(value)) {
930
+ const items = [];
931
+ for (const item of value) {
932
+ const answerItem = toSurveyAnswerValue(item);
933
+ if (answerItem === void 0) return void 0;
934
+ items.push(answerItem);
935
+ }
936
+ return items;
937
+ }
938
+ const record = {};
939
+ for (const [name, field] of Object.entries(value)) {
940
+ const answerField = toSurveyAnswerValue(field);
941
+ if (answerField === void 0) return void 0;
942
+ record[name] = answerField;
943
+ }
944
+ return record;
945
+ };
946
+ // src/services/runner/completeSurvey.ts
947
+ const completeSurvey = (document, state, now) => {
948
+ const values = getSurveyRunnerValues(document, state.answers, now);
949
+ const pageIndexes = getSurveyVisiblePageIndexesFromValues(document, values, now);
950
+ for (const pageIndex of pageIndexes) {
951
+ const errors = getSurveyPageErrors(document, pageIndex, state.answers, values, now);
952
+ if (errors.length > 0) return {
953
+ answers: {},
954
+ errors,
955
+ state: {
956
+ ...state,
957
+ isCompleted: false,
958
+ pageIndex
959
+ }
960
+ };
961
+ }
962
+ const visibleViews = pageIndexes.flatMap((pageIndex) => flattenSurveyElementViews(getSurveyPageViews(document, pageIndex, values, now)));
963
+ const visibleNodes = visibleViews.map((view) => view.node);
964
+ const visibleNames = new Set(visibleNodes.flatMap((node) => node.type === "panel" ? [] : [node.props.name]));
965
+ const answers = Object.fromEntries(Object.entries(state.answers).filter(([name]) => visibleNames.has(name)));
966
+ for (const { node } of visibleViews) {
967
+ if (node.type !== "paneldynamic") continue;
968
+ const rows = answers[node.props.name];
969
+ if (Array.isArray(rows)) answers[node.props.name] = rows.map((row) => typeof row === "object" && !Array.isArray(row) ? getSurveyPanelRowAnswers(node, row, values, now) : row);
970
+ }
971
+ const includedNames = [...visibleNodes.flatMap((node) => node.type === "expression" ? [node.props.name] : []), ...document.root.props.calculatedValues.filter(({ includeIntoResult }) => includeIntoResult).map(({ name }) => name)];
972
+ const completedValues = getSurveyRunnerValues(document, answers, now);
973
+ const resultAnswers = { ...answers };
974
+ for (const name of includedNames) {
975
+ const answer = toSurveyAnswerValue(completedValues[name]);
976
+ if (answer !== void 0) resultAnswers[name] = answer;
977
+ }
978
+ return {
979
+ answers: resultAnswers,
980
+ errors: [],
981
+ state: {
982
+ ...state,
983
+ answers,
984
+ isCompleted: true
985
+ }
986
+ };
987
+ };
988
+ // src/services/runner/createSurveyRunnerState.ts
989
+ const createSurveyRunnerState = (document, answers, pageIndex) => {
990
+ const lastPageIndex = Math.max(document.content.length - 1, 0);
991
+ return {
992
+ answers,
993
+ isCompleted: false,
994
+ pageIndex: Math.min(Math.max(pageIndex, 0), lastPageIndex)
995
+ };
996
+ };
997
+ // src/services/runner/getSurveyPageElements.ts
998
+ const getSurveyPageElements = (document, state, now) => getSurveyPageViews(document, state.pageIndex, getSurveyRunnerValues(document, state.answers, now), now);
999
+ // src/services/runner/getSurveyProgress.ts
1000
+ const getSurveyProgress = (document, state, now) => {
1001
+ const pageIndexes = getSurveyVisiblePageIndexes(document, state.answers, now);
1002
+ return {
1003
+ current: pageIndexes.filter((pageIndex) => pageIndex <= state.pageIndex).length,
1004
+ total: pageIndexes.length
1005
+ };
1006
+ };
1007
+ // src/services/runner/validateSurveyPage.ts
1008
+ const validateSurveyPage = (document, state, now) => getSurveyPageErrors(document, state.pageIndex, state.answers, getSurveyRunnerValues(document, state.answers, now), now);
1009
+ // src/services/runner/goToNextSurveyPage.ts
1010
+ const goToNextSurveyPage = (document, state, now) => {
1011
+ const errors = validateSurveyPage(document, state, now);
1012
+ if (errors.length > 0) return {
1013
+ errors,
1014
+ state
1015
+ };
1016
+ const nextPageIndex = getSurveyVisiblePageIndexes(document, state.answers, now).find((pageIndex) => pageIndex > state.pageIndex);
1017
+ return {
1018
+ errors,
1019
+ state: nextPageIndex === void 0 ? state : {
1020
+ ...state,
1021
+ pageIndex: nextPageIndex
1022
+ }
1023
+ };
1024
+ };
1025
+ // src/services/runner/goToPreviousSurveyPage.ts
1026
+ const goToPreviousSurveyPage = (document, state, now) => {
1027
+ const previousPageIndex = getSurveyVisiblePageIndexes(document, state.answers, now).findLast((pageIndex) => pageIndex < state.pageIndex);
1028
+ return previousPageIndex === void 0 ? state : {
1029
+ ...state,
1030
+ pageIndex: previousPageIndex
1031
+ };
1032
+ };
1033
+ // src/services/runner/setSurveyAnswer.ts
1034
+ const setSurveyAnswer = (state, name, value) => {
1035
+ const answers = Object.fromEntries(Object.entries(state.answers).filter(([answerName]) => answerName !== name));
1036
+ if (value === void 0 || checkSurveyAnswerEmpty(value)) return {
1037
+ ...state,
1038
+ answers
1039
+ };
1040
+ return {
1041
+ ...state,
1042
+ answers: {
1043
+ ...answers,
1044
+ [name]: value
1045
+ }
1046
+ };
1047
+ };
1048
+ // src/services/runner/validateSurveyAnswers.ts
1049
+ const validateSurveyAnswers = (document, answers, mode, now) => {
1050
+ const isSubmit = mode === "submit";
1051
+ const values = getSurveyRunnerValues(document, answers, now);
1052
+ const views = flattenSurveyElementViews(document.content.flatMap((_node, pageIndex) => getSurveyPageViews(document, pageIndex, values, now)));
1053
+ const questionNames = new Set(flattenSurveyQuestions(document.content).filter((node) => checkIsSurveyAnsweringNode(node)).map((node) => node.props.name));
1054
+ const shownNames = new Set(views.flatMap(({ node }) => node.type === "panel" ? [] : [node.props.name]));
1055
+ const calculatedNames = new Set(isSubmit ? document.root.props.calculatedValues.filter(({ includeIntoResult }) => includeIntoResult).map(({ name }) => name) : []);
1056
+ const issues = [];
1057
+ for (const name of Object.keys(answers)) {
1058
+ if (calculatedNames.has(name)) continue;
1059
+ if (!questionNames.has(name)) issues.push({
1060
+ message: SURVEY_UNKNOWN_QUESTION_MESSAGE,
1061
+ name
1062
+ });
1063
+ else if (isSubmit && !shownNames.has(name)) issues.push({
1064
+ message: SURVEY_NOT_SHOWN_MESSAGE,
1065
+ name
1066
+ });
1067
+ }
1068
+ for (const { node } of views) {
1069
+ if (!isSubmit || node.type !== "paneldynamic") continue;
1070
+ const rows = answers[node.props.name];
1071
+ if (!Array.isArray(rows)) continue;
1072
+ for (const row of rows) {
1073
+ if (typeof row !== "object" || Array.isArray(row)) continue;
1074
+ const shownRow = getSurveyPanelRowAnswers(node, row, values, now);
1075
+ if (Object.keys(shownRow).length < Object.keys(row).length) issues.push({
1076
+ message: SURVEY_NOT_SHOWN_MESSAGE,
1077
+ name: node.props.name
1078
+ });
1079
+ }
1080
+ }
1081
+ for (const view of views) {
1082
+ if (view.node.type === "panel") continue;
1083
+ if (!isSubmit && checkSurveyAnswerEmpty(answers[view.node.props.name])) continue;
1084
+ issues.push(...getSurveyQuestionErrors(view, answers, values, now).map(({ message, name }) => ({
1085
+ message,
1086
+ name
1087
+ })));
1088
+ }
1089
+ return issues;
1090
+ };
1091
+ // src/services/surveyBooleanNodeType.ts
1092
+ const surveyBooleanNodeType = {
1093
+ createDefaultProps: () => surveyBooleanNodePropsSchema.parse({ name: "question" }),
1094
+ formSchema: surveyBooleanNodePropsSchema,
1095
+ label: "Yes or no",
1096
+ propsSchema: surveyBooleanNodePropsSchema,
1097
+ slots: {},
1098
+ type: "boolean"
1099
+ };
1100
+ // src/services/surveyButtonGroupNodeType.ts
1101
+ const surveyButtonGroupNodeType = {
1102
+ createDefaultProps: () => surveyButtonGroupNodePropsSchema.parse({ name: "question" }),
1103
+ formSchema: surveyButtonGroupNodePropsSchema,
1104
+ label: "Button group",
1105
+ propsSchema: surveyButtonGroupNodePropsSchema,
1106
+ slots: {},
1107
+ type: "buttongroup"
1108
+ };
1109
+ // src/services/surveyCheckboxNodeType.ts
1110
+ const surveyCheckboxNodeType = {
1111
+ createDefaultProps: () => surveyCheckboxNodePropsSchema.parse({ name: "question" }),
1112
+ formSchema: surveyCheckboxNodePropsSchema,
1113
+ label: "Checkboxes",
1114
+ propsSchema: surveyCheckboxNodePropsSchema,
1115
+ slots: {},
1116
+ type: "checkbox"
1117
+ };
1118
+ // src/services/surveyCommentNodeType.ts
1119
+ const surveyCommentNodeType = {
1120
+ createDefaultProps: () => surveyCommentNodePropsSchema.parse({ name: "question" }),
1121
+ formSchema: surveyCommentNodePropsSchema,
1122
+ label: "Comment",
1123
+ propsSchema: surveyCommentNodePropsSchema,
1124
+ slots: {},
1125
+ type: "comment"
1126
+ };
1127
+ // src/services/surveyNodeChildren.ts
1128
+ const surveyNodeChildren = (node) => {
1129
+ switch (node.type) {
1130
+ case "boolean":
1131
+ case "buttongroup":
1132
+ case "checkbox":
1133
+ case "comment":
1134
+ case "dropdown":
1135
+ case "expression":
1136
+ case "html":
1137
+ case "image":
1138
+ case "imagepicker":
1139
+ case "matrix":
1140
+ case "matrixdynamic":
1141
+ case "multipletext":
1142
+ case "radiogroup":
1143
+ case "ranking":
1144
+ case "rating":
1145
+ case "slider":
1146
+ case "tagbox":
1147
+ case "text": return NO_BLOCK_SLOTS;
1148
+ case "page":
1149
+ case "panel": return { children: node.props.children };
1150
+ case "paneldynamic": return { template: node.props.template };
1151
+ default: return exhaustiveGuard(node);
1152
+ }
1153
+ };
1154
+ // src/services/surveyDropdownNodeType.ts
1155
+ const surveyDropdownNodeType = {
1156
+ createDefaultProps: () => surveyDropdownNodePropsSchema.parse({ name: "question" }),
1157
+ formSchema: surveyDropdownNodePropsSchema,
1158
+ label: "Dropdown",
1159
+ propsSchema: surveyDropdownNodePropsSchema,
1160
+ slots: {},
1161
+ type: "dropdown"
1162
+ };
1163
+ // src/services/surveyExpressionNodeType.ts
1164
+ const surveyExpressionNodeType = {
1165
+ createDefaultProps: () => surveyExpressionNodePropsSchema.parse({ name: "question" }),
1166
+ formSchema: surveyExpressionNodePropsSchema,
1167
+ label: "Calculated value",
1168
+ propsSchema: surveyExpressionNodePropsSchema,
1169
+ slots: {},
1170
+ type: "expression"
1171
+ };
1172
+ // src/services/surveyHtmlNodeType.ts
1173
+ const surveyHtmlNodeType = {
1174
+ createDefaultProps: () => surveyHtmlNodePropsSchema.parse({ name: "block" }),
1175
+ formSchema: surveyHtmlNodePropsSchema,
1176
+ label: "Text block",
1177
+ propsSchema: surveyHtmlNodePropsSchema,
1178
+ slots: {},
1179
+ type: "html"
1180
+ };
1181
+ const surveyIdSchema = z.string().max(64).regex(/^[\w-]+$/u);
1182
+ // src/services/surveyImageNodeType.ts
1183
+ const surveyImageNodeType = {
1184
+ createDefaultProps: () => surveyImageNodePropsSchema.parse({ name: "image" }),
1185
+ formSchema: surveyImageNodePropsSchema,
1186
+ label: "Image",
1187
+ propsSchema: surveyImageNodePropsSchema,
1188
+ slots: {},
1189
+ type: "image"
1190
+ };
1191
+ // src/services/surveyImagePickerNodeType.ts
1192
+ const surveyImagePickerNodeType = {
1193
+ createDefaultProps: () => surveyImagePickerNodePropsSchema.parse({ name: "question" }),
1194
+ formSchema: surveyImagePickerNodePropsSchema,
1195
+ label: "Image picker",
1196
+ propsSchema: surveyImagePickerNodePropsSchema,
1197
+ slots: {},
1198
+ type: "imagepicker"
1199
+ };
1200
+ // src/services/surveyMatrixDynamicNodeType.ts
1201
+ const surveyMatrixDynamicNodeType = {
1202
+ createDefaultProps: () => surveyMatrixDynamicNodePropsSchema.parse({ name: "question" }),
1203
+ formSchema: surveyMatrixDynamicNodePropsSchema,
1204
+ label: "Dynamic matrix",
1205
+ propsSchema: surveyMatrixDynamicNodePropsSchema,
1206
+ slots: {},
1207
+ type: "matrixdynamic"
1208
+ };
1209
+ // src/services/surveyMatrixNodeType.ts
1210
+ const surveyMatrixNodeType = {
1211
+ createDefaultProps: () => surveyMatrixNodePropsSchema.parse({ name: "question" }),
1212
+ formSchema: surveyMatrixNodePropsSchema,
1213
+ label: "Matrix",
1214
+ propsSchema: surveyMatrixNodePropsSchema,
1215
+ slots: {},
1216
+ type: "matrix"
1217
+ };
1218
+ // src/services/surveyMultipleTextNodeType.ts
1219
+ const surveyMultipleTextNodeType = {
1220
+ createDefaultProps: () => surveyMultipleTextNodePropsSchema.parse({ name: "question" }),
1221
+ formSchema: surveyMultipleTextNodePropsSchema,
1222
+ label: "Multiple text",
1223
+ propsSchema: surveyMultipleTextNodePropsSchema,
1224
+ slots: {},
1225
+ type: "multipletext"
1226
+ };
1227
+ // src/services/surveyPanelDynamicNodeType.ts
1228
+ const surveyPanelDynamicNodeType = {
1229
+ createDefaultProps: () => surveyPanelDynamicNodePropsSchema.parse({ name: "question" }),
1230
+ formSchema: surveyPanelDynamicNodePropsSchema,
1231
+ label: "Dynamic panel",
1232
+ propsSchema: surveyPanelDynamicNodePropsSchema,
1233
+ slots: { template: SURVEY_TEMPLATE_NODE_TYPES },
1234
+ type: "paneldynamic"
1235
+ };
1236
+ // src/services/surveyPanelNodeType.ts
1237
+ const surveyPanelNodeType = {
1238
+ createDefaultProps: () => surveyPanelNodePropsSchema.parse({}),
1239
+ formSchema: surveyPanelNodePropsSchema,
1240
+ label: "Panel",
1241
+ propsSchema: surveyPanelNodePropsSchema,
1242
+ slots: { children: SURVEY_PLACEABLE_NODE_TYPES },
1243
+ type: "panel"
1244
+ };
1245
+ // src/services/surveyRadioGroupNodeType.ts
1246
+ const surveyRadioGroupNodeType = {
1247
+ createDefaultProps: () => surveyRadioGroupNodePropsSchema.parse({ name: "question" }),
1248
+ formSchema: surveyRadioGroupNodePropsSchema,
1249
+ label: "Radio group",
1250
+ propsSchema: surveyRadioGroupNodePropsSchema,
1251
+ slots: {},
1252
+ type: "radiogroup"
1253
+ };
1254
+ // src/services/surveyRankingNodeType.ts
1255
+ const surveyRankingNodeType = {
1256
+ createDefaultProps: () => surveyRankingNodePropsSchema.parse({ name: "question" }),
1257
+ formSchema: surveyRankingNodePropsSchema,
1258
+ label: "Ranking",
1259
+ propsSchema: surveyRankingNodePropsSchema,
1260
+ slots: {},
1261
+ type: "ranking"
1262
+ };
1263
+ // src/services/surveyRatingNodeType.ts
1264
+ const surveyRatingNodeType = {
1265
+ createDefaultProps: () => surveyRatingNodePropsSchema.parse({ name: "question" }),
1266
+ formSchema: surveyRatingNodePropsSchema,
1267
+ label: "Rating",
1268
+ propsSchema: surveyRatingNodePropsSchema,
1269
+ slots: {},
1270
+ type: "rating"
1271
+ };
1272
+ // src/services/surveySliderNodeType.ts
1273
+ const surveySliderNodeType = {
1274
+ createDefaultProps: () => surveySliderNodePropsSchema.parse({ name: "question" }),
1275
+ formSchema: surveySliderNodePropsSchema,
1276
+ label: "Slider",
1277
+ propsSchema: surveySliderNodePropsSchema,
1278
+ slots: {},
1279
+ type: "slider"
1280
+ };
1281
+ // src/services/surveyTagBoxNodeType.ts
1282
+ const surveyTagBoxNodeType = {
1283
+ createDefaultProps: () => surveyTagBoxNodePropsSchema.parse({ name: "question" }),
1284
+ formSchema: surveyTagBoxNodePropsSchema,
1285
+ label: "Tag box",
1286
+ propsSchema: surveyTagBoxNodePropsSchema,
1287
+ slots: {},
1288
+ type: "tagbox"
1289
+ };
1290
+ // src/services/surveyTextNodeType.ts
1291
+ const surveyTextNodeType = {
1292
+ createDefaultProps: () => surveyTextNodePropsSchema.parse({ name: "question" }),
1293
+ formSchema: surveyTextNodePropsSchema,
1294
+ label: "Text",
1295
+ propsSchema: surveyTextNodePropsSchema,
1296
+ slots: {},
1297
+ type: "text"
1298
+ };
1299
+ // src/services/surveyNodeSchema.ts
1300
+ const placeableNodeSchema = z.lazy(() => surveyPlaceableNodeSchema);
1301
+ const templateNodeSchema = z.lazy(() => surveyTemplateNodeSchema);
1302
+ const surveyBooleanNodeSchemaValue = z.object({
1303
+ props: z.strictObject({
1304
+ ...surveyBooleanNodeType.propsSchema.shape,
1305
+ id: surveyIdSchema
1306
+ }),
1307
+ type: z.literal("boolean")
1308
+ });
1309
+ const surveyButtonGroupNodeSchemaValue = z.object({
1310
+ props: z.strictObject({
1311
+ ...surveyButtonGroupNodeType.propsSchema.shape,
1312
+ id: surveyIdSchema
1313
+ }),
1314
+ type: z.literal("buttongroup")
1315
+ });
1316
+ const surveyCheckboxNodeSchemaValue = z.object({
1317
+ props: z.strictObject({
1318
+ ...surveyCheckboxNodeType.propsSchema.shape,
1319
+ id: surveyIdSchema
1320
+ }),
1321
+ type: z.literal("checkbox")
1322
+ });
1323
+ const surveyCommentNodeSchemaValue = z.object({
1324
+ props: z.strictObject({
1325
+ ...surveyCommentNodeType.propsSchema.shape,
1326
+ id: surveyIdSchema
1327
+ }),
1328
+ type: z.literal("comment")
1329
+ });
1330
+ const surveyDropdownNodeSchemaValue = z.object({
1331
+ props: z.strictObject({
1332
+ ...surveyDropdownNodeType.propsSchema.shape,
1333
+ id: surveyIdSchema
1334
+ }),
1335
+ type: z.literal("dropdown")
1336
+ });
1337
+ const surveyExpressionNodeSchemaValue = z.object({
1338
+ props: z.strictObject({
1339
+ ...surveyExpressionNodeType.propsSchema.shape,
1340
+ id: surveyIdSchema
1341
+ }),
1342
+ type: z.literal("expression")
1343
+ });
1344
+ const surveyHtmlNodeSchemaValue = z.object({
1345
+ props: z.strictObject({
1346
+ ...surveyHtmlNodeType.propsSchema.shape,
1347
+ id: surveyIdSchema
1348
+ }),
1349
+ type: z.literal("html")
1350
+ });
1351
+ const surveyImageNodeSchemaValue = z.object({
1352
+ props: z.strictObject({
1353
+ ...surveyImageNodeType.propsSchema.shape,
1354
+ id: surveyIdSchema
1355
+ }),
1356
+ type: z.literal("image")
1357
+ });
1358
+ const surveyImagePickerNodeSchemaValue = z.object({
1359
+ props: z.strictObject({
1360
+ ...surveyImagePickerNodeType.propsSchema.shape,
1361
+ id: surveyIdSchema
1362
+ }),
1363
+ type: z.literal("imagepicker")
1364
+ });
1365
+ const surveyMatrixNodeSchemaValue = z.object({
1366
+ props: z.strictObject({
1367
+ ...surveyMatrixNodeType.propsSchema.shape,
1368
+ id: surveyIdSchema
1369
+ }),
1370
+ type: z.literal("matrix")
1371
+ });
1372
+ const surveyMatrixDynamicNodeSchemaValue = z.object({
1373
+ props: z.strictObject({
1374
+ ...surveyMatrixDynamicNodeType.propsSchema.shape,
1375
+ id: surveyIdSchema
1376
+ }),
1377
+ type: z.literal("matrixdynamic")
1378
+ });
1379
+ const surveyMultipleTextNodeSchemaValue = z.object({
1380
+ props: z.strictObject({
1381
+ ...surveyMultipleTextNodeType.propsSchema.shape,
1382
+ id: surveyIdSchema
1383
+ }),
1384
+ type: z.literal("multipletext")
1385
+ });
1386
+ const surveyPageNodeSchemaValue = z.object({
1387
+ props: z.strictObject({
1388
+ ...surveyPageNodeType.propsSchema.shape,
1389
+ children: boundedChildren(placeableNodeSchema),
1390
+ id: surveyIdSchema
1391
+ }),
1392
+ type: z.literal("page")
1393
+ });
1394
+ const surveyPanelNodeSchemaValue = z.object({
1395
+ props: z.strictObject({
1396
+ ...surveyPanelNodeType.propsSchema.shape,
1397
+ children: boundedChildren(placeableNodeSchema),
1398
+ id: surveyIdSchema
1399
+ }),
1400
+ type: z.literal("panel")
1401
+ });
1402
+ const surveyPanelDynamicNodeSchemaValue = z.object({
1403
+ props: z.strictObject({
1404
+ ...surveyPanelDynamicNodeType.propsSchema.shape,
1405
+ id: surveyIdSchema,
1406
+ template: boundedChildren(templateNodeSchema)
1407
+ }),
1408
+ type: z.literal("paneldynamic")
1409
+ });
1410
+ const surveyRadioGroupNodeSchemaValue = z.object({
1411
+ props: z.strictObject({
1412
+ ...surveyRadioGroupNodeType.propsSchema.shape,
1413
+ id: surveyIdSchema
1414
+ }),
1415
+ type: z.literal("radiogroup")
1416
+ });
1417
+ const surveyRankingNodeSchemaValue = z.object({
1418
+ props: z.strictObject({
1419
+ ...surveyRankingNodeType.propsSchema.shape,
1420
+ id: surveyIdSchema
1421
+ }),
1422
+ type: z.literal("ranking")
1423
+ });
1424
+ const surveyRatingNodeSchemaValue = z.object({
1425
+ props: z.strictObject({
1426
+ ...surveyRatingNodeType.propsSchema.shape,
1427
+ id: surveyIdSchema
1428
+ }),
1429
+ type: z.literal("rating")
1430
+ });
1431
+ const surveySliderNodeSchemaValue = z.object({
1432
+ props: z.strictObject({
1433
+ ...surveySliderNodeType.propsSchema.shape,
1434
+ id: surveyIdSchema
1435
+ }),
1436
+ type: z.literal("slider")
1437
+ });
1438
+ const surveyTagBoxNodeSchemaValue = z.object({
1439
+ props: z.strictObject({
1440
+ ...surveyTagBoxNodeType.propsSchema.shape,
1441
+ id: surveyIdSchema
1442
+ }),
1443
+ type: z.literal("tagbox")
1444
+ });
1445
+ const surveyTemplateNodeOptions = [
1446
+ z.object({
1447
+ props: z.strictObject({
1448
+ ...surveyTextNodeType.propsSchema.shape,
1449
+ id: surveyIdSchema
1450
+ }),
1451
+ type: z.literal("text")
1452
+ }),
1453
+ surveyCommentNodeSchemaValue,
1454
+ surveyBooleanNodeSchemaValue,
1455
+ surveyRadioGroupNodeSchemaValue,
1456
+ surveyDropdownNodeSchemaValue,
1457
+ surveyCheckboxNodeSchemaValue,
1458
+ surveyTagBoxNodeSchemaValue,
1459
+ surveyRatingNodeSchemaValue,
1460
+ surveyRankingNodeSchemaValue,
1461
+ surveyMatrixNodeSchemaValue,
1462
+ surveyMatrixDynamicNodeSchemaValue,
1463
+ surveyMultipleTextNodeSchemaValue,
1464
+ surveySliderNodeSchemaValue,
1465
+ surveyButtonGroupNodeSchemaValue,
1466
+ surveyImagePickerNodeSchemaValue,
1467
+ surveyExpressionNodeSchemaValue,
1468
+ surveyHtmlNodeSchemaValue,
1469
+ surveyImageNodeSchemaValue
1470
+ ];
1471
+ const surveyTemplateNodeSchema = z.discriminatedUnion("type", surveyTemplateNodeOptions, createAcceptedTypesError(SURVEY_TEMPLATE_NODE_TYPES));
1472
+ const surveyPlaceableNodeOptions = [
1473
+ ...surveyTemplateNodeOptions,
1474
+ surveyPanelDynamicNodeSchemaValue,
1475
+ surveyPanelNodeSchemaValue
1476
+ ];
1477
+ const surveyPlaceableNodeSchema = z.discriminatedUnion("type", surveyPlaceableNodeOptions, createAcceptedTypesError(SURVEY_PLACEABLE_NODE_TYPES));
1478
+ const surveyPageNodeSchema = surveyPageNodeSchemaValue;
1479
+ const surveyNodeSchema = z.discriminatedUnion("type", [...surveyPlaceableNodeOptions, surveyPageNodeSchemaValue], createAcceptedTypesError([...SURVEY_ROOT_NODE_TYPES, ...SURVEY_PLACEABLE_NODE_TYPES]));
1480
+ // src/services/surveyNodeTypeDefinitionMap.ts
1481
+ const surveyNodeTypeDefinitionMap = {
1482
+ ["boolean"]: surveyBooleanNodeType,
1483
+ ["buttongroup"]: surveyButtonGroupNodeType,
1484
+ ["checkbox"]: surveyCheckboxNodeType,
1485
+ ["comment"]: surveyCommentNodeType,
1486
+ ["dropdown"]: surveyDropdownNodeType,
1487
+ ["expression"]: surveyExpressionNodeType,
1488
+ ["html"]: surveyHtmlNodeType,
1489
+ ["image"]: surveyImageNodeType,
1490
+ ["imagepicker"]: surveyImagePickerNodeType,
1491
+ ["matrix"]: surveyMatrixNodeType,
1492
+ ["matrixdynamic"]: surveyMatrixDynamicNodeType,
1493
+ ["multipletext"]: surveyMultipleTextNodeType,
1494
+ ["page"]: surveyPageNodeType,
1495
+ ["panel"]: surveyPanelNodeType,
1496
+ ["paneldynamic"]: surveyPanelDynamicNodeType,
1497
+ ["radiogroup"]: surveyRadioGroupNodeType,
1498
+ ["ranking"]: surveyRankingNodeType,
1499
+ ["rating"]: surveyRatingNodeType,
1500
+ ["slider"]: surveySliderNodeType,
1501
+ ["tagbox"]: surveyTagBoxNodeType,
1502
+ ["text"]: surveyTextNodeType
1503
+ };
1504
+ // src/services/surveyRegistry.ts
1505
+ const surveyRegistry = {
1506
+ root: {
1507
+ content: SURVEY_ROOT_NODE_TYPES,
1508
+ propsSchema: surveyRootPropsSchema
1509
+ },
1510
+ types: Object.values(surveyNodeTypeDefinitionMap)
1511
+ };
1512
+ // src/services/surveyDocumentSchema.ts
1513
+ const surveyDocumentSchema = createBlockDocumentSchema(surveyPageNodeSchema, surveyRegistry, surveyNodeChildren, MAX_SURVEY_NODE_COUNT);
1514
+ export { MATRIX_CELL_RATING_COUNT, MAX_SURVEY_ANSWER_ENTRY_COUNT, MAX_SURVEY_ANSWER_LENGTH, MAX_SURVEY_CALCULATED_VALUE_COUNT, MAX_SURVEY_CHOICE_COUNT, MAX_SURVEY_COMMENT_ROW_COUNT, MAX_SURVEY_HTML_LENGTH, MAX_SURVEY_ID_LENGTH, MAX_SURVEY_IMAGE_SIZE, MAX_SURVEY_MATRIX_COLUMN_COUNT, MAX_SURVEY_MATRIX_ROW_COUNT, MAX_SURVEY_MULTIPLE_TEXT_ITEM_COUNT, MAX_SURVEY_NODE_COUNT, MAX_SURVEY_PANEL_COUNT, MAX_SURVEY_PATTERN_LENGTH, MAX_SURVEY_QUESTION_COUNT, MAX_SURVEY_QUESTION_NAME_LENGTH, MAX_SURVEY_TEXT_LENGTH, MAX_SURVEY_URL_LENGTH, MAX_SURVEY_VALIDATOR_COUNT, SURVEY_INVALID_ANSWER_MESSAGE, SURVEY_NONE_ANSWER, SURVEY_NOT_A_CHOICE_MESSAGE, SURVEY_NOT_SHOWN_MESSAGE, SURVEY_OUT_OF_RANGE_MESSAGE, SURVEY_PLACEABLE_NODE_TYPES, SURVEY_REQUIRED_MESSAGE, SURVEY_ROOT_NODE_TYPES, SURVEY_TEMPLATE_NODE_TYPES, SURVEY_TOO_FEW_SELECTED_MESSAGE, SURVEY_TOO_LONG_MESSAGE, SURVEY_TOO_MANY_SELECTED_MESSAGE, SURVEY_TOO_SHORT_MESSAGE, SURVEY_UNKNOWN_QUESTION_MESSAGE, SURVEY_WRONG_COUNT_MESSAGE, SurveyAnswerValidationMode, SurveyBooleanDisplayStyle, SurveyChoicesOrder, SurveyExpressionDisplayFormat, SurveyImageFit, SurveyMatrixCellType, SurveyMultipleTextItemInputType, SurveyNodeType, SurveyProgressBarPlacement, SurveyRatingType, SurveyTextInputType, boundedChildren, checkIsLastSurveyPage, checkIsSurveyAnsweringNode, checkSurveyAnswerEmpty, checkSurveyCalculatedValues, checkSurveyDocument, checkSurveyExpressionField, checkSurveyExpressionHolds, checkSurveyMinimumWithinMaximum, checkSurveyNodeEnabled, checkSurveyNodeRequired, checkSurveyNodeVisible, checkSurveyNodes, checkSurveyNoneChoice, checkSurveyOptionalExpression, checkSurveyQuestion, completeSurvey, createSeededRandom, createSurveyAnswerSchema, createSurveyBooleanAnswerSchema, createSurveyButtonGroupAnswerSchema, createSurveyCheckboxAnswerSchema, createSurveyChoiceValueSchema, createSurveyCommentAnswerSchema, createSurveyDocument, createSurveyDropdownAnswerSchema, createSurveyExpressionAnswerSchema, createSurveyImagePickerAnswerSchema, createSurveyMatrixAnswerSchema, createSurveyMatrixCellAnswerSchema, createSurveyMatrixDynamicAnswerSchema, createSurveyMultipleTextAnswerSchema, createSurveyNamedAnswerSchema, createSurveyNestedAnswerSchema, createSurveyNumberAnswerSchema, createSurveyPanelDynamicAnswerSchema, createSurveyPatternAnswerSchema, createSurveyRadioGroupAnswerSchema, createSurveyRankingAnswerSchema, createSurveyRatingAnswerSchema, createSurveyRatingValueSchema, createSurveyRunnerState, createSurveySelectionAnswerSchema, createSurveySliderAnswerSchema, createSurveyStringAnswerSchema, createSurveyStringRangeAnswerSchema, createSurveyTagBoxAnswerSchema, createSurveyTextAnswerSchema, flattenSurveyElementViews, flattenSurveyQuestions, getSurveyChoiceText, getSurveyElementViews, getSurveyExpressionNodes, getSurveyOrderedChoices, getSurveyPageElements, getSurveyPageErrors, getSurveyPageViews, getSurveyPanelRowAnswers, getSurveyPanelRowViews, getSurveyProgress, getSurveyQuestionErrors, getSurveyRunnerValues, getSurveyVisiblePageIndexes, getSurveyVisiblePageIndexesFromValues, goToNextSurveyPage, goToPreviousSurveyPage, hashSurveySeed, parseSurveyNumberBound, setSurveyAnswer, surveyAnswerScalarSchema, surveyAnswerValueSchema, surveyBooleanNodePropsSchema, surveyBooleanNodeType, surveyButtonGroupNodePropsSchema, surveyButtonGroupNodeType, surveyCalculatedValueSchema, surveyCheckboxNodePropsSchema, surveyCheckboxNodeType, surveyChoiceOptionsPropsShape, surveyChoiceSchema, surveyChoicesPropsShape, surveyCommentNodePropsSchema, surveyCommentNodeType, surveyConditionSchema, surveyContainerBasePropsShape, surveyDocumentSchema, surveyDropdownNodePropsSchema, surveyDropdownNodeType, surveyExpressionNodePropsSchema, surveyExpressionNodeType, surveyExpressionSchema, surveyHtmlNodePropsSchema, surveyHtmlNodeType, surveyIdSchema, surveyImageBoxPropsShape, surveyImageChoiceSchema, surveyImageNodePropsSchema, surveyImageNodeType, surveyImagePickerNodePropsSchema, surveyImagePickerNodeType, surveyMatrixColumnSchema, surveyMatrixDynamicNodePropsSchema, surveyMatrixDynamicNodeType, surveyMatrixNodePropsSchema, surveyMatrixNodeType, surveyMultipleTextItemSchema, surveyMultipleTextNodePropsSchema, surveyMultipleTextNodeType, surveyNameSchema, surveyNodeChildren, surveyNodeSchema, surveyNodeTypeDefinitionMap, surveyNoneChoicePropsShape, surveyPageNodePropsSchema, surveyPageNodeSchema, surveyPageNodeType, surveyPanelDynamicNodePropsSchema, surveyPanelDynamicNodeType, surveyPanelNodePropsSchema, surveyPanelNodeType, surveyPlaceableNodeSchema, surveyQuestionBasePropsShape, surveyRadioGroupNodePropsSchema, surveyRadioGroupNodeType, surveyRankingNodePropsSchema, surveyRankingNodeType, surveyRatingNodePropsSchema, surveyRatingNodeType, surveyRegistry, surveyRootPropsSchema, surveySliderNodePropsSchema, surveySliderNodeType, surveyTagBoxNodePropsSchema, surveyTagBoxNodeType, surveyTextNodePropsSchema, surveyTextNodeType, surveyValidatorSchema, toSurveyAnswerValue, toSurveyPanelScope, validateSurveyAnswers, validateSurveyPage };