ccjk 12.0.7 → 12.0.9

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 (47) hide show
  1. package/dist/chunks/agents.mjs +1 -1
  2. package/dist/chunks/auto-fixer.mjs +93 -0
  3. package/dist/chunks/auto-updater.mjs +3 -2
  4. package/dist/chunks/boost.mjs +1 -1
  5. package/dist/chunks/ccr.mjs +4 -3
  6. package/dist/chunks/check-updates.mjs +3 -2
  7. package/dist/chunks/claude-code-incremental-manager.mjs +3 -2
  8. package/dist/chunks/codex-config-switch.mjs +2 -1
  9. package/dist/chunks/codex-provider-manager.mjs +2 -1
  10. package/dist/chunks/codex-uninstaller.mjs +1 -1
  11. package/dist/chunks/codex.mjs +1 -1
  12. package/dist/chunks/config-switch.mjs +2 -1
  13. package/dist/chunks/config2.mjs +2 -1
  14. package/dist/chunks/doctor.mjs +1 -0
  15. package/dist/chunks/features.mjs +3 -2
  16. package/dist/chunks/index10.mjs +569 -1061
  17. package/dist/chunks/index11.mjs +1076 -913
  18. package/dist/chunks/index12.mjs +951 -135
  19. package/dist/chunks/index13.mjs +184 -209
  20. package/dist/chunks/index14.mjs +210 -655
  21. package/dist/chunks/index4.mjs +1 -1
  22. package/dist/chunks/index7.mjs +201 -2182
  23. package/dist/chunks/init.mjs +5 -5
  24. package/dist/chunks/installer.mjs +2 -1
  25. package/dist/chunks/mcp-cli.mjs +2 -1
  26. package/dist/chunks/mcp.mjs +2 -1
  27. package/dist/chunks/menu.mjs +22 -11
  28. package/dist/chunks/onboarding-wizard.mjs +93 -0
  29. package/dist/chunks/onboarding.mjs +1 -0
  30. package/dist/chunks/package.mjs +1 -1
  31. package/dist/chunks/prompts.mjs +2 -1
  32. package/dist/chunks/quick-actions.mjs +1 -1
  33. package/dist/chunks/quick-provider.mjs +1 -0
  34. package/dist/chunks/quick-setup.mjs +3 -2
  35. package/dist/chunks/remote.mjs +1 -0
  36. package/dist/chunks/status.mjs +7 -2
  37. package/dist/chunks/uninstall.mjs +3 -2
  38. package/dist/chunks/update.mjs +3 -2
  39. package/dist/chunks/upgrade-manager.mjs +1 -1
  40. package/dist/chunks/wsl.mjs +1 -1
  41. package/dist/cli.mjs +19 -3
  42. package/dist/shared/{ccjk.DOwtZMk8.mjs → ccjk.BWFpnOr3.mjs} +7 -1831
  43. package/dist/shared/{ccjk.D5MFQT7w.mjs → ccjk.CNMWk_mE.mjs} +7 -7
  44. package/dist/shared/{ccjk.BRZ9ww8S.mjs → ccjk.CvChMYvB.mjs} +1 -1
  45. package/dist/shared/ccjk.DeWpAShp.mjs +1828 -0
  46. package/dist/shared/{ccjk.BwfbSKN2.mjs → ccjk.Dx-O9dWz.mjs} +1 -1
  47. package/package.json +2 -2
@@ -1,6 +1,7 @@
1
1
  import process__default from 'node:process';
2
- import { stripVTControlCharacters } from 'node:util';
3
2
  import { o as onExit } from '../shared/ccjk.Cjgrln_h.mjs';
3
+ import { g as getDefaultExportFromCjs } from '../shared/ccjk.BAGoDD49.mjs';
4
+ import { r as requireCliSpinners } from '../shared/ccjk.DeWpAShp.mjs';
4
5
 
5
6
  const ANSI_BACKGROUND_OFFSET = 10;
6
7
 
@@ -635,1751 +636,15 @@ cliCursor.toggle = (force, writableStream) => {
635
636
  }
636
637
  };
637
638
 
638
- const dots = {
639
- interval: 80,
640
- frames: [
641
- "⠋",
642
- "⠙",
643
- "⠹",
644
- "⠸",
645
- "⠼",
646
- "⠴",
647
- "⠦",
648
- "⠧",
649
- "⠇",
650
- "⠏"
651
- ]
652
- };
653
- const dots2 = {
654
- interval: 80,
655
- frames: [
656
- "⣾",
657
- "⣽",
658
- "⣻",
659
- "⢿",
660
- "⡿",
661
- "⣟",
662
- "⣯",
663
- "⣷"
664
- ]
665
- };
666
- const dots3 = {
667
- interval: 80,
668
- frames: [
669
- "⠋",
670
- "⠙",
671
- "⠚",
672
- "⠞",
673
- "⠖",
674
- "⠦",
675
- "⠴",
676
- "⠲",
677
- "⠳",
678
- "⠓"
679
- ]
680
- };
681
- const dots4 = {
682
- interval: 80,
683
- frames: [
684
- "⠄",
685
- "⠆",
686
- "⠇",
687
- "⠋",
688
- "⠙",
689
- "⠸",
690
- "⠰",
691
- "⠠",
692
- "⠰",
693
- "⠸",
694
- "⠙",
695
- "⠋",
696
- "⠇",
697
- "⠆"
698
- ]
699
- };
700
- const dots5 = {
701
- interval: 80,
702
- frames: [
703
- "⠋",
704
- "⠙",
705
- "⠚",
706
- "⠒",
707
- "⠂",
708
- "⠂",
709
- "⠒",
710
- "⠲",
711
- "⠴",
712
- "⠦",
713
- "⠖",
714
- "⠒",
715
- "⠐",
716
- "⠐",
717
- "⠒",
718
- "⠓",
719
- "⠋"
720
- ]
721
- };
722
- const dots6 = {
723
- interval: 80,
724
- frames: [
725
- "⠁",
726
- "⠉",
727
- "⠙",
728
- "⠚",
729
- "⠒",
730
- "⠂",
731
- "⠂",
732
- "⠒",
733
- "⠲",
734
- "⠴",
735
- "⠤",
736
- "⠄",
737
- "⠄",
738
- "⠤",
739
- "⠴",
740
- "⠲",
741
- "⠒",
742
- "⠂",
743
- "⠂",
744
- "⠒",
745
- "⠚",
746
- "⠙",
747
- "⠉",
748
- "⠁"
749
- ]
750
- };
751
- const dots7 = {
752
- interval: 80,
753
- frames: [
754
- "⠈",
755
- "⠉",
756
- "⠋",
757
- "⠓",
758
- "⠒",
759
- "⠐",
760
- "⠐",
761
- "⠒",
762
- "⠖",
763
- "⠦",
764
- "⠤",
765
- "⠠",
766
- "⠠",
767
- "⠤",
768
- "⠦",
769
- "⠖",
770
- "⠒",
771
- "⠐",
772
- "⠐",
773
- "⠒",
774
- "⠓",
775
- "⠋",
776
- "⠉",
777
- "⠈"
778
- ]
779
- };
780
- const dots8 = {
781
- interval: 80,
782
- frames: [
783
- "⠁",
784
- "⠁",
785
- "⠉",
786
- "⠙",
787
- "⠚",
788
- "⠒",
789
- "⠂",
790
- "⠂",
791
- "⠒",
792
- "⠲",
793
- "⠴",
794
- "⠤",
795
- "⠄",
796
- "⠄",
797
- "⠤",
798
- "⠠",
799
- "⠠",
800
- "⠤",
801
- "⠦",
802
- "⠖",
803
- "⠒",
804
- "⠐",
805
- "⠐",
806
- "⠒",
807
- "⠓",
808
- "⠋",
809
- "⠉",
810
- "⠈",
811
- "⠈"
812
- ]
813
- };
814
- const dots9 = {
815
- interval: 80,
816
- frames: [
817
- "⢹",
818
- "⢺",
819
- "⢼",
820
- "⣸",
821
- "⣇",
822
- "⡧",
823
- "⡗",
824
- "⡏"
825
- ]
826
- };
827
- const dots10 = {
828
- interval: 80,
829
- frames: [
830
- "⢄",
831
- "⢂",
832
- "⢁",
833
- "⡁",
834
- "⡈",
835
- "⡐",
836
- "⡠"
837
- ]
838
- };
839
- const dots11 = {
840
- interval: 100,
841
- frames: [
842
- "⠁",
843
- "⠂",
844
- "⠄",
845
- "⡀",
846
- "⢀",
847
- "⠠",
848
- "⠐",
849
- "⠈"
850
- ]
851
- };
852
- const dots12 = {
853
- interval: 80,
854
- frames: [
855
- "⢀⠀",
856
- "⡀⠀",
857
- "⠄⠀",
858
- "⢂⠀",
859
- "⡂⠀",
860
- "⠅⠀",
861
- "⢃⠀",
862
- "⡃⠀",
863
- "⠍⠀",
864
- "⢋⠀",
865
- "⡋⠀",
866
- "⠍⠁",
867
- "⢋⠁",
868
- "⡋⠁",
869
- "⠍⠉",
870
- "⠋⠉",
871
- "⠋⠉",
872
- "⠉⠙",
873
- "⠉⠙",
874
- "⠉⠩",
875
- "⠈⢙",
876
- "⠈⡙",
877
- "⢈⠩",
878
- "⡀⢙",
879
- "⠄⡙",
880
- "⢂⠩",
881
- "⡂⢘",
882
- "⠅⡘",
883
- "⢃⠨",
884
- "⡃⢐",
885
- "⠍⡐",
886
- "⢋⠠",
887
- "⡋⢀",
888
- "⠍⡁",
889
- "⢋⠁",
890
- "⡋⠁",
891
- "⠍⠉",
892
- "⠋⠉",
893
- "⠋⠉",
894
- "⠉⠙",
895
- "⠉⠙",
896
- "⠉⠩",
897
- "⠈⢙",
898
- "⠈⡙",
899
- "⠈⠩",
900
- "⠀⢙",
901
- "⠀⡙",
902
- "⠀⠩",
903
- "⠀⢘",
904
- "⠀⡘",
905
- "⠀⠨",
906
- "⠀⢐",
907
- "⠀⡐",
908
- "⠀⠠",
909
- "⠀⢀",
910
- "⠀⡀"
911
- ]
912
- };
913
- const dots13 = {
914
- interval: 80,
915
- frames: [
916
- "⣼",
917
- "⣹",
918
- "⢻",
919
- "⠿",
920
- "⡟",
921
- "⣏",
922
- "⣧",
923
- "⣶"
924
- ]
925
- };
926
- const dots14 = {
927
- interval: 80,
928
- frames: [
929
- "⠉⠉",
930
- "⠈⠙",
931
- "⠀⠹",
932
- "⠀⢸",
933
- "⠀⣰",
934
- "⢀⣠",
935
- "⣀⣀",
936
- "⣄⡀",
937
- "⣆⠀",
938
- "⡇⠀",
939
- "⠏⠀",
940
- "⠋⠁"
941
- ]
942
- };
943
- const dots8Bit = {
944
- interval: 80,
945
- frames: [
946
- "⠀",
947
- "⠁",
948
- "⠂",
949
- "⠃",
950
- "⠄",
951
- "⠅",
952
- "⠆",
953
- "⠇",
954
- "⡀",
955
- "⡁",
956
- "⡂",
957
- "⡃",
958
- "⡄",
959
- "⡅",
960
- "⡆",
961
- "⡇",
962
- "⠈",
963
- "⠉",
964
- "⠊",
965
- "⠋",
966
- "⠌",
967
- "⠍",
968
- "⠎",
969
- "⠏",
970
- "⡈",
971
- "⡉",
972
- "⡊",
973
- "⡋",
974
- "⡌",
975
- "⡍",
976
- "⡎",
977
- "⡏",
978
- "⠐",
979
- "⠑",
980
- "⠒",
981
- "⠓",
982
- "⠔",
983
- "⠕",
984
- "⠖",
985
- "⠗",
986
- "⡐",
987
- "⡑",
988
- "⡒",
989
- "⡓",
990
- "⡔",
991
- "⡕",
992
- "⡖",
993
- "⡗",
994
- "⠘",
995
- "⠙",
996
- "⠚",
997
- "⠛",
998
- "⠜",
999
- "⠝",
1000
- "⠞",
1001
- "⠟",
1002
- "⡘",
1003
- "⡙",
1004
- "⡚",
1005
- "⡛",
1006
- "⡜",
1007
- "⡝",
1008
- "⡞",
1009
- "⡟",
1010
- "⠠",
1011
- "⠡",
1012
- "⠢",
1013
- "⠣",
1014
- "⠤",
1015
- "⠥",
1016
- "⠦",
1017
- "⠧",
1018
- "⡠",
1019
- "⡡",
1020
- "⡢",
1021
- "⡣",
1022
- "⡤",
1023
- "⡥",
1024
- "⡦",
1025
- "⡧",
1026
- "⠨",
1027
- "⠩",
1028
- "⠪",
1029
- "⠫",
1030
- "⠬",
1031
- "⠭",
1032
- "⠮",
1033
- "⠯",
1034
- "⡨",
1035
- "⡩",
1036
- "⡪",
1037
- "⡫",
1038
- "⡬",
1039
- "⡭",
1040
- "⡮",
1041
- "⡯",
1042
- "⠰",
1043
- "⠱",
1044
- "⠲",
1045
- "⠳",
1046
- "⠴",
1047
- "⠵",
1048
- "⠶",
1049
- "⠷",
1050
- "⡰",
1051
- "⡱",
1052
- "⡲",
1053
- "⡳",
1054
- "⡴",
1055
- "⡵",
1056
- "⡶",
1057
- "⡷",
1058
- "⠸",
1059
- "⠹",
1060
- "⠺",
1061
- "⠻",
1062
- "⠼",
1063
- "⠽",
1064
- "⠾",
1065
- "⠿",
1066
- "⡸",
1067
- "⡹",
1068
- "⡺",
1069
- "⡻",
1070
- "⡼",
1071
- "⡽",
1072
- "⡾",
1073
- "⡿",
1074
- "⢀",
1075
- "⢁",
1076
- "⢂",
1077
- "⢃",
1078
- "⢄",
1079
- "⢅",
1080
- "⢆",
1081
- "⢇",
1082
- "⣀",
1083
- "⣁",
1084
- "⣂",
1085
- "⣃",
1086
- "⣄",
1087
- "⣅",
1088
- "⣆",
1089
- "⣇",
1090
- "⢈",
1091
- "⢉",
1092
- "⢊",
1093
- "⢋",
1094
- "⢌",
1095
- "⢍",
1096
- "⢎",
1097
- "⢏",
1098
- "⣈",
1099
- "⣉",
1100
- "⣊",
1101
- "⣋",
1102
- "⣌",
1103
- "⣍",
1104
- "⣎",
1105
- "⣏",
1106
- "⢐",
1107
- "⢑",
1108
- "⢒",
1109
- "⢓",
1110
- "⢔",
1111
- "⢕",
1112
- "⢖",
1113
- "⢗",
1114
- "⣐",
1115
- "⣑",
1116
- "⣒",
1117
- "⣓",
1118
- "⣔",
1119
- "⣕",
1120
- "⣖",
1121
- "⣗",
1122
- "⢘",
1123
- "⢙",
1124
- "⢚",
1125
- "⢛",
1126
- "⢜",
1127
- "⢝",
1128
- "⢞",
1129
- "⢟",
1130
- "⣘",
1131
- "⣙",
1132
- "⣚",
1133
- "⣛",
1134
- "⣜",
1135
- "⣝",
1136
- "⣞",
1137
- "⣟",
1138
- "⢠",
1139
- "⢡",
1140
- "⢢",
1141
- "⢣",
1142
- "⢤",
1143
- "⢥",
1144
- "⢦",
1145
- "⢧",
1146
- "⣠",
1147
- "⣡",
1148
- "⣢",
1149
- "⣣",
1150
- "⣤",
1151
- "⣥",
1152
- "⣦",
1153
- "⣧",
1154
- "⢨",
1155
- "⢩",
1156
- "⢪",
1157
- "⢫",
1158
- "⢬",
1159
- "⢭",
1160
- "⢮",
1161
- "⢯",
1162
- "⣨",
1163
- "⣩",
1164
- "⣪",
1165
- "⣫",
1166
- "⣬",
1167
- "⣭",
1168
- "⣮",
1169
- "⣯",
1170
- "⢰",
1171
- "⢱",
1172
- "⢲",
1173
- "⢳",
1174
- "⢴",
1175
- "⢵",
1176
- "⢶",
1177
- "⢷",
1178
- "⣰",
1179
- "⣱",
1180
- "⣲",
1181
- "⣳",
1182
- "⣴",
1183
- "⣵",
1184
- "⣶",
1185
- "⣷",
1186
- "⢸",
1187
- "⢹",
1188
- "⢺",
1189
- "⢻",
1190
- "⢼",
1191
- "⢽",
1192
- "⢾",
1193
- "⢿",
1194
- "⣸",
1195
- "⣹",
1196
- "⣺",
1197
- "⣻",
1198
- "⣼",
1199
- "⣽",
1200
- "⣾",
1201
- "⣿"
1202
- ]
1203
- };
1204
- const dotsCircle = {
1205
- interval: 80,
1206
- frames: [
1207
- "⢎ ",
1208
- "⠎⠁",
1209
- "⠊⠑",
1210
- "⠈⠱",
1211
- " ⡱",
1212
- "⢀⡰",
1213
- "⢄⡠",
1214
- "⢆⡀"
1215
- ]
1216
- };
1217
- const sand = {
1218
- interval: 80,
1219
- frames: [
1220
- "⠁",
1221
- "⠂",
1222
- "⠄",
1223
- "⡀",
1224
- "⡈",
1225
- "⡐",
1226
- "⡠",
1227
- "⣀",
1228
- "⣁",
1229
- "⣂",
1230
- "⣄",
1231
- "⣌",
1232
- "⣔",
1233
- "⣤",
1234
- "⣥",
1235
- "⣦",
1236
- "⣮",
1237
- "⣶",
1238
- "⣷",
1239
- "⣿",
1240
- "⡿",
1241
- "⠿",
1242
- "⢟",
1243
- "⠟",
1244
- "⡛",
1245
- "⠛",
1246
- "⠫",
1247
- "⢋",
1248
- "⠋",
1249
- "⠍",
1250
- "⡉",
1251
- "⠉",
1252
- "⠑",
1253
- "⠡",
1254
- "⢁"
1255
- ]
1256
- };
1257
- const line = {
1258
- interval: 130,
1259
- frames: [
1260
- "-",
1261
- "\\",
1262
- "|",
1263
- "/"
1264
- ]
1265
- };
1266
- const line2 = {
1267
- interval: 100,
1268
- frames: [
1269
- "⠂",
1270
- "-",
1271
- "–",
1272
- "—",
1273
- "–",
1274
- "-"
1275
- ]
1276
- };
1277
- const pipe = {
1278
- interval: 100,
1279
- frames: [
1280
- "┤",
1281
- "┘",
1282
- "┴",
1283
- "└",
1284
- "├",
1285
- "┌",
1286
- "┬",
1287
- "┐"
1288
- ]
1289
- };
1290
- const simpleDots = {
1291
- interval: 400,
1292
- frames: [
1293
- ". ",
1294
- ".. ",
1295
- "...",
1296
- " "
1297
- ]
1298
- };
1299
- const simpleDotsScrolling = {
1300
- interval: 200,
1301
- frames: [
1302
- ". ",
1303
- ".. ",
1304
- "...",
1305
- " ..",
1306
- " .",
1307
- " "
1308
- ]
1309
- };
1310
- const star = {
1311
- interval: 70,
1312
- frames: [
1313
- "✶",
1314
- "✸",
1315
- "✹",
1316
- "✺",
1317
- "✹",
1318
- "✷"
1319
- ]
1320
- };
1321
- const star2 = {
1322
- interval: 80,
1323
- frames: [
1324
- "+",
1325
- "x",
1326
- "*"
1327
- ]
1328
- };
1329
- const flip = {
1330
- interval: 70,
1331
- frames: [
1332
- "_",
1333
- "_",
1334
- "_",
1335
- "-",
1336
- "`",
1337
- "`",
1338
- "'",
1339
- "´",
1340
- "-",
1341
- "_",
1342
- "_",
1343
- "_"
1344
- ]
1345
- };
1346
- const hamburger = {
1347
- interval: 100,
1348
- frames: [
1349
- "☱",
1350
- "☲",
1351
- "☴"
1352
- ]
1353
- };
1354
- const growVertical = {
1355
- interval: 120,
1356
- frames: [
1357
- "▁",
1358
- "▃",
1359
- "▄",
1360
- "▅",
1361
- "▆",
1362
- "▇",
1363
- "▆",
1364
- "▅",
1365
- "▄",
1366
- "▃"
1367
- ]
1368
- };
1369
- const growHorizontal = {
1370
- interval: 120,
1371
- frames: [
1372
- "▏",
1373
- "▎",
1374
- "▍",
1375
- "▌",
1376
- "▋",
1377
- "▊",
1378
- "▉",
1379
- "▊",
1380
- "▋",
1381
- "▌",
1382
- "▍",
1383
- "▎"
1384
- ]
1385
- };
1386
- const balloon = {
1387
- interval: 140,
1388
- frames: [
1389
- " ",
1390
- ".",
1391
- "o",
1392
- "O",
1393
- "@",
1394
- "*",
1395
- " "
1396
- ]
1397
- };
1398
- const balloon2 = {
1399
- interval: 120,
1400
- frames: [
1401
- ".",
1402
- "o",
1403
- "O",
1404
- "°",
1405
- "O",
1406
- "o",
1407
- "."
1408
- ]
1409
- };
1410
- const noise = {
1411
- interval: 100,
1412
- frames: [
1413
- "▓",
1414
- "▒",
1415
- "░"
1416
- ]
1417
- };
1418
- const bounce = {
1419
- interval: 120,
1420
- frames: [
1421
- "⠁",
1422
- "⠂",
1423
- "⠄",
1424
- "⠂"
1425
- ]
1426
- };
1427
- const boxBounce = {
1428
- interval: 120,
1429
- frames: [
1430
- "▖",
1431
- "▘",
1432
- "▝",
1433
- "▗"
1434
- ]
1435
- };
1436
- const boxBounce2 = {
1437
- interval: 100,
1438
- frames: [
1439
- "▌",
1440
- "▀",
1441
- "▐",
1442
- "▄"
1443
- ]
1444
- };
1445
- const triangle = {
1446
- interval: 50,
1447
- frames: [
1448
- "◢",
1449
- "◣",
1450
- "◤",
1451
- "◥"
1452
- ]
1453
- };
1454
- const binary = {
1455
- interval: 80,
1456
- frames: [
1457
- "010010",
1458
- "001100",
1459
- "100101",
1460
- "111010",
1461
- "111101",
1462
- "010111",
1463
- "101011",
1464
- "111000",
1465
- "110011",
1466
- "110101"
1467
- ]
1468
- };
1469
- const arc = {
1470
- interval: 100,
1471
- frames: [
1472
- "◜",
1473
- "◠",
1474
- "◝",
1475
- "◞",
1476
- "◡",
1477
- "◟"
1478
- ]
1479
- };
1480
- const circle = {
1481
- interval: 120,
1482
- frames: [
1483
- "◡",
1484
- "⊙",
1485
- "◠"
1486
- ]
1487
- };
1488
- const squareCorners = {
1489
- interval: 180,
1490
- frames: [
1491
- "◰",
1492
- "◳",
1493
- "◲",
1494
- "◱"
1495
- ]
1496
- };
1497
- const circleQuarters = {
1498
- interval: 120,
1499
- frames: [
1500
- "◴",
1501
- "◷",
1502
- "◶",
1503
- "◵"
1504
- ]
1505
- };
1506
- const circleHalves = {
1507
- interval: 50,
1508
- frames: [
1509
- "◐",
1510
- "◓",
1511
- "◑",
1512
- "◒"
1513
- ]
1514
- };
1515
- const squish = {
1516
- interval: 100,
1517
- frames: [
1518
- "╫",
1519
- "╪"
1520
- ]
1521
- };
1522
- const toggle = {
1523
- interval: 250,
1524
- frames: [
1525
- "⊶",
1526
- "⊷"
1527
- ]
1528
- };
1529
- const toggle2 = {
1530
- interval: 80,
1531
- frames: [
1532
- "▫",
1533
- "▪"
1534
- ]
1535
- };
1536
- const toggle3 = {
1537
- interval: 120,
1538
- frames: [
1539
- "□",
1540
- "■"
1541
- ]
1542
- };
1543
- const toggle4 = {
1544
- interval: 100,
1545
- frames: [
1546
- "■",
1547
- "□",
1548
- "▪",
1549
- "▫"
1550
- ]
1551
- };
1552
- const toggle5 = {
1553
- interval: 100,
1554
- frames: [
1555
- "▮",
1556
- "▯"
1557
- ]
1558
- };
1559
- const toggle6 = {
1560
- interval: 300,
1561
- frames: [
1562
- "ဝ",
1563
- "၀"
1564
- ]
1565
- };
1566
- const toggle7 = {
1567
- interval: 80,
1568
- frames: [
1569
- "⦾",
1570
- "⦿"
1571
- ]
1572
- };
1573
- const toggle8 = {
1574
- interval: 100,
1575
- frames: [
1576
- "◍",
1577
- "◌"
1578
- ]
1579
- };
1580
- const toggle9 = {
1581
- interval: 100,
1582
- frames: [
1583
- "◉",
1584
- "◎"
1585
- ]
1586
- };
1587
- const toggle10 = {
1588
- interval: 100,
1589
- frames: [
1590
- "㊂",
1591
- "㊀",
1592
- "㊁"
1593
- ]
1594
- };
1595
- const toggle11 = {
1596
- interval: 50,
1597
- frames: [
1598
- "⧇",
1599
- "⧆"
1600
- ]
1601
- };
1602
- const toggle12 = {
1603
- interval: 120,
1604
- frames: [
1605
- "☗",
1606
- "☖"
1607
- ]
1608
- };
1609
- const toggle13 = {
1610
- interval: 80,
1611
- frames: [
1612
- "=",
1613
- "*",
1614
- "-"
1615
- ]
1616
- };
1617
- const arrow = {
1618
- interval: 100,
1619
- frames: [
1620
- "←",
1621
- "↖",
1622
- "↑",
1623
- "↗",
1624
- "→",
1625
- "↘",
1626
- "↓",
1627
- "↙"
1628
- ]
1629
- };
1630
- const arrow2 = {
1631
- interval: 80,
1632
- frames: [
1633
- "⬆️ ",
1634
- "↗️ ",
1635
- "➡️ ",
1636
- "↘️ ",
1637
- "⬇️ ",
1638
- "↙️ ",
1639
- "⬅️ ",
1640
- "↖️ "
1641
- ]
1642
- };
1643
- const arrow3 = {
1644
- interval: 120,
1645
- frames: [
1646
- "▹▹▹▹▹",
1647
- "▸▹▹▹▹",
1648
- "▹▸▹▹▹",
1649
- "▹▹▸▹▹",
1650
- "▹▹▹▸▹",
1651
- "▹▹▹▹▸"
1652
- ]
1653
- };
1654
- const bouncingBar = {
1655
- interval: 80,
1656
- frames: [
1657
- "[ ]",
1658
- "[= ]",
1659
- "[== ]",
1660
- "[=== ]",
1661
- "[====]",
1662
- "[ ===]",
1663
- "[ ==]",
1664
- "[ =]",
1665
- "[ ]",
1666
- "[ =]",
1667
- "[ ==]",
1668
- "[ ===]",
1669
- "[====]",
1670
- "[=== ]",
1671
- "[== ]",
1672
- "[= ]"
1673
- ]
1674
- };
1675
- const bouncingBall = {
1676
- interval: 80,
1677
- frames: [
1678
- "( ● )",
1679
- "( ● )",
1680
- "( ● )",
1681
- "( ● )",
1682
- "( ●)",
1683
- "( ● )",
1684
- "( ● )",
1685
- "( ● )",
1686
- "( ● )",
1687
- "(● )"
1688
- ]
1689
- };
1690
- const smiley = {
1691
- interval: 200,
1692
- frames: [
1693
- "😄 ",
1694
- "😝 "
1695
- ]
1696
- };
1697
- const monkey = {
1698
- interval: 300,
1699
- frames: [
1700
- "🙈 ",
1701
- "🙈 ",
1702
- "🙉 ",
1703
- "🙊 "
1704
- ]
1705
- };
1706
- const hearts = {
1707
- interval: 100,
1708
- frames: [
1709
- "💛 ",
1710
- "💙 ",
1711
- "💜 ",
1712
- "💚 ",
1713
- "💗 "
1714
- ]
1715
- };
1716
- const clock = {
1717
- interval: 100,
1718
- frames: [
1719
- "🕛 ",
1720
- "🕐 ",
1721
- "🕑 ",
1722
- "🕒 ",
1723
- "🕓 ",
1724
- "🕔 ",
1725
- "🕕 ",
1726
- "🕖 ",
1727
- "🕗 ",
1728
- "🕘 ",
1729
- "🕙 ",
1730
- "🕚 "
1731
- ]
1732
- };
1733
- const earth = {
1734
- interval: 180,
1735
- frames: [
1736
- "🌍 ",
1737
- "🌎 ",
1738
- "🌏 "
1739
- ]
1740
- };
1741
- const material = {
1742
- interval: 17,
1743
- frames: [
1744
- "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1745
- "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1746
- "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1747
- "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1748
- "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1749
- "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1750
- "███████▁▁▁▁▁▁▁▁▁▁▁▁▁",
1751
- "████████▁▁▁▁▁▁▁▁▁▁▁▁",
1752
- "█████████▁▁▁▁▁▁▁▁▁▁▁",
1753
- "█████████▁▁▁▁▁▁▁▁▁▁▁",
1754
- "██████████▁▁▁▁▁▁▁▁▁▁",
1755
- "███████████▁▁▁▁▁▁▁▁▁",
1756
- "█████████████▁▁▁▁▁▁▁",
1757
- "██████████████▁▁▁▁▁▁",
1758
- "██████████████▁▁▁▁▁▁",
1759
- "▁██████████████▁▁▁▁▁",
1760
- "▁██████████████▁▁▁▁▁",
1761
- "▁██████████████▁▁▁▁▁",
1762
- "▁▁██████████████▁▁▁▁",
1763
- "▁▁▁██████████████▁▁▁",
1764
- "▁▁▁▁█████████████▁▁▁",
1765
- "▁▁▁▁██████████████▁▁",
1766
- "▁▁▁▁██████████████▁▁",
1767
- "▁▁▁▁▁██████████████▁",
1768
- "▁▁▁▁▁██████████████▁",
1769
- "▁▁▁▁▁██████████████▁",
1770
- "▁▁▁▁▁▁██████████████",
1771
- "▁▁▁▁▁▁██████████████",
1772
- "▁▁▁▁▁▁▁█████████████",
1773
- "▁▁▁▁▁▁▁█████████████",
1774
- "▁▁▁▁▁▁▁▁████████████",
1775
- "▁▁▁▁▁▁▁▁████████████",
1776
- "▁▁▁▁▁▁▁▁▁███████████",
1777
- "▁▁▁▁▁▁▁▁▁███████████",
1778
- "▁▁▁▁▁▁▁▁▁▁██████████",
1779
- "▁▁▁▁▁▁▁▁▁▁██████████",
1780
- "▁▁▁▁▁▁▁▁▁▁▁▁████████",
1781
- "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
1782
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████",
1783
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
1784
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
1785
- "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
1786
- "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
1787
- "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
1788
- "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
1789
- "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
1790
- "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
1791
- "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
1792
- "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█",
1793
- "████████▁▁▁▁▁▁▁▁▁▁▁▁",
1794
- "█████████▁▁▁▁▁▁▁▁▁▁▁",
1795
- "█████████▁▁▁▁▁▁▁▁▁▁▁",
1796
- "█████████▁▁▁▁▁▁▁▁▁▁▁",
1797
- "█████████▁▁▁▁▁▁▁▁▁▁▁",
1798
- "███████████▁▁▁▁▁▁▁▁▁",
1799
- "████████████▁▁▁▁▁▁▁▁",
1800
- "████████████▁▁▁▁▁▁▁▁",
1801
- "██████████████▁▁▁▁▁▁",
1802
- "██████████████▁▁▁▁▁▁",
1803
- "▁██████████████▁▁▁▁▁",
1804
- "▁██████████████▁▁▁▁▁",
1805
- "▁▁▁█████████████▁▁▁▁",
1806
- "▁▁▁▁▁████████████▁▁▁",
1807
- "▁▁▁▁▁████████████▁▁▁",
1808
- "▁▁▁▁▁▁███████████▁▁▁",
1809
- "▁▁▁▁▁▁▁▁█████████▁▁▁",
1810
- "▁▁▁▁▁▁▁▁█████████▁▁▁",
1811
- "▁▁▁▁▁▁▁▁▁█████████▁▁",
1812
- "▁▁▁▁▁▁▁▁▁█████████▁▁",
1813
- "▁▁▁▁▁▁▁▁▁▁█████████▁",
1814
- "▁▁▁▁▁▁▁▁▁▁▁████████▁",
1815
- "▁▁▁▁▁▁▁▁▁▁▁████████▁",
1816
- "▁▁▁▁▁▁▁▁▁▁▁▁███████▁",
1817
- "▁▁▁▁▁▁▁▁▁▁▁▁███████▁",
1818
- "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
1819
- "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
1820
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
1821
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
1822
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
1823
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
1824
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
1825
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
1826
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
1827
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
1828
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
1829
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
1830
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
1831
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
1832
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1833
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1834
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
1835
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁"
1836
- ]
1837
- };
1838
- const moon = {
1839
- interval: 80,
1840
- frames: [
1841
- "🌑 ",
1842
- "🌒 ",
1843
- "🌓 ",
1844
- "🌔 ",
1845
- "🌕 ",
1846
- "🌖 ",
1847
- "🌗 ",
1848
- "🌘 "
1849
- ]
1850
- };
1851
- const runner = {
1852
- interval: 140,
1853
- frames: [
1854
- "🚶 ",
1855
- "🏃 "
1856
- ]
1857
- };
1858
- const pong = {
1859
- interval: 80,
1860
- frames: [
1861
- "▐⠂ ▌",
1862
- "▐⠈ ▌",
1863
- "▐ ⠂ ▌",
1864
- "▐ ⠠ ▌",
1865
- "▐ ⡀ ▌",
1866
- "▐ ⠠ ▌",
1867
- "▐ ⠂ ▌",
1868
- "▐ ⠈ ▌",
1869
- "▐ ⠂ ▌",
1870
- "▐ ⠠ ▌",
1871
- "▐ ⡀ ▌",
1872
- "▐ ⠠ ▌",
1873
- "▐ ⠂ ▌",
1874
- "▐ ⠈ ▌",
1875
- "▐ ⠂▌",
1876
- "▐ ⠠▌",
1877
- "▐ ⡀▌",
1878
- "▐ ⠠ ▌",
1879
- "▐ ⠂ ▌",
1880
- "▐ ⠈ ▌",
1881
- "▐ ⠂ ▌",
1882
- "▐ ⠠ ▌",
1883
- "▐ ⡀ ▌",
1884
- "▐ ⠠ ▌",
1885
- "▐ ⠂ ▌",
1886
- "▐ ⠈ ▌",
1887
- "▐ ⠂ ▌",
1888
- "▐ ⠠ ▌",
1889
- "▐ ⡀ ▌",
1890
- "▐⠠ ▌"
1891
- ]
1892
- };
1893
- const shark = {
1894
- interval: 120,
1895
- frames: [
1896
- "▐|\\____________▌",
1897
- "▐_|\\___________▌",
1898
- "▐__|\\__________▌",
1899
- "▐___|\\_________▌",
1900
- "▐____|\\________▌",
1901
- "▐_____|\\_______▌",
1902
- "▐______|\\______▌",
1903
- "▐_______|\\_____▌",
1904
- "▐________|\\____▌",
1905
- "▐_________|\\___▌",
1906
- "▐__________|\\__▌",
1907
- "▐___________|\\_▌",
1908
- "▐____________|\\▌",
1909
- "▐____________/|▌",
1910
- "▐___________/|_▌",
1911
- "▐__________/|__▌",
1912
- "▐_________/|___▌",
1913
- "▐________/|____▌",
1914
- "▐_______/|_____▌",
1915
- "▐______/|______▌",
1916
- "▐_____/|_______▌",
1917
- "▐____/|________▌",
1918
- "▐___/|_________▌",
1919
- "▐__/|__________▌",
1920
- "▐_/|___________▌",
1921
- "▐/|____________▌"
1922
- ]
1923
- };
1924
- const dqpb = {
1925
- interval: 100,
1926
- frames: [
1927
- "d",
1928
- "q",
1929
- "p",
1930
- "b"
1931
- ]
1932
- };
1933
- const weather = {
1934
- interval: 100,
1935
- frames: [
1936
- "☀️ ",
1937
- "☀️ ",
1938
- "☀️ ",
1939
- "🌤 ",
1940
- "⛅️ ",
1941
- "🌥 ",
1942
- "☁️ ",
1943
- "🌧 ",
1944
- "🌨 ",
1945
- "🌧 ",
1946
- "🌨 ",
1947
- "🌧 ",
1948
- "🌨 ",
1949
- "⛈ ",
1950
- "🌨 ",
1951
- "🌧 ",
1952
- "🌨 ",
1953
- "☁️ ",
1954
- "🌥 ",
1955
- "⛅️ ",
1956
- "🌤 ",
1957
- "☀️ ",
1958
- "☀️ "
1959
- ]
1960
- };
1961
- const christmas = {
1962
- interval: 400,
1963
- frames: [
1964
- "🌲",
1965
- "🎄"
1966
- ]
1967
- };
1968
- const grenade = {
1969
- interval: 80,
1970
- frames: [
1971
- "، ",
1972
- "′ ",
1973
- " ´ ",
1974
- " ‾ ",
1975
- " ⸌",
1976
- " ⸊",
1977
- " |",
1978
- " ⁎",
1979
- " ⁕",
1980
- " ෴ ",
1981
- " ⁓",
1982
- " ",
1983
- " ",
1984
- " "
1985
- ]
1986
- };
1987
- const point = {
1988
- interval: 125,
1989
- frames: [
1990
- "∙∙∙",
1991
- "●∙∙",
1992
- "∙●∙",
1993
- "∙∙●",
1994
- "∙∙∙"
1995
- ]
1996
- };
1997
- const layer = {
1998
- interval: 150,
1999
- frames: [
2000
- "-",
2001
- "=",
2002
- "≡"
2003
- ]
2004
- };
2005
- const betaWave = {
2006
- interval: 80,
2007
- frames: [
2008
- "ρββββββ",
2009
- "βρβββββ",
2010
- "ββρββββ",
2011
- "βββρβββ",
2012
- "ββββρββ",
2013
- "βββββρβ",
2014
- "ββββββρ"
2015
- ]
2016
- };
2017
- const fingerDance = {
2018
- interval: 160,
2019
- frames: [
2020
- "🤘 ",
2021
- "🤟 ",
2022
- "🖖 ",
2023
- "✋ ",
2024
- "🤚 ",
2025
- "👆 "
2026
- ]
2027
- };
2028
- const fistBump = {
2029
- interval: 80,
2030
- frames: [
2031
- "🤜    🤛 ",
2032
- "🤜    🤛 ",
2033
- "🤜    🤛 ",
2034
- " 🤜  🤛  ",
2035
- "  🤜🤛   ",
2036
- " 🤜✨🤛   ",
2037
- "🤜 ✨ 🤛  "
2038
- ]
2039
- };
2040
- const soccerHeader = {
2041
- interval: 80,
2042
- frames: [
2043
- " 🧑⚽️ 🧑 ",
2044
- "🧑 ⚽️ 🧑 ",
2045
- "🧑 ⚽️ 🧑 ",
2046
- "🧑 ⚽️ 🧑 ",
2047
- "🧑 ⚽️ 🧑 ",
2048
- "🧑 ⚽️ 🧑 ",
2049
- "🧑 ⚽️🧑 ",
2050
- "🧑 ⚽️ 🧑 ",
2051
- "🧑 ⚽️ 🧑 ",
2052
- "🧑 ⚽️ 🧑 ",
2053
- "🧑 ⚽️ 🧑 ",
2054
- "🧑 ⚽️ 🧑 "
2055
- ]
2056
- };
2057
- const mindblown = {
2058
- interval: 160,
2059
- frames: [
2060
- "😐 ",
2061
- "😐 ",
2062
- "😮 ",
2063
- "😮 ",
2064
- "😦 ",
2065
- "😦 ",
2066
- "😧 ",
2067
- "😧 ",
2068
- "🤯 ",
2069
- "💥 ",
2070
- "✨ ",
2071
- "  ",
2072
- "  ",
2073
- "  "
2074
- ]
2075
- };
2076
- const speaker = {
2077
- interval: 160,
2078
- frames: [
2079
- "🔈 ",
2080
- "🔉 ",
2081
- "🔊 ",
2082
- "🔉 "
2083
- ]
2084
- };
2085
- const orangePulse = {
2086
- interval: 100,
2087
- frames: [
2088
- "🔸 ",
2089
- "🔶 ",
2090
- "🟠 ",
2091
- "🟠 ",
2092
- "🔶 "
2093
- ]
2094
- };
2095
- const bluePulse = {
2096
- interval: 100,
2097
- frames: [
2098
- "🔹 ",
2099
- "🔷 ",
2100
- "🔵 ",
2101
- "🔵 ",
2102
- "🔷 "
2103
- ]
2104
- };
2105
- const orangeBluePulse = {
2106
- interval: 100,
2107
- frames: [
2108
- "🔸 ",
2109
- "🔶 ",
2110
- "🟠 ",
2111
- "🟠 ",
2112
- "🔶 ",
2113
- "🔹 ",
2114
- "🔷 ",
2115
- "🔵 ",
2116
- "🔵 ",
2117
- "🔷 "
2118
- ]
2119
- };
2120
- const timeTravel = {
2121
- interval: 100,
2122
- frames: [
2123
- "🕛 ",
2124
- "🕚 ",
2125
- "🕙 ",
2126
- "🕘 ",
2127
- "🕗 ",
2128
- "🕖 ",
2129
- "🕕 ",
2130
- "🕔 ",
2131
- "🕓 ",
2132
- "🕒 ",
2133
- "🕑 ",
2134
- "🕐 "
2135
- ]
2136
- };
2137
- const aesthetic = {
2138
- interval: 80,
2139
- frames: [
2140
- "▰▱▱▱▱▱▱",
2141
- "▰▰▱▱▱▱▱",
2142
- "▰▰▰▱▱▱▱",
2143
- "▰▰▰▰▱▱▱",
2144
- "▰▰▰▰▰▱▱",
2145
- "▰▰▰▰▰▰▱",
2146
- "▰▰▰▰▰▰▰",
2147
- "▰▱▱▱▱▱▱"
2148
- ]
2149
- };
2150
- const dwarfFortress = {
2151
- interval: 80,
2152
- frames: [
2153
- " ██████£££ ",
2154
- "☺██████£££ ",
2155
- "☺██████£££ ",
2156
- "☺▓█████£££ ",
2157
- "☺▓█████£££ ",
2158
- "☺▒█████£££ ",
2159
- "☺▒█████£££ ",
2160
- "☺░█████£££ ",
2161
- "☺░█████£££ ",
2162
- "☺ █████£££ ",
2163
- " ☺█████£££ ",
2164
- " ☺█████£££ ",
2165
- " ☺▓████£££ ",
2166
- " ☺▓████£££ ",
2167
- " ☺▒████£££ ",
2168
- " ☺▒████£££ ",
2169
- " ☺░████£££ ",
2170
- " ☺░████£££ ",
2171
- " ☺ ████£££ ",
2172
- " ☺████£££ ",
2173
- " ☺████£££ ",
2174
- " ☺▓███£££ ",
2175
- " ☺▓███£££ ",
2176
- " ☺▒███£££ ",
2177
- " ☺▒███£££ ",
2178
- " ☺░███£££ ",
2179
- " ☺░███£££ ",
2180
- " ☺ ███£££ ",
2181
- " ☺███£££ ",
2182
- " ☺███£££ ",
2183
- " ☺▓██£££ ",
2184
- " ☺▓██£££ ",
2185
- " ☺▒██£££ ",
2186
- " ☺▒██£££ ",
2187
- " ☺░██£££ ",
2188
- " ☺░██£££ ",
2189
- " ☺ ██£££ ",
2190
- " ☺██£££ ",
2191
- " ☺██£££ ",
2192
- " ☺▓█£££ ",
2193
- " ☺▓█£££ ",
2194
- " ☺▒█£££ ",
2195
- " ☺▒█£££ ",
2196
- " ☺░█£££ ",
2197
- " ☺░█£££ ",
2198
- " ☺ █£££ ",
2199
- " ☺█£££ ",
2200
- " ☺█£££ ",
2201
- " ☺▓£££ ",
2202
- " ☺▓£££ ",
2203
- " ☺▒£££ ",
2204
- " ☺▒£££ ",
2205
- " ☺░£££ ",
2206
- " ☺░£££ ",
2207
- " ☺ £££ ",
2208
- " ☺£££ ",
2209
- " ☺£££ ",
2210
- " ☺▓££ ",
2211
- " ☺▓££ ",
2212
- " ☺▒££ ",
2213
- " ☺▒££ ",
2214
- " ☺░££ ",
2215
- " ☺░££ ",
2216
- " ☺ ££ ",
2217
- " ☺££ ",
2218
- " ☺££ ",
2219
- " ☺▓£ ",
2220
- " ☺▓£ ",
2221
- " ☺▒£ ",
2222
- " ☺▒£ ",
2223
- " ☺░£ ",
2224
- " ☺░£ ",
2225
- " ☺ £ ",
2226
- " ☺£ ",
2227
- " ☺£ ",
2228
- " ☺▓ ",
2229
- " ☺▓ ",
2230
- " ☺▒ ",
2231
- " ☺▒ ",
2232
- " ☺░ ",
2233
- " ☺░ ",
2234
- " ☺ ",
2235
- " ☺ &",
2236
- " ☺ ☼&",
2237
- " ☺ ☼ &",
2238
- " ☺☼ &",
2239
- " ☺☼ & ",
2240
- " ‼ & ",
2241
- " ☺ & ",
2242
- " ‼ & ",
2243
- " ☺ & ",
2244
- " ‼ & ",
2245
- " ☺ & ",
2246
- "‼ & ",
2247
- " & ",
2248
- " & ",
2249
- " & ░ ",
2250
- " & ▒ ",
2251
- " & ▓ ",
2252
- " & £ ",
2253
- " & ░£ ",
2254
- " & ▒£ ",
2255
- " & ▓£ ",
2256
- " & ££ ",
2257
- " & ░££ ",
2258
- " & ▒££ ",
2259
- "& ▓££ ",
2260
- "& £££ ",
2261
- " ░£££ ",
2262
- " ▒£££ ",
2263
- " ▓£££ ",
2264
- " █£££ ",
2265
- " ░█£££ ",
2266
- " ▒█£££ ",
2267
- " ▓█£££ ",
2268
- " ██£££ ",
2269
- " ░██£££ ",
2270
- " ▒██£££ ",
2271
- " ▓██£££ ",
2272
- " ███£££ ",
2273
- " ░███£££ ",
2274
- " ▒███£££ ",
2275
- " ▓███£££ ",
2276
- " ████£££ ",
2277
- " ░████£££ ",
2278
- " ▒████£££ ",
2279
- " ▓████£££ ",
2280
- " █████£££ ",
2281
- " ░█████£££ ",
2282
- " ▒█████£££ ",
2283
- " ▓█████£££ ",
2284
- " ██████£££ ",
2285
- " ██████£££ "
2286
- ]
2287
- };
2288
- const spinners = {
2289
- dots: dots,
2290
- dots2: dots2,
2291
- dots3: dots3,
2292
- dots4: dots4,
2293
- dots5: dots5,
2294
- dots6: dots6,
2295
- dots7: dots7,
2296
- dots8: dots8,
2297
- dots9: dots9,
2298
- dots10: dots10,
2299
- dots11: dots11,
2300
- dots12: dots12,
2301
- dots13: dots13,
2302
- dots14: dots14,
2303
- dots8Bit: dots8Bit,
2304
- dotsCircle: dotsCircle,
2305
- sand: sand,
2306
- line: line,
2307
- line2: line2,
2308
- pipe: pipe,
2309
- simpleDots: simpleDots,
2310
- simpleDotsScrolling: simpleDotsScrolling,
2311
- star: star,
2312
- star2: star2,
2313
- flip: flip,
2314
- hamburger: hamburger,
2315
- growVertical: growVertical,
2316
- growHorizontal: growHorizontal,
2317
- balloon: balloon,
2318
- balloon2: balloon2,
2319
- noise: noise,
2320
- bounce: bounce,
2321
- boxBounce: boxBounce,
2322
- boxBounce2: boxBounce2,
2323
- triangle: triangle,
2324
- binary: binary,
2325
- arc: arc,
2326
- circle: circle,
2327
- squareCorners: squareCorners,
2328
- circleQuarters: circleQuarters,
2329
- circleHalves: circleHalves,
2330
- squish: squish,
2331
- toggle: toggle,
2332
- toggle2: toggle2,
2333
- toggle3: toggle3,
2334
- toggle4: toggle4,
2335
- toggle5: toggle5,
2336
- toggle6: toggle6,
2337
- toggle7: toggle7,
2338
- toggle8: toggle8,
2339
- toggle9: toggle9,
2340
- toggle10: toggle10,
2341
- toggle11: toggle11,
2342
- toggle12: toggle12,
2343
- toggle13: toggle13,
2344
- arrow: arrow,
2345
- arrow2: arrow2,
2346
- arrow3: arrow3,
2347
- bouncingBar: bouncingBar,
2348
- bouncingBall: bouncingBall,
2349
- smiley: smiley,
2350
- monkey: monkey,
2351
- hearts: hearts,
2352
- clock: clock,
2353
- earth: earth,
2354
- material: material,
2355
- moon: moon,
2356
- runner: runner,
2357
- pong: pong,
2358
- shark: shark,
2359
- dqpb: dqpb,
2360
- weather: weather,
2361
- christmas: christmas,
2362
- grenade: grenade,
2363
- point: point,
2364
- layer: layer,
2365
- betaWave: betaWave,
2366
- fingerDance: fingerDance,
2367
- fistBump: fistBump,
2368
- soccerHeader: soccerHeader,
2369
- mindblown: mindblown,
2370
- speaker: speaker,
2371
- orangePulse: orangePulse,
2372
- bluePulse: bluePulse,
2373
- orangeBluePulse: orangeBluePulse,
2374
- timeTravel: timeTravel,
2375
- aesthetic: aesthetic,
2376
- dwarfFortress: dwarfFortress
2377
- };
639
+ var cliSpinnersExports = requireCliSpinners();
640
+ const cliSpinners = /*@__PURE__*/getDefaultExportFromCjs(cliSpinnersExports);
2378
641
 
2379
- const info = 'ℹ️';
2380
- const success = '';
2381
- const warning = '⚠️';
2382
- const error = '❌️';
642
+ const logSymbols = {
643
+ info: 'ℹ️',
644
+ success: '',
645
+ warning: '⚠️',
646
+ error: '❌️',
647
+ };
2383
648
 
2384
649
  function ansiRegex({onlyFirst = false} = {}) {
2385
650
  // Valid string terminator sequences are BEL, ESC\, and 0x9c
@@ -2790,49 +1055,17 @@ function eastAsianWidth(codePoint, {ambiguousAsWide = false} = {}) {
2790
1055
  return 1;
2791
1056
  }
2792
1057
 
2793
- /**
2794
- Logic:
2795
- - Segment graphemes to match how terminals render clusters.
2796
- - Width rules:
2797
- 1. Skip non-printing clusters (Default_Ignorable, Control, pure Mark, lone Surrogates). Tabs are ignored by design.
2798
- 2. RGI emoji clusters (\p{RGI_Emoji}) are double-width.
2799
- 3. Otherwise use East Asian Width of the cluster’s first visible code point, and add widths for trailing Halfwidth/Fullwidth Forms within the same cluster (e.g., dakuten/handakuten/prolonged sound mark).
2800
- */
1058
+ const emojiRegex = () => {
1059
+ // https://mths.be/emoji
1060
+ return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC2\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
1061
+ };
2801
1062
 
2802
1063
  const segmenter = new Intl.Segmenter();
2803
1064
 
2804
- // Whole-cluster zero-width
2805
- const zeroWidthClusterRegex = /^(?:\p{Default_Ignorable_Code_Point}|\p{Control}|\p{Mark}|\p{Surrogate})+$/v;
2806
-
2807
- // Pick the base scalar if the cluster starts with Prepend/Format/Marks
2808
- const leadingNonPrintingRegex = /^[\p{Default_Ignorable_Code_Point}\p{Control}\p{Format}\p{Mark}\p{Surrogate}]+/v;
2809
-
2810
- // RGI emoji sequences
2811
- const rgiEmojiRegex = /^\p{RGI_Emoji}$/v;
2812
-
2813
- function baseVisible(segment) {
2814
- return segment.replace(leadingNonPrintingRegex, '');
2815
- }
2816
-
2817
- function isZeroWidthCluster(segment) {
2818
- return zeroWidthClusterRegex.test(segment);
2819
- }
2820
-
2821
- function trailingHalfwidthWidth(segment, eastAsianWidthOptions) {
2822
- let extra = 0;
2823
- if (segment.length > 1) {
2824
- for (const char of segment.slice(1)) {
2825
- if (char >= '\uFF00' && char <= '\uFFEF') {
2826
- extra += eastAsianWidth(char.codePointAt(0), eastAsianWidthOptions);
2827
- }
2828
- }
2829
- }
2830
-
2831
- return extra;
2832
- }
1065
+ const defaultIgnorableCodePointRegex = /^\p{Default_Ignorable_Code_Point}$/u;
2833
1066
 
2834
- function stringWidth(input, options = {}) {
2835
- if (typeof input !== 'string' || input.length === 0) {
1067
+ function stringWidth(string, options = {}) {
1068
+ if (typeof string !== 'string' || string.length === 0) {
2836
1069
  return 0;
2837
1070
  }
2838
1071
 
@@ -2841,8 +1074,6 @@ function stringWidth(input, options = {}) {
2841
1074
  countAnsiEscapeCodes = false,
2842
1075
  } = options;
2843
1076
 
2844
- let string = input;
2845
-
2846
1077
  if (!countAnsiEscapeCodes) {
2847
1078
  string = stripAnsi(string);
2848
1079
  }
@@ -2854,24 +1085,55 @@ function stringWidth(input, options = {}) {
2854
1085
  let width = 0;
2855
1086
  const eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};
2856
1087
 
2857
- for (const {segment} of segmenter.segment(string)) {
2858
- // Zero-width / non-printing clusters
2859
- if (isZeroWidthCluster(segment)) {
1088
+ for (const {segment: character} of segmenter.segment(string)) {
1089
+ const codePoint = character.codePointAt(0);
1090
+
1091
+ // Ignore control characters
1092
+ if (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {
1093
+ continue;
1094
+ }
1095
+
1096
+ // Ignore zero-width characters
1097
+ if (
1098
+ (codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark
1099
+ || codePoint === 0xFE_FF // Zero-width no-break space
1100
+ ) {
1101
+ continue;
1102
+ }
1103
+
1104
+ // Ignore combining characters
1105
+ if (
1106
+ (codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks
1107
+ || (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended
1108
+ || (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement
1109
+ || (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols
1110
+ || (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks
1111
+ ) {
1112
+ continue;
1113
+ }
1114
+
1115
+ // Ignore surrogate pairs
1116
+ if (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {
1117
+ continue;
1118
+ }
1119
+
1120
+ // Ignore variation selectors
1121
+ if (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {
1122
+ continue;
1123
+ }
1124
+
1125
+ // This covers some of the above cases, but we still keep them for performance reasons.
1126
+ if (defaultIgnorableCodePointRegex.test(character)) {
2860
1127
  continue;
2861
1128
  }
2862
1129
 
2863
- // Emoji width logic
2864
- if (rgiEmojiRegex.test(segment)) {
1130
+ // TODO: Use `/\p{RGI_Emoji}/v` when targeting Node.js 20.
1131
+ if (emojiRegex().test(character)) {
2865
1132
  width += 2;
2866
1133
  continue;
2867
1134
  }
2868
1135
 
2869
- // Everything else: EAW of the cluster’s first visible scalar
2870
- const codePoint = baseVisible(segment).codePointAt(0);
2871
1136
  width += eastAsianWidth(codePoint, eastAsianWidthOptions);
2872
-
2873
- // Add width for trailing Halfwidth and Fullwidth Forms (e.g., ゙, ゚, ー)
2874
- width += trailingHalfwidthWidth(segment, eastAsianWidthOptions);
2875
1137
  }
2876
1138
 
2877
1139
  return width;
@@ -2905,195 +1167,81 @@ function isUnicodeSupported() {
2905
1167
  || env.TERMINAL_EMULATOR === 'JetBrains-JediTerm';
2906
1168
  }
2907
1169
 
2908
- const ASCII_ETX_CODE = 0x03; // Ctrl+C
1170
+ const ASCII_ETX_CODE = 0x03; // Ctrl+C emits this code
2909
1171
 
2910
1172
  class StdinDiscarder {
2911
1173
  #activeCount = 0;
2912
- #stdin;
2913
- #stdinWasPaused = false;
2914
- #stdinWasRaw = false;
2915
- #handleInputBound = chunk => {
2916
- if (!chunk?.length) {
2917
- return;
2918
- }
2919
-
2920
- const code = typeof chunk === 'string' ? chunk.codePointAt(0) : chunk[0];
2921
- if (code === ASCII_ETX_CODE) {
2922
- if (process__default.listenerCount('SIGINT') > 0) {
2923
- process__default.emit('SIGINT');
2924
- } else {
2925
- process__default.kill(process__default.pid, 'SIGINT');
2926
- }
2927
- }
2928
- };
2929
1174
 
2930
1175
  start() {
2931
1176
  this.#activeCount++;
1177
+
2932
1178
  if (this.#activeCount === 1) {
2933
1179
  this.#realStart();
2934
1180
  }
2935
1181
  }
2936
1182
 
2937
1183
  stop() {
2938
- if (this.#activeCount === 0) {
2939
- return;
1184
+ if (this.#activeCount <= 0) {
1185
+ throw new Error('`stop` called more times than `start`');
2940
1186
  }
2941
1187
 
2942
- if (--this.#activeCount === 0) {
1188
+ this.#activeCount--;
1189
+
1190
+ if (this.#activeCount === 0) {
2943
1191
  this.#realStop();
2944
1192
  }
2945
1193
  }
2946
1194
 
2947
1195
  #realStart() {
2948
- const {stdin} = process__default;
2949
-
2950
- if (process__default.platform === 'win32' || !stdin?.isTTY || typeof stdin.setRawMode !== 'function') {
2951
- this.#stdin = undefined;
1196
+ // No known way to make it work reliably on Windows.
1197
+ if (process__default.platform === 'win32' || !process__default.stdin.isTTY) {
2952
1198
  return;
2953
1199
  }
2954
1200
 
2955
- this.#stdin = stdin;
2956
- this.#stdinWasPaused = stdin.isPaused();
2957
- this.#stdinWasRaw = Boolean(stdin.isRaw);
2958
-
2959
- stdin.setRawMode(true);
2960
- stdin.prependListener('data', this.#handleInputBound);
2961
-
2962
- if (this.#stdinWasPaused) {
2963
- stdin.resume();
2964
- }
1201
+ process__default.stdin.setRawMode(true);
1202
+ process__default.stdin.on('data', this.#handleInput);
1203
+ process__default.stdin.resume();
2965
1204
  }
2966
1205
 
2967
1206
  #realStop() {
2968
- if (!this.#stdin) {
1207
+ if (!process__default.stdin.isTTY) {
2969
1208
  return;
2970
1209
  }
2971
1210
 
2972
- const stdin = this.#stdin;
2973
-
2974
- stdin.off('data', this.#handleInputBound);
2975
-
2976
- if (stdin.isTTY) {
2977
- stdin.setRawMode?.(this.#stdinWasRaw);
2978
- }
1211
+ process__default.stdin.off('data', this.#handleInput);
1212
+ process__default.stdin.pause();
1213
+ process__default.stdin.setRawMode(false);
1214
+ }
2979
1215
 
2980
- if (this.#stdinWasPaused) {
2981
- stdin.pause();
1216
+ #handleInput(chunk) {
1217
+ // Allow Ctrl+C to gracefully exit.
1218
+ if (chunk[0] === ASCII_ETX_CODE) {
1219
+ process__default.emit('SIGINT');
2982
1220
  }
2983
-
2984
- this.#stdin = undefined;
2985
- this.#stdinWasPaused = false;
2986
- this.#stdinWasRaw = false;
2987
1221
  }
2988
1222
  }
2989
1223
 
2990
1224
  const stdinDiscarder = new StdinDiscarder();
2991
1225
 
2992
- const stdinDiscarder$1 = Object.freeze(stdinDiscarder);
2993
-
2994
- // Constants
2995
- const RENDER_DEFERRAL_TIMEOUT = 200; // Milliseconds to wait before re-rendering after partial chunk write
2996
- const SYNCHRONIZED_OUTPUT_ENABLE = '\u001B[?2026h';
2997
- const SYNCHRONIZED_OUTPUT_DISABLE = '\u001B[?2026l';
2998
-
2999
- // Global state for concurrent spinner detection
3000
- const activeHooksPerStream = new Map(); // Stream → ora instance
3001
-
3002
1226
  class Ora {
3003
1227
  #linesToClear = 0;
1228
+ #isDiscardingStdin = false;
1229
+ #lineCount = 0;
3004
1230
  #frameIndex = -1;
3005
- #lastFrameTime = 0;
1231
+ #lastSpinnerFrameTime = 0;
3006
1232
  #options;
3007
1233
  #spinner;
3008
1234
  #stream;
3009
1235
  #id;
3010
- #hookedStreams = new Map();
3011
- #isInternalWrite = false;
3012
- #drainHandler;
3013
- #deferRenderTimer;
3014
- #isDiscardingStdin = false;
1236
+ #initialInterval;
1237
+ #isEnabled;
1238
+ #isSilent;
1239
+ #indent;
1240
+ #text;
1241
+ #prefixText;
1242
+ #suffixText;
3015
1243
  color;
3016
1244
 
3017
- // Helper to execute writes while preventing hook recursion
3018
- #internalWrite(fn) {
3019
- this.#isInternalWrite = true;
3020
- try {
3021
- return fn();
3022
- } finally {
3023
- this.#isInternalWrite = false;
3024
- }
3025
- }
3026
-
3027
- // Helper to render if still spinning
3028
- #tryRender() {
3029
- if (this.isSpinning) {
3030
- this.render();
3031
- }
3032
- }
3033
-
3034
- #stringifyChunk(chunk, encoding) {
3035
- if (chunk === undefined || chunk === null) {
3036
- return '';
3037
- }
3038
-
3039
- if (typeof chunk === 'string') {
3040
- return chunk;
3041
- }
3042
-
3043
- /* eslint-disable n/prefer-global/buffer */
3044
- if (Buffer.isBuffer(chunk) || ArrayBuffer.isView(chunk)) {
3045
- const normalizedEncoding = (typeof encoding === 'string' && encoding && encoding !== 'buffer') ? encoding : 'utf8';
3046
- return Buffer.from(chunk).toString(normalizedEncoding);
3047
- }
3048
- /* eslint-enable n/prefer-global/buffer */
3049
-
3050
- return String(chunk);
3051
- }
3052
-
3053
- #chunkTerminatesLine(chunkString) {
3054
- if (!chunkString) {
3055
- return false;
3056
- }
3057
-
3058
- const lastCharacter = chunkString.at(-1);
3059
- return lastCharacter === '\n' || lastCharacter === '\r';
3060
- }
3061
-
3062
- #scheduleRenderDeferral() {
3063
- // If already deferred, don't reset timer - let it complete
3064
- if (this.#deferRenderTimer) {
3065
- return;
3066
- }
3067
-
3068
- this.#deferRenderTimer = setTimeout(() => {
3069
- this.#deferRenderTimer = undefined;
3070
-
3071
- if (this.isSpinning) {
3072
- this.#tryRender();
3073
- }
3074
- }, RENDER_DEFERRAL_TIMEOUT);
3075
-
3076
- if (typeof this.#deferRenderTimer?.unref === 'function') {
3077
- this.#deferRenderTimer.unref();
3078
- }
3079
- }
3080
-
3081
- #clearRenderDeferral() {
3082
- if (this.#deferRenderTimer) {
3083
- clearTimeout(this.#deferRenderTimer);
3084
- this.#deferRenderTimer = undefined;
3085
- }
3086
- }
3087
-
3088
- // Helper to build complete line with symbol, text, prefix, and suffix
3089
- #buildOutputLine(symbol, text, prefixText, suffixText) {
3090
- const fullPrefixText = this.#getFullPrefixText(prefixText, ' ');
3091
- const separatorText = symbol ? ' ' : '';
3092
- const fullText = (typeof text === 'string') ? separatorText + text : '';
3093
- const fullSuffixText = this.#getFullSuffixText(suffixText, ' ');
3094
- return fullPrefixText + symbol + fullText + fullSuffixText;
3095
- }
3096
-
3097
1245
  constructor(options) {
3098
1246
  if (typeof options === 'string') {
3099
1247
  options = {
@@ -3112,23 +1260,16 @@ class Ora {
3112
1260
  // Public
3113
1261
  this.color = this.#options.color;
3114
1262
 
3115
- this.#stream = this.#options.stream;
3116
-
3117
- // Normalize isEnabled and isSilent into options
3118
- if (typeof this.#options.isEnabled !== 'boolean') {
3119
- this.#options.isEnabled = isInteractive({stream: this.#stream});
3120
- }
1263
+ // It's important that these use the public setters.
1264
+ this.spinner = this.#options.spinner;
3121
1265
 
3122
- if (typeof this.#options.isSilent !== 'boolean') {
3123
- this.#options.isSilent = false;
3124
- }
1266
+ this.#initialInterval = this.#options.interval;
1267
+ this.#stream = this.#options.stream;
1268
+ this.#isEnabled = typeof this.#options.isEnabled === 'boolean' ? this.#options.isEnabled : isInteractive({stream: this.#stream});
1269
+ this.#isSilent = typeof this.#options.isSilent === 'boolean' ? this.#options.isSilent : false;
3125
1270
 
3126
1271
  // Set *after* `this.#stream`.
3127
- // Store original interval before spinner setter clears it
3128
- const userInterval = this.#options.interval;
3129
1272
  // It's important that these use the public setters.
3130
- this.spinner = this.#options.spinner;
3131
- this.#options.interval = userInterval;
3132
1273
  this.text = this.#options.text;
3133
1274
  this.prefixText = this.#options.prefixText;
3134
1275
  this.suffixText = this.#options.suffixText;
@@ -3136,7 +1277,7 @@ class Ora {
3136
1277
 
3137
1278
  if (process__default.env.NODE_ENV === 'test') {
3138
1279
  this._stream = this.#stream;
3139
- this._isEnabled = this.#options.isEnabled;
1280
+ this._isEnabled = this.#isEnabled;
3140
1281
 
3141
1282
  Object.defineProperty(this, '_linesToClear', {
3142
1283
  get() {
@@ -3155,21 +1296,14 @@ class Ora {
3155
1296
 
3156
1297
  Object.defineProperty(this, '_lineCount', {
3157
1298
  get() {
3158
- const columns = this.#stream.columns ?? 80;
3159
- const prefixText = typeof this.#options.prefixText === 'function' ? '' : this.#options.prefixText;
3160
- const suffixText = typeof this.#options.suffixText === 'function' ? '' : this.#options.suffixText;
3161
- const fullPrefixText = (typeof prefixText === 'string' && prefixText !== '') ? prefixText + ' ' : '';
3162
- const fullSuffixText = (typeof suffixText === 'string' && suffixText !== '') ? ' ' + suffixText : '';
3163
- const spinnerChar = '-';
3164
- const fullText = ' '.repeat(this.#options.indent) + fullPrefixText + spinnerChar + (typeof this.#options.text === 'string' ? ' ' + this.#options.text : '') + fullSuffixText;
3165
- return this.#computeLineCountFrom(fullText, columns);
1299
+ return this.#lineCount;
3166
1300
  },
3167
1301
  });
3168
1302
  }
3169
1303
  }
3170
1304
 
3171
1305
  get indent() {
3172
- return this.#options.indent;
1306
+ return this.#indent;
3173
1307
  }
3174
1308
 
3175
1309
  set indent(indent = 0) {
@@ -3177,11 +1311,12 @@ class Ora {
3177
1311
  throw new Error('The `indent` option must be an integer from 0 and up');
3178
1312
  }
3179
1313
 
3180
- this.#options.indent = indent;
1314
+ this.#indent = indent;
1315
+ this.#updateLineCount();
3181
1316
  }
3182
1317
 
3183
1318
  get interval() {
3184
- return this.#options.interval ?? this.#spinner.interval ?? 100;
1319
+ return this.#initialInterval ?? this.#spinner.interval ?? 100;
3185
1320
  }
3186
1321
 
3187
1322
  get spinner() {
@@ -3190,86 +1325,95 @@ class Ora {
3190
1325
 
3191
1326
  set spinner(spinner) {
3192
1327
  this.#frameIndex = -1;
3193
- this.#options.interval = undefined;
1328
+ this.#initialInterval = undefined;
3194
1329
 
3195
1330
  if (typeof spinner === 'object') {
3196
- if (!Array.isArray(spinner.frames) || spinner.frames.length === 0 || spinner.frames.some(frame => typeof frame !== 'string')) {
3197
- throw new Error('The given spinner must have a non-empty `frames` array of strings');
3198
- }
3199
-
3200
- if (spinner.interval !== undefined && !(Number.isInteger(spinner.interval) && spinner.interval > 0)) {
3201
- throw new Error('`spinner.interval` must be a positive integer if provided');
1331
+ if (spinner.frames === undefined) {
1332
+ throw new Error('The given spinner must have a `frames` property');
3202
1333
  }
3203
1334
 
3204
1335
  this.#spinner = spinner;
3205
1336
  } else if (!isUnicodeSupported()) {
3206
- this.#spinner = spinners.line;
1337
+ this.#spinner = cliSpinners.line;
3207
1338
  } else if (spinner === undefined) {
3208
1339
  // Set default spinner
3209
- this.#spinner = spinners.dots;
3210
- } else if (spinner !== 'default' && spinners[spinner]) {
3211
- this.#spinner = spinners[spinner];
1340
+ this.#spinner = cliSpinners.dots;
1341
+ } else if (spinner !== 'default' && cliSpinners[spinner]) {
1342
+ this.#spinner = cliSpinners[spinner];
3212
1343
  } else {
3213
1344
  throw new Error(`There is no built-in spinner named '${spinner}'. See https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json for a full list.`);
3214
1345
  }
3215
1346
  }
3216
1347
 
3217
1348
  get text() {
3218
- return this.#options.text;
1349
+ return this.#text;
3219
1350
  }
3220
1351
 
3221
1352
  set text(value = '') {
3222
- this.#options.text = value;
1353
+ this.#text = value;
1354
+ this.#updateLineCount();
3223
1355
  }
3224
1356
 
3225
1357
  get prefixText() {
3226
- return this.#options.prefixText;
1358
+ return this.#prefixText;
3227
1359
  }
3228
1360
 
3229
1361
  set prefixText(value = '') {
3230
- this.#options.prefixText = value;
1362
+ this.#prefixText = value;
1363
+ this.#updateLineCount();
3231
1364
  }
3232
1365
 
3233
1366
  get suffixText() {
3234
- return this.#options.suffixText;
1367
+ return this.#suffixText;
3235
1368
  }
3236
1369
 
3237
1370
  set suffixText(value = '') {
3238
- this.#options.suffixText = value;
1371
+ this.#suffixText = value;
1372
+ this.#updateLineCount();
3239
1373
  }
3240
1374
 
3241
1375
  get isSpinning() {
3242
1376
  return this.#id !== undefined;
3243
1377
  }
3244
1378
 
3245
- #formatAffix(value, separator, placeBefore = false) {
3246
- const resolved = typeof value === 'function' ? value() : value;
3247
- if (typeof resolved === 'string' && resolved !== '') {
3248
- return placeBefore ? (separator + resolved) : (resolved + separator);
1379
+ #getFullPrefixText(prefixText = this.#prefixText, postfix = ' ') {
1380
+ if (typeof prefixText === 'string' && prefixText !== '') {
1381
+ return prefixText + postfix;
1382
+ }
1383
+
1384
+ if (typeof prefixText === 'function') {
1385
+ return prefixText() + postfix;
3249
1386
  }
3250
1387
 
3251
1388
  return '';
3252
1389
  }
3253
1390
 
3254
- #getFullPrefixText(prefixText = this.#options.prefixText, postfix = ' ') {
3255
- return this.#formatAffix(prefixText, postfix, false);
3256
- }
1391
+ #getFullSuffixText(suffixText = this.#suffixText, prefix = ' ') {
1392
+ if (typeof suffixText === 'string' && suffixText !== '') {
1393
+ return prefix + suffixText;
1394
+ }
3257
1395
 
3258
- #getFullSuffixText(suffixText = this.#options.suffixText, prefix = ' ') {
3259
- return this.#formatAffix(suffixText, prefix, true);
1396
+ if (typeof suffixText === 'function') {
1397
+ return prefix + suffixText();
1398
+ }
1399
+
1400
+ return '';
3260
1401
  }
3261
1402
 
3262
- #computeLineCountFrom(text, columns) {
3263
- let count = 0;
3264
- for (const line of stripVTControlCharacters(text).split('\n')) {
3265
- count += Math.max(1, Math.ceil(stringWidth(line) / columns));
3266
- }
1403
+ #updateLineCount() {
1404
+ const columns = this.#stream.columns ?? 80;
1405
+ const fullPrefixText = this.#getFullPrefixText(this.#prefixText, '-');
1406
+ const fullSuffixText = this.#getFullSuffixText(this.#suffixText, '-');
1407
+ const fullText = ' '.repeat(this.#indent) + fullPrefixText + '--' + this.#text + '--' + fullSuffixText;
3267
1408
 
3268
- return count;
1409
+ this.#lineCount = 0;
1410
+ for (const line of stripAnsi(fullText).split('\n')) {
1411
+ this.#lineCount += Math.max(1, Math.ceil(stringWidth(line, {countAnsiEscapeCodes: true}) / columns));
1412
+ }
3269
1413
  }
3270
1414
 
3271
1415
  get isEnabled() {
3272
- return this.#options.isEnabled && !this.#options.isSilent;
1416
+ return this.#isEnabled && !this.#isSilent;
3273
1417
  }
3274
1418
 
3275
1419
  set isEnabled(value) {
@@ -3277,11 +1421,11 @@ class Ora {
3277
1421
  throw new TypeError('The `isEnabled` option must be a boolean');
3278
1422
  }
3279
1423
 
3280
- this.#options.isEnabled = value;
1424
+ this.#isEnabled = value;
3281
1425
  }
3282
1426
 
3283
1427
  get isSilent() {
3284
- return this.#options.isSilent;
1428
+ return this.#isSilent;
3285
1429
  }
3286
1430
 
3287
1431
  set isSilent(value) {
@@ -3289,15 +1433,16 @@ class Ora {
3289
1433
  throw new TypeError('The `isSilent` option must be a boolean');
3290
1434
  }
3291
1435
 
3292
- this.#options.isSilent = value;
1436
+ this.#isSilent = value;
3293
1437
  }
3294
1438
 
3295
1439
  frame() {
3296
- // Only advance frame if enough time has passed (throttle to interval)
1440
+ // Ensure we only update the spinner frame at the wanted interval,
1441
+ // even if the render method is called more often.
3297
1442
  const now = Date.now();
3298
- if (this.#frameIndex === -1 || now - this.#lastFrameTime >= this.interval) {
3299
- this.#frameIndex = (this.#frameIndex + 1) % this.#spinner.frames.length;
3300
- this.#lastFrameTime = now;
1443
+ if (this.#frameIndex === -1 || now - this.#lastSpinnerFrameTime >= this.interval) {
1444
+ this.#frameIndex = ++this.#frameIndex % this.#spinner.frames.length;
1445
+ this.#lastSpinnerFrameTime = now;
3301
1446
  }
3302
1447
 
3303
1448
  const {frames} = this.#spinner;
@@ -3307,166 +1452,46 @@ class Ora {
3307
1452
  frame = chalk[this.color](frame);
3308
1453
  }
3309
1454
 
3310
- const fullPrefixText = this.#getFullPrefixText(this.#options.prefixText, ' ');
1455
+ const fullPrefixText = (typeof this.#prefixText === 'string' && this.#prefixText !== '') ? this.#prefixText + ' ' : '';
3311
1456
  const fullText = typeof this.text === 'string' ? ' ' + this.text : '';
3312
- const fullSuffixText = this.#getFullSuffixText(this.#options.suffixText, ' ');
1457
+ const fullSuffixText = (typeof this.#suffixText === 'string' && this.#suffixText !== '') ? ' ' + this.#suffixText : '';
3313
1458
 
3314
1459
  return fullPrefixText + frame + fullText + fullSuffixText;
3315
1460
  }
3316
1461
 
3317
1462
  clear() {
3318
- if (!this.isEnabled || !this.#stream.isTTY) {
1463
+ if (!this.#isEnabled || !this.#stream.isTTY) {
3319
1464
  return this;
3320
1465
  }
3321
1466
 
3322
- // Protect cursor control methods (cursorTo, moveCursor, clearLine) which internally call stream.write
3323
- this.#internalWrite(() => {
3324
- this.#stream.cursorTo(0);
3325
-
3326
- for (let index = 0; index < this.#linesToClear; index++) {
3327
- if (index > 0) {
3328
- this.#stream.moveCursor(0, -1);
3329
- }
1467
+ this.#stream.cursorTo(0);
3330
1468
 
3331
- this.#stream.clearLine(1);
1469
+ for (let index = 0; index < this.#linesToClear; index++) {
1470
+ if (index > 0) {
1471
+ this.#stream.moveCursor(0, -1);
3332
1472
  }
3333
1473
 
3334
- if (this.#options.indent) {
3335
- this.#stream.cursorTo(this.#options.indent);
3336
- }
3337
- });
3338
-
3339
- this.#linesToClear = 0;
3340
-
3341
- return this;
3342
- }
3343
-
3344
- // Helper to hook a single stream
3345
- #hookStream(stream) {
3346
- if (!stream || this.#hookedStreams.has(stream) || !stream.isTTY || typeof stream.write !== 'function') {
3347
- return;
3348
- }
3349
-
3350
- // Detect concurrent spinners
3351
- if (activeHooksPerStream.has(stream)) {
3352
- console.warn('[ora] Multiple concurrent spinners detected. This may cause visual corruption. Use one spinner at a time.');
3353
- }
3354
-
3355
- const originalWrite = stream.write;
3356
- this.#hookedStreams.set(stream, originalWrite);
3357
- activeHooksPerStream.set(stream, this);
3358
- stream.write = (chunk, encoding, callback) => this.#hookedWrite(stream, originalWrite, chunk, encoding, callback);
3359
- }
3360
-
3361
- /**
3362
- Intercept stream writes while spinner is active to handle external writes cleanly without visual corruption.
3363
- Hooks process stdio streams and the active spinner stream so console.log(), console.error(), and direct writes stay tidy.
3364
- */
3365
- #installHook() {
3366
- if (!this.isEnabled || this.#hookedStreams.size > 0) {
3367
- return;
3368
- }
3369
-
3370
- const streamsToHook = new Set([this.#stream, process__default.stdout, process__default.stderr]);
3371
-
3372
- for (const stream of streamsToHook) {
3373
- this.#hookStream(stream);
3374
- }
3375
- }
3376
-
3377
- #uninstallHook() {
3378
- for (const [stream, originalWrite] of this.#hookedStreams) {
3379
- stream.write = originalWrite;
3380
- if (activeHooksPerStream.get(stream) === this) {
3381
- activeHooksPerStream.delete(stream);
3382
- }
3383
- }
3384
-
3385
- this.#hookedStreams.clear();
3386
- }
3387
-
3388
- // eslint-disable-next-line max-params -- Need stream and originalWrite for multi-stream support
3389
- #hookedWrite(stream, originalWrite, chunk, encoding, callback) {
3390
- // Handle both write(chunk, encoding, callback) and write(chunk, callback) signatures
3391
- if (typeof encoding === 'function') {
3392
- callback = encoding;
3393
- encoding = undefined;
1474
+ this.#stream.clearLine(1);
3394
1475
  }
3395
1476
 
3396
- // Pass through our own internal writes (spinner rendering, cursor control)
3397
- if (this.#isInternalWrite) {
3398
- return originalWrite.call(stream, chunk, encoding, callback);
1477
+ if (this.#indent || this.lastIndent !== this.#indent) {
1478
+ this.#stream.cursorTo(this.#indent);
3399
1479
  }
3400
1480
 
3401
- // External write detected - clear spinner, write content, re-render if appropriate
3402
- this.clear();
3403
-
3404
- const chunkString = this.#stringifyChunk(chunk, encoding);
3405
- const chunkTerminatesLine = this.#chunkTerminatesLine(chunkString);
3406
-
3407
- const writeResult = originalWrite.call(stream, chunk, encoding, callback);
3408
-
3409
- // Schedule or clear render deferral based on chunk content
3410
- if (chunkTerminatesLine) {
3411
- this.#clearRenderDeferral();
3412
- } else if (chunkString.length > 0) {
3413
- this.#scheduleRenderDeferral();
3414
- }
3415
-
3416
- // Re-render spinner below the new output if still spinning and not deferred
3417
- if (this.isSpinning && !this.#deferRenderTimer) {
3418
- this.render();
3419
- }
1481
+ this.lastIndent = this.#indent;
1482
+ this.#linesToClear = 0;
3420
1483
 
3421
- return writeResult;
1484
+ return this;
3422
1485
  }
3423
1486
 
3424
1487
  render() {
3425
- if (!this.isEnabled || this.#drainHandler || this.#deferRenderTimer) {
1488
+ if (this.#isSilent) {
3426
1489
  return this;
3427
1490
  }
3428
1491
 
3429
- const useSynchronizedOutput = this.#stream.isTTY;
3430
- let shouldDisableSynchronizedOutput = false;
3431
-
3432
- try {
3433
- if (useSynchronizedOutput) {
3434
- this.#internalWrite(() => this.#stream.write(SYNCHRONIZED_OUTPUT_ENABLE));
3435
- shouldDisableSynchronizedOutput = true;
3436
- }
3437
-
3438
- this.clear();
3439
-
3440
- let frameContent = this.frame();
3441
- const columns = this.#stream.columns ?? 80;
3442
- const actualLineCount = this.#computeLineCountFrom(frameContent, columns);
3443
-
3444
- // If content would exceed viewport height, truncate it to prevent garbage
3445
- const consoleHeight = this.#stream.rows;
3446
- if (consoleHeight && consoleHeight > 1 && actualLineCount > consoleHeight) {
3447
- const lines = frameContent.split('\n');
3448
- const maxLines = consoleHeight - 1; // Reserve one line for truncation message
3449
- frameContent = [...lines.slice(0, maxLines), '... (content truncated to fit terminal)'].join('\n');
3450
- }
3451
-
3452
- const canContinue = this.#internalWrite(() => this.#stream.write(frameContent));
3453
-
3454
- // Handle backpressure - pause rendering if stream buffer is full
3455
- if (canContinue === false && this.#stream.isTTY) {
3456
- this.#drainHandler = () => {
3457
- this.#drainHandler = undefined;
3458
- this.#tryRender();
3459
- };
3460
-
3461
- this.#stream.once('drain', this.#drainHandler);
3462
- }
3463
-
3464
- this.#linesToClear = this.#computeLineCountFrom(frameContent, columns);
3465
- } finally {
3466
- if (shouldDisableSynchronizedOutput) {
3467
- this.#internalWrite(() => this.#stream.write(SYNCHRONIZED_OUTPUT_DISABLE));
3468
- }
3469
- }
1492
+ this.clear();
1493
+ this.#stream.write(this.frame());
1494
+ this.#linesToClear = this.#lineCount;
3470
1495
 
3471
1496
  return this;
3472
1497
  }
@@ -3476,16 +1501,13 @@ class Ora {
3476
1501
  this.text = text;
3477
1502
  }
3478
1503
 
3479
- if (this.isSilent) {
1504
+ if (this.#isSilent) {
3480
1505
  return this;
3481
1506
  }
3482
1507
 
3483
- if (!this.isEnabled) {
3484
- const symbol = this.text ? '-' : '';
3485
- const line = ' '.repeat(this.#options.indent) + this.#buildOutputLine(symbol, this.text, this.#options.prefixText, this.#options.suffixText);
3486
-
3487
- if (line.trim() !== '') {
3488
- this.#internalWrite(() => this.#stream.write(line + '\n'));
1508
+ if (!this.#isEnabled) {
1509
+ if (this.text) {
1510
+ this.#stream.write(`- ${this.text}\n`);
3489
1511
  }
3490
1512
 
3491
1513
  return this;
@@ -3500,11 +1522,10 @@ class Ora {
3500
1522
  }
3501
1523
 
3502
1524
  if (this.#options.discardStdin && process__default.stdin.isTTY) {
3503
- stdinDiscarder$1.start();
3504
1525
  this.#isDiscardingStdin = true;
1526
+ stdinDiscarder.start();
3505
1527
  }
3506
1528
 
3507
- this.#installHook();
3508
1529
  this.render();
3509
1530
  this.#id = setInterval(this.render.bind(this), this.interval);
3510
1531
 
@@ -3512,65 +1533,63 @@ class Ora {
3512
1533
  }
3513
1534
 
3514
1535
  stop() {
3515
- clearInterval(this.#id);
3516
- this.#id = undefined;
3517
- this.#frameIndex = -1;
3518
- this.#lastFrameTime = 0;
3519
-
3520
- this.#clearRenderDeferral();
3521
- this.#uninstallHook();
3522
-
3523
- // Clean up drain handler if it exists
3524
- if (this.#drainHandler) {
3525
- this.#stream.removeListener('drain', this.#drainHandler);
3526
- this.#drainHandler = undefined;
1536
+ if (!this.#isEnabled) {
1537
+ return this;
3527
1538
  }
3528
1539
 
3529
- if (this.isEnabled) {
3530
- this.clear();
3531
- if (this.#options.hideCursor) {
3532
- cliCursor.show(this.#stream);
3533
- }
1540
+ clearInterval(this.#id);
1541
+ this.#id = undefined;
1542
+ this.#frameIndex = 0;
1543
+ this.clear();
1544
+ if (this.#options.hideCursor) {
1545
+ cliCursor.show(this.#stream);
3534
1546
  }
3535
1547
 
3536
- if (this.#isDiscardingStdin) {
1548
+ if (this.#options.discardStdin && process__default.stdin.isTTY && this.#isDiscardingStdin) {
1549
+ stdinDiscarder.stop();
3537
1550
  this.#isDiscardingStdin = false;
3538
- stdinDiscarder$1.stop();
3539
1551
  }
3540
1552
 
3541
1553
  return this;
3542
1554
  }
3543
1555
 
3544
1556
  succeed(text) {
3545
- return this.stopAndPersist({symbol: success, text});
1557
+ return this.stopAndPersist({symbol: logSymbols.success, text});
3546
1558
  }
3547
1559
 
3548
1560
  fail(text) {
3549
- return this.stopAndPersist({symbol: error, text});
1561
+ return this.stopAndPersist({symbol: logSymbols.error, text});
3550
1562
  }
3551
1563
 
3552
1564
  warn(text) {
3553
- return this.stopAndPersist({symbol: warning, text});
1565
+ return this.stopAndPersist({symbol: logSymbols.warning, text});
3554
1566
  }
3555
1567
 
3556
1568
  info(text) {
3557
- return this.stopAndPersist({symbol: info, text});
1569
+ return this.stopAndPersist({symbol: logSymbols.info, text});
3558
1570
  }
3559
1571
 
3560
1572
  stopAndPersist(options = {}) {
3561
- if (this.isSilent) {
1573
+ if (this.#isSilent) {
3562
1574
  return this;
3563
1575
  }
3564
1576
 
3565
- const symbol = options.symbol ?? ' ';
1577
+ const prefixText = options.prefixText ?? this.#prefixText;
1578
+ const fullPrefixText = this.#getFullPrefixText(prefixText, ' ');
1579
+
1580
+ const symbolText = options.symbol ?? ' ';
1581
+
3566
1582
  const text = options.text ?? this.text;
3567
- const prefixText = options.prefixText ?? this.#options.prefixText;
3568
- const suffixText = options.suffixText ?? this.#options.suffixText;
1583
+ const separatorText = symbolText ? ' ' : '';
1584
+ const fullText = (typeof text === 'string') ? separatorText + text : '';
1585
+
1586
+ const suffixText = options.suffixText ?? this.#suffixText;
1587
+ const fullSuffixText = this.#getFullSuffixText(suffixText, ' ');
3569
1588
 
3570
- const textToWrite = this.#buildOutputLine(symbol, text, prefixText, suffixText) + '\n';
1589
+ const textToWrite = fullPrefixText + symbolText + fullText + fullSuffixText + '\n';
3571
1590
 
3572
1591
  this.stop();
3573
- this.#internalWrite(() => this.#stream.write(textToWrite));
1592
+ this.#stream.write(textToWrite);
3574
1593
 
3575
1594
  return this;
3576
1595
  }
@@ -3580,4 +1599,4 @@ function ora(options) {
3580
1599
  return new Ora(options);
3581
1600
  }
3582
1601
 
3583
- export { ora as default, spinners };
1602
+ export { ora as default, cliSpinners as spinners };