Open olemartinorg opened 1 year ago
Jobber med dette i app-lib-dotnet https://github.com/Altinn/app-lib-dotnet/compare/feature/backend-dynamics...ivarne:app-lib-dotnet:app-validator
@RonnyB71 @mijohansen Dette ble såvidt nevnt i møtet i går, så jeg tenkte å pinge dere her. Jeg har laget et forslag med ting jeg ønsker at vi validerer i en app, og at vi produserer en liste med potensielle feilmeldinger/advarsler om en gitt app.
Som nevnt over er det allerede påbegynt en implementasjon av dette i app-lib-dotnet
, men jeg vil påstå at app-frontend-react
er riktig repo å ha dette overordnede verktøyet i. Vi har såvidt jeg har skjønt flere ulike behov/stadier av app-utvikling hvor vi ønsker denne formen for validering:
Jeg tenker det er viktig å ha kode som validerer layout lokal, det vil si i nærheten av hvor layout blir brukt. Hvis vi legger til en mulighet i layout via en ny feature i app-frontend er det mest naturlig at vi også skriver koden som validerer om denne blir brukt riktig her i dette repoet - og til enhver tid vil det jo være app-frontend som leder an i forventningen om hva som er "riktig" layout. Layout blir i langt mindre grad lest og brukt på backend, dermed tenker jeg det er unaturlig å legge valideringen av layout der. Samme med Studio - det verktøyet produserer layout, men konsumerer det ikke, så det hjelper lite å bygge valideringslogikk for layout et sted som ikke har god kjennskap til hvordan layout blir brukt.
Det er riktignok en god del konfigurasjon på backend også, og det er gjerne mest naturlig at nuget-pakkene selv sørger for validering for å sjekke om den konfigurasjonen er riktig i appen.
Mitt forslag:
app-frontend-react
, hvor valideringen i utgangspunktet leser en App-mappe og bygger opp valideringsmeldinger som vises. I tillegg, om nuget-pakkene er nye nok, kalles en ekstra funksjon som kjører appen og ber den om nuget-pakkene sine valideringsmeldinger. Disse sendes til kommandolinjeverktøyet via et JSON-format - og alle meldingene flettes til slutt sammen til et sammenstilt format.master
-branchen til appen før deploy, og JSON-resultatet kan vises pent i Studio.Dette punktet:
[ ] As long as app-frontend-react puts the repeating group indexes into the component ID, we should show warnings when component IDs could be misunderstood as having repeating group indexes (i.e. matching
- )
Er vel på sett og vis løst av #1512 siden det ligger vel i regexen for id? Den gir i alle fall feil om at component-ider som summary-1
ikke matcher regexen. Nå er ikke den feilmeldingen spesielt brukervennlig da men.
Regex regelen treffer mye mer en den bør. Kombinasjonen av masse falske positiver og en melding jeg knapt forstår noen måneder etter at jeg var med å feilsøke problemet gjør at jeg er uenig i at den er løst.
Vi kan eventuelt velge å suppresse den warningen hvis vi legger inn en "custom" validering av komponent-ider
Hvis du får en feilmelding som bare treffer skjema med kollisjon på repeterende grupper, kan jo bare regex fjerneres fra json schema
Regexen er kanskje ikke optimal, men det har ikke kommet forslag om en som er mer optimal heller. Uansett - jeg synes det gir verdi å vise en feil om dette i vscode også, så jeg synes regexen skal bestå uavhengig av hva vi lager av verktøy i frontend.
Synes forsåvidt også vi kan "fiffe opp" akkurat den meldingen slik at den gir mer informasjon om hva man faktisk må gjøre for å fikse problemet, så det punktet kan godt ligge uløst her fortsatt.
Ref denne diskusjonen:
Jeg tenker vi kanskje burde bygge dette slik at det kan brukes som regler i eslint
. Men i tillegg også et API som kan brukes av Studio og hentes inn som en egen pakke der, og da lokal støtte (gjerne via noe som eslint
). Jeg ser for meg at vi kan eksportere en pakke fra app-frontend-react
til npm, slik at vårt app-cli
-verktøy også kan hente inn og kjøre eslint
. Da kan vi også få automatisk verktøystøtte rett i editoren dersom man f.eks. bruker vscode - samt implementere automatiske fikser for problemer vi vet hvordan kan løses med kode - f.eks. å bytte ut $schema
-stien i alle layout-filer og diverse med riktig sti på CDN.
eslint
gir oss et mye kraftigere verktøy enn vi får med ren JsonSchema, og vi kan nok også laste inn andre filer (som applicationmetadata.json
) for å gjøre mye dypere analyser av konfigurasjon enn det som da gjøres i dag.
Et neste alternativ er kanskje å lage en skikkelig "Altinn language server" som da også gir deg skikkelig god integrasjon i en editor, med forslag til refaktoreringer osv. Jeg begynte såvidt å se på det en gang i forbindelse med et stunt jeg tenkte å prøve meg på (i løpet av et litt kjedelig møte), men det var åpenbart ikke noe som stod på noen plan, så det ble ikke jobbet videre med den gang.
Description
This need has been thought of and discussed a lot before, and while we would like to produce warnings/errors for invalid configuration in Altinn Studio, rapid feedback on changes is needed, so having these warnings in
app-frontend-react
as well might lead to a better developer experience for those working on their app locally. The code should preferably be written in a way that makes it possible to extract the code to also show warnings in Studio.Suggested validations
Group/component order. Groups should be defined first(?), and all children later in the layout. We should show a warning if a child is defined before the group.No longer an issue in app-frontendOnly allow two levels (regular repeating groups and nested repeating groups)We theoretically support unlimited depth of repeating groups, although this will probably not look great in the UI.app-frontend-react
puts the repeating group indexes into the component ID, we should show warnings when component IDs could be misunderstood as having repeating group indexes (i.e. matching<something>-<short number>
)[ ] MissingdataModelBindings
for components where a binding is expected[ ]dataModelBindings
pointing to non-existing locations in the data model (use Levenshtein to find the correct one?)[ ]dataModelBindings
pointing to invalid types in the data model[ ] I.e.Input
supports strings and numbers (and with numeric data types, number formatting should be set)[ ] Booleans are not supported/recommended (#205)[ ] Repeating groups should have theirgroup
binding pointing to an array-type in the data model[ ] Non-repeating groups should have all its children bound to properties of the same object in the data model(?)[ ] Components inside groups must have their bindings contained within an object inside the array-type of thegroup
bindingtextResourceBindings
where a binding is expectedpanel
andgroupReference
points to an existing repeating grouplist
data model bindingShould be covered by JsonSchema validationtextResourceBindings
using keys that does not exist. As the keys are optional, we could potentially use a Levenshtein algorithm to warn when the binding is almost equal to a known text resource ('did you mean ___?').dataModelBindings
should apply to variables in text resourcesdataModelBindings
should apply todataModel
lookups in expressionsmaxFileSizeInMB
greater thanmaxSize
set on the connected DataType in applicationmetadata.json, warning if smallersource
ORoptions
ORoptionsId
(andsecure
should only be set if usingoptionsId
). If you set multiple of these, you depend on the order of the code that checks for these properties (which may be different in frontend/backend).[ ] Verify that all layout files validate according to the current layout JsonSchemaMoved to #1512app-frontend-react
)Relevant issue(s)