* Resolve workflow repo and effective event context across invocation styles: * - native events * - workflow_dispatch (optional explicit overrides in inputs) * - repository_dispatch (event wrapped in client_payload) * * @param {any} rawContext * @returns {{ * source: "native" | "workflow_di
(rawContext)
| 210 | * }} |
| 211 | */ |
| 212 | function resolveInvocationContext(rawContext) { |
| 213 | const contextRepo = normalizeRepo(rawContext?.repo) || { owner: "", repo: "" }; |
| 214 | const workflowRepo = normalizeRepo(rawContext?.workflowRepo) || contextRepo; |
| 215 | |
| 216 | /** @type {"native" | "workflow_dispatch" | "repository_dispatch"} */ |
| 217 | let source = "native"; |
| 218 | let eventName = rawContext?.eventName || ""; |
| 219 | let eventPayload = rawContext?.payload || {}; |
| 220 | let eventRepo = normalizeRepo(rawContext?.eventRepo); |
| 221 | |
| 222 | if (eventName === "repository_dispatch") { |
| 223 | const clientPayload = rawContext?.payload?.client_payload; |
| 224 | if (clientPayload && typeof clientPayload === "object") { |
| 225 | source = "repository_dispatch"; |
| 226 | eventName = rawContext?.payload?.action || eventName; |
| 227 | eventPayload = clientPayload; |
| 228 | eventRepo = eventRepo || extractRepoFromPayload(clientPayload) || parseRepoSlug(clientPayload?.aw_context?.repo); |
| 229 | } |
| 230 | } else if (eventName === "workflow_dispatch") { |
| 231 | source = "workflow_dispatch"; |
| 232 | const inputs = rawContext?.payload?.inputs; |
| 233 | if (inputs && typeof inputs === "object") { |
| 234 | const inputsEventName = typeof inputs.event_name === "string" ? inputs.event_name : typeof inputs.eventName === "string" ? inputs.eventName : ""; |
| 235 | const parsedPayload = parseJSONPayload(inputs.event_payload) || parseJSONPayload(inputs.eventPayload); |
| 236 | const awContext = parseJSONPayload(inputs.aw_context) || parseJSONPayload(inputs.awContext); |
| 237 | const targetRepo = parseRepoSlug(inputs.target_repo) || parseRepoSlug(inputs.targetRepo); |
| 238 | if (targetRepo) { |
| 239 | checkAllowedRepo(workflowRepo, targetRepo); |
| 240 | } |
| 241 | if (inputsEventName) { |
| 242 | eventName = inputsEventName; |
| 243 | } else if (typeof awContext?.event_type === "string" && awContext.event_type.trim()) { |
| 244 | eventName = awContext.event_type.trim(); |
| 245 | } |
| 246 | if (parsedPayload) { |
| 247 | eventPayload = parsedPayload; |
| 248 | } else if (awContext && typeof awContext === "object") { |
| 249 | const awPayload = buildPayloadFromAwContext(awContext, eventName); |
| 250 | if (awPayload) { |
| 251 | eventPayload = awPayload; |
| 252 | } |
| 253 | } |
| 254 | eventRepo = eventRepo || parseRepoSlug(inputs.event_repo) || parseRepoSlug(inputs.eventRepo) || parseRepoSlug(typeof awContext?.repo === "string" ? awContext.repo : undefined) || targetRepo; |
| 255 | } |
| 256 | } |
| 257 | |
| 258 | if (!eventRepo) { |
| 259 | eventRepo = extractRepoFromPayload(eventPayload) || workflowRepo; |
| 260 | } |
| 261 | |
| 262 | return { |
| 263 | source, |
| 264 | eventName, |
| 265 | eventPayload, |
| 266 | workflowRepo, |
| 267 | eventRepo, |
| 268 | }; |
| 269 | } |
no test coverage detected