139 lines
3.9 KiB
Bash
139 lines
3.9 KiB
Bash
#!/bin/bash
|
|
# Discover all components in the monorepo
|
|
# Usage: ./scripts/discover.sh [--json]
|
|
|
|
set -e
|
|
|
|
JSON_OUTPUT=false
|
|
if [ "$1" = "--json" ]; then
|
|
JSON_OUTPUT=true
|
|
fi
|
|
|
|
# Colors (only for non-JSON output)
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
# Component discovery
|
|
declare -a COMPONENTS
|
|
|
|
discover_components() {
|
|
for type in services workers apps cli packages; do
|
|
if [ -d "$type" ]; then
|
|
for dir in "$type"/*/; do
|
|
if [ -d "$dir" ] && [ "$dir" != "$type/*/" ]; then
|
|
name=$(basename "$dir")
|
|
path="$type/$name"
|
|
port=""
|
|
stack=""
|
|
|
|
# Detect stack type
|
|
if [ -f "$dir/go.mod" ]; then
|
|
stack="go"
|
|
elif [ -f "$dir/package.json" ]; then
|
|
stack="node"
|
|
# Try to detect framework
|
|
if grep -q "astro" "$dir/package.json" 2>/dev/null; then
|
|
stack="astro"
|
|
elif grep -q "react" "$dir/package.json" 2>/dev/null; then
|
|
stack="react"
|
|
fi
|
|
fi
|
|
|
|
# Try to get port from component.yaml
|
|
if [ -f "$dir/component.yaml" ]; then
|
|
port=$(grep -E '^port:' "$dir/component.yaml" 2>/dev/null | awk '{print $2}' || echo "")
|
|
fi
|
|
|
|
# Try to get port from .env.example
|
|
if [ -z "$port" ] && [ -f "$dir/.env.example" ]; then
|
|
port=$(grep -E '^PORT=' "$dir/.env.example" 2>/dev/null | cut -d'=' -f2 || echo "")
|
|
fi
|
|
|
|
COMPONENTS+=("$type|$name|$path|$port|$stack")
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
output_json() {
|
|
echo "{"
|
|
echo " \"project\": \"slack-auth-1770277926\","
|
|
echo " \"components\": ["
|
|
|
|
local first=true
|
|
for comp in "${COMPONENTS[@]}"; do
|
|
IFS='|' read -r type name path port stack <<< "$comp"
|
|
|
|
if [ "$first" = false ]; then
|
|
echo ","
|
|
fi
|
|
first=false
|
|
|
|
echo -n " {\"type\": \"$type\", \"name\": \"$name\", \"path\": \"$path\""
|
|
if [ -n "$port" ]; then
|
|
echo -n ", \"port\": $port"
|
|
fi
|
|
if [ -n "$stack" ]; then
|
|
echo -n ", \"stack\": \"$stack\""
|
|
fi
|
|
echo -n "}"
|
|
done
|
|
|
|
echo ""
|
|
echo " ]"
|
|
echo "}"
|
|
}
|
|
|
|
output_pretty() {
|
|
echo -e "${BLUE}Components in slack-auth-1770277926${NC}"
|
|
echo ""
|
|
|
|
if [ ${#COMPONENTS[@]} -eq 0 ]; then
|
|
echo -e "${YELLOW}No components found. Add one with:${NC}"
|
|
echo " curl -X POST .../projects/slack-auth-1770277926/components -d '{\"type\":\"service\",\"name\":\"my-api\"}'"
|
|
return
|
|
fi
|
|
|
|
# Group by type
|
|
for type in services workers apps cli packages; do
|
|
local has_type=false
|
|
for comp in "${COMPONENTS[@]}"; do
|
|
IFS='|' read -r ctype name path port stack <<< "$comp"
|
|
if [ "$ctype" = "$type" ]; then
|
|
if [ "$has_type" = false ]; then
|
|
echo -e "${GREEN}$type/${NC}"
|
|
has_type=true
|
|
fi
|
|
local info=" $name"
|
|
if [ -n "$stack" ]; then
|
|
info="$info ${YELLOW}[$stack]${NC}"
|
|
fi
|
|
if [ -n "$port" ]; then
|
|
info="$info :$port"
|
|
fi
|
|
echo -e "$info"
|
|
fi
|
|
done
|
|
if [ "$has_type" = true ]; then
|
|
echo ""
|
|
fi
|
|
done
|
|
|
|
echo "Total: ${#COMPONENTS[@]} component(s)"
|
|
echo ""
|
|
echo "Run './scripts/install.sh' to install all dependencies"
|
|
echo "Run './scripts/dev.sh' to start local development"
|
|
}
|
|
|
|
# Main
|
|
discover_components
|
|
|
|
if [ "$JSON_OUTPUT" = true ]; then
|
|
output_json
|
|
else
|
|
output_pretty
|
|
fi
|