scaffolder: Support conditional if on output links and text (#33332)

* Add sample template for conditional output demo

Add a scaffolder template that exercises conditional `if` on output
links and text items, for testing issue #24805.

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Support conditional `if` on scaffolder output links and text

Add `if` property to output link and text items in scaffolder templates,
allowing template authors to conditionally show/hide output items based
on parameters or step results. Items with a falsy `if` condition are
filtered out before being sent to the frontend.

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Add changesets for conditional output feature

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Document conditional if on output links and text

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Guard against non-object items in output arrays

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Skip array items in output if-filtering destructuring

Add Array.isArray guard to prevent corrupting array items
into plain objects during the rest-destructuring step.

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Extract filterConditionalItems helper to deduplicate logic

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Align output if schema descriptions with step if semantics

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Fix docs quality check: replace 'falsy' wording

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

* Refactor filterConditionalItems to use flatMap and generics

Replace .filter().map() with a single flatMap call and make the function
generic to eliminate JsonArray casts at call sites.

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>

---------

Signed-off-by: Dmitry Gusev <gusevda90@gmail.com>
This commit is contained in:
Dmitry Gusev
2026-04-14 15:29:04 +03:00
committed by GitHub
parent aa08b7f135
commit 3ef6078b70
11 changed files with 270 additions and 3 deletions
@@ -7,6 +7,7 @@ spec:
targets:
- ./remote-templates.yaml
- ./notifications-demo/template.yaml
- ./conditional-output-demo/template.yaml
# For local development of a template, you can reference your local templates here.
# Examples:
#
@@ -0,0 +1,62 @@
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: conditional-output-demo
title: Conditional Output Demo
description: Demonstrates conditional if on output links and text
spec:
owner: backstage/techdocs-core
type: service
parameters:
- title: Options
required:
- name
properties:
name:
title: Name
type: string
description: Unique name of the component
ui:autofocus: true
enableCI:
title: Enable CI
type: string
enum:
- 'Yes'
- 'No'
default: 'Yes'
showDetails:
title: Show Details
type: boolean
default: true
steps:
- id: log
name: Log
action: debug:log
input:
message: 'Creating ${{ parameters.name }}'
output:
links:
- title: Backstage Homepage
url: https://backstage.io
- if: ${{ parameters.enableCI === "Yes" }}
title: CI Dashboard
icon: dashboard
url: https://ci.example.com/${{ parameters.name }}
- if: ${{ parameters.enableCI === "Yes" }}
title: CI Docs
url: https://ci.example.com/docs
text:
- title: Summary
content: |
**Component:** `${{ parameters.name }}`
- if: ${{ parameters.showDetails }}
title: CI Details
content: |
**CI enabled:** ${{ parameters.enableCI }}
- if: ${{ parameters.enableCI === "Yes" }}
title: CI Setup Instructions
content: |
Run `ci-setup --name ${{ parameters.name }}` to configure CI.