fix(admin): resolve all 266 TypeScript errors, enable strict build

Eliminate the pre-existing TS errors that were masked by
next.config.js `typescript.ignoreBuildErrors: true`, then turn the flag
OFF so the compiler is a real safety net for future changes. `next build`
and `tsc --noEmit` now pass with 0 errors.

The errors were not cosmetic — several exposed real latent bugs hidden by
the flag, e.g. the drafting-engine ConstraintEnforcer read non-existent
fields (`t.rule.dsfaRequired`, `d.required`, `r.title`), so its DSFA hard
gate and risk-flag checks were silently no-ops; scopeDefaults read
snake_case CompanyProfile fields that never matched the camelCase type
(generator defaults never populated). Both fixed by aligning code to the
current types.

Highlights:
- Vitest globals: add vitest-globals.d.ts (config already had globals:true)
  so the test files type-check; exclude Playwright specs from vitest.
- Add a minimal ambient `pg` module declaration (no @types/pg installed).
- Fix Next 15 route handlers to await Promise params.
- Reconcile drifted types across loeschfristen, compliance-scope, document-
  generator, drafting-engine, vendor-compliance, agent and more.

Pre-existing (NOT caused here, proven by stashing the diff): 3 vitest
logic tests still fail — getNextStep (2) and buildDocumentScope priority (1).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-11 00:42:44 +02:00
parent bb9aacc3d3
commit a28db8f8f0
76 changed files with 280 additions and 190 deletions
@@ -8,10 +8,10 @@ const BACKEND_URL = process.env.BACKEND_API_URL || 'http://backend-compliance:80
export async function GET(
request: NextRequest,
{ params }: { params: { checkId: string } },
{ params }: { params: Promise<{ checkId: string }> },
) {
const qs = request.nextUrl.searchParams.toString()
const url = `${BACKEND_URL}/api/compliance/agent/migration/${params.checkId}/banner-preview${qs ? `?${qs}` : ''}`
const url = `${BACKEND_URL}/api/compliance/agent/migration/${(await params).checkId}/banner-preview${qs ? `?${qs}` : ''}`
try {
const resp = await fetch(url, { signal: AbortSignal.timeout(15000) })
const data = await resp.json()
@@ -8,9 +8,9 @@ const BACKEND_URL = process.env.BACKEND_API_URL || 'http://backend-compliance:80
export async function GET(
_request: NextRequest,
{ params }: { params: { checkId: string } },
{ params }: { params: Promise<{ checkId: string }> },
) {
const url = `${BACKEND_URL}/api/compliance/agent/migration/${params.checkId}/document-preview`
const url = `${BACKEND_URL}/api/compliance/agent/migration/${(await params).checkId}/document-preview`
try {
const resp = await fetch(url, { signal: AbortSignal.timeout(15000) })
const data = await resp.json()
@@ -8,9 +8,9 @@ const BACKEND_URL = process.env.BACKEND_API_URL || 'http://backend-compliance:80
export async function GET(
_request: NextRequest,
{ params }: { params: { checkId: string } },
{ params }: { params: Promise<{ checkId: string }> },
) {
const url = `${BACKEND_URL}/api/compliance/agent/migration/${params.checkId}/summary`
const url = `${BACKEND_URL}/api/compliance/agent/migration/${(await params).checkId}/summary`
try {
const resp = await fetch(url, { signal: AbortSignal.timeout(15000) })
const data = await resp.json()
@@ -5,9 +5,9 @@ import { NextRequest, NextResponse } from 'next/server'
const DSMS_URL = process.env.DSMS_GATEWAY_URL || 'http://dsms-gateway:8082'
export async function GET(request: NextRequest, { params }: { params: Promise<{ path: string[] }> }) {
export async function GET(request: NextRequest, { params }: { params: Promise<{ path?: string[] }> }) {
const { path } = await params
const target = `${DSMS_URL}/api/v1/${path.join('/')}`
const target = `${DSMS_URL}/api/v1/${(path || []).join('/')}`
try {
const resp = await fetch(target, {
@@ -299,8 +299,8 @@ async function handleMeta(_params: URLSearchParams) {
no_source_count: 0,
release_state_counts: { active: total },
verification_method_counts: Object.fromEntries(
vRes.rows.map((x: { verification_method: string; c: string }) =>
[x.verification_method, parseInt(x.c)])),
(vRes.rows as { verification_method: string; c: string }[]).map((x) =>
[x.verification_method, parseInt(x.c)] as [string, number])),
category_counts: facet(catRes.rows),
evidence_type_counts: {},
use_case_counts: Object.fromEntries(