From 79954aace6a7ad138db31f0822b55ad65a4d5975 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Tue, 5 May 2026 18:50:52 +0200 Subject: [PATCH] =?UTF-8?q?refactor(forms):=20move=20packages/form-schema?= =?UTF-8?q?=20=E2=86=92=20apps/app/src/composables/forms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inlines the form-schema source folder (no package.json, alias-only) into apps/app/src/composables/forms. Drops the @form-schema alias from apps/app/vite.config.ts (replaced by @/composables/forms via the existing @ alias). apps/portal vite + vitest configs keep @form-schema as a temporary alias pointing at the new location so portal tests/build keep working until apps/portal is removed at the end of this PR. Two pure-logic form-schema tests moved alongside. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/app/src/composables/forms/.gitkeep | 0 .../__tests__}/formatFieldValue.spec.ts | 6 +++--- .../__tests__}/useConditionalLogic.test.ts | 4 ++-- .../forms}/composables/formatFieldValue.ts | 0 .../forms}/composables/useConditionalLogic.ts | 0 .../forms}/composables/useFormSteps.ts | 0 .../composables/forms}/types/formBuilder.ts | 0 .../forms}/utils/formValidation.ts | 0 .../composables/forms}/utils/validators.ts | 0 apps/app/vite.config.ts | 3 --- apps/portal/vite.config.ts | 3 ++- apps/portal/vitest.config.ts | 3 ++- packages/form-schema/README.md | 19 ------------------- 13 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 apps/app/src/composables/forms/.gitkeep rename apps/{portal/tests/unit => app/src/composables/forms/composables/__tests__}/formatFieldValue.spec.ts (97%) rename apps/{portal/tests/composables => app/src/composables/forms/composables/__tests__}/useConditionalLogic.test.ts (95%) rename {packages/form-schema/src => apps/app/src/composables/forms}/composables/formatFieldValue.ts (100%) rename {packages/form-schema/src => apps/app/src/composables/forms}/composables/useConditionalLogic.ts (100%) rename {packages/form-schema/src => apps/app/src/composables/forms}/composables/useFormSteps.ts (100%) rename {packages/form-schema/src => apps/app/src/composables/forms}/types/formBuilder.ts (100%) rename {packages/form-schema/src => apps/app/src/composables/forms}/utils/formValidation.ts (100%) rename {packages/form-schema/src => apps/app/src/composables/forms}/utils/validators.ts (100%) delete mode 100644 packages/form-schema/README.md diff --git a/apps/app/src/composables/forms/.gitkeep b/apps/app/src/composables/forms/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/portal/tests/unit/formatFieldValue.spec.ts b/apps/app/src/composables/forms/composables/__tests__/formatFieldValue.spec.ts similarity index 97% rename from apps/portal/tests/unit/formatFieldValue.spec.ts rename to apps/app/src/composables/forms/composables/__tests__/formatFieldValue.spec.ts index b13740df..471053f7 100644 --- a/apps/portal/tests/unit/formatFieldValue.spec.ts +++ b/apps/app/src/composables/forms/composables/__tests__/formatFieldValue.spec.ts @@ -1,12 +1,12 @@ import { describe, expect, it } from 'vitest' -import { formatFieldValue } from '@form-schema/composables/formatFieldValue' -import { FormFieldType } from '@form-schema/types/formBuilder' +import { formatFieldValue } from '@/composables/forms/composables/formatFieldValue' +import { FormFieldType } from '@/composables/forms/types/formBuilder' import type { AvailableTag, PublicFormField, PublicFormSectionOption, PublicFormTimeSlot, -} from '@form-schema/types/formBuilder' +} from '@/composables/forms/types/formBuilder' function field(partial: Partial = {}): PublicFormField { return { diff --git a/apps/portal/tests/composables/useConditionalLogic.test.ts b/apps/app/src/composables/forms/composables/__tests__/useConditionalLogic.test.ts similarity index 95% rename from apps/portal/tests/composables/useConditionalLogic.test.ts rename to apps/app/src/composables/forms/composables/__tests__/useConditionalLogic.test.ts index 55f3484c..15d2b5e0 100644 --- a/apps/portal/tests/composables/useConditionalLogic.test.ts +++ b/apps/app/src/composables/forms/composables/__tests__/useConditionalLogic.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { evaluateConditionalLogic } from '@form-schema/composables/useConditionalLogic' -import type { ConditionalLogic } from '@form-schema/types/formBuilder' +import { evaluateConditionalLogic } from '@/composables/forms/composables/useConditionalLogic' +import type { ConditionalLogic } from '@/composables/forms/types/formBuilder' describe('evaluateConditionalLogic', () => { it('returns true when logic is null or undefined', () => { diff --git a/packages/form-schema/src/composables/formatFieldValue.ts b/apps/app/src/composables/forms/composables/formatFieldValue.ts similarity index 100% rename from packages/form-schema/src/composables/formatFieldValue.ts rename to apps/app/src/composables/forms/composables/formatFieldValue.ts diff --git a/packages/form-schema/src/composables/useConditionalLogic.ts b/apps/app/src/composables/forms/composables/useConditionalLogic.ts similarity index 100% rename from packages/form-schema/src/composables/useConditionalLogic.ts rename to apps/app/src/composables/forms/composables/useConditionalLogic.ts diff --git a/packages/form-schema/src/composables/useFormSteps.ts b/apps/app/src/composables/forms/composables/useFormSteps.ts similarity index 100% rename from packages/form-schema/src/composables/useFormSteps.ts rename to apps/app/src/composables/forms/composables/useFormSteps.ts diff --git a/packages/form-schema/src/types/formBuilder.ts b/apps/app/src/composables/forms/types/formBuilder.ts similarity index 100% rename from packages/form-schema/src/types/formBuilder.ts rename to apps/app/src/composables/forms/types/formBuilder.ts diff --git a/packages/form-schema/src/utils/formValidation.ts b/apps/app/src/composables/forms/utils/formValidation.ts similarity index 100% rename from packages/form-schema/src/utils/formValidation.ts rename to apps/app/src/composables/forms/utils/formValidation.ts diff --git a/packages/form-schema/src/utils/validators.ts b/apps/app/src/composables/forms/utils/validators.ts similarity index 100% rename from packages/form-schema/src/utils/validators.ts rename to apps/app/src/composables/forms/utils/validators.ts diff --git a/apps/app/vite.config.ts b/apps/app/vite.config.ts index f6521e9b..a34431b1 100644 --- a/apps/app/vite.config.ts +++ b/apps/app/vite.config.ts @@ -111,9 +111,6 @@ export default defineConfig({ import.meta.url, ), ), - '@form-schema': fileURLToPath( - new URL('../../packages/form-schema/src', import.meta.url), - ), }, }, server: { diff --git a/apps/portal/vite.config.ts b/apps/portal/vite.config.ts index eea4b94c..fac3c9aa 100644 --- a/apps/portal/vite.config.ts +++ b/apps/portal/vite.config.ts @@ -84,7 +84,8 @@ export default defineConfig({ '@images': fileURLToPath(new URL('./src/assets/images/', import.meta.url)), '@styles': fileURLToPath(new URL('./src/assets/styles/', import.meta.url)), '@configured-variables': fileURLToPath(new URL('./src/assets/styles/variables/_template.scss', import.meta.url)), - '@form-schema': fileURLToPath(new URL('../../packages/form-schema/src', import.meta.url)), + // Temporary alias during WS-3 PR-B1 transition; portal is deleted at PR end. + '@form-schema': fileURLToPath(new URL('../app/src/composables/forms', import.meta.url)), }, }, server: { diff --git a/apps/portal/vitest.config.ts b/apps/portal/vitest.config.ts index b3b9afc3..8b768515 100644 --- a/apps/portal/vitest.config.ts +++ b/apps/portal/vitest.config.ts @@ -23,7 +23,8 @@ export default defineConfig({ '@images': fileURLToPath(new URL('./src/assets/images/', import.meta.url)), '@styles': fileURLToPath(new URL('./src/assets/styles/', import.meta.url)), '@validators': fileURLToPath(new URL('./src/@core/utils/validators', import.meta.url)), - '@form-schema': fileURLToPath(new URL('../../packages/form-schema/src', import.meta.url)), + // Temporary alias during WS-3 PR-B1 transition; portal is deleted at PR end. + '@form-schema': fileURLToPath(new URL('../app/src/composables/forms', import.meta.url)), }, }, test: { diff --git a/packages/form-schema/README.md b/packages/form-schema/README.md deleted file mode 100644 index 6ac8ef8c..00000000 --- a/packages/form-schema/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# @form-schema - -Shared schema contract and schema-driven behaviors for Crewli form rendering. Consumed by apps/portal (public submission) and apps/app (organizer builder + submissions review). - -## What lives here - -- `types/` — TypeScript types and enum constants mirroring backend `FormBuilder` enums and `PublicForm(Schema|Submission)Resource` -- `utils/formValidation.ts` — validation rule builders driven by `FormFieldValidationRules` -- `composables/useConditionalLogic.ts` — evaluate `conditional_logic.show_when` against field values -- `composables/useFormSteps.ts` — step navigation logic for multi-step forms -- `composables/formatFieldValue.ts` — render a stored submission value as a human-readable string - -## What does NOT live here - -Vue components. Each app renders its own UI. Portal has full-fidelity submit components; app has builder-preview and submissions-review components. Sharing renderers would couple the two apps' visual styles, which we explicitly want to avoid. - -## Contract stability - -This is an alias-only shared directory inside the monorepo — no npm package, no semver. Breaking changes (new field type, new validation key, new conditional operator) require updating both apps in the same PR. TypeScript will flag missing cases in dispatchers.