| name: Detect Unused i18next Strings |
|
|
| |
| |
| |
| |
|
|
| on: |
| pull_request: |
| paths: |
| - "client/src/**" |
| - "api/**" |
| - "packages/data-provider/src/**" |
| - "packages/client/**" |
| - "packages/data-schemas/src/**" |
|
|
| jobs: |
| detect-unused-i18n-keys: |
| runs-on: ubuntu-latest |
| permissions: |
| pull-requests: write |
| steps: |
| - name: Checkout repository |
| uses: actions/checkout@v3 |
|
|
| - name: Find unused i18next keys |
| id: find-unused |
| run: | |
| echo "π Scanning for unused i18next keys..." |
| |
| |
| I18N_FILE="client/src/locales/en/translation.json" |
| SOURCE_DIRS=("client/src" "api" "packages/data-provider/src" "packages/client" "packages/data-schemas/src") |
|
|
| |
| if [[ ! -f "$I18N_FILE" ]]; then |
| echo "::error title=Missing i18n File::Translation file not found: $I18N_FILE" |
| exit 1 |
| fi |
|
|
| |
| KEYS=$(jq -r 'keys[]' "$I18N_FILE") |
|
|
| |
| UNUSED_KEYS=() |
|
|
| |
| for KEY in $KEYS; do |
| FOUND=false |
| |
| |
| if [[ "$KEY" == com_ui_special_var_* ]]; then |
| |
| for DIR in "${SOURCE_DIRS[@]}"; do |
| if grep -r --include=\*.{js,jsx,ts,tsx} -q "TSpecialVarLabel" "$DIR"; then |
| FOUND=true |
| break |
| fi |
| done |
| |
| |
| if [[ "$FOUND" == false ]]; then |
| for DIR in "${SOURCE_DIRS[@]}"; do |
| if grep -r --include=\*.{js,jsx,ts,tsx} -q "$KEY" "$DIR"; then |
| FOUND=true |
| break |
| fi |
| done |
| fi |
| |
| elif [[ "$KEY" == com_agents_category_* ]]; then |
| |
| for DIR in "${SOURCE_DIRS[@]}"; do |
| |
| if grep -r --include=\*.{js,jsx,ts,tsx} -E "category\.(label|description).*startsWith.*['\"]com_" "$DIR" > /dev/null 2>&1 || \ |
| |
| grep -r --include=\*.{js,jsx,ts,tsx} "ensureDefaultCategories" "$DIR" > /dev/null 2>&1 || \ |
| |
| grep -r --include=\*.ts -E "label:.*['\"]$KEY['\"]" "$DIR" > /dev/null 2>&1 || \ |
| grep -r --include=\*.ts -E "description:.*['\"]$KEY['\"]" "$DIR" > /dev/null 2>&1; then |
| FOUND=true |
| break |
| fi |
| done |
| |
| |
| if [[ "$FOUND" == false ]]; then |
| for DIR in "${SOURCE_DIRS[@]}"; do |
| if grep -r --include=\*.{js,jsx,ts,tsx} -q "$KEY" "$DIR"; then |
| FOUND=true |
| break |
| fi |
| done |
| fi |
| else |
| |
| for DIR in "${SOURCE_DIRS[@]}"; do |
| if grep -r --include=\*.{js,jsx,ts,tsx} -q "$KEY" "$DIR"; then |
| FOUND=true |
| break |
| fi |
| done |
| fi |
| |
| if [[ "$FOUND" == false ]]; then |
| UNUSED_KEYS+=("$KEY") |
| fi |
| done |
|
|
| |
| if [[ ${ |
| echo "π Found ${#UNUSED_KEYS[@]} unused i18n keys:" |
| echo "unused_keys=$(echo "${UNUSED_KEYS[@]}" | jq -R -s -c 'split(" ")')" >> $GITHUB_ENV |
| for KEY in "${UNUSED_KEYS[@]}"; do |
| echo "::warning title=Unused i18n Key::'$KEY' is defined but not used in the codebase." |
| done |
| else |
| echo "β
No unused i18n keys detected!" |
| echo "unused_keys=[]" >> $GITHUB_ENV |
| fi |
|
|
| - name: Post verified comment on PR |
| if: env.unused_keys != '[]' |
| run: | |
| PR_NUMBER=$(jq --raw-output .pull_request.number "$GITHUB_EVENT_PATH") |
| |
| |
| FILTERED_KEYS=$(echo "$unused_keys" | jq -r '.[]' | grep -v '^\s*$' | sed 's/^/- [ ] `/;s/$/`/' ) |
|
|
| COMMENT_BODY=$(cat <<EOF |
| |
|
|
| The following translation keys are defined in \`translation.json\` but are **not used** in the codebase: |
|
|
| $FILTERED_KEYS |
|
|
| β οΈ **Please remove these unused keys to keep the translation files clean.** |
| EOF |
| ) |
|
|
| gh api "repos/${{ github.repository }}/issues/${PR_NUMBER}/comments" \ |
| -f body="$COMMENT_BODY" \ |
| -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|
|
| - name: Fail workflow if unused keys found |
| if: env.unused_keys != '[]' |
| run: exit 1 |
|
|