* Extract user-facing configuration fields from a TriggerConfig subBlocks definition. * Handles both inline arrays (`subBlocks: [...]`) and builder function calls * (`subBlocks: buildXSubBlocks({...})`), resolving them from the trigger file and utils.ts.
( segment: string, primaryContent?: string, utilsContent?: string )
| 3457 | * (`subBlocks: buildXSubBlocks({...})`), resolving them from the trigger file and utils.ts. |
| 3458 | */ |
| 3459 | function extractTriggerConfigFields( |
| 3460 | segment: string, |
| 3461 | primaryContent?: string, |
| 3462 | utilsContent?: string |
| 3463 | ): TriggerConfigField[] { |
| 3464 | const UI_ONLY_IDS = new Set(['webhookUrlDisplay', 'triggerInstructions', 'selectedTriggerId']) |
| 3465 | const allContent = utilsContent || primaryContent || '' |
| 3466 | |
| 3467 | // Case 1: Inline subBlocks: [...] |
| 3468 | const subBlocksMatch = /\bsubBlocks\s*:\s*\[/.exec(segment) |
| 3469 | if (subBlocksMatch) { |
| 3470 | const arrayStart = subBlocksMatch.index + subBlocksMatch[0].length - 1 |
| 3471 | const arrayEnd = findMatchingClose(segment, arrayStart, '[', ']') |
| 3472 | if (arrayEnd === -1) return [] |
| 3473 | return parseSubBlockArrayContent( |
| 3474 | segment.substring(arrayStart + 1, arrayEnd - 1), |
| 3475 | UI_ONLY_IDS, |
| 3476 | allContent |
| 3477 | ) |
| 3478 | } |
| 3479 | |
| 3480 | // Case 2: Builder function call — subBlocks: buildXFunc(...) |
| 3481 | if (!allContent) return [] |
| 3482 | const builderCallMatch = /\bsubBlocks\s*:\s*(\w+)\s*\(/.exec(segment) |
| 3483 | if (!builderCallMatch) return [] |
| 3484 | |
| 3485 | const funcName = builderCallMatch[1] |
| 3486 | |
| 3487 | // Special case: buildTriggerSubBlocks — user config lives in the `extraFields` parameter |
| 3488 | if (funcName === 'buildTriggerSubBlocks') { |
| 3489 | const openParen = builderCallMatch.index + builderCallMatch[0].length - 1 |
| 3490 | const closeParen = findMatchingClose(segment, openParen, '(', ')') |
| 3491 | if (closeParen === -1) return [] |
| 3492 | |
| 3493 | const argsBody = segment.substring(openParen + 1, closeParen - 1) |
| 3494 | const extraFieldsMatch = /\bextraFields\s*:\s*/.exec(argsBody) |
| 3495 | if (!extraFieldsMatch) return [] |
| 3496 | |
| 3497 | // Find first non-whitespace char after "extraFields:" |
| 3498 | let valuePos = extraFieldsMatch.index + extraFieldsMatch[0].length |
| 3499 | while (valuePos < argsBody.length && /\s/.test(argsBody[valuePos])) valuePos++ |
| 3500 | |
| 3501 | if (argsBody[valuePos] === '[') { |
| 3502 | // extraFields: [...] — inline array, may contain function calls |
| 3503 | const arrayEnd = findMatchingClose(argsBody, valuePos, '[', ']') |
| 3504 | if (arrayEnd === -1) return [] |
| 3505 | return parseSubBlockArrayContent( |
| 3506 | argsBody.substring(valuePos + 1, arrayEnd - 1), |
| 3507 | UI_ONLY_IDS, |
| 3508 | allContent |
| 3509 | ) |
| 3510 | } |
| 3511 | |
| 3512 | // extraFields: buildXFunc(args) — resolve the builder function |
| 3513 | const extraFuncMatch = /^(\w+)\s*\(/.exec(argsBody.substring(valuePos)) |
| 3514 | if (!extraFuncMatch) return [] |
| 3515 | return resolveSubBlockBuilderFunction(extraFuncMatch[1], allContent) |
| 3516 | } |
no test coverage detected