mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-08-02 21:34:30 +08:00
114 lines
2.9 KiB
Bash
Executable File
114 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# scan-lwc-components.sh — Scan local SFDX project for LWC components matching a query.
|
|
#
|
|
# Usage: scripts/scan-lwc-components.sh <query> [packageDirectory]
|
|
#
|
|
# Arguments:
|
|
# query — User intent keywords (e.g., "expense tracker")
|
|
# packageDirectory — SFDX package directory path (default: read from sfdx-project.json)
|
|
#
|
|
# Output: Ranked JSON array of matches with confidence scores.
|
|
# [{"name": "expenseTracker", "score": 75, "confidence": "high"}]
|
|
#
|
|
# Confidence tiers:
|
|
# high (≥70%): auto-select, confirm with user
|
|
# medium (40-69%): present ranked list for user selection
|
|
# low (<40%): skip, proceed to Tier 2
|
|
|
|
set -euo pipefail
|
|
|
|
QUERY="${1:-}"
|
|
PKG_DIR="${2:-}"
|
|
|
|
if [ -z "$QUERY" ]; then
|
|
echo "Usage: $0 <query> [packageDirectory]" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Resolve package directory from sfdx-project.json if not provided
|
|
if [ -z "$PKG_DIR" ]; then
|
|
if [ -f "sfdx-project.json" ]; then
|
|
PKG_DIR=$(python3 -c "
|
|
import json, sys
|
|
with open('sfdx-project.json') as f:
|
|
data = json.load(f)
|
|
dirs = data.get('packageDirectories', [])
|
|
if dirs:
|
|
print(dirs[0].get('path', 'force-app'))
|
|
else:
|
|
print('force-app')
|
|
" 2>/dev/null || echo "force-app")
|
|
else
|
|
PKG_DIR="force-app"
|
|
fi
|
|
fi
|
|
|
|
# Check if package directory exists
|
|
if [ ! -d "$PKG_DIR" ]; then
|
|
echo "[]"
|
|
exit 0
|
|
fi
|
|
|
|
# Tokenize query: lowercase, split on spaces
|
|
IFS=' ' read -ra QUERY_TOKENS <<< "$(echo "$QUERY" | tr '[:upper:]' '[:lower:]')"
|
|
|
|
# Find all LWC component directories
|
|
RESULTS="["
|
|
FIRST=true
|
|
|
|
while IFS= read -r dir; do
|
|
COMP_NAME=$(basename "$dir")
|
|
|
|
# Tokenize camelCase component name: split on uppercase boundaries → lowercase
|
|
COMP_TOKENS=$(echo "$COMP_NAME" | sed 's/\([a-z]\)\([A-Z]\)/\1 \2/g' | tr '[:upper:]' '[:lower:]')
|
|
IFS=' ' read -ra TOKENS <<< "$COMP_TOKENS"
|
|
TOTAL=${#TOKENS[@]}
|
|
|
|
if [ "$TOTAL" -eq 0 ]; then
|
|
continue
|
|
fi
|
|
|
|
# Count matched tokens
|
|
MATCHED=0
|
|
for qt in "${QUERY_TOKENS[@]}"; do
|
|
for ct in "${TOKENS[@]}"; do
|
|
if [ "$qt" = "$ct" ]; then
|
|
MATCHED=$((MATCHED + 1))
|
|
break
|
|
fi
|
|
done
|
|
done
|
|
|
|
# Calculate score
|
|
SCORE=$(( (MATCHED * 100) / TOTAL ))
|
|
|
|
# Determine confidence tier
|
|
if [ "$SCORE" -ge 70 ]; then
|
|
CONFIDENCE="high"
|
|
elif [ "$SCORE" -ge 40 ]; then
|
|
CONFIDENCE="medium"
|
|
else
|
|
CONFIDENCE="low"
|
|
fi
|
|
|
|
# Only include medium and high confidence matches
|
|
if [ "$SCORE" -ge 40 ]; then
|
|
if [ "$FIRST" = true ]; then
|
|
FIRST=false
|
|
else
|
|
RESULTS+=","
|
|
fi
|
|
RESULTS+="{\"name\":\"$COMP_NAME\",\"score\":$SCORE,\"confidence\":\"$CONFIDENCE\"}"
|
|
fi
|
|
done < <(find "$PKG_DIR" -path "*/lwc/*" -type d -maxdepth 5 | grep -v "__tests__")
|
|
|
|
RESULTS+="]"
|
|
|
|
# Sort by score descending (using python for JSON sorting)
|
|
echo "$RESULTS" | python3 -c "
|
|
import json, sys
|
|
data = json.load(sys.stdin)
|
|
data.sort(key=lambda x: x['score'], reverse=True)
|
|
print(json.dumps(data, indent=2))
|
|
" 2>/dev/null || echo "$RESULTS"
|