setup-kapelu 3.0.0

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.
@@ -0,0 +1,326 @@
1
+ #!/usr/bin/env bash
2
+ # ╔════════════════════════════════════════════════════╗
3
+ # │ cerrar-sesion - Script para cerrar la sesión │
4
+ # │ Versión: 2.0 │
5
+ # │ Autor: Daniel Calderon - Kapelu │
6
+ # │ Fecha: 16/03/2024 │
7
+ # │ WebSite: https://danielcalderon.vercel.app/ │
8
+ # │ Github: https://github.com/Kapelu │
9
+ # ╚════════════════════════════════════════════════════╝
10
+
11
+ set -euo pipefail
12
+
13
+ TARGETS=("node_modules" ".next")
14
+ NODE_DIRS=()
15
+ DRY_RUN=false
16
+ [[ "${1:-}" == "--dry-run" ]] && DRY_RUN=true
17
+
18
+ declare -A DIR_SIZES
19
+
20
+ cleanup() {
21
+ tput rmcup 2>/dev/null || true
22
+ clear
23
+ }
24
+
25
+ salir() {
26
+ cleanup
27
+ echo ""
28
+ echo "Gracias por usar node-clean by Kapelu."
29
+ echo "https://github.com/Kapelu"
30
+ echo "¡Hasta la próxima!"
31
+ echo ""
32
+ exit 0
33
+ }
34
+
35
+ trap salir EXIT INT TERM
36
+
37
+ validar_dialog() {
38
+
39
+ if command -v dialog >/dev/null 2>&1; then
40
+ return
41
+ fi
42
+
43
+ echo "dialog no está instalado. Intentando instalar..."
44
+
45
+ if command -v apt >/dev/null 2>&1; then
46
+ sudo apt update && sudo apt install -y dialog
47
+ elif command -v dnf >/dev/null 2>&1; then
48
+ sudo dnf install -y dialog
49
+ elif command -v yum >/dev/null 2>&1; then
50
+ sudo yum install -y dialog
51
+ elif command -v pacman >/dev/null 2>&1; then
52
+ sudo pacman -Sy --noconfirm dialog
53
+ else
54
+ echo "No se pudo determinar el gestor de paquetes."
55
+ exit 1
56
+ fi
57
+ }
58
+
59
+ relative_path() {
60
+ echo "${1#$BASE_DIR/}"
61
+ }
62
+
63
+ get_size_mb() {
64
+ echo "${DIR_SIZES[$1]:-0}"
65
+ }
66
+
67
+ calc_height() {
68
+
69
+ local items=$1
70
+ local max_height=$((TERM_HEIGHT - 8))
71
+
72
+ if [[ $items -lt $max_height ]]; then
73
+ echo $((items + 8))
74
+ else
75
+ echo "$max_height"
76
+ fi
77
+ }
78
+
79
+ calc_all_sizes() {
80
+
81
+ local results
82
+
83
+ results=$(du -sm "${NODE_DIRS[@]}" 2>/dev/null)
84
+
85
+ while read -r size path; do
86
+ DIR_SIZES["$path"]=$size
87
+ done <<< "$results"
88
+ }
89
+
90
+ scan_with_progress() {
91
+
92
+ local TMP
93
+ TMP=$(mktemp)
94
+
95
+ (
96
+ find "$BASE_DIR" -type d \( -name node_modules -o -name .next \) -prune 2>/dev/null > "$TMP"
97
+ ) &
98
+
99
+ local PID=$!
100
+ local progress=0
101
+
102
+ while kill -0 "$PID" 2>/dev/null; do
103
+ progress=$(( (progress + 2) % 100 ))
104
+ echo $progress
105
+ sleep 0.1
106
+ done | dialog --gauge "Escaneando proyectos Node..." 10 70 0
107
+
108
+ mapfile -t NODE_DIRS < "$TMP"
109
+
110
+ rm -f "$TMP"
111
+ }
112
+
113
+ confirmar_borrado() {
114
+
115
+ local DIRS=("$@")
116
+ local TOTAL_MB=0
117
+ local SIZE_MB
118
+
119
+ for DIR in "${DIRS[@]}"; do
120
+ SIZE_MB=$(get_size_mb "$DIR")
121
+ TOTAL_MB=$((TOTAL_MB + SIZE_MB))
122
+ done
123
+
124
+ dialog --title "Confirmación de borrado" \
125
+ --yes-label "Sí" --no-label "No" \
126
+ --yesno "Se van a eliminar ${#DIRS[@]} carpetas.\nEspacio total a liberar: ${TOTAL_MB} MB\n\n¿Desea continuar?" \
127
+ 10 $((TERM_WIDTH / 2))
128
+
129
+ [[ $? -eq 0 ]]
130
+ }
131
+
132
+ mostrar_carpetas() {
133
+
134
+ local DIR_LIST=""
135
+ local TOTAL_MB=0
136
+ local SIZE_MB
137
+ local REL
138
+
139
+ for DIR in "${NODE_DIRS[@]}"; do
140
+
141
+ SIZE_MB=$(get_size_mb "$DIR")
142
+ REL=$(relative_path "$DIR")
143
+
144
+ DIR_LIST+="$REL → ${SIZE_MB} MB\n"
145
+
146
+ TOTAL_MB=$((TOTAL_MB + SIZE_MB))
147
+
148
+ done
149
+
150
+ local HEIGHT
151
+ HEIGHT=$(calc_height "${#NODE_DIRS[@]}")
152
+
153
+ dialog --title "Carpetas encontradas" \
154
+ --msgbox "Se encontraron ${#NODE_DIRS[@]} carpetas:\n\n$DIR_LIST\nTamaño total combinado: ${TOTAL_MB} MB" \
155
+ "$HEIGHT" "$TERM_WIDTH"
156
+ }
157
+
158
+ borrar_todas() {
159
+
160
+ local TOTAL_DELETED_MB=0
161
+ local SIZE_MB
162
+ local REL
163
+
164
+ if $DRY_RUN; then
165
+
166
+ local DIR_LIST=""
167
+
168
+ for DIR in "${NODE_DIRS[@]}"; do
169
+ REL=$(relative_path "$DIR")
170
+ DIR_LIST+="$REL\n"
171
+ done
172
+
173
+ dialog --msgbox "== DRY-RUN ==\n\n$DIR_LIST" \
174
+ "$(calc_height "${#NODE_DIRS[@]}")" "$TERM_WIDTH"
175
+
176
+ return
177
+ fi
178
+
179
+ confirmar_borrado "${NODE_DIRS[@]}" || return
180
+
181
+ for DIR in "${NODE_DIRS[@]}"; do
182
+
183
+ SIZE_MB=$(get_size_mb "$DIR")
184
+
185
+ [[ -d "$DIR" ]] && rm -rf -- "$DIR"
186
+
187
+ TOTAL_DELETED_MB=$((TOTAL_DELETED_MB + SIZE_MB))
188
+
189
+ done
190
+
191
+ dialog --msgbox "Se eliminaron todas las carpetas.\nEspacio liberado: ${TOTAL_DELETED_MB} MB" \
192
+ 10 $((TERM_WIDTH / 2))
193
+ }
194
+
195
+ borrar_checklist() {
196
+
197
+ local CHECKLIST_ARGS=()
198
+ local MAP_DIRS=()
199
+ local TOTAL_DELETED_MB=0
200
+ local SIZE_MB
201
+ local REL
202
+
203
+ for DIR in "${NODE_DIRS[@]}"; do
204
+
205
+ SIZE_MB=$(get_size_mb "$DIR")
206
+ REL=$(relative_path "$DIR")
207
+
208
+ local LABEL="item$(( ${#MAP_DIRS[@]} + 1 ))"
209
+
210
+ MAP_DIRS+=("$DIR")
211
+
212
+ CHECKLIST_ARGS+=("$LABEL" "$REL → ${SIZE_MB} MB" "off")
213
+
214
+ done
215
+
216
+ local HEIGHT
217
+ HEIGHT=$(calc_height "${#NODE_DIRS[@]}")
218
+
219
+ local SELECTED
220
+
221
+ SELECTED=$(dialog \
222
+ --title "Seleccionar carpetas a borrar" \
223
+ --checklist "Use espacio para seleccionar:" \
224
+ "$HEIGHT" "$TERM_WIDTH" 20 \
225
+ "${CHECKLIST_ARGS[@]}" \
226
+ 3>&1 1>&2 2>&3) || return
227
+
228
+ [[ -z "$SELECTED" ]] && return
229
+
230
+ local TO_DELETE=()
231
+
232
+ for LABEL in $SELECTED; do
233
+
234
+ LABEL=${LABEL//\"/}
235
+
236
+ local INDEX=$(( ${LABEL//[!0-9]/} - 1 ))
237
+
238
+ TO_DELETE+=("${MAP_DIRS[$INDEX]}")
239
+
240
+ done
241
+
242
+ confirmar_borrado "${TO_DELETE[@]}" || return
243
+
244
+ for DIR in "${TO_DELETE[@]}"; do
245
+
246
+ SIZE_MB=$(get_size_mb "$DIR")
247
+
248
+ [[ -d "$DIR" ]] && rm -rf -- "$DIR"
249
+
250
+ TOTAL_DELETED_MB=$((TOTAL_DELETED_MB + SIZE_MB))
251
+
252
+ done
253
+
254
+ dialog --msgbox "Proceso completado.\nEspacio liberado: ${TOTAL_DELETED_MB} MB" \
255
+ 10 $((TERM_WIDTH / 2))
256
+ }
257
+
258
+ # MAIN
259
+
260
+ validar_dialog
261
+
262
+ tput smcup
263
+ clear
264
+ printf '\033[3J'
265
+
266
+ TERM_WIDTH=$(tput cols)
267
+ TERM_HEIGHT=$(tput lines)
268
+
269
+ while true; do
270
+
271
+ ROOT_DIR_NAME=$(dialog \
272
+ --title "Seleccionar carpeta raíz" \
273
+ --inputbox "Ingrese la carpeta donde buscar:" \
274
+ 10 $((TERM_WIDTH / 2)) \
275
+ 3>&1 1>&2 2>&3)
276
+
277
+ STATUS=$?
278
+
279
+ [[ $STATUS -ne 0 ]] && salir
280
+
281
+ if [[ -z "$ROOT_DIR_NAME" ]]; then
282
+ dialog --msgbox "No ingresó ningún nombre de carpeta." 6 $((TERM_WIDTH / 2))
283
+ continue
284
+ fi
285
+
286
+ BASE_DIR="$HOME/$ROOT_DIR_NAME"
287
+
288
+ [[ -d "$BASE_DIR" ]] && break
289
+
290
+ dialog --msgbox "La carpeta $BASE_DIR no existe." 6 $((TERM_WIDTH / 2))
291
+
292
+ done
293
+
294
+ scan_with_progress
295
+
296
+ [[ ${#NODE_DIRS[@]} -eq 0 ]] && {
297
+
298
+ dialog --msgbox "No se encontraron carpetas: ${TARGETS[*]}" \
299
+ 8 $((TERM_WIDTH / 2))
300
+
301
+ salir
302
+ }
303
+
304
+ calc_all_sizes
305
+
306
+ mostrar_carpetas
307
+
308
+ while true; do
309
+
310
+ OPCION=$(dialog \
311
+ --title "Opciones de borrado" \
312
+ --menu "Seleccione una opción:" \
313
+ 12 50 3 \
314
+ 1 "Borrar todas" \
315
+ 2 "Borrado múltiple" \
316
+ 3 "Salir" \
317
+ 3>&1 1>&2 2>&3) || salir
318
+
319
+ case $OPCION in
320
+ 1) borrar_todas ;;
321
+ 2) borrar_checklist ;;
322
+ 3) salir ;;
323
+ *) dialog --msgbox "Opción inválida" 5 30 ;;
324
+ esac
325
+
326
+ done