fpf-cli 1.6.45 → 1.6.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/fpf +103 -109
  2. package/package.json +1 -1
package/fpf CHANGED
@@ -3,7 +3,7 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_NAME="fpf"
6
- SCRIPT_VERSION="1.6.45"
6
+ SCRIPT_VERSION="1.6.46"
7
7
  TMP_ROOT="${TMPDIR:-/tmp}/fpf"
8
8
  SESSION_TMP_ROOT=""
9
9
  HELP_FILE=""
@@ -102,7 +102,7 @@ dynamic_reload_query_cache_bypass_value() {
102
102
  local bypass_setting="${FPF_DYNAMIC_RELOAD_BYPASS_QUERY_CACHE:-1}"
103
103
 
104
104
  bypass_setting="$(trim_whitespace "${bypass_setting}")"
105
- bypass_setting="$(printf "%s" "${bypass_setting}" | tr '[:upper:]' '[:lower:]')"
105
+ bypass_setting="${bypass_setting,,}"
106
106
 
107
107
  case "${bypass_setting}" in
108
108
  1|true|yes|on)
@@ -122,7 +122,7 @@ loading_indicator_enabled() {
122
122
  local indicator_setting=""
123
123
 
124
124
  indicator_setting="$(trim_whitespace "${FPF_LOADING_INDICATOR:-1}")"
125
- indicator_setting="$(printf "%s" "${indicator_setting}" | tr '[:upper:]' '[:lower:]')"
125
+ indicator_setting="${indicator_setting,,}"
126
126
 
127
127
  case "${indicator_setting}" in
128
128
  0|false|no|off)
@@ -430,7 +430,7 @@ assume_yes_enabled() {
430
430
  fi
431
431
 
432
432
  env_assume_yes="$(trim_whitespace "${FPF_ASSUME_YES:-0}")"
433
- env_assume_yes="$(printf "%s" "${env_assume_yes}" | tr '[:upper:]' '[:lower:]')"
433
+ env_assume_yes="${env_assume_yes,,}"
434
434
 
435
435
  case "${env_assume_yes}" in
436
436
  1|true|yes|on)
@@ -491,13 +491,14 @@ initialize_cache_root() {
491
491
  }
492
492
 
493
493
  normalize_cache_query() {
494
- printf "%s" "$1" |
495
- awk '{
496
- line=$0
497
- gsub(/^[[:space:]]+|[[:space:]]+$/, "", line)
498
- gsub(/[[:space:]]+/, " ", line)
499
- print tolower(line)
500
- }'
494
+ local value="$1"
495
+ local -a tokens=()
496
+
497
+ read -r -a tokens <<<"${value}"
498
+ value="${tokens[*]}"
499
+ value="${value,,}"
500
+
501
+ printf "%s" "${value}"
501
502
  }
502
503
 
503
504
  trim_whitespace() {
@@ -531,7 +532,10 @@ log_selection_parse_skip() {
531
532
  }
532
533
 
533
534
  platform_cache_token() {
534
- uname -s | tr '[:upper:]' '[:lower:]'
535
+ local os
536
+
537
+ os="$(uname -s)"
538
+ printf "%s" "${os,,}"
535
539
  }
536
540
 
537
541
  cache_fingerprint() {
@@ -1079,7 +1083,7 @@ search_catalog_async_prewarm_enabled() {
1079
1083
  fi
1080
1084
 
1081
1085
  setting="$(trim_whitespace "${setting}")"
1082
- setting="$(printf "%s" "${setting}" | tr '[:upper:]' '[:lower:]')"
1086
+ setting="${setting,,}"
1083
1087
 
1084
1088
  case "${setting}" in
1085
1089
  0|false|no|off)
@@ -1771,7 +1775,7 @@ normalize_manager() {
1771
1775
  local manager="$1"
1772
1776
 
1773
1777
  manager="$(trim_whitespace "${manager}")"
1774
- manager="$(printf "%s" "${manager}" | tr '[:upper:]' '[:lower:]')"
1778
+ manager="${manager,,}"
1775
1779
 
1776
1780
  case "${manager}" in
1777
1781
  homebrew)
@@ -2086,6 +2090,9 @@ parse_args() {
2086
2090
  --feed-search)
2087
2091
  ACTION="feed-search"
2088
2092
  ;;
2093
+ --dynamic-reload)
2094
+ ACTION="dynamic-reload"
2095
+ ;;
2089
2096
  --ipc-reload)
2090
2097
  ACTION="ipc-reload"
2091
2098
  ;;
@@ -2346,8 +2353,10 @@ exact_query_candidates() {
2346
2353
  local dashed_query=""
2347
2354
  local underscored_query=""
2348
2355
  local nospace_query=""
2356
+ local -a query_tokens=()
2349
2357
 
2350
- compact_query="$(printf "%s" "${query}" | awk '{$1=$1; print}')"
2358
+ read -r -a query_tokens <<<"${query}"
2359
+ compact_query="${query_tokens[*]}"
2351
2360
  [[ -n "${compact_query}" ]] || return 0
2352
2361
 
2353
2362
  printf "%s\n" "${compact_query}"
@@ -2362,41 +2371,6 @@ exact_query_candidates() {
2362
2371
  fi
2363
2372
  }
2364
2373
 
2365
- exact_match_entry() {
2366
- local manager="$1"
2367
- local query="$2"
2368
- local candidate
2369
-
2370
- if [[ -z "${query}" ]]; then
2371
- return 0
2372
- fi
2373
-
2374
- while IFS= read -r candidate; do
2375
- [[ -n "${candidate}" ]] || continue
2376
-
2377
- case "${manager}" in
2378
- brew)
2379
- if brew info --formula "${candidate}" >/dev/null 2>&1 || brew info --cask "${candidate}" >/dev/null 2>&1; then
2380
- printf "%s\t-\n" "${candidate}"
2381
- return 0
2382
- fi
2383
- ;;
2384
- npm)
2385
- if command_exists npm && npm view "${candidate}" name >/dev/null 2>&1; then
2386
- printf "%s\t-\n" "${candidate}"
2387
- return 0
2388
- fi
2389
- ;;
2390
- bun)
2391
- if bun info "${candidate}" >/dev/null 2>&1 || (command_exists npm && npm view "${candidate}" name >/dev/null 2>&1); then
2392
- printf "%s\t-\n" "${candidate}"
2393
- return 0
2394
- fi
2395
- ;;
2396
- esac
2397
- done < <(exact_query_candidates "${query}" | awk '!seen[$0]++')
2398
- }
2399
-
2400
2374
  manager_bun_search_entries_strict() {
2401
2375
  local query="$1"
2402
2376
  local effective_query="${query}"
@@ -2437,7 +2411,6 @@ manager_bun_search_entries_strict() {
2437
2411
 
2438
2412
  {
2439
2413
  awk 'NR > 1 && NF > 0 { name=$1; $1=""; sub(/^[[:space:]]+/, "", $0); if ($0 == "") $0="-"; print name "\t" $0 }' "${bun_search_file}"
2440
- exact_match_entry "bun" "${query}"
2441
2414
  } | awk -F'\t' 'NF >= 1 { if ($2 == "") $2 = "-"; print $1 "\t" $2 }' | awk -F'\t' '!seen[$1]++' | {
2442
2415
  if [[ "${effective_limit}" -gt 0 ]]; then
2443
2416
  awk -v limit="${effective_limit}" 'NR <= limit'
@@ -2568,25 +2541,16 @@ manager_search_entries_uncached() {
2568
2541
  ;;
2569
2542
  brew)
2570
2543
  if search_entries_from_catalog_cache "${manager}" "${effective_query}"; then
2571
- exact_match_entry "${manager}" "${query}"
2544
+ :
2572
2545
  elif [[ -n "${query}" ]] && search_catalog_async_prewarm_enabled; then
2573
2546
  start_search_catalog_prewarm_async "${manager}"
2574
- {
2575
- brew search "${effective_query}" 2>/dev/null |
2576
- awk 'NF >= 1 { print $1 "\t-" }'
2577
- exact_match_entry "${manager}" "${query}"
2578
- }
2547
+ brew search "${effective_query}" 2>/dev/null |
2548
+ awk 'NF >= 1 { print $1 "\t-" }'
2579
2549
  elif ensure_search_catalog_cache "${manager}"; then
2580
- {
2581
- search_entries_from_catalog_cache "${manager}" "${effective_query}" || true
2582
- exact_match_entry "${manager}" "${query}"
2583
- }
2550
+ search_entries_from_catalog_cache "${manager}" "${effective_query}" || true
2584
2551
  else
2585
- {
2586
- brew search "${effective_query}" 2>/dev/null |
2587
- awk 'NF > 0 && $1 != "==>" { print $1 "\t-" }'
2588
- exact_match_entry "${manager}" "${query}"
2589
- }
2552
+ brew search "${effective_query}" 2>/dev/null |
2553
+ awk 'NF > 0 && $1 != "==>" { print $1 "\t-" }'
2590
2554
  fi
2591
2555
  ;;
2592
2556
  winget)
@@ -2658,11 +2622,8 @@ manager_search_entries_uncached() {
2658
2622
  fi
2659
2623
  ;;
2660
2624
  npm)
2661
- {
2662
- npm search "${effective_query}" --searchlimit="${npm_search_limit}" --parseable 2>/dev/null |
2663
- awk -F'\t' 'NF >= 2 { print $1 "\t" $2 }'
2664
- exact_match_entry "${manager}" "${query}"
2665
- }
2625
+ npm search "${effective_query}" --searchlimit="${npm_search_limit}" --parseable 2>/dev/null |
2626
+ awk -F'\t' 'NF >= 2 { print $1 "\t" $2 }'
2666
2627
  ;;
2667
2628
  bun)
2668
2629
  {
@@ -2675,7 +2636,6 @@ manager_search_entries_uncached() {
2675
2636
  awk -F'\t' 'NF >= 2 { print $1 "\t" $2 }'
2676
2637
  fi
2677
2638
  rm -f "${bun_search_file}"
2678
- exact_match_entry "${manager}" "${query}"
2679
2639
  } || true
2680
2640
  ;;
2681
2641
  esac | awk -F'\t' 'NF >= 1 { if ($2 == "") $2 = "-"; print $1 "\t" $2 }' | awk -F'\t' '!seen[$1]++' | {
@@ -2707,7 +2667,7 @@ manager_search_entries() {
2707
2667
 
2708
2668
  flags="$(query_cache_flags)"
2709
2669
  query_cache_setting="$(trim_whitespace "${query_cache_setting}")"
2710
- query_cache_setting="$(printf "%s" "${query_cache_setting}" | tr '[:upper:]' '[:lower:]')"
2670
+ query_cache_setting="${query_cache_setting,,}"
2711
2671
  query_cache_ttl="$(query_cache_ttl_seconds_for_manager "${manager}")"
2712
2672
 
2713
2673
  if [[ "${manager}" == "bun" ]]; then
@@ -3331,29 +3291,15 @@ build_dynamic_reload_command() {
3331
3291
  local manager_override="$1"
3332
3292
  local fallback_file="$2"
3333
3293
  local script_path="${BASH_SOURCE[0]}"
3334
- local min_chars="${FPF_RELOAD_MIN_CHARS:-2}"
3335
- local reload_debounce="${FPF_RELOAD_DEBOUNCE:-0.12}"
3336
3294
  local bypass_query_cache="1"
3337
3295
 
3338
- if ! [[ "${min_chars}" =~ ^[0-9]+$ ]]; then
3339
- min_chars=2
3340
- fi
3341
-
3342
- if ! [[ "${reload_debounce}" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
3343
- reload_debounce=0.12
3344
- fi
3345
-
3346
3296
  bypass_query_cache="$(dynamic_reload_query_cache_bypass_value)"
3347
3297
 
3348
3298
  if [[ "${script_path}" != /* ]]; then
3349
3299
  script_path="$(pwd)/${script_path}"
3350
3300
  fi
3351
3301
 
3352
- if [[ -n "${manager_override}" ]]; then
3353
- printf 'q={q}; if [ ${#q} -lt %s ]; then cat %q; else sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --feed-search --manager %q -- "$q" 2>/dev/null || cat %q; fi' "${min_chars}" "${fallback_file}" "${reload_debounce}" "${bypass_query_cache}" "${manager_override}" "${fallback_file}" "${script_path}" "${manager_override}" "${fallback_file}"
3354
- else
3355
- printf 'q={q}; if [ ${#q} -lt %s ]; then cat %q; else sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE= FPF_IPC_FALLBACK_FILE=%q %q --feed-search -- "$q" 2>/dev/null || cat %q; fi' "${min_chars}" "${fallback_file}" "${reload_debounce}" "${bypass_query_cache}" "${fallback_file}" "${script_path}" "${fallback_file}"
3356
- fi
3302
+ printf 'FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --dynamic-reload -- "{q}"' "${bypass_query_cache}" "${manager_override}" "${fallback_file}" "${script_path}"
3357
3303
  }
3358
3304
 
3359
3305
  build_dynamic_reload_command_for_query() {
@@ -3361,34 +3307,15 @@ build_dynamic_reload_command_for_query() {
3361
3307
  local fallback_file="$2"
3362
3308
  local query_value="$3"
3363
3309
  local script_path="${BASH_SOURCE[0]}"
3364
- local min_chars="${FPF_RELOAD_MIN_CHARS:-2}"
3365
- local reload_debounce="${FPF_RELOAD_DEBOUNCE:-0.12}"
3366
3310
  local bypass_query_cache="1"
3367
3311
 
3368
- if ! [[ "${min_chars}" =~ ^[0-9]+$ ]]; then
3369
- min_chars=2
3370
- fi
3371
-
3372
- if ! [[ "${reload_debounce}" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
3373
- reload_debounce=0.12
3374
- fi
3375
-
3376
3312
  bypass_query_cache="$(dynamic_reload_query_cache_bypass_value)"
3377
3313
 
3378
3314
  if [[ "${script_path}" != /* ]]; then
3379
3315
  script_path="$(pwd)/${script_path}"
3380
3316
  fi
3381
3317
 
3382
- if [[ ${#query_value} -lt ${min_chars} ]]; then
3383
- printf 'cat %q' "${fallback_file}"
3384
- return
3385
- fi
3386
-
3387
- if [[ -n "${manager_override}" ]]; then
3388
- printf 'sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --feed-search --manager %q -- %q 2>/dev/null || cat %q' "${reload_debounce}" "${bypass_query_cache}" "${manager_override}" "${fallback_file}" "${script_path}" "${manager_override}" "${query_value}" "${fallback_file}"
3389
- else
3390
- printf 'sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE= FPF_IPC_FALLBACK_FILE=%q %q --feed-search -- %q 2>/dev/null || cat %q' "${reload_debounce}" "${bypass_query_cache}" "${fallback_file}" "${script_path}" "${query_value}" "${fallback_file}"
3391
- fi
3318
+ printf 'FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --dynamic-reload -- %q' "${bypass_query_cache}" "${manager_override}" "${fallback_file}" "${script_path}" "${query_value}"
3392
3319
  }
3393
3320
 
3394
3321
  build_dynamic_reload_ipc_command() {
@@ -3514,6 +3441,68 @@ send_fzf_prompt_action() {
3514
3441
  send_fzf_listen_action "${action_payload}"
3515
3442
  }
3516
3443
 
3444
+ run_dynamic_reload_action() {
3445
+ local query="$1"
3446
+ local manager_override="${FPF_IPC_MANAGER_OVERRIDE:-}"
3447
+ local fallback_file="${FPF_IPC_FALLBACK_FILE:-}"
3448
+ local min_chars="${FPF_RELOAD_MIN_CHARS:-2}"
3449
+ local reload_debounce="${FPF_RELOAD_DEBOUNCE:-0.12}"
3450
+ local output_file=""
3451
+ local detected_manager=""
3452
+ local -a managers=()
3453
+
3454
+ if [[ -z "${fallback_file}" || ! -r "${fallback_file}" ]]; then
3455
+ return 1
3456
+ fi
3457
+
3458
+ if ! [[ "${min_chars}" =~ ^[0-9]+$ ]]; then
3459
+ min_chars=2
3460
+ fi
3461
+
3462
+ if ! [[ "${reload_debounce}" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
3463
+ reload_debounce=0.12
3464
+ fi
3465
+
3466
+ if [[ ${#query} -lt ${min_chars} ]]; then
3467
+ cat "${fallback_file}"
3468
+ return 0
3469
+ fi
3470
+
3471
+ sleep "${reload_debounce}"
3472
+
3473
+ if [[ -n "${manager_override}" ]]; then
3474
+ manager_override="$(normalize_manager "${manager_override}")"
3475
+ if ! manager_supported "${manager_override}" || ! manager_command_ready "${manager_override}"; then
3476
+ cat "${fallback_file}"
3477
+ return 0
3478
+ fi
3479
+ managers+=("${manager_override}")
3480
+ else
3481
+ while IFS= read -r detected_manager; do
3482
+ [[ -n "${detected_manager}" ]] || continue
3483
+ if manager_supported "${detected_manager}" && manager_command_ready "${detected_manager}"; then
3484
+ managers+=("${detected_manager}")
3485
+ fi
3486
+ done < <(detect_default_managers)
3487
+ fi
3488
+
3489
+ if [[ "${#managers[@]}" -eq 0 ]]; then
3490
+ cat "${fallback_file}"
3491
+ return 0
3492
+ fi
3493
+
3494
+ output_file="$(mktemp "${SESSION_TMP_ROOT}/dynamic-reload.XXXXXX")"
3495
+ : >"${output_file}"
3496
+
3497
+ if collect_search_display_rows "${query}" "${output_file}" "${managers[@]-}"; then
3498
+ cat "${output_file}"
3499
+ else
3500
+ cat "${fallback_file}"
3501
+ fi
3502
+
3503
+ rm -f "${output_file}"
3504
+ }
3505
+
3517
3506
  run_ipc_reload_action() {
3518
3507
  local query="$1"
3519
3508
  local manager_override="${FPF_IPC_MANAGER_OVERRIDE:-}"
@@ -3628,7 +3617,7 @@ confirm_action() {
3628
3617
  printf "%s [y/N]: " "${prompt}" >&2
3629
3618
  read -r reply || true
3630
3619
  reply="$(trim_whitespace "${reply}")"
3631
- normalized_reply="$(printf "%s" "${reply}" | tr '[:upper:]' '[:lower:]')"
3620
+ normalized_reply="${reply,,}"
3632
3621
 
3633
3622
  case "${normalized_reply}" in
3634
3623
  y|yes)
@@ -3738,6 +3727,11 @@ main() {
3738
3727
  exit 0
3739
3728
  fi
3740
3729
 
3730
+ if [[ "${ACTION}" == "dynamic-reload" ]]; then
3731
+ run_dynamic_reload_action "$(join_query)" || true
3732
+ exit 0
3733
+ fi
3734
+
3741
3735
  if [[ "${ACTION}" == "preview-item" ]]; then
3742
3736
  local preview_manager="${MANAGER_OVERRIDE:-}"
3743
3737
  local preview_package
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.6.45",
3
+ "version": "1.6.46",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"