feat: add speech telemetry and bundle guard

This commit is contained in:
colinislit
2025-11-25 13:37:00 +01:00
parent b6c5d1a6d3
commit 7033329e0f
17 changed files with 2258 additions and 481 deletions

View File

@@ -0,0 +1,85 @@
#!/usr/bin/env node
import { existsSync, readFileSync, statSync } from 'node:fs'
import path from 'node:path'
const manifestPath = path.join('.next', 'app-build-manifest.json')
if (!existsSync(manifestPath)) {
console.error('✖ Bundle manifest ontbreekt. Voer eerst `next build` uit.')
process.exit(1)
}
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'))
const budgets = [
{
label: '/epd/patients/[id]/rapportage',
manifestKey: '/epd/patients/[id]/rapportage/page',
maxKB: 150,
},
{
label: '/epd/patients/[id]/intakes/[intakeId]/behandeladvies',
manifestKey: '/epd/patients/[id]/intakes/[intakeId]/behandeladvies/page',
maxKB: 250,
},
]
function formatKB(bytes) {
return Math.round((bytes / 1024) * 10) / 10
}
const SHARED_CHUNK_PATTERNS = [/^static\/chunks\/webpack/, /^static\/chunks\/main-app/]
function isSharedChunk(chunkName) {
return SHARED_CHUNK_PATTERNS.some((pattern) => pattern.test(chunkName))
}
function calculateRouteSize(manifestKey) {
const chunks = manifest.pages?.[manifestKey]
if (!chunks) {
throw new Error(`Geen entry voor ${manifestKey} in app-build-manifest.json`)
}
const seen = new Set()
let totalBytes = 0
for (const chunk of chunks) {
if (seen.has(chunk)) continue
seen.add(chunk)
if (isSharedChunk(chunk)) continue
const filePath = path.join('.next', chunk)
if (!existsSync(filePath)) continue
totalBytes += statSync(filePath).size
}
return totalBytes
}
const violations = []
for (const budget of budgets) {
try {
const sizeBytes = calculateRouteSize(budget.manifestKey)
const sizeKB = formatKB(sizeBytes)
const maxKB = budget.maxKB
if (sizeKB > maxKB) {
violations.push(
`${budget.label}: ${sizeKB} kB > budget ${maxKB} kB (manifest: ${budget.manifestKey})`
)
} else {
console.log(`${budget.label}: ${sizeKB} kB (budget ${maxKB} kB)`)
}
} catch (error) {
violations.push(error.message)
}
}
if (violations.length > 0) {
console.error('\nBundel-check mislukt:')
for (const message of violations) {
console.error(`- ${message}`)
}
process.exit(1)
}
console.log('\nAlle bundels binnen budget. ✅')