Upgrades
- Frontend: React 19.2, Vite 8.2, @vitejs/plugin-react 6.1, ESLint 9.39
- Backend: Express 5.2, Helmet 8.3, express-rate-limit 8.7, pino 10.3,
pino-http 11, pg 8.23, dotenv 17.4, bcryptjs 3.0, ESLint 10.9
- Lockfiles opnieuw gegenereerd (backend had er geen)
Breaking changes opgevangen
- Express 5 laat kale wildcards in routes niet toe: app.use("/api/*") is een
prefix-mount geworden en app.get("*") pad-loze middleware
- Vite 8 bundelt met Rolldown, dat de object-vorm van manualChunks niet kent;
omgezet naar build.rollupOptions.output.advancedChunks
- Rate-limit headers verschillen per RFC-draft; de test kijkt nu naar de hele
RateLimit-headerfamilie in plaats van naar RateLimit-Limit
- ESLint blijft in de frontend op 9: eslint-plugin-react ondersteunt nog geen
ESLint 10 (peer <= ^9.7)
Update-check bij het testen
- docker/check-updates.mjs vergelijkt beide package.json's met het
npm-register; werkt zonder node_modules en zonder npm install
- test.ps1 draait dit als stap 1 van 4, met -Strict (falen) en -SkipDeps
(offline). Ook informatief in de Test-stage van de pipeline
- Bewuste uitzonderingen met reden in docker/update-exceptions.json
- dev.ps1 up gebruikt --renew-anon-volumes, anders houdt de dev-container de
oude node_modules na een upgrade
Overig
- ESLint flat configs voor beide packages; npm run lint werkte niet omdat er
geen configuratie was. Beide draaien nu groen (alleen waarschuwingen over
bestaande ongebruikte variabelen)
- README.md, BEHEER.md en Changelog.md bijgewerkt
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
165 lines
6.4 KiB
PowerShell
165 lines
6.4 KiB
PowerShell
# VibeFinance dev script (PowerShell)
|
|
# Lokale development cyclus voor de 2-container opzet: bouwen, starten,
|
|
# stoppen en optioneel pushen naar de dev-registry.
|
|
#
|
|
# app API (node --watch) + Vite dev-server met hot reload
|
|
# postgres database
|
|
#
|
|
# Gebruik:
|
|
# .\dev.ps1 # build + herstart containers
|
|
# .\dev.ps1 build # alleen lokaal bouwen
|
|
# .\dev.ps1 up # build + herstart containers
|
|
# .\dev.ps1 up -Target app # alleen de app herbouwen + herstarten
|
|
# .\dev.ps1 up -Target postgres # alleen de database herstarten
|
|
# .\dev.ps1 down # containers stoppen en volumes verwijderen
|
|
# .\dev.ps1 logs # logs van de app volgen
|
|
# .\dev.ps1 test # testsuite draaien (zie ook test.ps1)
|
|
# .\dev.ps1 push # multi-platform build + push naar registry
|
|
#
|
|
# Vereisten:
|
|
# - Docker Desktop actief
|
|
# - Voor 'push': ingelogd op registry via: docker login <registry>
|
|
# - Voor 'push': docker buildx builder actief (docker buildx create --use)
|
|
# - root package.json bevat het versienummer (bijv. "1.0.0-dev")
|
|
|
|
param(
|
|
[ValidateSet("build","up","down","logs","test","push")]
|
|
[string]$Action = "up",
|
|
|
|
[ValidateSet("all","app","postgres")]
|
|
[string]$Target = "all"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
# =============================================================================
|
|
# PROJECTCONFIGURATIE - pas alleen dit blok aan voor een nieuw project
|
|
# =============================================================================
|
|
$appName = "VibeFinance"
|
|
$registry = "vibehoogie.duckdns.org/vibe"
|
|
$appImage = "vibefinance-app"
|
|
$apiUrl = "/api"
|
|
# =============================================================================
|
|
|
|
# Versie uit root package.json
|
|
$rootPkg = Get-Content (Join-Path $PSScriptRoot "package.json") -Raw | ConvertFrom-Json
|
|
$appVersion = $rootPkg.version
|
|
$repoUrl = if ($rootPkg.repository) { $rootPkg.repository } else { "" }
|
|
$updateCheckUrl = if ($rootPkg.updateCheckUrl) { $rootPkg.updateCheckUrl } else { "" }
|
|
|
|
if (-not $appVersion) {
|
|
Write-Error "Kon versienummer niet lezen uit package.json"
|
|
exit 1
|
|
}
|
|
|
|
$env:VERSION = $appVersion
|
|
$env:VITE_APP_VERSION = $appVersion
|
|
# De backend doet de update-check (server-side, geen CORS) — URL doorgeven aan compose
|
|
$env:UPDATE_CHECK_URL = $updateCheckUrl
|
|
if (-not $env:POSTGRES_PASSWORD) { $env:POSTGRES_PASSWORD = "devpassword" }
|
|
|
|
# Versie synchroniseren naar frontend/package.json
|
|
$frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json"
|
|
$frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json
|
|
if ($frontendPkg.version -ne $appVersion) {
|
|
$frontendPkg.version = $appVersion
|
|
[System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10))
|
|
Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green
|
|
}
|
|
|
|
# Registry tags (één image voor de hele app)
|
|
$appBase = "$registry/$appImage"
|
|
$appLatestDev = "$appBase`:latest-dev"
|
|
$appVersionDev = "$appBase`:$appVersion"
|
|
|
|
# Pad naar compose file
|
|
$devCompose = Join-Path $PSScriptRoot "docker-compose.dev.yml"
|
|
|
|
# Welke services de actie raakt
|
|
$services = @(if ($Target -ne "all") { $Target })
|
|
|
|
Write-Host ""
|
|
Write-Host "========================================" -ForegroundColor Cyan
|
|
Write-Host " $appName Dev" -ForegroundColor Cyan
|
|
Write-Host " Versie : $appVersion" -ForegroundColor Green
|
|
Write-Host " Actie : $Action" -ForegroundColor Green
|
|
Write-Host " Target : $Target" -ForegroundColor Green
|
|
Write-Host " Registry: $registry" -ForegroundColor Green
|
|
Write-Host "========================================" -ForegroundColor Cyan
|
|
Write-Host ""
|
|
|
|
# Functies
|
|
function Invoke-AppPush {
|
|
Write-Host "App bouwen en pushen (amd64 + arm64)..." -ForegroundColor White
|
|
docker buildx build `
|
|
--platform linux/amd64,linux/arm64 `
|
|
--target production `
|
|
--push `
|
|
-t $appLatestDev `
|
|
-t $appVersionDev `
|
|
--build-arg APP_VERSION=$appVersion `
|
|
--build-arg VITE_API_URL=$apiUrl `
|
|
--build-arg VITE_APP_VERSION=$appVersion `
|
|
$PSScriptRoot
|
|
if ($LASTEXITCODE -ne 0) { throw "Build mislukt" }
|
|
Write-Host "Gepusht: $appVersionDev" -ForegroundColor Green
|
|
}
|
|
|
|
# Acties
|
|
switch ($Action) {
|
|
|
|
"build" {
|
|
Write-Host "-- Lokaal bouwen -------------------------" -ForegroundColor Cyan
|
|
docker compose --progress plain -f $devCompose build @services
|
|
if ($LASTEXITCODE -ne 0) { throw "Build mislukt" }
|
|
Write-Host ""
|
|
Write-Host "Build klaar - $appVersion [$Target]" -ForegroundColor Green
|
|
}
|
|
|
|
"up" {
|
|
# --renew-anon-volumes: node_modules zitten in anonieme volumes; zonder
|
|
# dit blijven ze na een dependency-upgrade op de oude versies staan.
|
|
if ($Target -eq "all") {
|
|
# Let op: geen -v hier, dat zou de dev-database wissen (zie actie down)
|
|
docker compose -f $devCompose down
|
|
docker compose --progress plain -f $devCompose up --build -d --renew-anon-volumes
|
|
} else {
|
|
docker compose -f $devCompose stop $Target
|
|
docker compose --progress plain -f $devCompose up --build -d --renew-anon-volumes $Target
|
|
}
|
|
if ($LASTEXITCODE -ne 0) { throw "Opstarten mislukt" }
|
|
Write-Host ""
|
|
Write-Host "$appName gestart - $appVersion [$Target]" -ForegroundColor Green
|
|
Write-Host " App : http://localhost/" -ForegroundColor White
|
|
Write-Host " API : http://localhost:3001/api/health" -ForegroundColor White
|
|
}
|
|
|
|
"down" {
|
|
docker compose -f $devCompose down -v
|
|
Write-Host ""
|
|
Write-Host "$appName gestopt" -ForegroundColor Yellow
|
|
}
|
|
|
|
"logs" {
|
|
$svc = if ($Target -eq "all") { "app" } else { $Target }
|
|
docker compose -f $devCompose logs -f $svc
|
|
}
|
|
|
|
"test" {
|
|
& (Join-Path $PSScriptRoot "test.ps1")
|
|
if ($LASTEXITCODE -ne 0) { throw "Tests mislukt" }
|
|
}
|
|
|
|
"push" {
|
|
Invoke-AppPush
|
|
Write-Host ""
|
|
Write-Host "========================================" -ForegroundColor Cyan
|
|
Write-Host " Dev image gepusht: $appVersion" -ForegroundColor Green
|
|
Write-Host " $appVersionDev" -ForegroundColor White
|
|
Write-Host " $appLatestDev" -ForegroundColor White
|
|
Write-Host "========================================" -ForegroundColor Cyan
|
|
}
|
|
}
|
|
|
|
Write-Host ""
|