@case-framework/survey-items 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.mjs","names":[],"sources":["../src/form.ts"],"sourcesContent":["import {\n ContentType,\n SurveyItemTranslations,\n ValueType,\n generateCodingKey,\n generateId,\n getContentPlainText,\n type Content,\n} from \"@case-framework/survey-core\";\n\nexport type FormFieldType =\n | \"input\"\n | \"textarea\"\n | \"number\"\n | \"datepicker\"\n | \"switch\"\n | \"select\"\n | \"slider\";\n\nexport const FORM_DATEPICKER_FIELD_MODES = [\"year\", \"year-month\", \"year-month-day\"] as const;\n\nexport type FormDatepickerFieldMode = (typeof FORM_DATEPICKER_FIELD_MODES)[number];\n\nexport function getFormFieldValueType(field: { type?: unknown }): ValueType {\n switch (field.type) {\n case \"number\":\n case \"slider\":\n return ValueType.number;\n case \"datepicker\":\n return ValueType.date;\n case \"switch\":\n return ValueType.boolean;\n default:\n return ValueType.string;\n }\n}\n\nexport type FormFieldValidationType =\n | \"required\"\n | \"minLength\"\n | \"maxLength\"\n | \"pattern\"\n | \"email\"\n | \"url\"\n | \"integer\"\n | \"min\"\n | \"max\"\n | \"minDate\"\n | \"maxDate\"\n | \"mustBeTrue\";\n\nexport interface FormFieldValidationConfig {\n id: string;\n type: FormFieldValidationType;\n value?: number | string;\n message?: string;\n}\n\nexport type FormFieldEffectiveValidationType = \"required\" | FormFieldValidationType;\n\nexport interface FormFieldEffectiveValidationConfig {\n id: string;\n type: FormFieldEffectiveValidationType;\n value?: number | string;\n message?: string;\n source: \"required\" | \"validation\";\n}\n\nexport interface FormFieldSelectOptionConfig {\n id: string;\n value: string;\n label?: string;\n}\n\nexport interface FormInputFieldControlConfig {\n type: \"input\";\n placeholder?: string;\n inputMode?: \"text\" | \"email\" | \"tel\" | \"url\" | \"password\";\n autocomplete?: string;\n}\n\nexport interface FormTextareaFieldControlConfig {\n type: \"textarea\";\n placeholder?: string;\n rows?: number;\n}\n\nexport interface FormNumberFieldControlConfig {\n type: \"number\";\n placeholder?: string;\n step?: number;\n unit?: string;\n defaultValue?: number;\n}\n\nexport interface FormDatepickerFieldControlConfig {\n type: \"datepicker\";\n placeholder?: string;\n mode: FormDatepickerFieldMode;\n}\n\nexport interface FormSwitchFieldControlConfig {\n type: \"switch\";\n checkedLabel?: string;\n uncheckedLabel?: string;\n defaultChecked?: boolean;\n}\n\nexport interface FormSelectFieldControlConfig {\n type: \"select\";\n placeholder?: string;\n allowClear?: boolean;\n options: FormFieldSelectOptionConfig[];\n}\n\nexport interface FormSliderFieldControlConfig {\n type: \"slider\";\n min?: number;\n max?: number;\n step?: number;\n defaultValue?: number;\n showValue?: boolean;\n}\n\nexport type FormFieldControlConfig =\n | FormInputFieldControlConfig\n | FormTextareaFieldControlConfig\n | FormNumberFieldControlConfig\n | FormDatepickerFieldControlConfig\n | FormSwitchFieldControlConfig\n | FormSelectFieldControlConfig\n | FormSliderFieldControlConfig;\n\nexport interface FormFieldConfig {\n id: string;\n key: string;\n type: FormFieldType;\n label?: string;\n description?: string;\n errorMessage?: string;\n required?: boolean;\n controller: FormFieldControlConfig;\n validations: FormFieldValidationConfig[];\n hasValidations?: boolean;\n isInvalid?: boolean;\n}\n\nexport function getFormFieldEffectiveValidations(\n field: Pick<FormFieldConfig, \"id\" | \"required\" | \"validations\">,\n): FormFieldEffectiveValidationConfig[] {\n const effectiveValidations = field.validations.map((validation) => ({\n ...validation,\n source: \"validation\" as const,\n }));\n\n if (\n field.required !== true ||\n effectiveValidations.some((validation) => validation.type === \"required\")\n ) {\n return effectiveValidations;\n }\n\n return [\n {\n id: `${field.id}-required`,\n type: \"required\",\n source: \"required\",\n },\n ...effectiveValidations,\n ];\n}\n\n/**\n * Column counts keyed by field group card width (container), not the viewport.\n * Breakpoints match `@container (width >= …)` on `form-field-group`: 20rem / 24rem / 28rem / 36rem.\n */\nexport interface FormFieldGroupLayoutConfig {\n /** Below @xs (under 20rem) */\n base: number;\n /** @xs — width >= 20rem */\n xs: number;\n /** @sm — width >= 24rem */\n sm: number;\n /** @md — width >= 28rem */\n md: number;\n /** @xl — width >= 36rem */\n xl: number;\n}\n\nexport interface FormFieldGroupConfig {\n id: string;\n title?: string;\n description?: string;\n hasDisplayCondition?: boolean;\n layout: FormFieldGroupLayoutConfig;\n fields: FormFieldConfig[];\n}\n\nexport interface FormItemConfig {\n id: string;\n /** Editor-facing complexity level; it does not change participant behavior. */\n authoringMode: \"simple\" | \"custom\";\n fieldGroups: FormFieldGroupConfig[];\n}\n\nexport function createFormItemConfig(itemId: string): FormItemConfig {\n return {\n id: itemId,\n authoringMode: \"custom\",\n fieldGroups: [],\n };\n}\n\nfunction createPlainTextContent(value?: string): Content | undefined {\n const normalizedValue = normalizeOptionalString(value);\n\n return normalizedValue\n ? {\n type: ContentType.plain,\n content: normalizedValue,\n }\n : undefined;\n}\n\nfunction getTranslatedPlainText(\n itemTranslations: SurveyItemTranslations | undefined,\n locale: string,\n contentKey: string,\n fallbackLocale?: string,\n): string | undefined {\n const content = itemTranslations?.getContent(locale, contentKey, fallbackLocale);\n const plainText = getContentPlainText(content).trim();\n\n return plainText || undefined;\n}\n\nconst FORM_FIELD_TRANSLATION_PREFIX = \"fields\";\nconst FORM_FIELD_GROUP_TRANSLATION_PREFIX = \"fieldGroups\";\n\nfunction withFormTranslationNamespace(prefix: string, translationNamespace?: string): string {\n return translationNamespace?.trim() ? `${translationNamespace}.${prefix}` : prefix;\n}\n\nexport function getFormFieldGroupTranslationPrefix(\n groupId: string,\n translationNamespace?: string,\n): string {\n return withFormTranslationNamespace(\n `${FORM_FIELD_GROUP_TRANSLATION_PREFIX}.${groupId}`,\n translationNamespace,\n );\n}\n\nexport function getFormFieldGroupTitleContentKey(\n groupId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldGroupTranslationPrefix(groupId, translationNamespace)}.title`;\n}\n\nexport function getFormFieldGroupDescriptionContentKey(\n groupId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldGroupTranslationPrefix(groupId, translationNamespace)}.description`;\n}\n\nexport function getFormFieldTranslationPrefix(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return withFormTranslationNamespace(\n `${FORM_FIELD_TRANSLATION_PREFIX}.${fieldId}`,\n translationNamespace,\n );\n}\n\nexport function getFormFieldLabelContentKey(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.label`;\n}\n\nexport function getFormFieldDescriptionContentKey(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.description`;\n}\n\nexport function getFormFieldErrorMessageContentKey(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.error`;\n}\n\nexport function getFormFieldPlaceholderContentKey(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.placeholder`;\n}\n\nexport function getFormFieldUnitContentKey(fieldId: string, translationNamespace?: string): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.unit`;\n}\n\nexport function getFormFieldCheckedLabelContentKey(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.checkedLabel`;\n}\n\nexport function getFormFieldUncheckedLabelContentKey(\n fieldId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.uncheckedLabel`;\n}\n\nexport function getFormFieldOptionLabelContentKey(\n fieldId: string,\n optionId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.options.${optionId}.label`;\n}\n\nexport function getFormFieldValidationMessageContentKey(\n fieldId: string,\n validationId: string,\n translationNamespace?: string,\n): string {\n return `${getFormFieldTranslationPrefix(fieldId, translationNamespace)}.validations.${validationId}.message`;\n}\n\nexport function getFormFieldTranslationKeys(\n field: Pick<FormFieldConfig, \"id\" | \"type\" | \"controller\" | \"validations\">,\n translationNamespace?: string,\n): string[] {\n const keys = [\n getFormFieldLabelContentKey(field.id, translationNamespace),\n getFormFieldDescriptionContentKey(field.id, translationNamespace),\n getFormFieldErrorMessageContentKey(field.id, translationNamespace),\n ...field.validations.map((validation) =>\n getFormFieldValidationMessageContentKey(field.id, validation.id, translationNamespace),\n ),\n ];\n\n switch (field.type) {\n case \"textarea\":\n case \"datepicker\":\n case \"input\":\n keys.push(getFormFieldPlaceholderContentKey(field.id, translationNamespace));\n break;\n case \"number\":\n keys.push(getFormFieldPlaceholderContentKey(field.id, translationNamespace));\n keys.push(getFormFieldUnitContentKey(field.id, translationNamespace));\n break;\n case \"switch\":\n keys.push(getFormFieldCheckedLabelContentKey(field.id, translationNamespace));\n keys.push(getFormFieldUncheckedLabelContentKey(field.id, translationNamespace));\n break;\n case \"select\": {\n keys.push(getFormFieldPlaceholderContentKey(field.id, translationNamespace));\n const controller = field.controller as FormSelectFieldControlConfig;\n keys.push(\n ...controller.options.map((option) =>\n getFormFieldOptionLabelContentKey(field.id, option.id, translationNamespace),\n ),\n );\n break;\n }\n case \"slider\":\n break;\n }\n\n return keys;\n}\n\nexport function getFormFieldGroupTranslationKeys(\n group: Pick<FormFieldGroupConfig, \"id\">,\n translationNamespace?: string,\n): string[] {\n return [\n getFormFieldGroupTitleContentKey(group.id, translationNamespace),\n getFormFieldGroupDescriptionContentKey(group.id, translationNamespace),\n ];\n}\n\nexport function writeFormFieldGroupTranslations(\n itemTranslations: SurveyItemTranslations,\n locale: string,\n group: Pick<FormFieldGroupConfig, \"id\" | \"title\" | \"description\">,\n translationNamespace?: string,\n): void {\n itemTranslations.setContent(\n locale,\n getFormFieldGroupTitleContentKey(group.id, translationNamespace),\n createPlainTextContent(group.title),\n );\n itemTranslations.setContent(\n locale,\n getFormFieldGroupDescriptionContentKey(group.id, translationNamespace),\n createPlainTextContent(group.description),\n );\n}\n\nexport function writeFormFieldTranslations(\n itemTranslations: SurveyItemTranslations,\n locale: string,\n field: Pick<\n FormFieldConfig,\n \"id\" | \"type\" | \"label\" | \"description\" | \"errorMessage\" | \"controller\" | \"validations\"\n >,\n translationNamespace?: string,\n): void {\n itemTranslations.setContent(\n locale,\n getFormFieldLabelContentKey(field.id, translationNamespace),\n createPlainTextContent(field.label),\n );\n itemTranslations.setContent(\n locale,\n getFormFieldDescriptionContentKey(field.id, translationNamespace),\n createPlainTextContent(field.description),\n );\n itemTranslations.setContent(\n locale,\n getFormFieldErrorMessageContentKey(field.id, translationNamespace),\n createPlainTextContent(field.errorMessage),\n );\n\n for (const validation of field.validations) {\n itemTranslations.setContent(\n locale,\n getFormFieldValidationMessageContentKey(field.id, validation.id, translationNamespace),\n createPlainTextContent(validation.message),\n );\n }\n\n switch (field.type) {\n case \"textarea\":\n case \"datepicker\":\n case \"input\": {\n const controller = field.controller as\n | FormTextareaFieldControlConfig\n | FormDatepickerFieldControlConfig\n | FormInputFieldControlConfig;\n itemTranslations.setContent(\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n createPlainTextContent(controller.placeholder),\n );\n break;\n }\n case \"number\": {\n const controller = field.controller as FormNumberFieldControlConfig;\n itemTranslations.setContent(\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n createPlainTextContent(controller.placeholder),\n );\n itemTranslations.setContent(\n locale,\n getFormFieldUnitContentKey(field.id, translationNamespace),\n createPlainTextContent(controller.unit),\n );\n break;\n }\n case \"switch\": {\n const controller = field.controller as FormSwitchFieldControlConfig;\n itemTranslations.setContent(\n locale,\n getFormFieldCheckedLabelContentKey(field.id, translationNamespace),\n createPlainTextContent(controller.checkedLabel),\n );\n itemTranslations.setContent(\n locale,\n getFormFieldUncheckedLabelContentKey(field.id, translationNamespace),\n createPlainTextContent(controller.uncheckedLabel),\n );\n break;\n }\n case \"select\": {\n const controller = field.controller as FormSelectFieldControlConfig;\n itemTranslations.setContent(\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n createPlainTextContent(controller.placeholder),\n );\n for (const option of controller.options) {\n itemTranslations.setContent(\n locale,\n getFormFieldOptionLabelContentKey(field.id, option.id, translationNamespace),\n createPlainTextContent(option.label),\n );\n }\n break;\n }\n case \"slider\":\n break;\n }\n}\n\nfunction withTranslatedFieldContent(\n field: FormFieldConfig,\n itemTranslations: SurveyItemTranslations | undefined,\n locale: string,\n fallbackLocale?: string,\n translationNamespace?: string,\n): FormFieldConfig {\n const translatedField: FormFieldConfig = {\n ...field,\n label:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldLabelContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? field.label,\n description:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldDescriptionContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? field.description,\n errorMessage:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldErrorMessageContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? field.errorMessage,\n validations: field.validations.map((validation) => ({\n ...validation,\n message:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldValidationMessageContentKey(field.id, validation.id, translationNamespace),\n fallbackLocale,\n ) ?? validation.message,\n })),\n };\n\n switch (field.type) {\n case \"textarea\": {\n const controller = field.controller as FormTextareaFieldControlConfig;\n\n translatedField.controller = {\n ...controller,\n placeholder:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.placeholder,\n };\n break;\n }\n case \"number\": {\n const controller = field.controller as FormNumberFieldControlConfig;\n\n translatedField.controller = {\n ...controller,\n placeholder:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.placeholder,\n unit:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldUnitContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.unit,\n };\n break;\n }\n case \"datepicker\": {\n const controller = field.controller as FormDatepickerFieldControlConfig;\n\n translatedField.controller = {\n ...controller,\n placeholder:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.placeholder,\n };\n break;\n }\n case \"switch\": {\n const controller = field.controller as FormSwitchFieldControlConfig;\n\n translatedField.controller = {\n ...controller,\n checkedLabel:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldCheckedLabelContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.checkedLabel,\n uncheckedLabel:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldUncheckedLabelContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.uncheckedLabel,\n };\n break;\n }\n case \"select\": {\n const controller = field.controller as FormSelectFieldControlConfig;\n\n translatedField.controller = {\n ...controller,\n placeholder:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.placeholder,\n options: controller.options.map((option) => ({\n ...option,\n label:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldOptionLabelContentKey(field.id, option.id, translationNamespace),\n fallbackLocale,\n ) ?? option.label,\n })),\n };\n break;\n }\n case \"slider\":\n break;\n case \"input\":\n default: {\n const controller = field.controller as FormInputFieldControlConfig;\n\n translatedField.controller = {\n ...controller,\n placeholder:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldPlaceholderContentKey(field.id, translationNamespace),\n fallbackLocale,\n ) ?? controller.placeholder,\n };\n break;\n }\n }\n\n return translatedField;\n}\n\nfunction withTranslatedFieldGroupContent(\n group: FormFieldGroupConfig,\n itemTranslations: SurveyItemTranslations | undefined,\n locale: string,\n fallbackLocale?: string,\n translationNamespace?: string,\n): FormFieldGroupConfig {\n return {\n ...group,\n title:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldGroupTitleContentKey(group.id, translationNamespace),\n fallbackLocale,\n ) ?? group.title,\n description:\n getTranslatedPlainText(\n itemTranslations,\n locale,\n getFormFieldGroupDescriptionContentKey(group.id, translationNamespace),\n fallbackLocale,\n ) ?? group.description,\n fields: group.fields.map((field) =>\n withTranslatedFieldContent(\n field,\n itemTranslations,\n locale,\n fallbackLocale,\n translationNamespace,\n ),\n ),\n };\n}\n\nexport function withFormItemTranslatedContent(\n config: FormItemConfig,\n itemTranslations: SurveyItemTranslations | undefined,\n locale: string,\n options: {\n fallbackLocale?: string;\n translationNamespace?: string;\n } = {},\n): FormItemConfig {\n const { fallbackLocale, translationNamespace } = options;\n\n return {\n ...config,\n fieldGroups: config.fieldGroups.map((group) =>\n withTranslatedFieldGroupContent(\n group,\n itemTranslations,\n locale,\n fallbackLocale,\n translationNamespace,\n ),\n ),\n };\n}\n\nfunction withoutTranslatedFieldContent(field: FormFieldConfig): FormFieldConfig {\n const serializedField: FormFieldConfig = {\n ...field,\n label: undefined,\n description: undefined,\n errorMessage: undefined,\n required: undefined,\n hasValidations: undefined,\n isInvalid: undefined,\n validations: field.validations.map((validation) => ({\n ...validation,\n message: undefined,\n })),\n };\n\n switch (field.type) {\n case \"textarea\": {\n const controller = field.controller as FormTextareaFieldControlConfig;\n serializedField.controller = {\n ...controller,\n placeholder: undefined,\n };\n break;\n }\n case \"number\": {\n const controller = field.controller as FormNumberFieldControlConfig;\n serializedField.controller = {\n ...controller,\n placeholder: undefined,\n unit: undefined,\n };\n break;\n }\n case \"datepicker\": {\n const controller = field.controller as FormDatepickerFieldControlConfig;\n serializedField.controller = {\n ...controller,\n placeholder: undefined,\n };\n break;\n }\n case \"switch\": {\n const controller = field.controller as FormSwitchFieldControlConfig;\n serializedField.controller = {\n ...controller,\n checkedLabel: undefined,\n uncheckedLabel: undefined,\n };\n break;\n }\n case \"select\": {\n const controller = field.controller as FormSelectFieldControlConfig;\n serializedField.controller = {\n ...controller,\n placeholder: undefined,\n options: controller.options.map((option) => ({\n ...option,\n label: undefined,\n })),\n };\n break;\n }\n case \"slider\":\n break;\n case \"input\":\n default: {\n const controller = field.controller as FormInputFieldControlConfig;\n serializedField.controller = {\n ...controller,\n placeholder: undefined,\n };\n break;\n }\n }\n\n return serializedField;\n}\n\nfunction withoutTranslatedFieldGroupContent(group: FormFieldGroupConfig): FormFieldGroupConfig {\n return {\n ...group,\n title: undefined,\n description: undefined,\n fields: group.fields.map((field) => withoutTranslatedFieldContent(field)),\n };\n}\n\nexport function withoutFormItemTranslatedContent(config: FormItemConfig): FormItemConfig {\n return {\n ...config,\n fieldGroups: config.fieldGroups.map((group) => withoutTranslatedFieldGroupContent(group)),\n };\n}\n\nfunction normalizeColumnCount(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return 1;\n }\n\n return Math.min(4, Math.max(1, Math.round(value)));\n}\n\nfunction normalizeFormFieldGroupLayoutConfig(rawLayout: unknown): FormFieldGroupLayoutConfig {\n const layout =\n rawLayout && typeof rawLayout === \"object\"\n ? (rawLayout as Partial<FormFieldGroupLayoutConfig> & { xs?: unknown; lg?: unknown })\n : {};\n\n const hasBaseKey = Object.prototype.hasOwnProperty.call(layout, \"base\");\n const hasXsKey = Object.prototype.hasOwnProperty.call(layout, \"xs\");\n\n // Legacy configs: three tiers as sm → md → lg (no base / xs).\n if (\n !hasBaseKey &&\n !hasXsKey &&\n (layout.sm !== undefined || layout.md !== undefined || layout.lg !== undefined)\n ) {\n const narrow = normalizeColumnCount(layout.sm);\n\n return {\n base: narrow,\n xs: narrow,\n sm: normalizeColumnCount(layout.md ?? layout.sm),\n md: normalizeColumnCount(layout.lg ?? layout.md ?? layout.sm),\n xl: normalizeColumnCount(layout.lg ?? layout.md ?? layout.sm),\n };\n }\n\n const xs = normalizeColumnCount(layout.xs ?? layout.sm ?? 1);\n const sm = normalizeColumnCount(layout.sm ?? 1);\n const md = normalizeColumnCount(layout.md ?? 1);\n const xl = normalizeColumnCount(layout.xl ?? layout.lg ?? 1);\n\n return {\n base: normalizeColumnCount(hasBaseKey ? layout.base : xs),\n xs,\n sm,\n md,\n xl,\n };\n}\n\n/** CSS custom properties for `.form-field-group-layout-scope` + `.form-field-group-grid`. */\nexport function formFieldGroupLayoutCssVars(\n layout: FormFieldGroupLayoutConfig,\n): Record<string, string> {\n return {\n \"--form-group-cols-base\": String(layout.base),\n \"--form-group-cols-xs\": String(layout.xs),\n \"--form-group-cols-sm\": String(layout.sm),\n \"--form-group-cols-md\": String(layout.md),\n \"--form-group-cols-xl\": String(layout.xl),\n };\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmedValue = value.trim();\n\n return trimmedValue || undefined;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return undefined;\n }\n\n return value;\n}\n\nfunction normalizeOptionalBoolean(value: unknown): boolean | undefined {\n return value === true ? true : value === false ? false : undefined;\n}\n\nfunction normalizeFormFieldKey(id: string, key?: string): string {\n return (\n key?.trim() ||\n id\n .replace(/[^a-zA-Z0-9]/g, \"\")\n .slice(0, 4)\n .toUpperCase() ||\n generateCodingKey(4)\n );\n}\n\nfunction createDefaultFormFieldControlConfig(type: FormFieldType): FormFieldControlConfig {\n switch (type) {\n case \"textarea\":\n return {\n type,\n rows: 3,\n };\n case \"number\":\n return {\n type,\n step: 1,\n };\n case \"datepicker\":\n return {\n type,\n mode: \"year-month-day\",\n };\n case \"switch\":\n return {\n type,\n defaultChecked: false,\n };\n case \"select\":\n return {\n type,\n options: [],\n };\n case \"slider\":\n return {\n type,\n min: 0,\n max: 100,\n step: 1,\n defaultValue: 50,\n showValue: true,\n };\n case \"input\":\n default:\n return {\n type: \"input\",\n inputMode: \"text\",\n };\n }\n}\n\nfunction normalizeFormFieldSelectOptionConfig(\n rawOption: unknown,\n): FormFieldSelectOptionConfig | null {\n if (!rawOption || typeof rawOption !== \"object\") {\n return null;\n }\n\n const option = rawOption as Partial<FormFieldSelectOptionConfig>;\n const id = normalizeOptionalString(option.id) ?? generateId();\n const value = normalizeOptionalString(option.value);\n const label = normalizeOptionalString(option.label);\n\n if (!value && !label) {\n return null;\n }\n\n return {\n id,\n value: value ?? label ?? id,\n label,\n };\n}\n\nfunction hasDuplicateSelectOptionValue(options: FormFieldSelectOptionConfig[]): boolean {\n const seenValues = new Set<string>();\n\n for (const option of options) {\n const normalizedValue = option.value.trim().toLowerCase();\n\n if (!normalizedValue) {\n continue;\n }\n\n if (seenValues.has(normalizedValue)) {\n return true;\n }\n\n seenValues.add(normalizedValue);\n }\n\n return false;\n}\n\nfunction normalizeFormFieldValidationConfig(\n rawValidation: unknown,\n): FormFieldValidationConfig | null {\n if (!rawValidation || typeof rawValidation !== \"object\") {\n return null;\n }\n\n const validation = rawValidation as Partial<FormFieldValidationConfig>;\n const id = normalizeOptionalString(validation.id) ?? generateId();\n const message = normalizeOptionalString(validation.message);\n\n switch (validation.type) {\n case \"minLength\":\n case \"maxLength\":\n case \"min\":\n case \"max\": {\n const value = normalizeOptionalNumber(validation.value);\n\n if (value === undefined) {\n return null;\n }\n\n return {\n id,\n type: validation.type,\n value,\n message,\n };\n }\n case \"pattern\": {\n const value = normalizeOptionalString(validation.value);\n\n if (!value) {\n return null;\n }\n\n return {\n id,\n type: \"pattern\",\n value,\n message,\n };\n }\n case \"minDate\":\n case \"maxDate\": {\n const value = normalizeOptionalString(validation.value);\n\n if (!value) {\n return null;\n }\n\n return {\n id,\n type: validation.type,\n value,\n message,\n };\n }\n case \"email\":\n case \"url\":\n case \"integer\":\n case \"required\":\n case \"mustBeTrue\":\n return {\n id,\n type: validation.type,\n message,\n };\n default:\n return null;\n }\n}\n\nfunction normalizeFormFieldControlConfig(\n rawController: unknown,\n type: FormFieldType,\n): FormFieldControlConfig {\n const controller =\n rawController && typeof rawController === \"object\"\n ? (rawController as Record<string, unknown>)\n : {};\n\n switch (type) {\n case \"textarea\": {\n const defaults = createDefaultFormFieldControlConfig(type) as FormTextareaFieldControlConfig;\n\n return {\n type,\n placeholder: normalizeOptionalString(controller.placeholder),\n rows: Math.min(\n 12,\n Math.max(2, Math.round(normalizeOptionalNumber(controller.rows) ?? defaults.rows ?? 3)),\n ),\n };\n }\n case \"number\": {\n const defaults = createDefaultFormFieldControlConfig(type) as FormNumberFieldControlConfig;\n\n return {\n type,\n placeholder: normalizeOptionalString(controller.placeholder),\n step: normalizeOptionalNumber(controller.step) ?? defaults.step,\n unit: normalizeOptionalString(controller.unit),\n defaultValue: normalizeOptionalNumber(controller.defaultValue),\n };\n }\n case \"datepicker\": {\n const defaults = createDefaultFormFieldControlConfig(\n type,\n ) as FormDatepickerFieldControlConfig;\n\n return {\n type,\n placeholder: normalizeOptionalString(controller.placeholder),\n mode:\n controller.mode === \"year\" || controller.mode === \"year-month\"\n ? controller.mode\n : defaults.mode,\n };\n }\n case \"switch\":\n return {\n type,\n checkedLabel: normalizeOptionalString(controller.checkedLabel),\n uncheckedLabel: normalizeOptionalString(controller.uncheckedLabel),\n defaultChecked: normalizeOptionalBoolean(controller.defaultChecked) ?? false,\n };\n case \"select\": {\n const defaults = createDefaultFormFieldControlConfig(type) as FormSelectFieldControlConfig;\n\n return {\n type,\n placeholder: normalizeOptionalString(controller.placeholder),\n allowClear: normalizeOptionalBoolean(controller.allowClear),\n options: Array.isArray(controller.options)\n ? controller.options\n .map((option) => normalizeFormFieldSelectOptionConfig(option))\n .filter((option): option is FormFieldSelectOptionConfig => option !== null)\n : defaults.options,\n };\n }\n case \"slider\": {\n const defaults = createDefaultFormFieldControlConfig(type) as FormSliderFieldControlConfig;\n\n return {\n type,\n min: normalizeOptionalNumber(controller.min) ?? defaults.min,\n max: normalizeOptionalNumber(controller.max) ?? defaults.max,\n step: normalizeOptionalNumber(controller.step) ?? defaults.step,\n defaultValue: normalizeOptionalNumber(controller.defaultValue) ?? defaults.defaultValue,\n showValue: normalizeOptionalBoolean(controller.showValue) ?? defaults.showValue ?? true,\n };\n }\n case \"input\":\n default:\n return {\n type: \"input\",\n placeholder: normalizeOptionalString(controller.placeholder),\n inputMode:\n controller.inputMode === \"email\" ||\n controller.inputMode === \"tel\" ||\n controller.inputMode === \"url\" ||\n controller.inputMode === \"password\"\n ? controller.inputMode\n : \"text\",\n autocomplete: normalizeOptionalString(controller.autocomplete),\n };\n }\n}\n\nfunction hasDuplicateValidationType(validations: FormFieldValidationConfig[]): boolean {\n const seenValidationTypes = new Set<FormFieldValidationType>();\n\n for (const validation of validations) {\n if (seenValidationTypes.has(validation.type)) {\n return true;\n }\n\n seenValidationTypes.add(validation.type);\n }\n\n return false;\n}\n\nfunction isFormFieldConfigInvalid(\n field: Pick<FormFieldConfig, \"key\" | \"type\" | \"controller\" | \"validations\">,\n): boolean {\n if (!field.key.trim()) {\n return true;\n }\n\n if (hasDuplicateValidationType(field.validations)) {\n return true;\n }\n\n switch (field.type) {\n case \"number\": {\n const controller = field.controller as FormNumberFieldControlConfig;\n\n if (controller.step !== undefined && controller.step <= 0) {\n return true;\n }\n\n return false;\n }\n case \"datepicker\": {\n const minDate = field.validations.find((validation) => validation.type === \"minDate\")?.value;\n const maxDate = field.validations.find((validation) => validation.type === \"maxDate\")?.value;\n\n if (typeof minDate === \"string\" && typeof maxDate === \"string\" && minDate > maxDate) {\n return true;\n }\n\n return false;\n }\n case \"select\": {\n const controller = field.controller as FormSelectFieldControlConfig;\n\n return (\n controller.options.length === 0 ||\n controller.options.some((option) => !option.value.trim()) ||\n hasDuplicateSelectOptionValue(controller.options)\n );\n }\n case \"slider\": {\n const controller = field.controller as FormSliderFieldControlConfig;\n\n if (\n controller.min === undefined ||\n controller.max === undefined ||\n controller.step === undefined ||\n controller.defaultValue === undefined\n ) {\n return true;\n }\n\n return (\n controller.min >= controller.max ||\n controller.step <= 0 ||\n controller.defaultValue < controller.min ||\n controller.defaultValue > controller.max\n );\n }\n default:\n return field.validations.some((validation) => {\n if (\n (validation.type === \"minLength\" ||\n validation.type === \"maxLength\" ||\n validation.type === \"min\" ||\n validation.type === \"max\") &&\n typeof validation.value === \"number\"\n ) {\n return validation.value < 0;\n }\n\n if (\n (validation.type === \"pattern\" ||\n validation.type === \"minDate\" ||\n validation.type === \"maxDate\") &&\n typeof validation.value === \"string\"\n ) {\n return validation.value.trim().length === 0;\n }\n\n return false;\n });\n }\n}\n\nfunction normalizeFormFieldConfig(rawField: unknown): FormFieldConfig | null {\n if (!rawField || typeof rawField !== \"object\") {\n return null;\n }\n\n const field = rawField as Partial<FormFieldConfig>;\n const trimmedId = typeof field.id === \"string\" ? field.id.trim() : \"\";\n const trimmedKey = typeof field.key === \"string\" ? field.key.trim() : \"\";\n\n if (!trimmedId) {\n return null;\n }\n\n const normalizedKey = normalizeFormFieldKey(trimmedId, trimmedKey);\n const type =\n field.type === \"textarea\" ||\n field.type === \"number\" ||\n field.type === \"datepicker\" ||\n field.type === \"switch\" ||\n field.type === \"select\" ||\n field.type === \"slider\"\n ? field.type\n : \"input\";\n const normalizedRawValidations = Array.isArray(field.validations)\n ? field.validations\n .map((validation) => normalizeFormFieldValidationConfig(validation))\n .filter((validation): validation is FormFieldValidationConfig => validation !== null)\n : [];\n const validations = getFormFieldEffectiveValidations({\n id: trimmedId,\n required: field.required === true ? true : undefined,\n validations: normalizedRawValidations,\n }).map((validation) => ({\n id: validation.id,\n type: validation.type,\n value: validation.value,\n message: validation.message,\n }));\n const controller = normalizeFormFieldControlConfig(field.controller, type);\n const hasEffectiveValidations =\n getFormFieldEffectiveValidations({\n id: trimmedId,\n validations,\n }).length > 0;\n const normalizedField: FormFieldConfig = {\n id: trimmedId,\n key: normalizedKey,\n type,\n label: normalizeOptionalString(field.label),\n description: normalizeOptionalString(field.description),\n errorMessage: normalizeOptionalString(field.errorMessage),\n required: validations.some((validation) => validation.type === \"required\") ? true : undefined,\n controller,\n validations,\n hasValidations: hasEffectiveValidations ? true : undefined,\n isInvalid: isFormFieldConfigInvalid({\n key: normalizedKey,\n type,\n controller,\n validations,\n })\n ? true\n : undefined,\n };\n\n return normalizedField;\n}\n\nfunction normalizeFormFieldGroupConfig(rawGroup: unknown): FormFieldGroupConfig | null {\n if (!rawGroup || typeof rawGroup !== \"object\") {\n return null;\n }\n\n const group = rawGroup as Partial<FormFieldGroupConfig>;\n const trimmedId = typeof group.id === \"string\" ? group.id.trim() : \"\";\n const trimmedTitle = typeof group.title === \"string\" ? group.title.trim() : \"\";\n const trimmedDescription = typeof group.description === \"string\" ? group.description.trim() : \"\";\n\n if (!trimmedId) {\n return null;\n }\n\n return {\n id: trimmedId,\n title: trimmedTitle || undefined,\n description: trimmedDescription || undefined,\n hasDisplayCondition: group.hasDisplayCondition === true ? true : undefined,\n layout: normalizeFormFieldGroupLayoutConfig(group.layout),\n fields: Array.isArray(group.fields)\n ? group.fields\n .map((field) => normalizeFormFieldConfig(field))\n .filter((field): field is FormFieldConfig => field !== null)\n : [],\n };\n}\n\nexport function normalizeFormItemConfig(rawConfig: unknown, itemId: string): FormItemConfig {\n const config = (rawConfig ?? {}) as Partial<FormItemConfig>;\n\n return {\n id: typeof config.id === \"string\" && config.id.trim() ? config.id : itemId,\n authoringMode: config.authoringMode === \"simple\" ? \"simple\" : \"custom\",\n fieldGroups: Array.isArray(config.fieldGroups)\n ? config.fieldGroups\n .map((group) => normalizeFormFieldGroupConfig(group))\n .filter((group): group is FormFieldGroupConfig => group !== null)\n : [],\n };\n}\n\nexport function createFormFieldGroupConfig(): FormFieldGroupConfig {\n return {\n id: generateId(),\n layout: {\n base: 1,\n xs: 1,\n sm: 1,\n md: 1,\n xl: 1,\n },\n fields: [],\n };\n}\n\nexport function getNextAvailableFormFieldKey(fields: Pick<FormFieldConfig, \"key\">[]): string {\n const usedKeys = new Set(fields.map((field) => field.key.trim().toLowerCase()).filter(Boolean));\n\n let nextIndex = 1;\n\n while (usedKeys.has(`f${nextIndex}`)) {\n nextIndex += 1;\n }\n\n return `F${nextIndex}`;\n}\n\nexport function createFormFieldConfig(\n type: FormFieldType,\n key = generateCodingKey(4),\n): FormFieldConfig {\n return {\n id: generateId(),\n key,\n type,\n controller: createDefaultFormFieldControlConfig(type),\n validations: [],\n };\n}\n\nexport type FormAuthoringMode = FormItemConfig[\"authoringMode\"];\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst SIMPLE_FORM_FIELD_TYPES = new Set<FormFieldType>([\n \"input\",\n \"textarea\",\n \"number\",\n \"slider\",\n \"select\",\n \"datepicker\",\n \"switch\",\n]);\n\nexport const getFormAuthoringMode = (config: unknown): FormAuthoringMode =>\n isRecord(config) && config.authoringMode === \"simple\" ? \"simple\" : \"custom\";\n\nexport const hasSingleFormField = (config: unknown): boolean => {\n if (!isRecord(config) || !Array.isArray(config.fieldGroups) || config.fieldGroups.length !== 1) {\n return false;\n }\n\n const [group] = config.fieldGroups;\n if (!isRecord(group) || !Array.isArray(group.fields) || group.fields.length !== 1) {\n return false;\n }\n\n const layout = isRecord(group.layout) ? group.layout : undefined;\n if (\n group.hasDisplayCondition === true ||\n (layout &&\n [\"base\", \"xs\", \"sm\", \"md\", \"xl\"].some(\n (breakpoint) => layout[breakpoint] !== undefined && layout[breakpoint] !== 1,\n ))\n ) {\n return false;\n }\n\n const [field] = group.fields;\n return (\n isRecord(field) &&\n typeof field.id === \"string\" &&\n field.id.length > 0 &&\n typeof field.key === \"string\" &&\n field.key.length > 0 &&\n typeof field.type === \"string\" &&\n SIMPLE_FORM_FIELD_TYPES.has(field.type as FormFieldType) &&\n isRecord(field.controller) &&\n field.controller.type === field.type\n );\n};\n\nexport const isValidSimpleFormConfig = (config: unknown): boolean =>\n getFormAuthoringMode(config) !== \"simple\" || hasSingleFormField(config);\n\n/**\n * Canonicalizes the editor-facing mode without modifying groups, fields, or translations.\n * Missing modes and malformed simple forms become custom; valid simple forms stay simple.\n */\nexport const normalizeFormAuthoringConfig = (\n config: unknown,\n): Record<string, unknown> | undefined => {\n if (!isRecord(config)) {\n return undefined;\n }\n\n return {\n ...config,\n authoringMode:\n config.authoringMode === \"simple\" && hasSingleFormField(config) ? \"simple\" : \"custom\",\n };\n};\n\n/**\n * Returns true only for an in-place edit of the existing sole field that the simple editor can\n * still represent. Adding, moving, retyping, or exposing hidden field configuration is structural.\n */\nexport const isCompatibleSimpleFieldUpsert = ({\n config,\n field,\n groupId,\n index,\n}: {\n config: unknown;\n field: Record<string, unknown> & { id: string; key: string; type: string };\n groupId: string;\n index?: number;\n}): boolean => {\n if (\n getFormAuthoringMode(config) !== \"simple\" ||\n !isRecord(config) ||\n !Array.isArray(config.fieldGroups) ||\n config.fieldGroups.length !== 1 ||\n (index ?? 0) > 0\n ) {\n return false;\n }\n\n const [group] = config.fieldGroups;\n if (!isRecord(group) || group.id !== groupId || !Array.isArray(group.fields)) {\n return false;\n }\n\n const [existingField] = group.fields;\n if (!isRecord(existingField) || group.fields.length !== 1) {\n return false;\n }\n\n const controller = isRecord(field.controller) ? field.controller : undefined;\n const validationsUnchanged =\n field.validations === undefined ||\n JSON.stringify(field.validations) === JSON.stringify(existingField.validations);\n const simpleEditableKeys = new Set([\n \"id\",\n \"key\",\n \"type\",\n \"controller\",\n \"required\",\n \"validations\",\n ]);\n const hiddenConfigUnchanged = Object.keys(field)\n .filter((key) => !simpleEditableKeys.has(key))\n .every((key) => JSON.stringify(field[key]) === JSON.stringify(existingField[key]));\n\n return (\n existingField.id === field.id &&\n existingField.key === field.key &&\n existingField.type === field.type &&\n controller?.type === field.type &&\n validationsUnchanged &&\n hiddenConfigUnchanged\n );\n};\n\n/** Structural form edits leave simple mode unless the sole field remains representable there. */\nexport const transitionFormAuthoringMode = ({\n config,\n fieldGroups,\n preserveSimpleMode = false,\n}: {\n config: Record<string, unknown>;\n fieldGroups: Record<string, unknown>[];\n preserveSimpleMode?: boolean;\n}): Record<string, unknown> => {\n const nextConfig = { ...config, fieldGroups };\n if (getFormAuthoringMode(config) !== \"simple\") {\n return { ...nextConfig, authoringMode: \"custom\" };\n }\n\n return {\n ...nextConfig,\n authoringMode: preserveSimpleMode && hasSingleFormField(nextConfig) ? \"simple\" : \"custom\",\n };\n};\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@case-framework/survey-items",
3
+ "version": "0.1.0",
4
+ "description": "Headless domain models for the standard CASE survey item types.",
5
+ "license": "ISC",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/case-framework/case-survey-toolkit"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "type": "module",
14
+ "sideEffects": false,
15
+ "exports": {
16
+ "./form": {
17
+ "types": "./dist/form.d.mts",
18
+ "import": "./dist/form.mjs"
19
+ },
20
+ "./choice": {
21
+ "types": "./dist/choice.d.mts",
22
+ "import": "./dist/choice.mjs"
23
+ },
24
+ "./package.json": "./package.json"
25
+ },
26
+ "devDependencies": {
27
+ "@case-framework/survey-core": "0.7.0",
28
+ "tsdown": "^0.21.10",
29
+ "typescript": "^6.0.3"
30
+ },
31
+ "peerDependencies": {
32
+ "@case-framework/survey-core": "^0.7.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsdown",
36
+ "typecheck": "tsc --noEmit",
37
+ "check": "pnpm typecheck && pnpm build"
38
+ }
39
+ }