(content: string, filename: string)
| 427 | } |
| 428 | |
| 429 | export function extractWorkflowName(content: string, filename: string): string { |
| 430 | try { |
| 431 | const parsed = unwrapWorkflowExportEnvelope(JSON.parse(content)) as Record<string, any> |
| 432 | |
| 433 | if (parsed.state?.metadata?.name && typeof parsed.state.metadata.name === 'string') { |
| 434 | return parsed.state.metadata.name.trim() |
| 435 | } |
| 436 | |
| 437 | if (parsed.workflow?.name && typeof parsed.workflow.name === 'string') { |
| 438 | return parsed.workflow.name.trim() |
| 439 | } |
| 440 | } catch { |
| 441 | // JSON parse failed, fall through to filename |
| 442 | } |
| 443 | |
| 444 | let name = filename.replace(/\.json$/i, '') |
| 445 | |
| 446 | name = name.replace(/-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, '') |
| 447 | |
| 448 | name = name |
| 449 | .replace(/[-_]/g, ' ') |
| 450 | .split(' ') |
| 451 | .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) |
| 452 | .join(' ') |
| 453 | |
| 454 | return name.trim() || 'Imported Workflow' |
| 455 | } |
| 456 | |
| 457 | /** |
| 458 | * Normalize subblock values by converting empty strings to null and repairing invalid subblocks. |
no test coverage detected