ADR-DS-002: Versjonering og publisering
Beslutning
indeks-css, indeks-web og indeks-react har alltid identisk versjonsnummer og bumpes alltid sammen. Endringer dokumenteres med Changesets. Pakker publiseres til både CDN (anbefalt) og npm.
Versjonering
indeks-css, indeks-web og indeks-react har alltid identisk versjonsnummer — en endring i én bumper alle tre. indeks-tokens og indeks-utils versjoneres uavhengig. Changesets er konfigurert slik at en endring i indeks-tokens eller indeks-utils automatisk utløser en patch-bump i indeks-css, som igjen bumper indeks-web og indeks-react.
indeks-web er pakken med Web Components (rammeverk-uavhengig komponentlogikk) — se ADR-DS-004 for mer om arkitekturen.
Changesets
Erstattet Lerna + Conventional Commits. pnpm changeset dokumenterer endringer i en fil uavhengig av commit-meldinger. Ingen krav til commit-format.
Distribusjon
CDN (anbefalt): cdn.sparebank1.no/indeks/css/{versjon}/index.css — versjonerte URLer kan caches "for alltid" i nettleseren. CDN-bygget publiserer indeks-css, indeks-tokens, indeks-utils og indeks-web. indeks-css henter automatisk inn tokens og utils, slik at konsumenter bare trenger én <link>-tag. CDN-bygget er et eget build-target der PostCSS-plugin erstatter interne npm-imports med absolutte CDN-URLer, slik at CSS-filen er selvforsynt uten bundler.
npm (alternativ): @sb1/indeks-css, @sb1/indeks-web og @sb1/indeks-react for bundler-baserte apps. Avhengigheter håndteres automatisk via workspace:*.
Drivere for beslutningen
- Garantert kompatibilitet mellom CSS og React — konsumenter slipper å teste kombinasjoner
- Optimal CDN-caching med versjonerte URLer
- Lavere terskel for bidragsytere uten krav om commit-format
- Fleksibilitet for team med ulik teknisk infrastruktur
Bakgrunn
indeks-web og indeks-react avhenger av CSS-klasser fra indeks-css — versjoner ute av sync gir feil
styling. Konsumenter trenger garantert kompatibilitet uten å måtte teste kombinasjoner.
I tillegg må CSS kunne konsumeres på to måter: via bundler (npm) og direkte via <link>-tag
(CDN). CDN-distribusjon krever versjonerte URLer for å muliggjøre evig caching.
Vi brukte tidligere Lerna med Conventional Commits, men brukte mye tid på å rette commit-meldinger og terskelen for å bidra var høy. Verktøyet var i tillegg utdatert.
Problemstilling
Hvordan sikrer vi garantert kompatibilitet mellom CSS og React-pakker, støtter både CDN og npm-distribusjon, og holder terskelen for bidrag lav?
Konsekvenser
Hvem påvirkes?
Alle konsumenter velger mellom CDN og npm. Alle bidragsytere bruker pnpm changeset
i stedet for Conventional Commits.
Ulemper
- Små CSS-endringer bumper React-versjon og omvendt, selv uten funksjonell endring
- Ekstra steg (
pnpm changeset) i utviklingsflyten - To build-outputs å vedlikeholde (npm + CDN)
- CDN-brukere må manuelt oppdatere versjonsnummer i
<link>-tag
Tiltak mot ulemper
- CI blokkerer merge hvis det allerede finnes en åpen release-PR — sikrer at ikke to versjonsoppdateringer havner i køen samtidig
- CDN-versjoner publiseres automatisk ved release
Forkastede alternativer
Alle pakker samme versjon (som @sb1/ffe)
Tokens, CSS og React bumpes alltid til samme versjon, som i SpareBank 1s eksisterende designsystem FFE.
Forkastet fordi: indeks-tokens og indeks-utils har uavhengige versjoner nettopp for å unngå dette — en token-endring skal ikke tvinge CSS, Web Components og React til ny versjon. Å låse alle fire til samme versjon fjerner den fordelen og tvinger konsumenter til å ugyldiggjøre all CDN-cache ved selv små token-justeringer.
Helt uavhengige versjoner
Alle pakker versjoneres uavhengig uten noen form for synkronisering.
Forkastet fordi: Vanskelig for konsumenter å vite hvilke kombinasjoner av CSS og React som fungerer sammen. Øker supportbyrden.
Lerna + Conventional Commits
Det opprinnelige verktøyet vi brukte.
Forkastet fordi: Utdatert verktøy, høy terskel grunnet krav om spesifikk commit-format, og vi brukte faktisk tid på å fikse commit-meldinger i stedet for å lage produktet.
semantic-release
Automatisk versjonering basert på commit-meldinger.
Forkastet fordi: Krever fortsatt Conventional Commits — løser ikke terskelen for bidrag.
Kun npm eller kun CDN
Publisere bare til én distribusjonskjøre i stedet for begge.
Forkastet fordi: Team med ulik infrastruktur trenger begge. Kun CDN fungerer ikke for bundler-baserte apper som trenger tree-shaking. Kun npm mister CDN-caching-fordelene.
Deltakere