@rhseung/ps-cli 1.3.3 → 1.4.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-7MQMPJ3X.js +88 -0
- package/dist/{chunk-PNIGP6LX.js → chunk-7SVCS23X.js} +392 -96
- package/dist/{chunk-2E4VSP6O.js → chunk-NB4OIWND.js} +139 -139
- package/dist/{chunk-EIFFWFLS.js → chunk-OJZLQ6FK.js} +1 -1
- package/dist/chunk-QGMWUOJ3.js +23 -0
- package/dist/commands/config.js +298 -262
- package/dist/commands/fetch.js +262 -254
- package/dist/commands/init.js +138 -101
- package/dist/commands/open.js +74 -78
- package/dist/commands/run.js +99 -98
- package/dist/commands/stats.js +71 -65
- package/dist/commands/submit.js +112 -126
- package/dist/commands/test.js +203 -203
- package/dist/index.js +7 -6
- package/package.json +16 -6
- package/dist/chunk-6ENX5K3C.js +0 -84
- package/dist/chunk-FYS2JH42.js +0 -31
- package/dist/chunk-TQXMB7XV.js +0 -52
|
@@ -1,141 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// src/services/solved-api.ts
|
|
4
|
-
var BASE_URL = "https://solved.ac/api/v3";
|
|
5
|
-
var USER_AGENT = "ps-cli/1.0.0";
|
|
6
|
-
async function fetchWithRetry(url, options = {}, maxRetries = 3) {
|
|
7
|
-
let lastError = null;
|
|
8
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
9
|
-
try {
|
|
10
|
-
const response = await fetch(url, {
|
|
11
|
-
...options,
|
|
12
|
-
headers: {
|
|
13
|
-
"User-Agent": USER_AGENT,
|
|
14
|
-
...options.headers
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
if (response.status === 429) {
|
|
18
|
-
const retryAfter = response.headers.get("Retry-After");
|
|
19
|
-
const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1e3 : (attempt + 1) * 1e3;
|
|
20
|
-
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
if (!response.ok) {
|
|
24
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
25
|
-
}
|
|
26
|
-
return response;
|
|
27
|
-
} catch (error) {
|
|
28
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
29
|
-
if (attempt < maxRetries - 1) {
|
|
30
|
-
await new Promise(
|
|
31
|
-
(resolve) => setTimeout(resolve, (attempt + 1) * 1e3)
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
throw lastError || new Error("Request failed after retries");
|
|
37
|
-
}
|
|
38
|
-
async function getProblem(problemId) {
|
|
39
|
-
const url = `${BASE_URL}/problem/show?problemId=${problemId}`;
|
|
40
|
-
const response = await fetchWithRetry(url);
|
|
41
|
-
const data = await response.json();
|
|
42
|
-
return data;
|
|
43
|
-
}
|
|
44
|
-
async function getUserStats(handle) {
|
|
45
|
-
const url = `${BASE_URL}/user/show?handle=${handle}`;
|
|
46
|
-
const response = await fetchWithRetry(url);
|
|
47
|
-
const data = await response.json();
|
|
48
|
-
return data;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// src/utils/tier.ts
|
|
52
|
-
var TIER_NAMES = [
|
|
53
|
-
void 0,
|
|
54
|
-
"Bronze V",
|
|
55
|
-
"Bronze IV",
|
|
56
|
-
"Bronze III",
|
|
57
|
-
"Bronze II",
|
|
58
|
-
"Bronze I",
|
|
59
|
-
"Silver V",
|
|
60
|
-
"Silver IV",
|
|
61
|
-
"Silver III",
|
|
62
|
-
"Silver II",
|
|
63
|
-
"Silver I",
|
|
64
|
-
"Gold V",
|
|
65
|
-
"Gold IV",
|
|
66
|
-
"Gold III",
|
|
67
|
-
"Gold II",
|
|
68
|
-
"Gold I",
|
|
69
|
-
"Platinum V",
|
|
70
|
-
"Platinum IV",
|
|
71
|
-
"Platinum III",
|
|
72
|
-
"Platinum II",
|
|
73
|
-
"Platinum I",
|
|
74
|
-
"Diamond V",
|
|
75
|
-
"Diamond IV",
|
|
76
|
-
"Diamond III",
|
|
77
|
-
"Diamond II",
|
|
78
|
-
"Diamond I",
|
|
79
|
-
"Ruby V",
|
|
80
|
-
"Ruby IV",
|
|
81
|
-
"Ruby III",
|
|
82
|
-
"Ruby II",
|
|
83
|
-
"Ruby I",
|
|
84
|
-
"Master"
|
|
85
|
-
];
|
|
86
|
-
var TIER_COLORS = [
|
|
87
|
-
void 0,
|
|
88
|
-
"#9d4900",
|
|
89
|
-
"#a54f00",
|
|
90
|
-
"#ad5600",
|
|
91
|
-
"#b55d0a",
|
|
92
|
-
"#c67739",
|
|
93
|
-
"#38546e",
|
|
94
|
-
"#3d5a74",
|
|
95
|
-
"#435f7a",
|
|
96
|
-
"#496580",
|
|
97
|
-
"#4e6a86",
|
|
98
|
-
"#d28500",
|
|
99
|
-
"#df8f00",
|
|
100
|
-
"#ec9a00",
|
|
101
|
-
"#f9a518",
|
|
102
|
-
"#ffb028",
|
|
103
|
-
"#00c78b",
|
|
104
|
-
"#00d497",
|
|
105
|
-
"#27e2a4",
|
|
106
|
-
"#3ef0b1",
|
|
107
|
-
"#51fdbd",
|
|
108
|
-
"#009ee5",
|
|
109
|
-
"#00a9f0",
|
|
110
|
-
"#00b4fc",
|
|
111
|
-
"#2bbfff",
|
|
112
|
-
"#41caff",
|
|
113
|
-
"#e0004c",
|
|
114
|
-
"#ea0053",
|
|
115
|
-
"#f5005a",
|
|
116
|
-
"#ff0062",
|
|
117
|
-
"#ff3071",
|
|
118
|
-
"#b300e0"
|
|
119
|
-
];
|
|
120
|
-
var TIER_IMAGE_BASE_URL = "https://d2gd6pc034wcta.cloudfront.net/tier";
|
|
121
|
-
function getTierName(level) {
|
|
122
|
-
if (level === 0) return "Unrated";
|
|
123
|
-
if (level >= 1 && level < TIER_NAMES.length) {
|
|
124
|
-
return TIER_NAMES[level] || "Unrated";
|
|
125
|
-
}
|
|
126
|
-
return "Unrated";
|
|
127
|
-
}
|
|
128
|
-
function getTierColor(level) {
|
|
129
|
-
if (level === 0) return "#2d2d2d";
|
|
130
|
-
if (level >= 1 && level < TIER_COLORS.length) {
|
|
131
|
-
return TIER_COLORS[level] || "#2d2d2d";
|
|
132
|
-
}
|
|
133
|
-
return "#2d2d2d";
|
|
134
|
-
}
|
|
135
|
-
function getTierImageUrl(level) {
|
|
136
|
-
return `${TIER_IMAGE_BASE_URL}/${level}.svg`;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
3
|
// node_modules/chalk/source/vendor/ansi-styles/index.js
|
|
140
4
|
var ANSI_BACKGROUND_OFFSET = 10;
|
|
141
5
|
var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
|
|
@@ -631,11 +495,147 @@ var chalk = createChalk();
|
|
|
631
495
|
var chalkStderr = createChalk({ level: stderrColor ? stderrColor.level : 0 });
|
|
632
496
|
var source_default = chalk;
|
|
633
497
|
|
|
498
|
+
// src/utils/tier.ts
|
|
499
|
+
var TIER_NAMES = [
|
|
500
|
+
void 0,
|
|
501
|
+
"Bronze V",
|
|
502
|
+
"Bronze IV",
|
|
503
|
+
"Bronze III",
|
|
504
|
+
"Bronze II",
|
|
505
|
+
"Bronze I",
|
|
506
|
+
"Silver V",
|
|
507
|
+
"Silver IV",
|
|
508
|
+
"Silver III",
|
|
509
|
+
"Silver II",
|
|
510
|
+
"Silver I",
|
|
511
|
+
"Gold V",
|
|
512
|
+
"Gold IV",
|
|
513
|
+
"Gold III",
|
|
514
|
+
"Gold II",
|
|
515
|
+
"Gold I",
|
|
516
|
+
"Platinum V",
|
|
517
|
+
"Platinum IV",
|
|
518
|
+
"Platinum III",
|
|
519
|
+
"Platinum II",
|
|
520
|
+
"Platinum I",
|
|
521
|
+
"Diamond V",
|
|
522
|
+
"Diamond IV",
|
|
523
|
+
"Diamond III",
|
|
524
|
+
"Diamond II",
|
|
525
|
+
"Diamond I",
|
|
526
|
+
"Ruby V",
|
|
527
|
+
"Ruby IV",
|
|
528
|
+
"Ruby III",
|
|
529
|
+
"Ruby II",
|
|
530
|
+
"Ruby I",
|
|
531
|
+
"Master"
|
|
532
|
+
];
|
|
533
|
+
var TIER_COLORS = [
|
|
534
|
+
void 0,
|
|
535
|
+
"#9d4900",
|
|
536
|
+
"#a54f00",
|
|
537
|
+
"#ad5600",
|
|
538
|
+
"#b55d0a",
|
|
539
|
+
"#c67739",
|
|
540
|
+
"#38546e",
|
|
541
|
+
"#3d5a74",
|
|
542
|
+
"#435f7a",
|
|
543
|
+
"#496580",
|
|
544
|
+
"#4e6a86",
|
|
545
|
+
"#d28500",
|
|
546
|
+
"#df8f00",
|
|
547
|
+
"#ec9a00",
|
|
548
|
+
"#f9a518",
|
|
549
|
+
"#ffb028",
|
|
550
|
+
"#00c78b",
|
|
551
|
+
"#00d497",
|
|
552
|
+
"#27e2a4",
|
|
553
|
+
"#3ef0b1",
|
|
554
|
+
"#51fdbd",
|
|
555
|
+
"#009ee5",
|
|
556
|
+
"#00a9f0",
|
|
557
|
+
"#00b4fc",
|
|
558
|
+
"#2bbfff",
|
|
559
|
+
"#41caff",
|
|
560
|
+
"#e0004c",
|
|
561
|
+
"#ea0053",
|
|
562
|
+
"#f5005a",
|
|
563
|
+
"#ff0062",
|
|
564
|
+
"#ff3071",
|
|
565
|
+
"#b300e0"
|
|
566
|
+
];
|
|
567
|
+
var TIER_IMAGE_BASE_URL = "https://d2gd6pc034wcta.cloudfront.net/tier";
|
|
568
|
+
function getTierName(level) {
|
|
569
|
+
if (level === 0) return "Unrated";
|
|
570
|
+
if (level >= 1 && level < TIER_NAMES.length) {
|
|
571
|
+
return TIER_NAMES[level] || "Unrated";
|
|
572
|
+
}
|
|
573
|
+
return "Unrated";
|
|
574
|
+
}
|
|
575
|
+
function getTierColor(level) {
|
|
576
|
+
if (level === 0) return "#2d2d2d";
|
|
577
|
+
if (level >= 1 && level < TIER_COLORS.length) {
|
|
578
|
+
return TIER_COLORS[level] || "#2d2d2d";
|
|
579
|
+
}
|
|
580
|
+
return "#2d2d2d";
|
|
581
|
+
}
|
|
582
|
+
function getTierImageUrl(level) {
|
|
583
|
+
return `${TIER_IMAGE_BASE_URL}/${level}.svg`;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// src/services/solved-api.ts
|
|
587
|
+
var BASE_URL = "https://solved.ac/api/v3";
|
|
588
|
+
var USER_AGENT = "ps-cli/1.0.0";
|
|
589
|
+
async function fetchWithRetry(url, options = {}, maxRetries = 3) {
|
|
590
|
+
let lastError = null;
|
|
591
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
592
|
+
try {
|
|
593
|
+
const response = await fetch(url, {
|
|
594
|
+
...options,
|
|
595
|
+
headers: {
|
|
596
|
+
"User-Agent": USER_AGENT,
|
|
597
|
+
...options.headers
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
if (response.status === 429) {
|
|
601
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
602
|
+
const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1e3 : (attempt + 1) * 1e3;
|
|
603
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
if (!response.ok) {
|
|
607
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
608
|
+
}
|
|
609
|
+
return response;
|
|
610
|
+
} catch (error) {
|
|
611
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
612
|
+
if (attempt < maxRetries - 1) {
|
|
613
|
+
await new Promise(
|
|
614
|
+
(resolve) => setTimeout(resolve, (attempt + 1) * 1e3)
|
|
615
|
+
);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
throw lastError || new Error("Request failed after retries");
|
|
620
|
+
}
|
|
621
|
+
async function getProblem(problemId) {
|
|
622
|
+
const url = `${BASE_URL}/problem/show?problemId=${problemId}`;
|
|
623
|
+
const response = await fetchWithRetry(url);
|
|
624
|
+
const data = await response.json();
|
|
625
|
+
return data;
|
|
626
|
+
}
|
|
627
|
+
async function getUserStats(handle) {
|
|
628
|
+
const url = `${BASE_URL}/user/show?handle=${handle}`;
|
|
629
|
+
const response = await fetchWithRetry(url);
|
|
630
|
+
const data = await response.json();
|
|
631
|
+
return data;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
634
|
export {
|
|
635
|
-
|
|
636
|
-
getUserStats,
|
|
635
|
+
source_default,
|
|
637
636
|
getTierName,
|
|
638
637
|
getTierColor,
|
|
639
638
|
getTierImageUrl,
|
|
640
|
-
|
|
639
|
+
getProblem,
|
|
640
|
+
getUserStats
|
|
641
641
|
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/utils/browser.ts
|
|
4
|
+
import { execaCommand } from "execa";
|
|
5
|
+
async function openBrowser(url) {
|
|
6
|
+
let command;
|
|
7
|
+
if (process.platform === "win32") {
|
|
8
|
+
command = `start "" "${url}"`;
|
|
9
|
+
} else if (process.platform === "darwin") {
|
|
10
|
+
command = `open "${url}"`;
|
|
11
|
+
} else {
|
|
12
|
+
command = `xdg-open "${url}"`;
|
|
13
|
+
}
|
|
14
|
+
await execaCommand(command, {
|
|
15
|
+
shell: true,
|
|
16
|
+
detached: true,
|
|
17
|
+
stdio: "ignore"
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export {
|
|
22
|
+
openBrowser
|
|
23
|
+
};
|