@rhseung/ps-cli 1.5.0 → 1.6.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.
- package/dist/{chunk-HDNNR5OY.js → chunk-ASMT3CRD.js} +1 -202
- package/dist/chunk-NH36IFWR.js +255 -0
- package/dist/{chunk-7SVCS23X.js → chunk-RVD22OUQ.js} +53 -25
- package/dist/commands/config.js +1 -1
- package/dist/commands/fetch.js +12 -15
- package/dist/commands/init.js +77 -22
- package/dist/commands/open.js +1 -1
- package/dist/commands/run.js +1 -1
- package/dist/commands/search.js +366 -102
- package/dist/commands/solve.js +163 -0
- package/dist/commands/stats.js +5 -5
- package/dist/commands/submit.js +1 -1
- package/dist/commands/test.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-A6STXEAE.js +0 -54
|
@@ -495,207 +495,6 @@ var chalk = createChalk();
|
|
|
495
495
|
var chalkStderr = createChalk({ level: stderrColor ? stderrColor.level : 0 });
|
|
496
496
|
var source_default = chalk;
|
|
497
497
|
|
|
498
|
-
// src/utils/tier.ts
|
|
499
|
-
import gradient from "gradient-string";
|
|
500
|
-
var TIER_NAMES = [
|
|
501
|
-
void 0,
|
|
502
|
-
"Bronze V",
|
|
503
|
-
"Bronze IV",
|
|
504
|
-
"Bronze III",
|
|
505
|
-
"Bronze II",
|
|
506
|
-
"Bronze I",
|
|
507
|
-
"Silver V",
|
|
508
|
-
"Silver IV",
|
|
509
|
-
"Silver III",
|
|
510
|
-
"Silver II",
|
|
511
|
-
"Silver I",
|
|
512
|
-
"Gold V",
|
|
513
|
-
"Gold IV",
|
|
514
|
-
"Gold III",
|
|
515
|
-
"Gold II",
|
|
516
|
-
"Gold I",
|
|
517
|
-
"Platinum V",
|
|
518
|
-
"Platinum IV",
|
|
519
|
-
"Platinum III",
|
|
520
|
-
"Platinum II",
|
|
521
|
-
"Platinum I",
|
|
522
|
-
"Diamond V",
|
|
523
|
-
"Diamond IV",
|
|
524
|
-
"Diamond III",
|
|
525
|
-
"Diamond II",
|
|
526
|
-
"Diamond I",
|
|
527
|
-
"Ruby V",
|
|
528
|
-
"Ruby IV",
|
|
529
|
-
"Ruby III",
|
|
530
|
-
"Ruby II",
|
|
531
|
-
"Ruby I",
|
|
532
|
-
"Master"
|
|
533
|
-
];
|
|
534
|
-
var TIER_COLORS = [
|
|
535
|
-
void 0,
|
|
536
|
-
"#9d4900",
|
|
537
|
-
"#a54f00",
|
|
538
|
-
"#ad5600",
|
|
539
|
-
"#b55d0a",
|
|
540
|
-
"#c67739",
|
|
541
|
-
"#38546e",
|
|
542
|
-
"#3d5a74",
|
|
543
|
-
"#435f7a",
|
|
544
|
-
"#496580",
|
|
545
|
-
"#4e6a86",
|
|
546
|
-
"#d28500",
|
|
547
|
-
"#df8f00",
|
|
548
|
-
"#ec9a00",
|
|
549
|
-
"#f9a518",
|
|
550
|
-
"#ffb028",
|
|
551
|
-
"#00c78b",
|
|
552
|
-
"#00d497",
|
|
553
|
-
"#27e2a4",
|
|
554
|
-
"#3ef0b1",
|
|
555
|
-
"#51fdbd",
|
|
556
|
-
"#009ee5",
|
|
557
|
-
"#00a9f0",
|
|
558
|
-
"#00b4fc",
|
|
559
|
-
"#2bbfff",
|
|
560
|
-
"#41caff",
|
|
561
|
-
"#e0004c",
|
|
562
|
-
"#ea0053",
|
|
563
|
-
"#f5005a",
|
|
564
|
-
"#ff0062",
|
|
565
|
-
"#ff3071",
|
|
566
|
-
"#b300e0"
|
|
567
|
-
];
|
|
568
|
-
var TIER_IMAGE_BASE_URL = "https://d2gd6pc034wcta.cloudfront.net/tier";
|
|
569
|
-
var MASTER_TIER_GRADIENT = [
|
|
570
|
-
{ r: 255, g: 124, b: 168 },
|
|
571
|
-
{ r: 180, g: 145, b: 255 },
|
|
572
|
-
{ r: 124, g: 249, b: 255 }
|
|
573
|
-
];
|
|
574
|
-
var TIER_MIN_RATINGS = [
|
|
575
|
-
0,
|
|
576
|
-
// Unrated (tier 0): 0-29
|
|
577
|
-
30,
|
|
578
|
-
// Bronze V (tier 1)
|
|
579
|
-
60,
|
|
580
|
-
// Bronze IV (tier 2)
|
|
581
|
-
90,
|
|
582
|
-
// Bronze III (tier 3)
|
|
583
|
-
120,
|
|
584
|
-
// Bronze II (tier 4)
|
|
585
|
-
150,
|
|
586
|
-
// Bronze I (tier 5)
|
|
587
|
-
200,
|
|
588
|
-
// Silver V (tier 6)
|
|
589
|
-
300,
|
|
590
|
-
// Silver IV (tier 7)
|
|
591
|
-
400,
|
|
592
|
-
// Silver III (tier 8)
|
|
593
|
-
500,
|
|
594
|
-
// Silver II (tier 9)
|
|
595
|
-
650,
|
|
596
|
-
// Silver I (tier 10)
|
|
597
|
-
800,
|
|
598
|
-
// Gold V (tier 11)
|
|
599
|
-
950,
|
|
600
|
-
// Gold IV (tier 12)
|
|
601
|
-
1100,
|
|
602
|
-
// Gold III (tier 13)
|
|
603
|
-
1250,
|
|
604
|
-
// Gold II (tier 14)
|
|
605
|
-
1400,
|
|
606
|
-
// Gold I (tier 15)
|
|
607
|
-
1600,
|
|
608
|
-
// Platinum V (tier 16)
|
|
609
|
-
1750,
|
|
610
|
-
// Platinum IV (tier 17)
|
|
611
|
-
1900,
|
|
612
|
-
// Platinum III (tier 18)
|
|
613
|
-
2e3,
|
|
614
|
-
// Platinum II (tier 19)
|
|
615
|
-
2100,
|
|
616
|
-
// Platinum I (tier 20)
|
|
617
|
-
2200,
|
|
618
|
-
// Diamond V (tier 21)
|
|
619
|
-
2300,
|
|
620
|
-
// Diamond IV (tier 22)
|
|
621
|
-
2400,
|
|
622
|
-
// Diamond III (tier 23)
|
|
623
|
-
2500,
|
|
624
|
-
// Diamond II (tier 24)
|
|
625
|
-
2600,
|
|
626
|
-
// Diamond I (tier 25)
|
|
627
|
-
2700,
|
|
628
|
-
// Ruby V (tier 26)
|
|
629
|
-
2800,
|
|
630
|
-
// Ruby IV (tier 27)
|
|
631
|
-
2850,
|
|
632
|
-
// Ruby III (tier 28)
|
|
633
|
-
2900,
|
|
634
|
-
// Ruby II (tier 29)
|
|
635
|
-
2950,
|
|
636
|
-
// Ruby I (tier 30)
|
|
637
|
-
3e3
|
|
638
|
-
// Master (tier 31)
|
|
639
|
-
];
|
|
640
|
-
function getTierMinRating(tier) {
|
|
641
|
-
if (tier >= 0 && tier < TIER_MIN_RATINGS.length) {
|
|
642
|
-
return TIER_MIN_RATINGS[tier] ?? 0;
|
|
643
|
-
}
|
|
644
|
-
return 0;
|
|
645
|
-
}
|
|
646
|
-
function getNextTierMinRating(tier) {
|
|
647
|
-
if (tier === 31) {
|
|
648
|
-
return null;
|
|
649
|
-
}
|
|
650
|
-
if (tier >= 0 && tier < TIER_MIN_RATINGS.length - 1) {
|
|
651
|
-
return TIER_MIN_RATINGS[tier + 1] ?? null;
|
|
652
|
-
}
|
|
653
|
-
return null;
|
|
654
|
-
}
|
|
655
|
-
function calculateTierProgress(currentRating, tier) {
|
|
656
|
-
if (tier === 31) {
|
|
657
|
-
return 100;
|
|
658
|
-
}
|
|
659
|
-
const currentTierMin = getTierMinRating(tier);
|
|
660
|
-
const nextTierMin = getNextTierMinRating(tier);
|
|
661
|
-
if (nextTierMin === null) {
|
|
662
|
-
return 100;
|
|
663
|
-
}
|
|
664
|
-
if (currentRating < currentTierMin) {
|
|
665
|
-
return 0;
|
|
666
|
-
}
|
|
667
|
-
if (currentRating >= nextTierMin) {
|
|
668
|
-
return 100;
|
|
669
|
-
}
|
|
670
|
-
const progress = (currentRating - currentTierMin) / (nextTierMin - currentTierMin) * 100;
|
|
671
|
-
return Math.max(0, Math.min(100, progress));
|
|
672
|
-
}
|
|
673
|
-
function getTierName(level) {
|
|
674
|
-
if (level === 0) return "Unrated";
|
|
675
|
-
if (level >= 1 && level < TIER_NAMES.length) {
|
|
676
|
-
return TIER_NAMES[level] || "Unrated";
|
|
677
|
-
}
|
|
678
|
-
return "Unrated";
|
|
679
|
-
}
|
|
680
|
-
function getTierColor(level) {
|
|
681
|
-
if (level === 0) return "#2d2d2d";
|
|
682
|
-
if (level === 31) {
|
|
683
|
-
return gradient([...MASTER_TIER_GRADIENT]);
|
|
684
|
-
}
|
|
685
|
-
if (level >= 1 && level < TIER_COLORS.length) {
|
|
686
|
-
return TIER_COLORS[level] || "#2d2d2d";
|
|
687
|
-
}
|
|
688
|
-
return "#2d2d2d";
|
|
689
|
-
}
|
|
690
|
-
function getTierImageUrl(level) {
|
|
691
|
-
return `${TIER_IMAGE_BASE_URL}/${level}.svg`;
|
|
692
|
-
}
|
|
693
|
-
|
|
694
498
|
export {
|
|
695
|
-
source_default
|
|
696
|
-
getNextTierMinRating,
|
|
697
|
-
calculateTierProgress,
|
|
698
|
-
getTierName,
|
|
699
|
-
getTierColor,
|
|
700
|
-
getTierImageUrl
|
|
499
|
+
source_default
|
|
701
500
|
};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/utils/tier.ts
|
|
4
|
+
import gradient from "gradient-string";
|
|
5
|
+
var TIER_NAMES = [
|
|
6
|
+
void 0,
|
|
7
|
+
"Bronze V",
|
|
8
|
+
"Bronze IV",
|
|
9
|
+
"Bronze III",
|
|
10
|
+
"Bronze II",
|
|
11
|
+
"Bronze I",
|
|
12
|
+
"Silver V",
|
|
13
|
+
"Silver IV",
|
|
14
|
+
"Silver III",
|
|
15
|
+
"Silver II",
|
|
16
|
+
"Silver I",
|
|
17
|
+
"Gold V",
|
|
18
|
+
"Gold IV",
|
|
19
|
+
"Gold III",
|
|
20
|
+
"Gold II",
|
|
21
|
+
"Gold I",
|
|
22
|
+
"Platinum V",
|
|
23
|
+
"Platinum IV",
|
|
24
|
+
"Platinum III",
|
|
25
|
+
"Platinum II",
|
|
26
|
+
"Platinum I",
|
|
27
|
+
"Diamond V",
|
|
28
|
+
"Diamond IV",
|
|
29
|
+
"Diamond III",
|
|
30
|
+
"Diamond II",
|
|
31
|
+
"Diamond I",
|
|
32
|
+
"Ruby V",
|
|
33
|
+
"Ruby IV",
|
|
34
|
+
"Ruby III",
|
|
35
|
+
"Ruby II",
|
|
36
|
+
"Ruby I",
|
|
37
|
+
"Master"
|
|
38
|
+
];
|
|
39
|
+
var TIER_COLORS = [
|
|
40
|
+
void 0,
|
|
41
|
+
"#9d4900",
|
|
42
|
+
"#a54f00",
|
|
43
|
+
"#ad5600",
|
|
44
|
+
"#b55d0a",
|
|
45
|
+
"#c67739",
|
|
46
|
+
"#38546e",
|
|
47
|
+
"#3d5a74",
|
|
48
|
+
"#435f7a",
|
|
49
|
+
"#496580",
|
|
50
|
+
"#4e6a86",
|
|
51
|
+
"#d28500",
|
|
52
|
+
"#df8f00",
|
|
53
|
+
"#ec9a00",
|
|
54
|
+
"#f9a518",
|
|
55
|
+
"#ffb028",
|
|
56
|
+
"#00c78b",
|
|
57
|
+
"#00d497",
|
|
58
|
+
"#27e2a4",
|
|
59
|
+
"#3ef0b1",
|
|
60
|
+
"#51fdbd",
|
|
61
|
+
"#009ee5",
|
|
62
|
+
"#00a9f0",
|
|
63
|
+
"#00b4fc",
|
|
64
|
+
"#2bbfff",
|
|
65
|
+
"#41caff",
|
|
66
|
+
"#e0004c",
|
|
67
|
+
"#ea0053",
|
|
68
|
+
"#f5005a",
|
|
69
|
+
"#ff0062",
|
|
70
|
+
"#ff3071",
|
|
71
|
+
"#b300e0"
|
|
72
|
+
];
|
|
73
|
+
var TIER_IMAGE_BASE_URL = "https://d2gd6pc034wcta.cloudfront.net/tier";
|
|
74
|
+
var MASTER_TIER_GRADIENT = [
|
|
75
|
+
{ r: 255, g: 124, b: 168 },
|
|
76
|
+
{ r: 180, g: 145, b: 255 },
|
|
77
|
+
{ r: 124, g: 249, b: 255 }
|
|
78
|
+
];
|
|
79
|
+
var TIER_MIN_RATINGS = [
|
|
80
|
+
0,
|
|
81
|
+
// Unrated (tier 0): 0-29
|
|
82
|
+
30,
|
|
83
|
+
// Bronze V (tier 1)
|
|
84
|
+
60,
|
|
85
|
+
// Bronze IV (tier 2)
|
|
86
|
+
90,
|
|
87
|
+
// Bronze III (tier 3)
|
|
88
|
+
120,
|
|
89
|
+
// Bronze II (tier 4)
|
|
90
|
+
150,
|
|
91
|
+
// Bronze I (tier 5)
|
|
92
|
+
200,
|
|
93
|
+
// Silver V (tier 6)
|
|
94
|
+
300,
|
|
95
|
+
// Silver IV (tier 7)
|
|
96
|
+
400,
|
|
97
|
+
// Silver III (tier 8)
|
|
98
|
+
500,
|
|
99
|
+
// Silver II (tier 9)
|
|
100
|
+
650,
|
|
101
|
+
// Silver I (tier 10)
|
|
102
|
+
800,
|
|
103
|
+
// Gold V (tier 11)
|
|
104
|
+
950,
|
|
105
|
+
// Gold IV (tier 12)
|
|
106
|
+
1100,
|
|
107
|
+
// Gold III (tier 13)
|
|
108
|
+
1250,
|
|
109
|
+
// Gold II (tier 14)
|
|
110
|
+
1400,
|
|
111
|
+
// Gold I (tier 15)
|
|
112
|
+
1600,
|
|
113
|
+
// Platinum V (tier 16)
|
|
114
|
+
1750,
|
|
115
|
+
// Platinum IV (tier 17)
|
|
116
|
+
1900,
|
|
117
|
+
// Platinum III (tier 18)
|
|
118
|
+
2e3,
|
|
119
|
+
// Platinum II (tier 19)
|
|
120
|
+
2100,
|
|
121
|
+
// Platinum I (tier 20)
|
|
122
|
+
2200,
|
|
123
|
+
// Diamond V (tier 21)
|
|
124
|
+
2300,
|
|
125
|
+
// Diamond IV (tier 22)
|
|
126
|
+
2400,
|
|
127
|
+
// Diamond III (tier 23)
|
|
128
|
+
2500,
|
|
129
|
+
// Diamond II (tier 24)
|
|
130
|
+
2600,
|
|
131
|
+
// Diamond I (tier 25)
|
|
132
|
+
2700,
|
|
133
|
+
// Ruby V (tier 26)
|
|
134
|
+
2800,
|
|
135
|
+
// Ruby IV (tier 27)
|
|
136
|
+
2850,
|
|
137
|
+
// Ruby III (tier 28)
|
|
138
|
+
2900,
|
|
139
|
+
// Ruby II (tier 29)
|
|
140
|
+
2950,
|
|
141
|
+
// Ruby I (tier 30)
|
|
142
|
+
3e3
|
|
143
|
+
// Master (tier 31)
|
|
144
|
+
];
|
|
145
|
+
function getTierMinRating(tier) {
|
|
146
|
+
if (tier >= 0 && tier < TIER_MIN_RATINGS.length) {
|
|
147
|
+
return TIER_MIN_RATINGS[tier] ?? 0;
|
|
148
|
+
}
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
function getNextTierMinRating(tier) {
|
|
152
|
+
if (tier === 31) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
if (tier >= 0 && tier < TIER_MIN_RATINGS.length - 1) {
|
|
156
|
+
return TIER_MIN_RATINGS[tier + 1] ?? null;
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function calculateTierProgress(currentRating, tier) {
|
|
161
|
+
if (tier === 31) {
|
|
162
|
+
return 100;
|
|
163
|
+
}
|
|
164
|
+
const currentTierMin = getTierMinRating(tier);
|
|
165
|
+
const nextTierMin = getNextTierMinRating(tier);
|
|
166
|
+
if (nextTierMin === null) {
|
|
167
|
+
return 100;
|
|
168
|
+
}
|
|
169
|
+
if (currentRating < currentTierMin) {
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
if (currentRating >= nextTierMin) {
|
|
173
|
+
return 100;
|
|
174
|
+
}
|
|
175
|
+
const progress = (currentRating - currentTierMin) / (nextTierMin - currentTierMin) * 100;
|
|
176
|
+
return Math.max(0, Math.min(100, progress));
|
|
177
|
+
}
|
|
178
|
+
function getTierName(level) {
|
|
179
|
+
if (level === 0) return "Unrated";
|
|
180
|
+
if (level >= 1 && level < TIER_NAMES.length) {
|
|
181
|
+
return TIER_NAMES[level] || "Unrated";
|
|
182
|
+
}
|
|
183
|
+
return "Unrated";
|
|
184
|
+
}
|
|
185
|
+
function getTierColor(level) {
|
|
186
|
+
if (level === 0) return "#2d2d2d";
|
|
187
|
+
if (level === 31) {
|
|
188
|
+
return gradient([...MASTER_TIER_GRADIENT]);
|
|
189
|
+
}
|
|
190
|
+
if (level >= 1 && level < TIER_COLORS.length) {
|
|
191
|
+
return TIER_COLORS[level] || "#2d2d2d";
|
|
192
|
+
}
|
|
193
|
+
return "#2d2d2d";
|
|
194
|
+
}
|
|
195
|
+
function getTierImageUrl(level) {
|
|
196
|
+
return `${TIER_IMAGE_BASE_URL}/${level}.svg`;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/services/solved-api.ts
|
|
200
|
+
var BASE_URL = "https://solved.ac/api/v3";
|
|
201
|
+
var USER_AGENT = "ps-cli/1.0.0";
|
|
202
|
+
async function fetchWithRetry(url, options = {}, maxRetries = 3) {
|
|
203
|
+
let lastError = null;
|
|
204
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
205
|
+
try {
|
|
206
|
+
const response = await fetch(url, {
|
|
207
|
+
...options,
|
|
208
|
+
headers: {
|
|
209
|
+
"User-Agent": USER_AGENT,
|
|
210
|
+
...options.headers
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
if (response.status === 429) {
|
|
214
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
215
|
+
const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1e3 : (attempt + 1) * 1e3;
|
|
216
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
221
|
+
}
|
|
222
|
+
return response;
|
|
223
|
+
} catch (error) {
|
|
224
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
225
|
+
if (attempt < maxRetries - 1) {
|
|
226
|
+
await new Promise(
|
|
227
|
+
(resolve) => setTimeout(resolve, (attempt + 1) * 1e3)
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
throw lastError || new Error("Request failed after retries");
|
|
233
|
+
}
|
|
234
|
+
async function getProblem(problemId) {
|
|
235
|
+
const url = `${BASE_URL}/problem/show?problemId=${problemId}`;
|
|
236
|
+
const response = await fetchWithRetry(url);
|
|
237
|
+
const data = await response.json();
|
|
238
|
+
return data;
|
|
239
|
+
}
|
|
240
|
+
async function getUserStats(handle) {
|
|
241
|
+
const url = `${BASE_URL}/user/show?handle=${handle}`;
|
|
242
|
+
const response = await fetchWithRetry(url);
|
|
243
|
+
const data = await response.json();
|
|
244
|
+
return data;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export {
|
|
248
|
+
getNextTierMinRating,
|
|
249
|
+
calculateTierProgress,
|
|
250
|
+
getTierName,
|
|
251
|
+
getTierColor,
|
|
252
|
+
getTierImageUrl,
|
|
253
|
+
getProblem,
|
|
254
|
+
getUserStats
|
|
255
|
+
};
|
|
@@ -9924,8 +9924,10 @@ var config = new Conf({
|
|
|
9924
9924
|
autoOpenEditor: false,
|
|
9925
9925
|
// 기본값: 자동 열기 비활성화
|
|
9926
9926
|
solvedAcHandle: void 0,
|
|
9927
|
-
problemDir: "problems"
|
|
9927
|
+
problemDir: "problems",
|
|
9928
9928
|
// 기본값: problems 디렉토리
|
|
9929
|
+
solvingDir: "solving"
|
|
9930
|
+
// 기본값: solving 디렉토리
|
|
9929
9931
|
}
|
|
9930
9932
|
});
|
|
9931
9933
|
var projectConfigCache = null;
|
|
@@ -10014,44 +10016,58 @@ function getProblemDir() {
|
|
|
10014
10016
|
}
|
|
10015
10017
|
return config.get("problemDir") ?? "problems";
|
|
10016
10018
|
}
|
|
10019
|
+
function getSolvingDir() {
|
|
10020
|
+
const projectConfig = getProjectConfigSync();
|
|
10021
|
+
if (projectConfig?.solvingDir !== void 0) {
|
|
10022
|
+
return projectConfig.solvingDir;
|
|
10023
|
+
}
|
|
10024
|
+
return config.get("solvingDir") ?? "solving";
|
|
10025
|
+
}
|
|
10017
10026
|
|
|
10018
10027
|
// src/utils/problem-id.ts
|
|
10019
10028
|
import { join as join2 } from "path";
|
|
10020
10029
|
function detectProblemIdFromPath(cwd = process.cwd()) {
|
|
10021
10030
|
const problemDir = getProblemDir();
|
|
10031
|
+
const solvingDir = getSolvingDir();
|
|
10022
10032
|
const normalizedPath = cwd.replace(/\\/g, "/");
|
|
10023
|
-
|
|
10033
|
+
const dirsToCheck = [problemDir, solvingDir].filter(
|
|
10034
|
+
(dir) => dir && dir !== "." && dir !== ""
|
|
10035
|
+
);
|
|
10036
|
+
if (dirsToCheck.length === 0) {
|
|
10024
10037
|
const segments = normalizedPath.split("/").filter(Boolean);
|
|
10025
10038
|
const lastSegment = segments[segments.length - 1];
|
|
10026
10039
|
if (lastSegment) {
|
|
10027
|
-
const
|
|
10028
|
-
if (!isNaN(
|
|
10029
|
-
return
|
|
10040
|
+
const problemId = parseInt(lastSegment, 10);
|
|
10041
|
+
if (!isNaN(problemId) && problemId > 0 && lastSegment === problemId.toString()) {
|
|
10042
|
+
return problemId;
|
|
10030
10043
|
}
|
|
10031
10044
|
}
|
|
10032
10045
|
return null;
|
|
10033
10046
|
}
|
|
10034
|
-
const
|
|
10035
|
-
|
|
10036
|
-
|
|
10037
|
-
|
|
10038
|
-
|
|
10039
|
-
|
|
10040
|
-
|
|
10041
|
-
|
|
10042
|
-
|
|
10043
|
-
|
|
10044
|
-
|
|
10045
|
-
|
|
10046
|
-
|
|
10047
|
-
|
|
10048
|
-
|
|
10049
|
-
|
|
10050
|
-
|
|
10051
|
-
|
|
10052
|
-
|
|
10047
|
+
for (const dir of dirsToCheck) {
|
|
10048
|
+
const dirPattern = `/${dir}/`;
|
|
10049
|
+
const dirIndex = normalizedPath.indexOf(dirPattern);
|
|
10050
|
+
if (dirIndex === -1) {
|
|
10051
|
+
continue;
|
|
10052
|
+
}
|
|
10053
|
+
const afterDir = normalizedPath.substring(dirIndex + dirPattern.length);
|
|
10054
|
+
if (!afterDir) {
|
|
10055
|
+
continue;
|
|
10056
|
+
}
|
|
10057
|
+
const firstSegment = afterDir.split("/")[0];
|
|
10058
|
+
if (!firstSegment) {
|
|
10059
|
+
continue;
|
|
10060
|
+
}
|
|
10061
|
+
const problemId = parseInt(firstSegment, 10);
|
|
10062
|
+
if (isNaN(problemId) || problemId <= 0) {
|
|
10063
|
+
continue;
|
|
10064
|
+
}
|
|
10065
|
+
if (firstSegment !== problemId.toString()) {
|
|
10066
|
+
continue;
|
|
10067
|
+
}
|
|
10068
|
+
return problemId;
|
|
10053
10069
|
}
|
|
10054
|
-
return
|
|
10070
|
+
return null;
|
|
10055
10071
|
}
|
|
10056
10072
|
function getProblemId(args, cwd = process.cwd()) {
|
|
10057
10073
|
if (args.length > 0 && args[0]) {
|
|
@@ -10071,6 +10087,15 @@ function getProblemDirPath(problemId, cwd = process.cwd()) {
|
|
|
10071
10087
|
}
|
|
10072
10088
|
return join2(baseDir, problemDir, problemId.toString());
|
|
10073
10089
|
}
|
|
10090
|
+
function getSolvingDirPath(problemId, cwd = process.cwd()) {
|
|
10091
|
+
const solvingDir = getSolvingDir();
|
|
10092
|
+
const projectRoot = findProjectRoot(cwd);
|
|
10093
|
+
const baseDir = projectRoot || cwd;
|
|
10094
|
+
if (solvingDir === "." || solvingDir === "") {
|
|
10095
|
+
return join2(baseDir, problemId.toString());
|
|
10096
|
+
}
|
|
10097
|
+
return join2(baseDir, solvingDir, problemId.toString());
|
|
10098
|
+
}
|
|
10074
10099
|
|
|
10075
10100
|
// src/utils/execution-context.ts
|
|
10076
10101
|
import { readdir } from "fs/promises";
|
|
@@ -10249,14 +10274,17 @@ var CommandBuilder = class {
|
|
|
10249
10274
|
|
|
10250
10275
|
export {
|
|
10251
10276
|
Command,
|
|
10277
|
+
findProjectRoot,
|
|
10252
10278
|
getDefaultLanguage,
|
|
10253
10279
|
getEditor,
|
|
10254
10280
|
getAutoOpenEditor,
|
|
10255
10281
|
getSolvedAcHandle,
|
|
10256
10282
|
getProblemDir,
|
|
10283
|
+
getSolvingDir,
|
|
10257
10284
|
detectProblemIdFromPath,
|
|
10258
10285
|
getProblemId,
|
|
10259
10286
|
getProblemDirPath,
|
|
10287
|
+
getSolvingDirPath,
|
|
10260
10288
|
resolveProblemContext,
|
|
10261
10289
|
resolveLanguage,
|
|
10262
10290
|
findSolutionFile,
|
package/dist/commands/config.js
CHANGED
package/dist/commands/fetch.js
CHANGED
|
@@ -3,23 +3,20 @@ import {
|
|
|
3
3
|
scrapeProblem
|
|
4
4
|
} from "../chunk-AG6KWWHS.js";
|
|
5
5
|
import {
|
|
6
|
-
getProblem
|
|
7
|
-
} from "../chunk-A6STXEAE.js";
|
|
8
|
-
import {
|
|
6
|
+
getProblem,
|
|
9
7
|
getTierColor,
|
|
10
8
|
getTierImageUrl,
|
|
11
|
-
getTierName
|
|
12
|
-
|
|
13
|
-
} from "../chunk-HDNNR5OY.js";
|
|
9
|
+
getTierName
|
|
10
|
+
} from "../chunk-NH36IFWR.js";
|
|
14
11
|
import {
|
|
15
12
|
Command,
|
|
16
13
|
CommandBuilder,
|
|
17
14
|
CommandDef,
|
|
18
15
|
getAutoOpenEditor,
|
|
19
16
|
getEditor,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
} from "../chunk-
|
|
17
|
+
getProblemId,
|
|
18
|
+
getSolvingDirPath
|
|
19
|
+
} from "../chunk-RVD22OUQ.js";
|
|
23
20
|
import {
|
|
24
21
|
__decorateClass,
|
|
25
22
|
getLanguageConfig,
|
|
@@ -33,14 +30,14 @@ import { Spinner } from "@inkjs/ui";
|
|
|
33
30
|
import { Box as Box2 } from "ink";
|
|
34
31
|
|
|
35
32
|
// src/components/problem-dashboard.tsx
|
|
36
|
-
import { Box, Text
|
|
33
|
+
import { Box, Text } from "ink";
|
|
37
34
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
38
35
|
function ProblemDashboard({ problem }) {
|
|
39
36
|
const tierName = getTierName(problem.level);
|
|
40
37
|
const tierColor = getTierColor(problem.level);
|
|
41
|
-
const tierColorFn = typeof tierColor === "string" ? source_default.hex(tierColor) : tierColor.multiline;
|
|
42
38
|
const borderColorString = typeof tierColor === "string" ? tierColor : "#ff7ca8";
|
|
43
|
-
|
|
39
|
+
const textColorString = borderColorString;
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
44
41
|
Box,
|
|
45
42
|
{
|
|
46
43
|
flexDirection: "column",
|
|
@@ -48,7 +45,7 @@ function ProblemDashboard({ problem }) {
|
|
|
48
45
|
borderColor: borderColorString,
|
|
49
46
|
paddingX: 1,
|
|
50
47
|
alignSelf: "flex-start",
|
|
51
|
-
children: /* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
48
|
+
children: /* @__PURE__ */ jsxs(Text, { bold: true, color: textColorString, children: [
|
|
52
49
|
tierName,
|
|
53
50
|
" ",
|
|
54
51
|
/* @__PURE__ */ jsxs(Text, { color: "white", children: [
|
|
@@ -59,7 +56,7 @@ function ProblemDashboard({ problem }) {
|
|
|
59
56
|
] })
|
|
60
57
|
] })
|
|
61
58
|
}
|
|
62
|
-
)
|
|
59
|
+
);
|
|
63
60
|
}
|
|
64
61
|
|
|
65
62
|
// src/hooks/use-fetch-problem.ts
|
|
@@ -87,7 +84,7 @@ function getProjectRoot() {
|
|
|
87
84
|
return join(__dirname, "../..");
|
|
88
85
|
}
|
|
89
86
|
async function generateProblemFiles(problem, language = "python") {
|
|
90
|
-
const problemDir =
|
|
87
|
+
const problemDir = getSolvingDirPath(problem.id);
|
|
91
88
|
await mkdir(problemDir, { recursive: true });
|
|
92
89
|
const langConfig = getLanguageConfig(language);
|
|
93
90
|
const projectRoot = getProjectRoot();
|