diff --git a/dev-docs/BACKLOG.md b/dev-docs/BACKLOG.md index d37507dc..cd38ae25 100644 --- a/dev-docs/BACKLOG.md +++ b/dev-docs/BACKLOG.md @@ -489,6 +489,22 @@ apps/portal om drift te voorkomen. --- +### TECH-DEBT-01 — @form-schema transitive dep op @core/utils/validators + +**Aanleiding:** `packages/form-schema/src/utils/formValidation.ts` +importeert uit `@core/utils/validators`, dat per-app resolvt naar +`apps/*/src/@core/utils/validators.ts`. Beide app-kopieën zijn op dit +moment identiek (Vuexy template-code), maar drift tussen de twee +zou `@form-schema` per consumer verschillend laten werken. +**Wat:** Kopieer de specifieke validators die `formValidation.ts` +gebruikt naar `packages/form-schema/src/utils/` zodra het package +een tweede echte consumer krijgt (PR-c of later). Ontdekt tijdens +PR-a (commit dda60ed5). +**Prioriteit:** Laag — latent; triggert pas bij consumer-drift of +wanneer het package buiten de huidige Vuexy-twin apps wordt geladen. + +--- + ### ~~TECH-02 — scopeForFestival helper op Event model~~ ✅ OPGELOST --- diff --git a/dev-docs/dev-guide.md b/dev-docs/dev-guide.md index c145d138..bf8b1199 100644 --- a/dev-docs/dev-guide.md +++ b/dev-docs/dev-guide.md @@ -381,6 +381,47 @@ Altijd in deze volgorde. Nooit stappen overslaan — later toevoegen kost meer t | Fase 3 — Advancing & Show Day | Artist advancing + portaal, Timetable, Mission Control, Formulierbouwer, Post-festival evaluatie, PDF allocatiesheet, Campagnes (email + WhatsApp via Zender) | | Fase 4 — Differentiators | Real-time WebSockets, Show Day Mode, Vrijwilligersprofiel + festival-paspoort, Shift swap & wachtlijst, Retrospectief rapport, Leveranciersportaal uitgebreid | +## Shared frontend packages + +`apps/portal/` en `apps/app/` delen een klein aantal schema-gedreven modules. Deze sectie legt vast wat wel en niet in die gedeelde laag hoort, en hoe je de aliases opzet. + +### Locatie + +`packages/form-schema/` — pure TypeScript, **geen** `package.json`, alias-only. Geen npm-package en geen pnpm workspace member; puur geconsumeerd via per-app TypeScript- en Vite-path-aliases. + +### Wat hoort erin + +- Schema-types die backend PHP-enums en API-resources mirroren (bv. `PublicFormField`, `FormFieldType`, `PublicFormSchema`) +- Schema-gedreven gedrag: validation rule builders, conditional-logic evaluator, step-navigation, stored-value formatters +- Alles wat pure TypeScript is en in portal én app exact dezelfde output moet produceren + +### Wat hoort er NIET in + +- Vue SFCs (`.vue` bestanden) — elke app rendert zijn eigen UI +- Vuetify/Vuexy-specifieke code, theming of styling +- Vue Router-code, route-definities of navigation guards +- Pinia stores of app-level state +- Axios-instanties of API-client code +- Composables die afhangen van app-runtime (auth, i18n, router) + +### Rationale + +Portal is submit-facing, app is builder- en review-facing. De twee apps zullen visueel uit elkaar groeien naarmate product-requirements verschillen. Gedeelde Vue-componenten zouden hun stijlen aan elkaar koppelen — daarom delen we het *contract en de logica* (schema-types, gedrag) maar laat elke app zijn eigen UI bezitten. + +### Alias-setup (verplicht op drie plekken per app) + +Beide apps moeten `@form-schema/*` registreren in álle drie: + +- `apps//tsconfig.json` — `compilerOptions.paths` +- `apps//vite.config.ts` — `resolve.alias` +- `apps//vitest.config.ts` — `resolve.alias` + +Alle drie zijn nodig omdat `vitest.config.ts` niet overerft van `vite.config.ts`. Eén van de drie vergeten breekt óf de productie-build, óf de dev-server, óf de test-suite. Wanneer een derde app consumer wordt, wire dan alle drie tegelijk. + +### Vue-resolutie (dependency-note) + +Het gedeelde package heeft geen `package.json` en kan dus geen eigen dependencies declareren. Om `vue` resolvable te maken tijdens TypeScript-compilatie vanuit `packages/form-schema/src/`, voegen beide apps een `"vue": ["./node_modules/vue"]`-entry toe aan `compilerOptions.paths`. Dit is het minimum; als het package ooit niet-triviale externe imports krijgt (bv. `@vueuse/core`, `lodash`), voeg dan per app een vergelijkbare paths-entry toe — níet een `package.json` in het package — of promoveer het package tot workspace-member. + ## 5. Prompt Bibliotheek Kant-en-klare prompts voor elke ontwikkelstap