XRD Transform - Quick Start
Run It Now (Easy Way - Workspace Script)
# 1. From workspace root
cd /path/to/portal-workspace
# 2. Transform template-namespace XRD
./scripts/xrd-transform.sh template-namespace/configuration/xrd.yaml
# 3. With verbose output
./scripts/xrd-transform.sh -v template-namespace/configuration/xrd.yaml
# 4. From stdin (pipe)
cat template-namespace/configuration/xrd.yaml | ./scripts/xrd-transform.sh
# 5. Save to file
./scripts/xrd-transform.sh template-namespace/configuration/xrd.yaml > /tmp/generated-template.yaml
# 6. View generated template
cat /tmp/generated-template.yaml | head -50
Alternative: Direct CLI (From Plugin Directory)
# 1. Navigate to ingestor plugin
cd plugins/ingestor
# 2. Transform template-namespace XRD
cat ../../../template-namespace/configuration/xrd.yaml | \
npx ts-node --project tsconfig.cli.json \
src/xrd-transform/cli/xrd-transform-cli.ts
# 3. With verbose output
cat ../../../template-namespace/configuration/xrd.yaml | \
npx ts-node --project tsconfig.cli.json \
src/xrd-transform/cli/xrd-transform-cli.ts -v
What You Get
Input: Crossplane XRD (CompositeResourceDefinition) Output:
- ✅ Backstage Template entity (scaffolder.backstage.io/v1beta3)
- ✅ API Documentation entity (backstage.io/v1alpha1)
One-Liner for Testing
# From workspace root (recommended)
./scripts/xrd-transform.sh -v template-namespace/configuration/xrd.yaml
# Or from plugin directory
cd plugins/ingestor && \
cat ../../../template-namespace/configuration/xrd.yaml | \
npx ts-node --project tsconfig.cli.json src/xrd-transform/cli/xrd-transform-cli.ts -v
Directory Structure
plugins/ingestor/
├── templates/ ← Handlebars templates (customizable!)
│ ├── backstage/
│ │ ├── default.hbs
│ │ └── simple.hbs
│ └── api/
│ └── default.hbs
│
└── src/
└── xrd-transform/ ← Transform tool
├── lib/ ← Core library
├── helpers/ ← Template helpers
└── cli/ ← CLI wrapper
Common Options
# Only generate templates (no API docs)
--only template
# Only generate API docs (no templates)
--only api
# Use custom templates
-t /path/to/templates
# Save to directory
-o ./output
# JSON format instead of YAML
-f json
# See what's happening
-v
# Watch for changes
--watch
Filter Output Examples
# Generate only Backstage template (no API entity)
./scripts/xrd-transform.sh --only template template-namespace/configuration/xrd.yaml
# Generate only API documentation
./scripts/xrd-transform.sh --only api template-namespace/configuration/xrd.yaml
# Generate both (default behavior)
./scripts/xrd-transform.sh template-namespace/configuration/xrd.yaml
See Full Examples
Test Other XRDs
# From workspace root (easy)
./scripts/xrd-transform.sh template-whoami/xrd.yaml
./scripts/xrd-transform.sh template-cloudflare-dnsrecord/xrd.yaml
# Or from plugin directory
cat ../../../template-whoami/xrd.yaml | \
npx ts-node --project tsconfig.cli.json \
src/xrd-transform/cli/xrd-transform-cli.ts
cat ../../../template-cloudflare-dnsrecord/xrd.yaml | \
npx ts-node --project tsconfig.cli.json \
src/xrd-transform/cli/xrd-transform-cli.ts
Integration with Backstage
The plugin uses the same library automatically:
// In XRDTemplateEntityProvider
const transformer = new XRDTransformer();
const entities = await transformer.transform(xrdData);
// Returns Backstage Template + API entities
No CLI needed in production - the plugin discovers XRDs from Kubernetes and transforms them automatically!