// Loop 10 (actions.ts zerlegen, Schnitt 2): der Objekt-Pfad-Shape, den
// createQafUploadTargets prägt — als EINE Quelle für alle Action-Familien
// (Ingest, Replace/Reparse, Quelle/Kanonisch). Bewusst KEINE 'use server'-
// Datei: ein purer Helfer, der als Action-Export ein sinnloser RPC-Endpunkt
// wäre. Wortgleich aus actions.ts verschoben.

/** The exact object-path shape createQafUploadTargets mints (single source). */
export function qafStoragePathShape(projectId: string): RegExp {
  return new RegExp(`^${projectId}/[0-9a-f-]{36}-[0-9A-Za-z._-]+$`, 'i')
}

/** Storage-sicherer Dateiname (geteilt von Upload-Targets und Replace/Reparse
 * — wortgleich aus actions.ts verschoben, Plan Schritt B). */
export function sanitizeStorageName(name: string): string {
  return name.replace(/[^0-9A-Za-z._-]+/g, '_').slice(-80)
}
