refactor(form-schema): extract schema types and schema-driven behaviors to shared package

Moves formBuilder types, formValidation, useConditionalLogic, useFormSteps,
and formatFieldValue from apps/portal/src to packages/form-schema/src.
Adds @form-schema path alias to both apps/portal and apps/app.
Vue field components remain per-app to allow independent visual evolution.
Behavior-neutral: all 35 Vitest tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 23:57:39 +02:00
parent b6a3a17b0a
commit dda60ed5e4
48 changed files with 114 additions and 83 deletions

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import type { PublicFormSubmissionDuplicate } from '@/types/formBuilder'
import type { PublicFormSubmissionDuplicate } from '@form-schema/types/formBuilder'
const props = defineProps<{
data: PublicFormSubmissionDuplicate | null

View File

@@ -1,8 +1,8 @@
<script setup lang="ts">
import { usePublicFormTimeSlots } from '@/composables/api/usePublicFormTimeSlots'
import { usePublicFormToken } from '@/composables/publicFormInjection'
import type { PublicFormField, PublicFormTimeSlot } from '@/types/formBuilder'
import { getValidatorsForField, runValidators } from '@/utils/formValidation'
import type { PublicFormField, PublicFormTimeSlot } from '@form-schema/types/formBuilder'
import { getValidatorsForField, runValidators } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import type { PublicFormField } from '@form-schema/types/formBuilder'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { FieldOption, PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField, runValidators } from '@/utils/formValidation'
import type { FieldOption, PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField, runValidators } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import type { PublicFormField } from '@form-schema/types/formBuilder'
defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { FieldOption, PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { FieldOption, PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import type { PublicFormField } from '@form-schema/types/formBuilder'
defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { FieldOption, PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { FieldOption, PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -16,9 +16,9 @@ import FieldTagPicker from './FieldTagPicker.vue'
import FieldText from './FieldText.vue'
import FieldTextarea from './FieldTextarea.vue'
import FieldUrl from './FieldUrl.vue'
import { evaluateConditionalLogic } from '@/composables/useConditionalLogic'
import { FormFieldType } from '@/types/formBuilder'
import type { FormFieldDisplayWidth, FormValues, PublicFormField } from '@/types/formBuilder'
import { evaluateConditionalLogic } from '@form-schema/composables/useConditionalLogic'
import { FormFieldType } from '@form-schema/types/formBuilder'
import type { FormFieldDisplayWidth, FormValues, PublicFormField } from '@form-schema/types/formBuilder'
const props = defineProps<{
field: PublicFormField

View File

@@ -3,8 +3,8 @@ import draggable from 'vuedraggable'
import { useDisplay } from 'vuetify'
import { usePublicFormSections } from '@/composables/api/usePublicFormSections'
import { usePublicFormToken } from '@/composables/publicFormInjection'
import type { PublicFormField, PublicFormSectionOption, SectionPriorityValue } from '@/types/formBuilder'
import { getValidatorsForField, runValidators } from '@/utils/formValidation'
import type { PublicFormField, PublicFormSectionOption, SectionPriorityValue } from '@form-schema/types/formBuilder'
import { getValidatorsForField, runValidators } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { FieldOption, PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { FieldOption, PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { AvailableTag, PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { AvailableTag, PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PublicFormField } from '@/types/formBuilder'
import { getValidatorsForField } from '@/utils/formValidation'
import type { PublicFormField } from '@form-schema/types/formBuilder'
import { getValidatorsForField } from '@form-schema/utils/formValidation'
const props = defineProps<{
field: PublicFormField

View File

@@ -3,16 +3,16 @@ import DuplicateSubmissionHint from './DuplicateSubmissionHint.vue'
import IdentityMatchBanner from './IdentityMatchBanner.vue'
import { usePublicFormSections } from '@/composables/api/usePublicFormSections'
import { usePublicFormTimeSlots } from '@/composables/api/usePublicFormTimeSlots'
import { formatFieldValue } from '@/composables/formatFieldValue'
import type { FormStep } from '@/composables/useFormSteps'
import { formatFieldValue } from '@form-schema/composables/formatFieldValue'
import type { FormStep } from '@form-schema/composables/useFormSteps'
import { usePublicFormToken } from '@/composables/publicFormInjection'
import { FormFieldType } from '@/types/formBuilder'
import { FormFieldType } from '@form-schema/types/formBuilder'
import type {
FormValues,
PublicFormField,
PublicFormSubmissionDuplicate,
PublicFormSubmissionIdentityMatch,
} from '@/types/formBuilder'
} from '@form-schema/types/formBuilder'
const props = defineProps<{
steps: FormStep[]

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import type { FormErrorCode } from '@/types/formBuilder'
import type { FormErrorCode } from '@form-schema/types/formBuilder'
const props = defineProps<{
errorCode?: FormErrorCode | string

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useDisplay } from 'vuetify'
import type { FormStep } from '@/composables/useFormSteps'
import type { FormStep } from '@form-schema/composables/useFormSteps'
const props = defineProps<{
steps: FormStep[]