@case-framework/survey-core 0.1.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/build/editor.d.mts +245 -0
- package/build/editor.d.mts.map +1 -0
- package/build/editor.mjs +603 -0
- package/build/editor.mjs.map +1 -0
- package/build/index.d.mts +597 -0
- package/build/index.d.mts.map +1 -0
- package/build/index.mjs +1586 -0
- package/build/index.mjs.map +1 -0
- package/build/package.json/package.json +49 -0
- package/build/survey-C3ZHI-5z.mjs +931 -0
- package/build/survey-C3ZHI-5z.mjs.map +1 -0
- package/build/survey-TUPUXiXl.d.mts +614 -0
- package/build/survey-TUPUXiXl.d.mts.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/to_mirgrate/data_types/legacy-types.ts","../src/survey/responses/item-response.ts","../src/survey/responses/response-meta.ts","../src/survey/responses/survey-response.ts","../src/survey/responses/value-types.ts","../src/survey/responses/utils.ts","../src/expressions/expression-evaluator.ts","../src/expressions/editors/expression-editor.ts","../src/expressions/editors/expression-editor-generators.ts","../src/survey/utils/content.ts","../src/engine/engine.ts"],"sourcesContent":["import { Expression } from \"./expression\";\nimport { ExpressionArg } from \"./expression\";\n\n// ----------------------------------------------------------------------\nexport type LegacyItemComponent = LegacyItemComponentBase | LegacyItemGroupComponent | LegacyResponseComponent;\n\ninterface LegacyItemComponentBase {\n role: string; // purpose of the component\n key?: string; // unique identifier\n content?: Array<LegacyLocalizedObject>; // array with item that are a sub-type of LocalizedObject\n displayCondition?: Expression | boolean;\n disabled?: Expression | boolean;\n style?: Array<{ key: string, value: string }>;\n description?: Array<LegacyLocalizedObject>; // optional explanation to the content\n properties?: LegacyComponentProperties;\n}\n\nexport interface LegacyResponseComponent extends LegacyItemComponentBase {\n key: string;\n dtype?: string;\n}\n\nexport interface LegacyItemGroupComponent extends LegacyItemComponentBase {\n items: Array<LegacyItemComponent>;\n order?: Expression;\n}\n\nexport const isLegacyItemGroupComponent = (item: LegacyItemComponent): item is LegacyItemGroupComponent => {\n const items = (item as LegacyItemGroupComponent).items;\n return items !== undefined && items.length > 0;\n}\n\nexport interface LegacyComponentProperties {\n min?: ExpressionArg | number;\n max?: ExpressionArg | number;\n stepSize?: ExpressionArg | number;\n dateInputMode?: ExpressionArg | string;\n pattern?: string;\n}\n\n// ----------------------------------------------------------------------\nexport type LegacyLocalizedObject = LegacyLocalizedString;\n\nexport interface LegacyLocalizedObjectBase {\n code: string;\n}\n\nexport interface LegacyLocalizedString extends LegacyLocalizedObjectBase {\n parts: Array<ExpressionArg>\n resolvedText?: string;\n}\n\n\nexport interface LegacySurvey {\n id?: string;\n props?: LegacySurveyProps;\n prefillRules?: Expression[];\n //contextRules?: SurveyContextDef;\n maxItemsPerPage?: { large: number, small: number };\n availableFor?: string;\n requireLoginBeforeSubmission?: boolean;\n //\n surveyDefinition: LegacySurveyGroupItem;\n published?: number;\n unpublished?: number;\n versionId: string;\n metadata?: {\n [key: string]: string\n }\n}\n\n\nexport interface LegacySurveyProps {\n name?: LegacyLocalizedObject[];\n description?: LegacyLocalizedObject[];\n typicalDuration?: LegacyLocalizedObject[];\n}\n\ninterface LegacySurveyItemBase {\n key: string;\n metadata?: {\n [key: string]: string\n }\n follows?: Array<string>;\n condition?: Expression;\n priority?: number; // can be used to sort items in the list\n}\n\nexport type LegacySurveyItem = LegacySurveyGroupItem | LegacySurveySingleItem;\n\n// ----------------------------------------------------------------------\nexport interface LegacySurveyGroupItem extends LegacySurveyItemBase {\n items: Array<LegacySurveyItem>;\n selectionMethod?: Expression; // what method to use to pick next item if ambigous - default uniform random\n}\n\nexport const isLegacySurveyGroupItem = (item: LegacySurveyItem): item is LegacySurveyGroupItem => {\n const items = (item as LegacySurveyGroupItem).items;\n return items !== undefined && items.length > 0;\n}\n\n// ----------------------------------------------------------------------\n// Single Survey Items:\nexport type LegacySurveyItemTypes =\n 'pageBreak' | 'test' | 'surveyEnd'\n ;\n\nexport interface LegacySurveySingleItem extends LegacySurveyItemBase {\n type?: LegacySurveyItemTypes;\n components?: LegacyItemGroupComponent; // any sub-type of ItemComponent\n validations?: Array<LegacyValidation>;\n confidentialMode?: LegacyConfidentialMode;\n mapToKey?: string; // if the response should be mapped to another key in confidential mode\n}\n\nexport interface LegacyValidation {\n key: string;\n type: 'soft' | 'hard'; // hard or softvalidation\n rule: Expression | boolean;\n}\n\nexport type LegacyConfidentialMode = 'add' | 'replace';\n","import { ItemResponseMeta } from \"./response-meta\";\nimport { ResponseValue } from \"./value-types\";\n\n\nexport interface JsonSurveyItemResponse {\n itemId: string;\n itemType: string;\n meta?: ItemResponseMeta;\n response?: JsonResponseItem;\n}\n\nexport interface JsonResponseItem {\n slotValues: Array<[slotId: string, slotResponse: ResponseValue]>;\n}\n\n\n/**\n * SurveyItemResponse to store the response of a survey item.\n */\nexport class SurveyItemResponse {\n itemId: string;\n meta?: ItemResponseMeta;\n response?: ResponseItem;\n itemType: string;\n\n constructor(itemDef: {\n itemId: string;\n itemType: string;\n }, response?: ResponseItem) {\n this.itemId = itemDef.itemId;\n this.response = response;\n this.itemType = itemDef.itemType;\n }\n\n serialize(): JsonSurveyItemResponse {\n return {\n itemId: this.itemId,\n itemType: this.itemType,\n meta: this.meta,\n response: this.response?.serialize(),\n };\n }\n\n static deserialize(json: JsonSurveyItemResponse): SurveyItemResponse {\n const itemDef: {\n itemId: string;\n itemType: string;\n } = {\n itemId: json.itemId,\n itemType: json.itemType,\n };\n\n const response = json.response ? ResponseItem.deserialize(json.response) : undefined;\n\n const newResponse = new SurveyItemResponse(itemDef, response);\n newResponse.meta = json.meta;\n return newResponse;\n }\n}\n\n\nexport class ResponseItem {\n private _slots: Map<string, ResponseValue>;\n\n constructor(initialValues?: Array<[slotId: string, slotResponse: ResponseValue]>) {\n this._slots = new Map(initialValues ?? []);\n }\n\n get(slotId: string): ResponseValue | undefined {\n return this._slots.get(slotId);\n }\n\n setSlotValue(slotId: string, slotResponse?: ResponseValue) {\n if (slotResponse) {\n this._slots.set(slotId, slotResponse);\n } else {\n this._slots.delete(slotId);\n }\n }\n\n serialize(): JsonResponseItem | undefined {\n return {\n slotValues: Array.from(this._slots.entries()),\n };\n }\n\n clone(): ResponseItem {\n return new ResponseItem(Array.from(this._slots.entries()));\n }\n\n static deserialize(json: JsonResponseItem): ResponseItem {\n return new ResponseItem(json.slotValues);\n }\n}\n","export interface ItemResponseMeta {\n position: number;\n}\n\nexport const SurveyEventTypes = {\n openSurvey: 'openSurvey',\n pageChanged: 'pageChanged',\n responeChanged: 'responeChanged',\n languageChanged: 'languageChanged',\n} as const;\n\nexport type SurveyEventTypes = typeof SurveyEventTypes[keyof typeof SurveyEventTypes];\n\n\n\nexport interface SurveyEventBase<TEventType extends SurveyEventTypes = SurveyEventTypes> {\n type: TEventType;\n timestamp: number;\n}\n\nexport interface OpenSurveyEvent extends SurveyEventBase<typeof SurveyEventTypes.openSurvey> {\n value: string; // locale code\n}\n\nexport interface PageChangedEvent extends SurveyEventBase<typeof SurveyEventTypes.pageChanged> {\n value: number;\n}\n\nexport interface ResponseChangedEvent extends SurveyEventBase<typeof SurveyEventTypes.responeChanged> {\n itemId: string;\n}\n\nexport interface LanguageChangedEvent extends SurveyEventBase<typeof SurveyEventTypes.languageChanged> {\n value: string;\n}\n\nexport type SurveyEvent = OpenSurveyEvent | PageChangedEvent | ResponseChangedEvent | LanguageChangedEvent;","import { JsonSurveyItemResponse, SurveyItemResponse } from \"./item-response\";\nimport { SurveyEvent } from \"./response-meta\";\n\n/**\n * SurveyResponse to store the responses of a survey.\n */\nexport class SurveyResponse {\n key: string;\n participantId?: string;\n submittedAt?: number;\n versionId: string;\n responses: Map<string, SurveyItemResponse>;\n events: Array<SurveyEvent>;\n context?: {\n [key: string]: string;\n };\n\n constructor(key: string, versionId: string) {\n this.key = key;\n this.participantId = '';\n this.submittedAt = 0;\n this.versionId = versionId;\n this.responses = new Map();\n this.events = [];\n }\n\n serialize(): JsonSurveyResponse {\n return {\n key: this.key,\n participantId: this.participantId,\n submittedAt: this.submittedAt,\n versionId: this.versionId,\n responses: Array.from(this.responses.values()).map(r => r.serialize()),\n events: this.events,\n context: this.context,\n };\n }\n\n static deserialize(json: JsonSurveyResponse): SurveyResponse {\n const response = new SurveyResponse(json.key, json.versionId);\n response.participantId = json.participantId;\n response.submittedAt = json.submittedAt;\n response.responses = new Map(json.responses.map(r => [r.itemId, SurveyItemResponse.deserialize(r)]));\n response.context = json.context;\n return response;\n }\n}\n\n/**\n * JsonSurveyResponse is the JSON representation of a survey response.\n */\nexport interface JsonSurveyResponse {\n key: string;\n participantId?: string;\n submittedAt?: number;\n versionId: string;\n responses: JsonSurveyItemResponse[];\n events: SurveyEvent[];\n context?: {\n [key: string]: string;\n }; // key value pairs of data\n}\n","export const ValueType = {\n string: 'string',\n duration: 'duration',\n reference: 'reference',\n number: 'number',\n boolean: 'boolean',\n date: 'date',\n stringArray: 'string[]',\n durationArray: 'duration[]',\n referenceArray: 'reference[]',\n numberArray: 'number[]',\n dateArray: 'date[]',\n} as const;\n\nexport type ValueType = (typeof ValueType)[keyof typeof ValueType];\n\n\nexport const DurationUnits = {\n seconds: 'seconds',\n minutes: 'minutes',\n hours: 'hours',\n days: 'days',\n weeks: 'weeks',\n months: 'months',\n years: 'years',\n} as const;\n\nexport type DurationUnit = (typeof DurationUnits)[keyof typeof DurationUnits];\n\n\nexport const NumberPrecision = {\n int: 'int',\n float: 'float',\n} as const;\n\nexport type NumberPrecision = (typeof NumberPrecision)[keyof typeof NumberPrecision];\n\n\nexport interface SlotResponseBase<TValueType extends ValueType> {\n type: TValueType;\n}\n\nexport interface StringResponse extends SlotResponseBase<typeof ValueType.string> {\n value: string;\n}\n\nexport interface DurationResponse extends SlotResponseBase<typeof ValueType.duration> {\n value: number;\n unit: DurationUnit;\n precision?: NumberPrecision;\n}\n\nexport interface NumberResponse extends SlotResponseBase<typeof ValueType.number> {\n value: number;\n precision?: NumberPrecision;\n}\n\nexport interface BooleanResponse extends SlotResponseBase<typeof ValueType.boolean> {\n value: boolean;\n}\n\nexport interface ReferenceResponse extends SlotResponseBase<typeof ValueType.reference> {\n value: string;\n}\n\nexport interface DateResponse extends SlotResponseBase<typeof ValueType.date> {\n value: number;\n}\n\nexport interface StringArrayResponse extends SlotResponseBase<typeof ValueType.stringArray> {\n value: string[];\n}\n\n\n\nexport interface DurationArrayResponse extends SlotResponseBase<typeof ValueType.durationArray> {\n value: number[];\n unit: DurationUnit;\n precision?: NumberPrecision;\n}\n\nexport interface NumberArrayResponse extends SlotResponseBase<typeof ValueType.numberArray> {\n value: number[];\n precision?: NumberPrecision;\n}\n\n\nexport interface DateArrayResponse extends SlotResponseBase<typeof ValueType.dateArray> {\n value: number[];\n}\n\n\nexport interface ReferenceArrayResponse extends SlotResponseBase<typeof ValueType.referenceArray> {\n value: string[];\n}\n\nexport type ResponseValue = StringResponse | DurationResponse | ReferenceResponse | NumberResponse | BooleanResponse | DateResponse | StringArrayResponse | DurationArrayResponse | NumberArrayResponse | DateArrayResponse | ReferenceArrayResponse;\n\n\nexport type ValueRefTypeLookup = {\n [valueRefString: string]: ValueType;\n}\n\n\n","import { DurationUnits, ResponseValue, ValueType } from \"./value-types\";\n\n\nexport const initValueForType = (returnType: ValueType): ResponseValue => {\n switch (returnType) {\n case ValueType.string:\n return {\n type: ValueType.string,\n value: '',\n };\n case ValueType.number:\n return {\n type: ValueType.number,\n value: 0,\n };\n case ValueType.boolean:\n return {\n type: ValueType.boolean,\n value: false,\n };\n case ValueType.date:\n return {\n type: ValueType.date,\n value: Math.floor(Date.now() / 1000),\n };\n case ValueType.stringArray:\n return {\n type: ValueType.stringArray,\n value: [],\n };\n case ValueType.numberArray:\n return {\n type: ValueType.numberArray,\n value: [],\n };\n case ValueType.dateArray:\n return {\n type: ValueType.dateArray,\n value: [],\n };\n case ValueType.duration:\n return {\n type: ValueType.duration,\n value: 0,\n unit: DurationUnits.seconds,\n };\n case ValueType.reference:\n return {\n type: ValueType.reference,\n value: '',\n };\n case ValueType.durationArray:\n return {\n type: ValueType.durationArray,\n value: [],\n unit: DurationUnits.seconds,\n };\n case ValueType.referenceArray:\n return {\n type: ValueType.referenceArray,\n value: [],\n };\n default:\n throw new Error('Invalid return type: ' + returnType);\n }\n}","import {\n BooleanResponse,\n NumberResponse,\n ResponseValue,\n SurveyItemResponse,\n ValueType,\n} from \"../survey/responses\";\nimport { ValueReferenceMethod } from \"../survey/utils/value-reference\";\nimport { SurveyContext } from \"../survey/utils/context\";\nimport {\n ConstExpression,\n ContextVariableExpression,\n ContextVariableType,\n Expression,\n ExpressionType,\n FunctionExpression,\n FunctionExpressionNames,\n ResponseVariableExpression,\n} from \"./expression\";\n\nexport interface ExpressionContext {\n surveyContext: SurveyContext;\n responses: {\n [key: string]: SurveyItemResponse;\n }\n}\n\nexport class ExpressionEvaluator {\n private context?: ExpressionContext;\n\n constructor(context?: ExpressionContext) {\n this.context = context;\n }\n\n eval(expression: Expression | undefined): ResponseValue | undefined {\n if (expression === undefined) {\n return undefined;\n }\n switch (expression.type) {\n case ExpressionType.Const:\n return this.evaluateConst(expression as ConstExpression);\n case ExpressionType.Function:\n return this.evaluateFunction(expression as FunctionExpression);\n case ExpressionType.ResponseVariable:\n return this.evaluateResponseVariable(expression as ResponseVariableExpression);\n case ExpressionType.ContextVariable:\n return this.evaluateContextVariable(expression as ContextVariableExpression);\n default:\n throw new Error(`Unsupported expression type: ${expression.type}`);\n }\n }\n\n setContext(context: ExpressionContext) {\n this.context = context;\n }\n\n private evaluateConst(expression: ConstExpression): ResponseValue | undefined {\n return expression.value;\n }\n\n private evaluateResponseVariable(expression: ResponseVariableExpression): ResponseValue | undefined {\n const varRef = expression.responseVariableRef;\n\n switch (varRef.name) {\n case ValueReferenceMethod.get:\n return this.context?.responses[varRef.itemId]?.response?.get(varRef.slotId);\n case ValueReferenceMethod.isDefined:\n return {\n type: ValueType.boolean,\n value: this.context?.responses[varRef.itemId]?.response?.get(varRef.slotId) !== undefined\n };\n default:\n throw new Error(`Unsupported value reference method: ${varRef.name}`);\n }\n }\n\n private evaluateFunction(expression: FunctionExpression): ResponseValue | undefined {\n switch (expression.functionName) {\n case FunctionExpressionNames.and:\n return this.evaluateAnd(expression);\n case FunctionExpressionNames.or:\n return this.evaluateOr(expression);\n case FunctionExpressionNames.not:\n return this.evaluateNot(expression);\n // string methods:\n case FunctionExpressionNames.str_eq:\n return this.evaluateStrEq(expression);\n // numeric methods:\n case FunctionExpressionNames.eq:\n return this.evaluateEq(expression);\n case FunctionExpressionNames.gt:\n return this.evaluateGt(expression);\n case FunctionExpressionNames.gte:\n return this.evaluateGte(expression);\n case FunctionExpressionNames.lt:\n return this.evaluateLt(expression);\n case FunctionExpressionNames.lte:\n return this.evaluateLte(expression);\n case FunctionExpressionNames.in_range:\n return this.evaluateInRange(expression);\n case FunctionExpressionNames.sum:\n return this.evaluateSum(expression);\n case FunctionExpressionNames.min:\n return this.evaluateMin(expression);\n case FunctionExpressionNames.max:\n return this.evaluateMax(expression);\n // list methods:\n case FunctionExpressionNames.list_contains:\n return this.evaluateListContains(expression);\n\n default:\n throw new Error(`Unsupported function: ${expression.functionName}`);\n }\n // TODO: implement function evaluation\n return undefined;\n }\n\n private evaluateContextVariable(expression: ContextVariableExpression): ResponseValue | undefined {\n if (!this.context?.surveyContext) {\n return undefined;\n }\n\n const surveyContext = this.context.surveyContext;\n\n switch (expression.contextType) {\n case ContextVariableType.Locale:\n return {\n type: ValueType.string,\n value: surveyContext.locale\n };\n\n case ContextVariableType.ParticipantFlag: {\n if (!expression.key) {\n return undefined;\n }\n\n const flagKey = this.eval(expression.key);\n if (flagKey?.type !== ValueType.string || flagKey.value === undefined) {\n return undefined;\n }\n\n const flagValue = surveyContext.participantFlags?.[flagKey.value];\n\n\n // Handle different return types for participant flags\n switch (expression.asType) {\n case ValueType.boolean:\n // exists?\n return { type: ValueType.boolean, value: flagValue !== undefined };\n case ValueType.string:\n if (flagValue === undefined) {\n return undefined;\n }\n return { type: ValueType.string, value: flagValue };\n case ValueType.number:\n {\n if (flagValue === undefined) {\n return undefined;\n }\n const numValue = parseFloat(flagValue);\n return isNaN(numValue) ? undefined : { type: ValueType.number, value: numValue };\n }\n case ValueType.date:\n {\n if (flagValue === undefined) {\n return undefined;\n }\n const timestamp = parseFloat(flagValue);\n return isNaN(timestamp) ? undefined : { type: ValueType.date, value: timestamp };\n }\n default:\n if (flagValue === undefined) {\n return undefined;\n }\n return { type: ValueType.string, value: flagValue };\n }\n }\n\n case ContextVariableType.CustomValue: {\n if (!expression.key) {\n return undefined;\n }\n\n const customKey = this.eval(expression.key);\n if (customKey?.type !== ValueType.string || customKey.value === undefined) {\n return undefined;\n }\n\n const customValue = surveyContext.customValues?.[customKey.value];\n if (customValue === undefined) {\n return undefined;\n }\n\n // Type checking for custom values\n if (expression.asType !== undefined) {\n if (customValue?.type !== expression.asType) {\n throw new Error(`Custom value type does not match expected type, got ${customValue?.type} and expected ${expression.asType}`);\n }\n }\n return customValue;\n }\n\n case ContextVariableType.CustomExpression: {\n if (!expression.key) {\n return undefined;\n }\n\n const expressionKey = this.eval(expression.key);\n if (expressionKey?.type !== ValueType.string || expressionKey.value === undefined) {\n return undefined;\n }\n\n const customExpression = surveyContext.customExpressions?.[expressionKey.value];\n if (typeof customExpression !== ExpressionType.Function || customExpression === undefined) {\n return undefined;\n }\n\n try {\n const args = expression.arguments;\n const result = customExpression(args);\n\n // Type checking for custom expression results\n\n if (expression.asType !== undefined) {\n if (result?.type !== expression.asType) {\n throw new Error(`Custom expression result type does not match expected type, got ${result?.type} and expected ${expression.asType}`);\n }\n }\n return result;\n\n } catch (error) {\n throw new Error(`Error evaluating custom expression: ${error}`);\n }\n }\n }\n }\n\n private evaluateAnd(expression: FunctionExpression): BooleanResponse {\n return {\n type: ValueType.boolean,\n value: expression.arguments.every(arg => this.eval(arg)?.value === true)\n };\n }\n\n private evaluateOr(expression: FunctionExpression): BooleanResponse {\n return {\n type: ValueType.boolean,\n value: expression.arguments.some(arg => this.eval(arg)?.value === true)\n };\n }\n\n private evaluateNot(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 1 || expression.arguments[0] === undefined) {\n throw new Error(`Not function expects 1 argument, got ${expression.arguments.length}`);\n }\n\n const resolvedValue = this.eval(expression.arguments[0]);\n if (resolvedValue?.type !== ValueType.boolean) {\n throw new Error(`Not function expects a boolean argument, got ${resolvedValue?.type}`);\n }\n\n if (resolvedValue === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n return {\n type: ValueType.boolean,\n value: !resolvedValue.value\n };\n }\n\n private evaluateListContains(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`List contains function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedList = this.eval(expression.arguments[0]);\n const resolvedItem = this.eval(expression.arguments[1]);\n\n if (resolvedList === undefined || resolvedItem === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n const allowedListTypes = [\n ValueType.stringArray,\n ValueType.referenceArray,\n ] as string[];\n const allowedItemTypes = [\n ValueType.string,\n ValueType.reference,\n ] as string[];\n\n const resolvedListType = resolvedList.type as ValueType;\n const resolvedItemType = resolvedItem.type as ValueType;\n\n if (!allowedListTypes.includes(resolvedListType) || !allowedItemTypes.includes(resolvedItemType)) {\n throw new Error(`List contains function expects a string array list and a string item, got ${resolvedList?.type} and ${resolvedItem?.type}`);\n }\n\n const list = resolvedList.value as string[];\n const item = resolvedItem.value as string;\n\n return {\n type: ValueType.boolean,\n value: list.includes(item)\n };\n }\n\n private evaluateStrEq(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`String equals function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedA = this.eval(expression.arguments[0]);\n const resolvedB = this.eval(expression.arguments[1]);\n\n if (resolvedA === undefined || resolvedB === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedA?.type !== ValueType.string || resolvedB?.type !== ValueType.string) {\n throw new Error(`String equals function expects strings for all arguments, got ${resolvedA?.type} and ${resolvedB?.type}`);\n }\n\n return {\n type: ValueType.boolean,\n value: resolvedA.value === resolvedB.value\n };\n }\n\n private evaluateEq(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`Equals function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedA = this.eval(expression.arguments[0]);\n const resolvedB = this.eval(expression.arguments[1]);\n\n if (resolvedA === undefined || resolvedB === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedA?.type !== resolvedB?.type) {\n throw new Error(`Equals function expects the same type for all arguments, got ${resolvedA?.type} and ${resolvedB?.type}`);\n }\n\n return {\n type: ValueType.boolean,\n value: resolvedA.value === resolvedB.value\n };\n }\n\n private evaluateGt(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`Greater than function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedA = this.eval(expression.arguments[0]);\n const resolvedB = this.eval(expression.arguments[1]);\n\n\n if (resolvedA === undefined || resolvedB === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedA?.type !== resolvedB?.type) {\n throw new Error(`Greater than function expects the same type for all arguments, got ${resolvedA?.type} and ${resolvedB?.type}`);\n }\n\n return {\n type: ValueType.boolean,\n value: resolvedA.value > resolvedB.value\n };\n }\n\n private evaluateGte(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`Greater than or equal to function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedA = this.eval(expression.arguments[0]);\n const resolvedB = this.eval(expression.arguments[1]);\n\n if (resolvedA === undefined || resolvedB === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedA?.type !== resolvedB?.type) {\n throw new Error(`Greater than or equal to function expects the same type for all arguments, got ${resolvedA?.type} and ${resolvedB?.type}`);\n }\n\n return {\n type: ValueType.boolean,\n value: resolvedA.value >= resolvedB.value\n };\n }\n\n private evaluateLt(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`Less than function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedA = this.eval(expression.arguments[0]);\n const resolvedB = this.eval(expression.arguments[1]);\n\n if (resolvedA === undefined || resolvedB === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedA?.type !== resolvedB?.type) {\n throw new Error(`Less than function expects the same type for all arguments, got ${resolvedA?.type} and ${resolvedB?.type}`);\n }\n\n return {\n type: ValueType.boolean,\n value: resolvedA.value < resolvedB.value\n };\n }\n\n private evaluateLte(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 2) {\n throw new Error(`Less than or equal to function expects 2 arguments, got ${expression.arguments.length}`);\n }\n const resolvedA = this.eval(expression.arguments[0]);\n const resolvedB = this.eval(expression.arguments[1]);\n\n if (resolvedA === undefined || resolvedB === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedA?.type !== resolvedB?.type) {\n throw new Error(`Less than or equal to function expects the same type for all arguments, got ${resolvedA?.type} and ${resolvedB?.type}`);\n }\n\n return {\n type: ValueType.boolean,\n value: resolvedA.value <= resolvedB.value\n };\n }\n\n private evaluateInRange(expression: FunctionExpression): BooleanResponse {\n if (expression.arguments.length !== 4) {\n throw new Error(`In range function expects 4 arguments, got ${expression.arguments.length}`);\n }\n const resolvedValue = this.eval(expression.arguments[0]);\n const resolvedMin = this.eval(expression.arguments[1]);\n const resolvedMax = this.eval(expression.arguments[2]);\n const resolvedInclusive = this.eval(expression.arguments[3])?.value === true\n\n if (resolvedValue === undefined || resolvedMin === undefined || resolvedMax === undefined) {\n return {\n type: ValueType.boolean,\n value: false\n };\n }\n\n if (resolvedValue?.type !== ValueType.number || resolvedMin?.type !== ValueType.number || resolvedMax?.type !== ValueType.number) {\n throw new Error(`In range function expects numbers for all arguments, got ${resolvedValue?.type} and ${resolvedMin?.type} and ${resolvedMax?.type}`);\n }\n\n if (resolvedInclusive) {\n return {\n type: ValueType.boolean,\n value: resolvedValue.value >= resolvedMin.value && resolvedValue.value <= resolvedMax.value\n };\n }\n return {\n type: ValueType.boolean,\n value: resolvedValue.value > resolvedMin.value && resolvedValue.value < resolvedMax.value\n };\n\n }\n\n private evaluateSum(expression: FunctionExpression): NumberResponse {\n if (expression.arguments.length < 1) {\n throw new Error(`Sum function expects at least 1 argument, got ${expression.arguments.length}`);\n }\n return expression.arguments.reduce((sum, arg) => {\n if (arg === undefined) {\n return sum;\n }\n const resolvedValue = this.eval(arg);\n if (resolvedValue === undefined) {\n return sum;\n }\n if (resolvedValue?.type === ValueType.number) {\n return {\n type: ValueType.number,\n value: sum.value + resolvedValue.value\n };\n }\n throw new Error(`Sum function expects all arguments to be numbers, got ${resolvedValue?.type}`);\n }, {\n type: ValueType.number,\n value: 0\n });\n }\n\n private evaluateMin(expression: FunctionExpression): NumberResponse {\n if (expression.arguments.length < 1) {\n throw new Error(`Min function expects at least 1 argument, got ${expression.arguments.length}`);\n }\n return expression.arguments.reduce((min, arg) => {\n if (arg === undefined) {\n return min;\n }\n const resolvedValue = this.eval(arg);\n if (resolvedValue === undefined) {\n return min;\n }\n if (resolvedValue?.type === ValueType.number) {\n return {\n type: ValueType.number,\n value: Math.min(min.value, resolvedValue.value)\n };\n }\n throw new Error(`Min function expects all arguments to be numbers, got ${typeof resolvedValue}`);\n }, {\n type: ValueType.number,\n value: Infinity\n });\n }\n\n private evaluateMax(expression: FunctionExpression): NumberResponse {\n if (expression.arguments.length < 1) {\n throw new Error(`Max function expects at least 1 argument, got ${expression.arguments.length}`);\n }\n return expression.arguments.reduce((max, arg) => {\n if (arg === undefined) {\n return max;\n }\n const resolvedValue = this.eval(arg);\n if (resolvedValue === undefined) {\n return max;\n }\n if (resolvedValue?.type === ValueType.number) {\n return {\n type: ValueType.number,\n value: Math.max(max.value, resolvedValue.value)\n };\n }\n throw new Error(`Max function expects all arguments to be numbers, got ${typeof resolvedValue}`);\n }, {\n type: ValueType.number,\n value: -Infinity\n });\n }\n\n}\n","\n\n// TODO: constant expression editor\n// TODO: context variable expression editor\n// TODO: function expression editor\n\nimport { Expression, FunctionExpression, ExpressionEditorConfig, FunctionExpressionNames, ConstExpression, ResponseVariableExpression, ContextVariableType, ContextVariableExpression } from \"../../expressions/expression\";\nimport { ValueType } from \"../../survey/responses/value-types\";\nimport { ValueReference } from \"../../survey/utils/value-reference\";\n\n\n// ================================\n// EXPRESSION EDITOR CLASSES\n// ================================\nexport abstract class ExpressionEditor {\n returnType!: ValueType;\n protected _editorConfig?: ExpressionEditorConfig;\n\n abstract getExpression(): Expression | undefined\n\n get editorConfig(): ExpressionEditorConfig | undefined {\n return this._editorConfig;\n }\n\n withEditorConfig(editorConfig: ExpressionEditorConfig): ExpressionEditor {\n this._editorConfig = editorConfig;\n return this;\n }\n}\n\n// ================================\n// CONST EDITORS\n// ================================\nexport class ConstStringArrayEditor extends ExpressionEditor {\n readonly returnType = ValueType.stringArray;\n\n private _values: string[];\n\n constructor(values: string[], editorConfig?: ExpressionEditorConfig) {\n super();\n this._values = values;\n this._editorConfig = editorConfig;\n }\n\n get values(): string[] {\n return this._values;\n }\n\n set values(values: string[]) {\n this._values = values;\n }\n\n getExpression(): Expression | undefined {\n return new ConstExpression({ type: ValueType.stringArray, value: this._values }, this._editorConfig);\n }\n}\n\nexport class ConstStringEditor extends ExpressionEditor {\n readonly returnType = ValueType.string;\n\n private _value: string;\n\n constructor(value: string, editorConfig?: ExpressionEditorConfig) {\n super();\n this._value = value;\n this._editorConfig = editorConfig;\n }\n\n get value(): string {\n return this._value;\n }\n\n set value(value: string) {\n this._value = value;\n }\n\n getExpression(): Expression | undefined {\n return new ConstExpression({ type: ValueType.string, value: this._value }, this._editorConfig);\n }\n}\n\nexport class ConstNumberEditor extends ExpressionEditor {\n readonly returnType = ValueType.number;\n\n private _value: number;\n\n constructor(value: number, editorConfig?: ExpressionEditorConfig) {\n super();\n this._value = value;\n this._editorConfig = editorConfig;\n }\n\n get value(): number {\n return this._value;\n }\n\n set value(value: number) {\n this._value = value;\n }\n\n getExpression(): Expression | undefined {\n return new ConstExpression({ type: ValueType.number, value: this._value }, this._editorConfig);\n }\n}\n\nexport class ConstBooleanEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n\n private _value: boolean;\n\n constructor(value: boolean, editorConfig?: ExpressionEditorConfig) {\n super();\n this._value = value;\n this._editorConfig = editorConfig;\n }\n\n get value(): boolean {\n return this._value;\n }\n\n set value(value: boolean) {\n this._value = value;\n }\n\n getExpression(): Expression | undefined {\n return new ConstExpression({ type: ValueType.boolean, value: this._value }, this._editorConfig);\n }\n}\n\nexport class ConstDateEditor extends ExpressionEditor {\n readonly returnType = ValueType.date;\n\n private _value: Date;\n\n constructor(value: Date, editorConfig?: ExpressionEditorConfig) {\n super();\n this._value = value;\n this._editorConfig = editorConfig;\n }\n\n get value(): Date {\n return this._value;\n }\n\n set value(value: Date) {\n this._value = value;\n }\n\n getExpression(): Expression | undefined {\n const value = Math.floor(this._value.getTime() / 1000);\n return new ConstExpression({ type: ValueType.date, value: value }, this._editorConfig);\n }\n}\n\nexport class ConstNumberArrayEditor extends ExpressionEditor {\n readonly returnType = ValueType.numberArray;\n\n private _values: number[];\n\n constructor(values: number[], editorConfig?: ExpressionEditorConfig) {\n super();\n this._values = values;\n this._editorConfig = editorConfig;\n }\n\n get values(): number[] {\n return this._values;\n }\n\n set values(values: number[]) {\n this._values = values;\n }\n\n getExpression(): Expression | undefined {\n return new ConstExpression({ type: ValueType.numberArray, value: this._values }, this._editorConfig);\n }\n}\n\nexport class ConstDateArrayEditor extends ExpressionEditor {\n readonly returnType = ValueType.dateArray;\n\n private _values: Date[];\n\n constructor(values: Date[], editorConfig?: ExpressionEditorConfig) {\n super();\n this._values = values;\n this._editorConfig = editorConfig;\n }\n\n get values(): Date[] {\n return this._values;\n }\n\n set values(values: Date[]) {\n this._values = values;\n }\n\n getExpression(): Expression | undefined {\n const value = this._values.map(date => Math.floor(date.getTime() / 1000));\n return new ConstExpression({ type: ValueType.dateArray, value: value }, this._editorConfig);\n }\n}\n\n// ================================\n// RESPONSE VARIABLE EXPRESSION EDITOR CLASSES\n// ================================\n\nexport class ResponseVariableEditor extends ExpressionEditor {\n private _variableName: string;\n private _variableRef: ValueReference;\n\n constructor(variableName: string, variableType: ValueType, editorConfig?: ExpressionEditorConfig) {\n super();\n this._variableName = variableName;\n this._variableRef = new ValueReference(variableName);\n this._editorConfig = editorConfig;\n this.returnType = variableType;\n }\n\n get variableName(): string {\n return this._variableName;\n }\n\n get variableRef(): ValueReference {\n return this._variableRef;\n }\n\n getExpression(): Expression | undefined {\n return new ResponseVariableExpression(this._variableName, this._editorConfig);\n }\n}\n\n// ================================\n// CONTEXT VARIABLE EXPRESSION EDITOR CLASSES\n// ================================\n\nabstract class ContextVariableEditor extends ExpressionEditor {\n private _contextType: ContextVariableType;\n private _key?: ExpressionEditor;\n private _args?: ExpressionEditor[];\n private _asType?: ValueType;\n\n constructor(contextType: ContextVariableType, key?: ExpressionEditor, args?: ExpressionEditor[], asType?: ValueType, editorConfig?: ExpressionEditorConfig) {\n super();\n this._contextType = contextType;\n this._key = key;\n this._args = args;\n this._asType = asType;\n this._editorConfig = editorConfig;\n }\n\n getExpression(): Expression | undefined {\n return new ContextVariableExpression(this._contextType, this._key?.getExpression(), this._args?.map(arg => arg.getExpression()), this._asType, this._editorConfig);\n }\n}\n\nexport class CtxLocaleEditor extends ContextVariableEditor {\n readonly returnType = ValueType.string;\n\n constructor(editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.Locale, undefined, undefined, ValueType.string, editorConfig);\n }\n}\n\nexport class CtxPFlagIsDefinedEditor extends ContextVariableEditor {\n readonly returnType = ValueType.boolean;\n\n constructor(key: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.ParticipantFlag, key, undefined, ValueType.boolean, editorConfig);\n }\n}\n\nexport class CtxPFlagStringEditor extends ContextVariableEditor {\n readonly returnType = ValueType.string;\n\n constructor(key: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.ParticipantFlag, key, undefined, ValueType.string, editorConfig);\n }\n}\n\nexport class CtxPFlagNumEditor extends ContextVariableEditor {\n readonly returnType = ValueType.number;\n\n constructor(key: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.ParticipantFlag, key, undefined, ValueType.number, editorConfig);\n }\n}\n\nexport class CtxPFlagDateEditor extends ContextVariableEditor {\n readonly returnType = ValueType.date;\n\n constructor(key: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.ParticipantFlag, key, undefined, ValueType.date, editorConfig);\n }\n}\n\n\nexport class CtxCustomValueEditor extends ContextVariableEditor {\n\n constructor(key: ExpressionEditor,\n asType: ValueType,\n editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.CustomValue, key, undefined, asType, editorConfig);\n this.returnType = asType;\n }\n}\n\nexport class CtxCustomExpressionEditor extends ContextVariableEditor {\n constructor(key: ExpressionEditor,\n args: ExpressionEditor[],\n asType: ValueType,\n editorConfig?: ExpressionEditorConfig) {\n super(ContextVariableType.CustomExpression, key, args, asType, editorConfig);\n this.returnType = asType;\n }\n}\n\n// ================================\n// GROUP EXPRESSION EDITOR CLASSES\n// ================================\nabstract class GroupExpressionEditor extends ExpressionEditor {\n private _args: ExpressionEditor[];\n\n constructor(\n args: ExpressionEditor[],\n editorConfig?: ExpressionEditorConfig\n ) {\n super();\n this._args = args;\n this._editorConfig = editorConfig;\n }\n\n get args(): ExpressionEditor[] {\n return this._args;\n }\n\n addArg(arg: ExpressionEditor, position?: number) {\n if (position === undefined) {\n this._args.push(arg);\n } else {\n this._args.splice(position, 0, arg);\n }\n }\n\n removeArg(position: number) {\n this._args.splice(position, 1);\n }\n\n replaceArg(position: number, arg: ExpressionEditor) {\n this._args[position] = arg;\n }\n\n swapArgs(activeIndex: number, overIndex: number) {\n const newOrder = [...this._args];\n newOrder.splice(activeIndex, 1);\n newOrder.splice(overIndex, 0, this._args[activeIndex]);\n this._args = newOrder;\n }\n}\n\nexport class AndExpressionEditor extends GroupExpressionEditor {\n readonly returnType = ValueType.boolean;\n\n constructor(args: ExpressionEditor[], editorConfig?: ExpressionEditorConfig) {\n if (args.some(arg => arg.returnType !== ValueType.boolean)) {\n throw new Error('And expression editor must have boolean arguments');\n }\n super(args, editorConfig);\n }\n\n getExpression(): Expression | undefined {\n return new FunctionExpression(\n FunctionExpressionNames.and,\n this.args.map(arg => arg.getExpression()),\n this._editorConfig\n )\n }\n}\n\nexport class OrExpressionEditor extends GroupExpressionEditor {\n readonly returnType = ValueType.boolean;\n\n constructor(args: ExpressionEditor[], editorConfig?: ExpressionEditorConfig) {\n if (args.some(arg => arg.returnType !== ValueType.boolean)) {\n throw new Error('Or expression editor must have boolean arguments');\n }\n super(args, editorConfig);\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.or,\n this.args.map(arg => arg.getExpression()),\n this._editorConfig\n )\n }\n}\n\n\n// ================================\n// LIST EXPRESSION EDITOR CLASSES\n// ================================\n\nexport class StrListContainsExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _list: ExpressionEditor | undefined;\n private _item: ExpressionEditor | undefined;\n\n constructor(list: ExpressionEditor, item: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n if (list.returnType !== ValueType.stringArray) {\n throw new Error('List contains expression editor must have a string array list');\n }\n if (item.returnType !== ValueType.string) {\n throw new Error('List contains expression editor must have a string item');\n }\n this._list = list;\n this._item = item;\n this._editorConfig = editorConfig;\n }\n\n get list(): ExpressionEditor | undefined {\n return this._list;\n }\n\n get item(): ExpressionEditor | undefined {\n return this._item;\n }\n\n set list(list: ExpressionEditor | undefined) {\n this._list = list;\n }\n\n set item(item: ExpressionEditor | undefined) {\n this._item = item;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.list_contains,\n [this._list?.getExpression(), this._item?.getExpression()],\n this._editorConfig\n );\n }\n}\n\n// ================================\n// STRING EXPRESSION EDITOR CLASSES\n// ================================\n\nexport class StrEqExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _a: ExpressionEditor | undefined;\n private _b: ExpressionEditor | undefined;\n\n constructor(a: ExpressionEditor, b: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this._a = a;\n this._b = b;\n this._editorConfig = editorConfig;\n }\n\n get a(): ExpressionEditor | undefined {\n return this._a;\n }\n\n get b(): ExpressionEditor | undefined {\n return this._b;\n }\n\n set a(a: ExpressionEditor | undefined) {\n this._a = a;\n }\n\n set b(b: ExpressionEditor | undefined) {\n this._b = b;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.str_eq,\n [this._a?.getExpression(), this._b?.getExpression()],\n this._editorConfig\n );\n }\n}\n\n// ================================\n// NUMBER EXPRESSION EDITOR CLASSES\n// ================================\n\nexport class EqExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _a: ExpressionEditor | undefined;\n private _b: ExpressionEditor | undefined;\n\n constructor(a: ExpressionEditor, b: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this._a = a;\n this._b = b;\n this._editorConfig = editorConfig;\n }\n\n get a(): ExpressionEditor | undefined {\n return this._a;\n }\n\n get b(): ExpressionEditor | undefined {\n return this._b;\n }\n\n set a(a: ExpressionEditor | undefined) {\n this._a = a;\n }\n\n set b(b: ExpressionEditor | undefined) {\n this._b = b;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.eq,\n [this._a?.getExpression(), this._b?.getExpression()],\n this._editorConfig\n );\n }\n}\n\nexport class GtExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _a: ExpressionEditor | undefined;\n private _b: ExpressionEditor | undefined;\n\n constructor(a: ExpressionEditor, b: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this._a = a;\n this._b = b;\n this._editorConfig = editorConfig;\n }\n\n get a(): ExpressionEditor | undefined {\n return this._a;\n }\n\n get b(): ExpressionEditor | undefined {\n return this._b;\n }\n\n set a(a: ExpressionEditor | undefined) {\n this._a = a;\n }\n\n set b(b: ExpressionEditor | undefined) {\n this._b = b;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.gt,\n [this._a?.getExpression(), this._b?.getExpression()],\n this._editorConfig\n );\n }\n}\n\nexport class GteExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _a: ExpressionEditor | undefined;\n private _b: ExpressionEditor | undefined;\n\n constructor(a: ExpressionEditor, b: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this._a = a;\n this._b = b;\n this._editorConfig = editorConfig;\n }\n\n get a(): ExpressionEditor | undefined {\n return this._a;\n }\n\n get b(): ExpressionEditor | undefined {\n return this._b;\n }\n\n set a(a: ExpressionEditor | undefined) {\n this._a = a;\n }\n\n set b(b: ExpressionEditor | undefined) {\n this._b = b;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.gte,\n [this._a?.getExpression(), this._b?.getExpression()],\n this._editorConfig\n );\n }\n}\n\nexport class LtExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _a: ExpressionEditor | undefined;\n private _b: ExpressionEditor | undefined;\n\n constructor(a: ExpressionEditor, b: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this._a = a;\n this._b = b;\n this._editorConfig = editorConfig;\n }\n\n get a(): ExpressionEditor | undefined {\n return this._a;\n }\n\n get b(): ExpressionEditor | undefined {\n return this._b;\n }\n\n set a(a: ExpressionEditor | undefined) {\n this._a = a;\n }\n\n set b(b: ExpressionEditor | undefined) {\n this._b = b;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.lt,\n [this._a?.getExpression(), this._b?.getExpression()],\n this._editorConfig\n );\n }\n}\n\nexport class LteExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n private _a: ExpressionEditor | undefined;\n private _b: ExpressionEditor | undefined;\n\n constructor(a: ExpressionEditor, b: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this._a = a;\n this._b = b;\n this._editorConfig = editorConfig;\n }\n\n get a(): ExpressionEditor | undefined {\n return this._a;\n }\n\n get b(): ExpressionEditor | undefined {\n return this._b;\n }\n\n set b(b: ExpressionEditor | undefined) {\n this._b = b;\n }\n\n set a(a: ExpressionEditor | undefined) {\n this._a = a;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.lte,\n [this._a?.getExpression(), this._b?.getExpression()],\n this._editorConfig\n );\n }\n}\n\nexport class InRangeExpressionEditor extends ExpressionEditor {\n readonly returnType = ValueType.boolean;\n value: ExpressionEditor | undefined;\n min: ExpressionEditor | undefined;\n max: ExpressionEditor | undefined;\n inclusive: ExpressionEditor | undefined;\n\n constructor(value: ExpressionEditor, min: ExpressionEditor, max: ExpressionEditor, inclusive: ExpressionEditor, editorConfig?: ExpressionEditorConfig) {\n super();\n this.value = value;\n this.min = min;\n this.max = max;\n this.inclusive = inclusive;\n this._editorConfig = editorConfig;\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.in_range,\n [this.value?.getExpression(), this.min?.getExpression(), this.max?.getExpression(), this.inclusive?.getExpression()],\n this._editorConfig\n );\n }\n}\n\nexport class SumExpressionEditor extends GroupExpressionEditor {\n readonly returnType = ValueType.number;\n\n constructor(args: ExpressionEditor[], editorConfig?: ExpressionEditorConfig) {\n super(args, editorConfig);\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.sum,\n this.args.map(arg => arg.getExpression()),\n this._editorConfig\n );\n }\n}\n\nexport class MinExpressionEditor extends GroupExpressionEditor {\n readonly returnType = ValueType.number;\n\n constructor(args: ExpressionEditor[], editorConfig?: ExpressionEditorConfig) {\n super(args, editorConfig);\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.min,\n this.args.map(arg => arg.getExpression()),\n this._editorConfig\n );\n }\n}\n\nexport class MaxExpressionEditor extends GroupExpressionEditor {\n readonly returnType = ValueType.number;\n\n constructor(args: ExpressionEditor[], editorConfig?: ExpressionEditorConfig) {\n super(args, editorConfig);\n }\n\n getExpression(): Expression {\n return new FunctionExpression(\n FunctionExpressionNames.max,\n this.args.map(arg => arg.getExpression()),\n this._editorConfig\n );\n }\n}\n","import { ValueType } from \"../../survey/responses/value-types\";\nimport {\n AndExpressionEditor,\n ConstStringArrayEditor,\n ConstStringEditor,\n ExpressionEditor,\n StrListContainsExpressionEditor,\n OrExpressionEditor,\n ResponseVariableEditor,\n ConstNumberArrayEditor,\n ConstNumberEditor,\n ConstBooleanEditor,\n ConstDateEditor,\n ConstDateArrayEditor,\n StrEqExpressionEditor,\n EqExpressionEditor,\n GtExpressionEditor,\n GteExpressionEditor,\n LteExpressionEditor,\n LtExpressionEditor,\n InRangeExpressionEditor,\n SumExpressionEditor,\n MinExpressionEditor,\n MaxExpressionEditor,\n CtxLocaleEditor,\n CtxPFlagIsDefinedEditor,\n CtxPFlagStringEditor,\n CtxPFlagNumEditor,\n CtxPFlagDateEditor,\n CtxCustomValueEditor,\n CtxCustomExpressionEditor,\n} from \"./expression-editor\";\n\n// ================================\n// CONST EXPRESSIONS\n// ================================\nexport const const_string_array = (...values: string[]): ExpressionEditor => {\n return new ConstStringArrayEditor(values);\n}\n\nexport const const_string = (value: string): ExpressionEditor => {\n return new ConstStringEditor(value);\n}\n\nexport const const_number_array = (...values: number[]): ExpressionEditor => {\n return new ConstNumberArrayEditor(values);\n}\n\nexport const const_number = (value: number): ExpressionEditor => {\n return new ConstNumberEditor(value);\n}\n\nexport const const_boolean = (value: boolean): ExpressionEditor => {\n return new ConstBooleanEditor(value);\n}\n\nexport const const_date = (value: Date): ExpressionEditor => {\n return new ConstDateEditor(value);\n}\n\nexport const const_date_array = (...values: Date[]): ExpressionEditor => {\n return new ConstDateArrayEditor(values);\n}\n\n\n// ================================\n// RESPONSE VARIABLE EXPRESSIONS\n// ================================\nexport const response_string = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.string);\n}\n\nexport const response_string_array = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.stringArray);\n}\n\nexport const response_number = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.number);\n}\n\nexport const response_boolean = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.boolean);\n}\n\nexport const response_date = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.date);\n}\n\nexport const response_number_array = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.numberArray);\n}\n\nexport const response_date_array = (valueRef: string): ExpressionEditor => {\n return new ResponseVariableEditor(valueRef, ValueType.dateArray);\n}\n\n// ================================\n// CONTEXT VARIABLE EXPRESSIONS\n// ================================\nexport const ctx_locale = (): ExpressionEditor => {\n return new CtxLocaleEditor();\n}\n\nexport const ctx_pflag_is_defined = (key: ExpressionEditor): ExpressionEditor => {\n return new CtxPFlagIsDefinedEditor(key);\n}\n\nexport const ctx_pflag_string = (key: ExpressionEditor): ExpressionEditor => {\n return new CtxPFlagStringEditor(key);\n}\n\nexport const ctx_pflag_num = (key: ExpressionEditor): ExpressionEditor => {\n return new CtxPFlagNumEditor(key);\n}\n\nexport const ctx_pflag_date = (key: ExpressionEditor): ExpressionEditor => {\n return new CtxPFlagDateEditor(key);\n}\n\nexport const ctx_custom_value = (key: ExpressionEditor, dType: ValueType): ExpressionEditor => {\n return new CtxCustomValueEditor(key, dType);\n}\n\nexport const ctx_custom_expression = (key: ExpressionEditor, args: ExpressionEditor[], returnType: ValueType): ExpressionEditor => {\n return new CtxCustomExpressionEditor(key, args, returnType);\n}\n\n// ================================\n// LOGIC EXPRESSIONS\n// ================================\nexport const and = (...args: ExpressionEditor[]): ExpressionEditor => {\n return new AndExpressionEditor(args);\n}\n\nexport const or = (...args: ExpressionEditor[]): ExpressionEditor => {\n return new OrExpressionEditor(args);\n}\n\n\n// ================================\n// LIST EXPRESSIONS\n// ================================\n\nexport const str_list_contains = (list: ExpressionEditor, item: ExpressionEditor): ExpressionEditor => {\n return new StrListContainsExpressionEditor(list, item);\n}\n\n// ================================\n// STRING EXPRESSIONS\n// ================================\n\nexport const str_eq = (a: ExpressionEditor, b: ExpressionEditor): ExpressionEditor => {\n return new StrEqExpressionEditor(a, b);\n}\n\n// ================================\n// NUMBER EXPRESSIONS\n// ================================\n\nexport const eq = (a: ExpressionEditor, b: ExpressionEditor): ExpressionEditor => {\n return new EqExpressionEditor(a, b);\n}\n\nexport const gt = (a: ExpressionEditor, b: ExpressionEditor): ExpressionEditor => {\n return new GtExpressionEditor(a, b);\n}\n\nexport const gte = (a: ExpressionEditor, b: ExpressionEditor): ExpressionEditor => {\n return new GteExpressionEditor(a, b);\n}\n\nexport const lt = (a: ExpressionEditor, b: ExpressionEditor): ExpressionEditor => {\n return new LtExpressionEditor(a, b);\n}\n\nexport const lte = (a: ExpressionEditor, b: ExpressionEditor): ExpressionEditor => {\n return new LteExpressionEditor(a, b);\n}\n\nexport const in_range = (value: ExpressionEditor, min: ExpressionEditor, max: ExpressionEditor, inclusive: ExpressionEditor): ExpressionEditor => {\n return new InRangeExpressionEditor(value, min, max, inclusive);\n}\n\nexport const sum = (...args: ExpressionEditor[]): ExpressionEditor => {\n return new SumExpressionEditor(args);\n}\n\nexport const min = (...args: ExpressionEditor[]): ExpressionEditor => {\n return new MinExpressionEditor(args);\n}\n\nexport const max = (...args: ExpressionEditor[]): ExpressionEditor => {\n return new MaxExpressionEditor(args);\n}\n","export enum ContentType {\n CQM = 'CQM',\n md = 'md'\n}\n\nexport enum AttributionType {\n style = 'style',\n template = 'template'\n}\n\nexport type StyleAttribution = {\n type: AttributionType.style;\n styleKey: string;\n start: number;\n end: number;\n}\n\nexport type TemplateAttribution = {\n type: AttributionType.template;\n templateKey: string;\n position: number;\n}\n\n\nexport type Attribution = StyleAttribution | TemplateAttribution;\n\n\n// TODO: create JSON schema\n// TODO: create classes to represent the content\n\nexport type CQMContent = {\n type: ContentType.CQM;\n content: string;\n attributions?: Array<Attribution>;\n}\n\nexport type MDContent = {\n type: ContentType.md;\n content: string;\n}\n\nexport type Content = CQMContent | MDContent;\n\n","import { format, Locale } from 'date-fns';\nimport { enUS } from 'date-fns/locale';\nimport { shuffleIndices } from \"../utils\";\n\nimport {\n Survey,\n SurveyItemCore,\n ReservedSurveyItemTypes,\n} from \"../survey\";\nimport {\n JsonSurveyItemResponse,\n ResponseItem,\n ResponseValue,\n SurveyEvent,\n SurveyEventTypes,\n SurveyItemResponse,\n ValueType\n} from \"../survey/responses\";\nimport { ExpressionEvaluator } from \"../expressions/expression-evaluator\";\nimport { Expression, TemplateDefTypes, TemplateValueDefinition, TemplateValueFormatDate } from \"../expressions\";\nimport { SurveyContext } from '../survey/utils/context';\nimport { GroupItemCore } from '../survey/registry/built-in-items';\n\n\nexport type ScreenSize = \"small\" | \"large\";\n\n\nexport interface RenderedSurveyItem {\n id: string;\n type: string;\n items?: Array<RenderedSurveyItem>\n}\n\nexport class SurveyEngineCore {\n private surveyDef: Survey;\n private renderedSurveyTree: RenderedSurveyItem;\n private context: SurveyContext;\n private locale: string;\n\n private responses: {\n [itemKey: string]: SurveyItemResponse;\n };\n private prefills?: {\n [itemKey: string]: SurveyItemResponse;\n };\n private _events: Array<SurveyEvent>;\n private _openedAt: number;\n private dateLocales: Array<{ code: string, locale: Locale }>;\n\n private cache!: {\n validations: {\n [itemKey: string]: {\n [validationKey: string]: {\n expression: Expression;\n result: boolean;\n };\n };\n };\n displayConditions: {\n [itemKey: string]: {\n root?: {\n expression: Expression;\n result: boolean;\n };\n components?: {\n [componentKey: string]: {\n expression: Expression;\n result: boolean;\n };\n }\n };\n };\n templateValues: {\n [templateValueKey: string]: {\n value?: ResponseValue;\n templateDef: TemplateValueDefinition | undefined;\n };\n };\n disabledConditions: {\n [itemKey: string]: {\n components?: {\n [componentKey: string]: {\n expression: Expression;\n result: boolean;\n };\n }\n };\n };\n }\n\n constructor(\n survey: Survey,\n context?: SurveyContext,\n prefills?: JsonSurveyItemResponse[],\n dateLocales?: Array<{ code: string, locale: Locale }>,\n ) {\n this._openedAt = this._getTimestamp();\n\n\n this.surveyDef = survey;\n\n this.context = context ? context : {\n locale: 'en',\n };\n this.locale = this.context.locale;\n this.prefills = prefills ? prefills.reduce((acc, p) => {\n acc[p.itemId] = SurveyItemResponse.deserialize(p);\n return acc;\n }, {} as { [itemKey: string]: SurveyItemResponse }) : undefined;\n\n this.dateLocales = dateLocales || [{ code: 'en', locale: enUS }];\n this.responses = this.initResponseObject(this.surveyDef.surveyItems);\n\n this.initCache();\n this.evalExpressions();\n\n // init rendered survey\n if (!survey.rootItem) {\n throw new Error('constructor: root item not found');\n }\n this.renderedSurveyTree = this.renderGroup(survey.rootItem);\n this._events = [\n {\n type: SurveyEventTypes.openSurvey,\n timestamp: this._getTimestamp(),\n value: this.context.locale,\n },\n ];\n }\n\n\n // PUBLIC METHODS\n setContext(context: SurveyContext) {\n this.context = context;\n }\n\n getDateLocales(): Array<{ code: string, locale: Locale }> {\n return this.dateLocales.slice();\n }\n\n getCurrentDateLocale(): Locale | undefined {\n const found = this.dateLocales.find(dl => dl.code === this.locale);\n if (!found) {\n console.warn(`Locale '${this.locale}' is not available. Using default locale.`);\n if (this.dateLocales.length > 0) {\n return this.dateLocales[0].locale;\n }\n return enUS;\n }\n return found?.locale;\n }\n\n updateContext(context: SurveyContext) {\n this.context = context;\n this.locale = context.locale;\n this._registerSurveyEvent({\n type: SurveyEventTypes.languageChanged,\n timestamp: this._getTimestamp(),\n value: context.locale,\n });\n\n // Re-render to update any locale-dependent expressions\n this.evalExpressions();\n this.reRenderSurveyTree();\n }\n\n setResponse(\n targetKey: string,\n response?: ResponseItem\n ) {\n const target = this.getResponseItem(targetKey);\n if (!target) {\n throw new Error('setResponse: target not found for key: ' + targetKey);\n }\n\n target.response = response;\n this._registerSurveyEvent({\n type: SurveyEventTypes.responeChanged,\n timestamp: this._getTimestamp(),\n itemId: targetKey,\n });\n\n this.evalExpressions();\n // re-render whole tree\n this.reRenderSurveyTree();\n }\n\n get openedAt(): number {\n return this._openedAt;\n }\n\n get survey(): Readonly<Survey> {\n return this.surveyDef;\n }\n\n getSurveyPages(size?: ScreenSize): RenderedSurveyItem[][] {\n const renderedSurvey = flattenTree(this.renderedSurveyTree);\n const pages = new Array<RenderedSurveyItem[]>();\n\n if (!size) {\n size = 'large';\n }\n\n let currentPage: RenderedSurveyItem[] = [];\n\n renderedSurvey.forEach(item => {\n if (item.type === ReservedSurveyItemTypes.PageBreak) {\n if (currentPage.length > 0) {\n pages.push([...currentPage]);\n currentPage = [];\n }\n return;\n }\n currentPage.push(item);\n\n if (!this.surveyDef.maxItemsPerPage) {\n return;\n }\n let max = 0;\n switch (size) {\n case 'large':\n max = this.surveyDef.maxItemsPerPage.large;\n break;\n case 'small':\n max = this.surveyDef.maxItemsPerPage.small;\n break\n }\n\n if (currentPage.length >= max) {\n pages.push([...currentPage]);\n currentPage = [];\n }\n });\n if (currentPage.length > 0) {\n pages.push([...currentPage]);\n }\n return pages;\n }\n\n getRenderedSurveyItem(itemId: string): RenderedSurveyItem | undefined {\n const renderedSurvey = flattenTree(this.renderedSurveyTree);\n return renderedSurvey.find(item => item.id === itemId);\n }\n\n onPageChanged(pageIndex: number) {\n this._registerSurveyEvent({\n type: SurveyEventTypes.pageChanged,\n timestamp: this._getTimestamp(),\n value: pageIndex,\n });\n }\n\n getEvents(): Readonly<Array<SurveyEvent>> {\n return this._events.slice();\n }\n\n getResponses(): SurveyItemResponse[] {\n const renderedSurvey = flattenTree(this.renderedSurveyTree).filter(\n item => item.type !== ReservedSurveyItemTypes.PageBreak\n );\n\n const responses: SurveyItemResponse[] = [];\n renderedSurvey.forEach((item, index) => {\n const response = this.getResponseItem(item.id);\n if (!response) {\n return;\n }\n response.meta = { position: index };\n responses.push(response);\n });\n return responses;\n }\n\n getDisplayConditionValue(itemKey: string, componentKey?: string): boolean | undefined {\n if (componentKey) {\n return this.cache.displayConditions[itemKey]?.components?.[componentKey]?.result;\n }\n return this.cache.displayConditions[itemKey]?.root?.result;\n }\n\n getDisabledConditionValue(itemKey: string, componentKey: string): boolean | undefined {\n return this.cache.disabledConditions[itemKey]?.components?.[componentKey]?.result;\n }\n\n getTemplateValue(templateValueKey: string): ResponseValue | undefined {\n return this.cache.templateValues[templateValueKey]?.value;\n }\n\n getValidationValues(itemKey: string): {\n [validationKey: string]: boolean;\n } | undefined {\n const validations = this.cache.validations[itemKey];\n if (!validations) {\n return undefined;\n }\n return Object.keys(validations).reduce((acc, validationKey) => {\n acc[validationKey] = validations[validationKey].result;\n return acc;\n }, {} as { [validationKey: string]: boolean });\n }\n\n // INIT METHODS\n\n private initCache() {\n this.cache = {\n validations: {},\n displayConditions: {},\n templateValues: {},\n disabledConditions: {},\n }\n\n const templateKeys = this.surveyDef.getTemplateValueKeys();\n templateKeys.forEach(templateKey => {\n this.cache.templateValues[templateKey] = {\n value: undefined,\n templateDef: this.surveyDef.getTemplateValue(templateKey),\n };\n });\n\n this.surveyDef.surveyItems.forEach((item, itemId) => {\n // Init validations\n if (item.validations && Object.keys(item.validations).length > 0) {\n this.cache.validations[itemId] = {};\n Object.keys(item.validations).forEach(validationKey => {\n const valExp = item.validations![validationKey];\n if (!valExp) {\n console.warn('initCache: validation expression not found: ' + itemId + ' ' + validationKey);\n return;\n }\n this.cache.validations[itemId][validationKey] = {\n expression: valExp,\n result: false,\n };\n });\n }\n\n // Init display conditions\n if (item.displayConditions !== undefined && (item.displayConditions.root || item.displayConditions.components)) {\n this.cache.displayConditions[itemId] = {};\n if (item.displayConditions.root) {\n this.cache.displayConditions[itemId].root = {\n expression: item.displayConditions.root,\n result: false,\n };\n }\n if (item.displayConditions.components) {\n this.cache.displayConditions[itemId].components = {};\n Object.keys(item.displayConditions.components).forEach(componentKey => {\n const compExp = item.displayConditions?.components?.[componentKey];\n if (!compExp) {\n console.warn('initCache: display condition component expression not found: ' + itemId + ' ' + componentKey);\n return;\n }\n this.cache.displayConditions[itemId].components![componentKey] = {\n expression: compExp,\n result: false,\n };\n });\n }\n }\n\n // Init disable conditions\n if (item.disabledConditions !== undefined && item.disabledConditions.components !== undefined) {\n this.cache.disabledConditions[itemId] = {\n components: {}\n };\n Object.keys(item.disabledConditions.components).forEach(componentKey => {\n const compExp = item.disabledConditions?.components?.[componentKey];\n if (!compExp) {\n console.warn('initCache: disabled condition component expression not found: ' + itemId + ' ' + componentKey);\n return;\n }\n this.cache.disabledConditions[itemId].components![componentKey] = {\n expression: compExp,\n result: false,\n };\n });\n }\n });\n }\n\n\n private initResponseObject(items: Map<string, SurveyItemCore>): {\n [itemId: string]: SurveyItemResponse;\n } {\n const respGroup: {\n [itemId: string]: SurveyItemResponse;\n } = {};\n\n items.forEach((item, itemId) => {\n if (!item.isInteractive) {\n return;\n } else {\n const prefill = this.prefills?.[itemId];\n const applyPrefill = prefill && prefill.itemType === item.type;\n respGroup[itemId] = new SurveyItemResponse(\n { itemId: itemId, itemType: item.type },\n applyPrefill ? prefill.response : undefined,\n )\n }\n });\n\n return respGroup;\n }\n\n private shouldRender(itemId: string, componentId?: string): boolean {\n const displayConditionResult = this.getDisplayConditionValue(itemId, componentId);\n if (displayConditionResult !== undefined) {\n return displayConditionResult;\n }\n return true;\n }\n\n private sequentialRender(groupDef: GroupItemCore): RenderedSurveyItem {\n const newItems: RenderedSurveyItem[] = [];\n\n for (const itemId of groupDef.items || []) {\n const shouldRender = this.shouldRender(itemId);\n if (!shouldRender) {\n continue;\n }\n\n const itemDef = this.surveyDef.surveyItems.get(itemId);\n if (!itemDef) {\n console.warn('sequentialRender: item not found: ' + itemId);\n continue;\n }\n\n if (itemDef.type === ReservedSurveyItemTypes.Group) {\n newItems.push(this.renderGroup(itemDef as GroupItemCore));\n continue;\n }\n\n newItems.push({\n id: itemId,\n type: itemDef.type,\n });\n }\n\n return {\n id: groupDef.id,\n type: ReservedSurveyItemTypes.Group,\n items: newItems\n };\n }\n\n private randomizedItemRender(groupDef: GroupItemCore, parent: RenderedSurveyItem): RenderedSurveyItem {\n const newItems: RenderedSurveyItem[] = parent.items?.filter(rItem =>\n this.shouldRender(rItem.id)\n ) || [];\n\n\n const itemIds = groupDef.items || [];\n const shuffledIndices = shuffleIndices(itemIds.length);\n\n for (const index of shuffledIndices) {\n const itemId = itemIds[index];\n const alreadyRenderedItem = parent.items?.find(rItem => rItem.id === itemId);\n if (alreadyRenderedItem) {\n continue;\n }\n\n const shouldRender = this.shouldRender(itemId);\n if (!shouldRender) {\n continue;\n }\n\n const itemDef = this.surveyDef.surveyItems.get(itemId);\n if (!itemDef) {\n console.warn('randomizedItemRender: item not found: ' + itemId);\n continue;\n }\n\n if (itemDef.type === ReservedSurveyItemTypes.Group) {\n newItems.push(this.renderGroup(itemDef as GroupItemCore, parent));\n continue;\n }\n\n newItems.push({\n id: itemId,\n type: itemDef.type,\n });\n }\n\n return {\n id: groupDef.id,\n type: ReservedSurveyItemTypes.Group,\n items: newItems\n };\n }\n\n private renderGroup(groupDef: GroupItemCore, parent?: RenderedSurveyItem): RenderedSurveyItem {\n if (!parent) {\n parent = {\n id: groupDef.id,\n type: ReservedSurveyItemTypes.Group,\n items: []\n };\n }\n\n if (groupDef.config.shuffleItems) {\n return this.randomizedItemRender(groupDef, parent);\n }\n\n return this.sequentialRender(groupDef);\n }\n\n private reRenderSurveyTree() {\n if (!this.surveyDef.rootItem) {\n throw new Error('reRenderSurveyTree: root item not found');\n }\n this.renderedSurveyTree = this.renderGroup(this.surveyDef.rootItem as GroupItemCore);\n }\n\n private _registerSurveyEvent(event: SurveyEvent) {\n this._events.push(event);\n }\n\n private _getTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n }\n\n getResponseItem(itemId: string): SurveyItemResponse | undefined {\n return this.responses[itemId];\n }\n\n private evalExpressions() {\n const evalEngine = new ExpressionEvaluator(\n {\n responses: this.responses,\n surveyContext: this.context,\n }\n );\n this.evalTemplateValues(evalEngine);\n this.evalDisplayConditions(evalEngine);\n this.evalDisableConditions(evalEngine);\n this.evalValidations(evalEngine);\n }\n\n\n private evalTemplateValues(evalEngine: ExpressionEvaluator) {\n Object.keys(this.cache.templateValues).forEach(templateValueKey => {\n const templateValue = this.cache.templateValues[templateValueKey];\n if (!templateValue.templateDef?.expression) {\n console.warn('evalTemplateValues: template value expression not found: ' + templateValueKey);\n return;\n }\n\n let evaluatedValue = evalEngine.eval(templateValue.templateDef.expression);\n if (evaluatedValue === undefined) {\n console.warn('evalTemplateValues: template value expression returned undefined: ' + templateValueKey);\n return;\n }\n\n switch (templateValue.templateDef.type) {\n case TemplateDefTypes.Date2String:\n if (evaluatedValue.type !== ValueType.date) {\n console.warn('evalTemplateValues: template value expression returned non-date value: ' + templateValueKey);\n return;\n }\n evaluatedValue = {\n type: ValueType.string,\n value: format(new Date(evaluatedValue.value * 1000), (templateValue.templateDef as TemplateValueFormatDate).dateFormat),\n };\n break;\n default:\n break;\n }\n this.cache.templateValues[templateValueKey].value = evaluatedValue;\n });\n }\n\n private evalDisplayConditions(evalEngine: ExpressionEvaluator) {\n Object.keys(this.cache.displayConditions).forEach(itemKey => {\n const displayCondition = this.cache.displayConditions[itemKey];\n if (displayCondition.root) {\n const resolvedValue = evalEngine.eval(displayCondition.root.expression);\n if (resolvedValue === undefined || resolvedValue.type !== ValueType.boolean) {\n console.warn('evalDisplayConditions: display condition expression returned undefined: ' + itemKey);\n return;\n }\n this.cache.displayConditions[itemKey].root!.result = resolvedValue.value;\n }\n if (displayCondition.components) {\n Object.keys(displayCondition.components).forEach(componentKey => {\n const resolvedValue = evalEngine.eval(displayCondition.components![componentKey].expression);\n if (resolvedValue === undefined || resolvedValue.type !== ValueType.boolean) {\n console.warn('evalDisplayConditions: display condition component expression returned undefined: ' + itemKey + '.' + componentKey);\n return;\n }\n this.cache.displayConditions[itemKey].components![componentKey].result = resolvedValue.value;\n });\n }\n });\n }\n\n private evalDisableConditions(evalEngine: ExpressionEvaluator) {\n Object.keys(this.cache.disabledConditions).forEach(itemKey => {\n const disableCondition = this.cache.disabledConditions[itemKey];\n if (disableCondition.components) {\n Object.keys(disableCondition.components).forEach(componentKey => {\n const resolvedValue = evalEngine.eval(disableCondition.components![componentKey].expression);\n if (resolvedValue === undefined || resolvedValue.type !== ValueType.boolean) {\n console.warn('evalDisableConditions: disable condition component expression returned undefined: ' + itemKey + '.' + componentKey);\n return;\n }\n this.cache.disabledConditions[itemKey].components![componentKey].result = resolvedValue.value;\n });\n }\n });\n }\n\n private evalValidations(evalEngine: ExpressionEvaluator) {\n Object.keys(this.cache.validations).forEach(itemId => {\n const validation = this.cache.validations[itemId];\n\n Object.keys(validation).forEach(validationKey => {\n const resolvedValue = evalEngine.eval(validation[validationKey].expression);\n if (resolvedValue === undefined || resolvedValue.type !== ValueType.boolean) {\n console.warn('evalValidations: validation expression returned undefined: ' + itemId + '.' + validationKey);\n return;\n }\n this.cache.validations[itemId][validationKey].result = resolvedValue.value;\n });\n });\n }\n}\n\nexport const flattenTree = (itemTree: RenderedSurveyItem): RenderedSurveyItem[] => {\n const flatTree = new Array<RenderedSurveyItem>();\n\n itemTree.items?.forEach(item => {\n if (item.type === ReservedSurveyItemTypes.Group) {\n flatTree.push(...flattenTree(item));\n } else {\n flatTree.push({ ...item });\n }\n });\n return flatTree;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@case-framework/survey-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Implementation of the survey core to use in typescript/javascript projects.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"build"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "jest --config jestconfig.json",
|
|
11
|
+
"build": "tsdown",
|
|
12
|
+
"lint": "eslint src",
|
|
13
|
+
"lint:fix": "eslint src --fix"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"survey engine"
|
|
17
|
+
],
|
|
18
|
+
"author": "phev8",
|
|
19
|
+
"license": "ISC",
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@eslint/js": "^9.39.2",
|
|
22
|
+
"@types/jest": "^30.0.0",
|
|
23
|
+
"eslint": "^9.39.2",
|
|
24
|
+
"jest": "^30.0.2",
|
|
25
|
+
"ts-jest": "^29.4.6",
|
|
26
|
+
"tsdown": "^0.20.1",
|
|
27
|
+
"typescript": "^5.8.3",
|
|
28
|
+
"typescript-eslint": "^8.54.0"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"date-fns": "^4.1.0"
|
|
32
|
+
},
|
|
33
|
+
"main": "./build/index.mjs",
|
|
34
|
+
"types": "./build/index.d.mts",
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./build/index.d.mts",
|
|
38
|
+
"import": "./build/index.mjs"
|
|
39
|
+
},
|
|
40
|
+
"./editor": {
|
|
41
|
+
"types": "./build/editor.d.mts",
|
|
42
|
+
"import": "./build/editor.mjs"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/case-framework/case-survey-toolkit"
|
|
48
|
+
}
|
|
49
|
+
}
|