diff --git a/plugins/clone-app/skills/clone-app/scripts/extract-package.sh b/plugins/clone-app/skills/clone-app/scripts/extract-package.sh new file mode 100755 index 0000000..844647a --- /dev/null +++ b/plugins/clone-app/skills/clone-app/scripts/extract-package.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -euo pipefail + +input="${1:-}" +if [[ -z "$input" ]]; then + echo "ERROR: usage: extract-package.sh " >&2 + exit 1 +fi + +# Case 1: full URL containing id= +if [[ "$input" =~ id=([a-zA-Z0-9._]+) ]]; then + echo "${BASH_REMATCH[1]}" + exit 0 +fi + +# Case 2: already a bare package (must contain a dot, valid chars only) +if [[ "$input" =~ ^[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)+$ ]]; then + echo "$input" + exit 0 +fi + +echo "ERROR: could not extract package from '$input'" >&2 +exit 1 diff --git a/plugins/clone-app/tests/test-extract-package.sh b/plugins/clone-app/tests/test-extract-package.sh new file mode 100644 index 0000000..718e3e0 --- /dev/null +++ b/plugins/clone-app/tests/test-extract-package.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -uo pipefail +SCRIPT="$(dirname "$0")/../skills/clone-app/scripts/extract-package.sh" +fail=0 +check() { + local desc="$1" expected="$2" actual="$3" + if [[ "$expected" == "$actual" ]]; then + echo "PASS: $desc" + else + echo "FAIL: $desc — expected '$expected' got '$actual'"; fail=1 + fi +} + +check "full url" "com.example.app" \ + "$(bash "$SCRIPT" 'https://play.google.com/store/apps/details?id=com.example.app')" +check "url with extra params" "com.whatsapp" \ + "$(bash "$SCRIPT" 'https://play.google.com/store/apps/details?id=com.whatsapp&hl=en&gl=US')" +check "bare package passthrough" "com.spotify.music" \ + "$(bash "$SCRIPT" 'com.spotify.music')" + +# invalid input → exit 1, empty stdout +out="$(bash "$SCRIPT" 'not a url' 2>/dev/null)"; rc=$? +check "invalid exit code" "1" "$rc" +check "invalid empty stdout" "" "$out" + +exit $fail