fix: remove tsx from optionalDependencies to fix Plesk deploys

tsx's esbuild postinstall fails in Plesk's nodenv sub-shell context
because npm git dep preparation spawns `sh -c node install.js` which
doesn't inherit the PATH set in deploy actions.

Fix: Remove tsx entirely (only needed on sv-payload for `pnpm extract`,
where it's available via npx). Also updates extracted types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Martin Porwoll 2026-02-17 11:22:30 +00:00
parent d4e1ef1035
commit 381bc291a0
3 changed files with 408 additions and 18 deletions

View file

@ -34,7 +34,7 @@
"build": "tsc",
"dev": "tsc --watch",
"typecheck": "tsc --noEmit",
"extract": "tsx scripts/extract-types.ts",
"extract": "npx tsx scripts/extract-types.ts",
"wo:create": "bash scripts/create-work-order.sh",
"wo:execute": "bash scripts/execute-work-order.sh",
"preinstall": "true",
@ -52,9 +52,6 @@
"@types/react": "^19.0.0",
"typescript": "^5.7.0"
},
"optionalDependencies": {
"tsx": "^4.19.0"
},
"peerDependencies": {
"react": "^19.0.0"
},

View file

@ -39,6 +39,10 @@ import type {
CookieConfiguration,
CookieInventory,
PrivacyPolicySetting,
MonitoringSnapshot,
MonitoringLog,
MonitoringAlertRule,
MonitoringAlertHistory,
SiteSetting,
Navigation,
Form,
@ -82,6 +86,10 @@ export type {
CookieConfiguration,
CookieInventory,
PrivacyPolicySetting,
MonitoringSnapshot,
MonitoringLog,
MonitoringAlertRule,
MonitoringAlertHistory,
SiteSetting,
Navigation,
Form,
@ -127,6 +135,10 @@ export interface CollectionTypeMap {
'cookie-configurations': CookieConfiguration;
'cookie-inventory': CookieInventory;
'privacy-policy-settings': PrivacyPolicySetting;
'monitoring-snapshots': MonitoringSnapshot;
'monitoring-logs': MonitoringLog;
'monitoring-alert-rules': MonitoringAlertRule;
'monitoring-alert-history': MonitoringAlertHistory;
'site-settings': SiteSetting;
'navigations': Navigation;
'forms': Form;

View file

@ -125,6 +125,10 @@ export interface Config {
'privacy-policy-settings': PrivacyPolicySetting;
'email-logs': EmailLog;
'audit-logs': AuditLog;
'monitoring-snapshots': MonitoringSnapshot;
'monitoring-logs': MonitoringLog;
'monitoring-alert-rules': MonitoringAlertRule;
'monitoring-alert-history': MonitoringAlertHistory;
'site-settings': SiteSetting;
navigations: Navigation;
forms: Form;
@ -191,6 +195,10 @@ export interface Config {
'privacy-policy-settings': PrivacyPolicySettingsSelect<false> | PrivacyPolicySettingsSelect<true>;
'email-logs': EmailLogsSelect<false> | EmailLogsSelect<true>;
'audit-logs': AuditLogsSelect<false> | AuditLogsSelect<true>;
'monitoring-snapshots': MonitoringSnapshotsSelect<false> | MonitoringSnapshotsSelect<true>;
'monitoring-logs': MonitoringLogsSelect<false> | MonitoringLogsSelect<true>;
'monitoring-alert-rules': MonitoringAlertRulesSelect<false> | MonitoringAlertRulesSelect<true>;
'monitoring-alert-history': MonitoringAlertHistorySelect<false> | MonitoringAlertHistorySelect<true>;
'site-settings': SiteSettingsSelect<false> | SiteSettingsSelect<true>;
navigations: NavigationsSelect<false> | NavigationsSelect<true>;
forms: FormsSelect<false> | FormsSelect<true>;
@ -310,6 +318,10 @@ export interface YoutubeChannel {
language: 'de' | 'en';
category: 'lifestyle' | 'corporate' | 'b2b';
status: 'active' | 'planned' | 'paused' | 'archived';
/**
* Profil-Thumbnail URL von YouTube (automatisch befüllt)
*/
channelThumbnailUrl?: string | null;
branding?: {
/**
* z.B. #1278B3
@ -494,7 +506,7 @@ export interface Tenant {
/**
* Hostname ohne Protokoll (z.B. smtp.gmail.com)
*/
host: string;
host?: string | null;
/**
* 587 (STARTTLS) oder 465 (SSL)
*/
@ -506,7 +518,7 @@ export interface Tenant {
/**
* Meist die E-Mail-Adresse
*/
user: string;
user?: string | null;
/**
* Leer lassen um bestehendes Passwort zu behalten
*/
@ -528,11 +540,6 @@ export interface Page {
* URL-Pfad (z.B. "ueber-uns" / "about-us")
*/
slug: string;
hero?: {
image?: (number | null) | Media;
headline?: string | null;
subline?: string | null;
};
layout?:
| (
| {
@ -797,7 +804,13 @@ export interface Page {
headline?: string | null;
cards?:
| {
mediaType?: ('none' | 'image' | 'icon') | null;
image?: (number | null) | Media;
/**
* Lucide Icon-Name (z.B. "heart", "star", "shield-check", "camera")
*/
icon?: string | null;
iconPosition?: ('top' | 'left') | null;
title: string;
description?: string | null;
link?: string | null;
@ -6381,6 +6394,17 @@ export interface YoutubeContent {
subscribersGained?: number | null;
lastSyncedAt?: string | null;
};
/**
* Für ROI-Berechnung (manuell pflegen)
*/
costs?: {
estimatedProductionHours?: number | null;
estimatedProductionCost?: number | null;
/**
* AdSense + Sponsoring + Affiliate
*/
estimatedRevenue?: number | null;
};
/**
* Nur für das Team sichtbar
*/
@ -7422,6 +7446,232 @@ export interface AuditLog {
updatedAt: string;
createdAt: string;
}
/**
* Historische System-Metriken für Trend-Charts
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-snapshots".
*/
export interface MonitoringSnapshot {
id: number;
timestamp: string;
/**
* System-Ressourcen (CPU, RAM, Disk)
*/
system?: {
cpuUsagePercent?: number | null;
memoryUsedMB?: number | null;
memoryTotalMB?: number | null;
memoryUsagePercent?: number | null;
diskUsedGB?: number | null;
diskTotalGB?: number | null;
diskUsagePercent?: number | null;
loadAvg1?: number | null;
loadAvg5?: number | null;
/**
* Uptime in Sekunden
*/
uptime?: number | null;
};
/**
* Service-Status (PM2-Prozesse, Datenbank, Cache)
*/
services?: {
payload?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
queueWorker?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
postgresql?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
pgbouncer?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
redis?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
};
/**
* Externe Services (SMTP, OAuth, Cron)
*/
external?: {
smtp?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
metaOAuth?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
youtubeOAuth?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
cronJobs?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
};
/**
* Performance-Metriken
*/
performance?: {
avgResponseTimeMs?: number | null;
p95ResponseTimeMs?: number | null;
p99ResponseTimeMs?: number | null;
errorRate?: number | null;
requestsPerMinute?: number | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Structured Logs für Business-Events
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-logs".
*/
export interface MonitoringLog {
id: number;
level: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
source: 'payload' | 'queue-worker' | 'cron' | 'email' | 'oauth' | 'sync';
message: string;
/**
* Strukturierte Metadaten
*/
context?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
/**
* Korrelations-ID
*/
requestId?: string | null;
userId?: (number | null) | User;
tenant?: (number | null) | Tenant;
/**
* Dauer in ms
*/
duration?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Konfigurierbare Alert-Regeln
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-alert-rules".
*/
export interface MonitoringAlertRule {
id: number;
name: string;
/**
* z.B. system.cpuUsagePercent, services.redis.memoryUsedMB
*/
metric: string;
condition: 'gt' | 'lt' | 'eq' | 'gte' | 'lte';
threshold: number;
severity: 'warning' | 'error' | 'critical';
channels: ('email' | 'slack' | 'discord')[];
recipients?: {
emails?:
| {
email: string;
id?: string | null;
}[]
| null;
slackWebhook?: string | null;
discordWebhook?: string | null;
};
/**
* Minimaler Abstand zwischen gleichen Alerts
*/
cooldownMinutes?: number | null;
enabled?: boolean | null;
/**
* Optional: Tenant-spezifische Regel
*/
tenant?: (number | null) | Tenant;
updatedAt: string;
createdAt: string;
}
/**
* Alert-Log (WORM - Write Once)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-alert-history".
*/
export interface MonitoringAlertHistory {
id: number;
rule?: (number | null) | MonitoringAlertRule;
metric: string;
value: number;
threshold: number;
severity: 'warning' | 'error' | 'critical';
message: string;
channelsSent?: ('email' | 'slack' | 'discord')[] | null;
resolvedAt?: string | null;
acknowledgedBy?: (number | null) | User;
updatedAt: string;
createdAt: string;
}
/**
* Allgemeine Website-Einstellungen pro Tenant
*
@ -7804,6 +8054,22 @@ export interface PayloadLockedDocument {
relationTo: 'audit-logs';
value: number | AuditLog;
} | null)
| ({
relationTo: 'monitoring-snapshots';
value: number | MonitoringSnapshot;
} | null)
| ({
relationTo: 'monitoring-logs';
value: number | MonitoringLog;
} | null)
| ({
relationTo: 'monitoring-alert-rules';
value: number | MonitoringAlertRule;
} | null)
| ({
relationTo: 'monitoring-alert-history';
value: number | MonitoringAlertHistory;
} | null)
| ({
relationTo: 'site-settings';
value: number | SiteSetting;
@ -8065,13 +8331,6 @@ export interface PagesSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
hero?:
| T
| {
image?: T;
headline?: T;
subline?: T;
};
layout?:
| T
| {
@ -8297,7 +8556,10 @@ export interface PagesSelect<T extends boolean = true> {
cards?:
| T
| {
mediaType?: T;
image?: T;
icon?: T;
iconPosition?: T;
title?: T;
description?: T;
link?: T;
@ -11464,6 +11726,7 @@ export interface YoutubeChannelsSelect<T extends boolean = true> {
language?: T;
category?: T;
status?: T;
channelThumbnailUrl?: T;
branding?:
| T
| {
@ -11631,6 +11894,13 @@ export interface YoutubeContentSelect<T extends boolean = true> {
subscribersGained?: T;
lastSyncedAt?: T;
};
costs?:
| T
| {
estimatedProductionHours?: T;
estimatedProductionCost?: T;
estimatedRevenue?: T;
};
internalNotes?: T;
updatedAt?: T;
createdAt?: T;
@ -12278,6 +12548,117 @@ export interface AuditLogsSelect<T extends boolean = true> {
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-snapshots_select".
*/
export interface MonitoringSnapshotsSelect<T extends boolean = true> {
timestamp?: T;
system?:
| T
| {
cpuUsagePercent?: T;
memoryUsedMB?: T;
memoryTotalMB?: T;
memoryUsagePercent?: T;
diskUsedGB?: T;
diskTotalGB?: T;
diskUsagePercent?: T;
loadAvg1?: T;
loadAvg5?: T;
uptime?: T;
};
services?:
| T
| {
payload?: T;
queueWorker?: T;
postgresql?: T;
pgbouncer?: T;
redis?: T;
};
external?:
| T
| {
smtp?: T;
metaOAuth?: T;
youtubeOAuth?: T;
cronJobs?: T;
};
performance?:
| T
| {
avgResponseTimeMs?: T;
p95ResponseTimeMs?: T;
p99ResponseTimeMs?: T;
errorRate?: T;
requestsPerMinute?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-logs_select".
*/
export interface MonitoringLogsSelect<T extends boolean = true> {
level?: T;
source?: T;
message?: T;
context?: T;
requestId?: T;
userId?: T;
tenant?: T;
duration?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-alert-rules_select".
*/
export interface MonitoringAlertRulesSelect<T extends boolean = true> {
name?: T;
metric?: T;
condition?: T;
threshold?: T;
severity?: T;
channels?: T;
recipients?:
| T
| {
emails?:
| T
| {
email?: T;
id?: T;
};
slackWebhook?: T;
discordWebhook?: T;
};
cooldownMinutes?: T;
enabled?: T;
tenant?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "monitoring-alert-history_select".
*/
export interface MonitoringAlertHistorySelect<T extends boolean = true> {
rule?: T;
metric?: T;
value?: T;
threshold?: T;
severity?: T;
message?: T;
channelsSent?: T;
resolvedAt?: T;
acknowledgedBy?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "site-settings_select".