* Resolve a safe-output issue/PR target number from a message. * Handles temporary IDs, field aliases, and deferred resolution. * * Returns one of: * - `{ success: true, number: n }` — explicit number found and resolved * - `{ success: true, number: null }` — no explicit number; caller should u
({ message, resolvedTemporaryIds, tempIdMap, repoParts, handlerType, aliases = ["item_number", "issue_number", "pr_number", "pull_number"] })
| 458 | * @returns {{success: true, number: number|null} | {success: false, deferred?: boolean, error: string}} |
| 459 | */ |
| 460 | function resolveSafeOutputIssueTarget({ message, resolvedTemporaryIds, tempIdMap, repoParts, handlerType, aliases = ["item_number", "issue_number", "pr_number", "pull_number"] }) { |
| 461 | const fieldNames = aliases; |
| 462 | |
| 463 | // Find the first non-null explicit value across all provided field aliases |
| 464 | let explicitValue; |
| 465 | for (const alias of fieldNames) { |
| 466 | if (message[alias] !== undefined && message[alias] !== null) { |
| 467 | explicitValue = message[alias]; |
| 468 | break; |
| 469 | } |
| 470 | } |
| 471 | |
| 472 | if (explicitValue === undefined) { |
| 473 | // No explicit item number provided — caller should fall back to event context |
| 474 | return { success: true, number: null }; |
| 475 | } |
| 476 | |
| 477 | const map = tempIdMap ?? loadTemporaryIdMapFromResolved(resolvedTemporaryIds); |
| 478 | const resolvedTarget = resolveRepoIssueTarget(explicitValue, map, repoParts.owner, repoParts.repo); |
| 479 | |
| 480 | if (resolvedTarget.wasTemporaryId && !resolvedTarget.resolved) { |
| 481 | core.info(`Deferring ${handlerType}: unresolved temporary ID (${explicitValue})`); |
| 482 | return { |
| 483 | success: false, |
| 484 | deferred: true, |
| 485 | error: resolvedTarget.errorMessage ?? `Unresolved temporary ID: ${explicitValue}`, |
| 486 | }; |
| 487 | } |
| 488 | |
| 489 | if (resolvedTarget.errorMessage || !resolvedTarget.resolved) { |
| 490 | const error = `Invalid item number: ${explicitValue}`; |
| 491 | core.warning(error); |
| 492 | return { success: false, error }; |
| 493 | } |
| 494 | |
| 495 | return { success: true, number: resolvedTarget.resolved.number }; |
| 496 | } |
| 497 | |
| 498 | /** |
| 499 | * Check if text contains unresolved temporary ID references |
no test coverage detected